revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-all / m680x0 / fpsp / DYADIC.GCC
blobeacfa477ce337c869d52c299f55faecad939684c
1 *       $NetBSD: DYADIC.GCC,v 1.2 1994/10/26 07:48:27 cgd Exp $
3 *       MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4 *       M68000 Hi-Performance Microprocessor Division
5 *       M68040 Software Package 
7 *       M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8 *       All rights reserved.
10 *       THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11 *       To the maximum extent permitted by applicable law,
12 *       MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13 *       INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14 *       PARTICULAR PURPOSE and any warranty against infringement with
15 *       regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16 *       and any accompanying written materials. 
18 *       To the maximum extent permitted by applicable law,
19 *       IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20 *       (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21 *       PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22 *       OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23 *       SOFTWARE.  Motorola assumes no responsibility for the maintenance
24 *       and support of the SOFTWARE.  
26 *       You are hereby granted a copyright license to use, modify, and
27 *       distribute the SOFTWARE so long as this entire notice is retained
28 *       without alteration in any modified and/or redistributed versions,
29 *       and that such modified versions are clearly identified as such.
30 *       No licenses are granted by implication, estoppel or otherwise
31 *       under any patents or trademarks of Motorola, Inc.
34 *       DYADIC.GCC --- DYADIC template for GCC compiler
36 *       This is based on the generic template.  The only difference is that
37 *       GCC does not need the d0-d1/a0-a1 registers saved.
39 *       Customizations:  
40 *               2. Likewise, don't save FP0/FP1 if they are scratch
41 *                  registers.
42 *               3. Delete updating of the fpsr if you only care about
43 *                  the result.
44 *               5. Move the result to d0/d1 if the compiler is that old.
47         xref    _OPa_
48         xref    tag
50         xdef    _OPs_
51 _OPs_:
52         link    a6,#-LOCAL_SIZE
53         fmovem.x fp0-fp3,USER_FP0(a6)
54         fmove.l fpsr,USER_FPSR(a6)
55         fmove.l fpcr,USER_FPCR(a6)      ; user's rounding mode/precision
56         fmove.l #0,fpcr         ; force rounding mode/prec to extended,rn
58 *       copy, convert and tag input arguments
60         fmove.s 8(a6),fp0
61         fmove.x fp0,FPTEMP(a6)
62         lea     FPTEMP(a6),a0
63         bsr     tag
64         move.b  d0,DTAG(a6)
66         fmove.s 12(a6),fp0
67         fmove.x fp0,ETEMP(a6)
68         lea     ETEMP(a6),a0
69         bsr     tag
70         move.b  d0,STAG(a6)
72         bsr     _OPa_
74         fmove.l fpsr,d0         ; update status register
75         or.b    FPSR_AEXCEPT(a6),d0     ;add previously accrued exceptions
76         swap.w  d0
77         or.b    FPSR_QBYTE(a6),d0       ; pickup sign of quotient byte
78         swap.w  d0
79         fmove.l d0,fpsr
81 *       Result is now in FP0
83         fmovem.x USER_FP1(a6),fp1-fp3   ; note: FP0 not restored
84         unlk    a6
85         rts
87         xdef    _OPd_
88 _OPd_:
89         link    a6,#-LOCAL_SIZE
90         fmovem.x fp0-fp3,USER_FP0(a6)
91         fmove.l fpsr,USER_FPSR(a6)
92         fmove.l fpcr,USER_FPCR(a6)      ; user's rounding mode/precision
93         fmove.l #0,fpcr         ; force rounding mode/prec to extended,rn
95 *       copy, convert and tag input arguments
97         fmove.d 8(a6),fp0
98         fmove.x fp0,FPTEMP(a6)
99         lea     FPTEMP(a6),a0
100         bsr     tag
101         move.b  d0,DTAG(a6)
103         fmove.d 16(a6),fp0
104         fmove.x fp0,ETEMP(a6)
105         lea     ETEMP(a6),a0
106         bsr     tag
107         move.b  d0,STAG(a6)
109         bsr     _OPa_
111         fmove.l fpsr,d0         ; update status register
112         or.b    FPSR_AEXCEPT(a6),d0     ;add previously accrued exceptions
113         swap.w  d0
114         or.b    FPSR_QBYTE(a6),d0       ; pickup sign of quotient byte
115         swap.w  d0
116         fmove.l d0,fpsr
118 *       Result is now in FP0
120         fmovem.x USER_FP1(a6),fp1-fp3   ; note: FP0 not restored
121         unlk    a6
122         rts
124         xdef    _OPx_
125 _OPx_:
126         link    a6,#-LOCAL_SIZE
127         fmovem.x fp0-fp3,USER_FP0(a6)
128         fmove.l fpsr,USER_FPSR(a6)
129         fmove.l fpcr,USER_FPCR(a6)      ; user's rounding mode/precision
130         fmove.l #0,fpcr         ; force rounding mode/prec to extended,rn
132 *       copy, convert and tag input arguments
134         fmove.x 8(a6),fp0
135         fmove.x fp0,FPTEMP(a6)
136         lea     FPTEMP(a6),a0
137         bsr     tag
138         move.b  d0,DTAG(a6)
140         fmove.x 20(a6),fp0
141         fmove.x fp0,ETEMP(a6)
142         lea     ETEMP(a6),a0
143         bsr     tag
144         move.b  d0,STAG(a6)
146         bsr     _OPa_
148         fmove.l fpsr,d0         ; update status register
149         or.b    FPSR_AEXCEPT(a6),d0     ;add previously accrued exceptions
150         swap.w  d0
151         or.b    FPSR_QBYTE(a6),d0       ; pickup sign of quotient byte
152         swap.w  d0
153         fmove.l d0,fpsr
155 *       Result is now in FP0
157         fmovem.x USER_FP1(a6),fp1-fp3   ; note: FP0 not restored
158         unlk    a6
159         rts