DYADIC.GEN revision 1.1.1.1 1 1.1 mycroft * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
2 1.1 mycroft * M68000 Hi-Performance Microprocessor Division
3 1.1 mycroft * M68040 Software Package
4 1.1 mycroft *
5 1.1 mycroft * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
6 1.1 mycroft * All rights reserved.
7 1.1 mycroft *
8 1.1 mycroft * THE SOFTWARE is provided on an "AS IS" basis and without warranty.
9 1.1 mycroft * To the maximum extent permitted by applicable law,
10 1.1 mycroft * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
11 1.1 mycroft * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
12 1.1 mycroft * PARTICULAR PURPOSE and any warranty against infringement with
13 1.1 mycroft * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
14 1.1 mycroft * and any accompanying written materials.
15 1.1 mycroft *
16 1.1 mycroft * To the maximum extent permitted by applicable law,
17 1.1 mycroft * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
18 1.1 mycroft * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
19 1.1 mycroft * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
20 1.1 mycroft * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
21 1.1 mycroft * SOFTWARE. Motorola assumes no responsibility for the maintenance
22 1.1 mycroft * and support of the SOFTWARE.
23 1.1 mycroft *
24 1.1 mycroft * You are hereby granted a copyright license to use, modify, and
25 1.1 mycroft * distribute the SOFTWARE so long as this entire notice is retained
26 1.1 mycroft * without alteration in any modified and/or redistributed versions,
27 1.1 mycroft * and that such modified versions are clearly identified as such.
28 1.1 mycroft * No licenses are granted by implication, estoppel or otherwise
29 1.1 mycroft * under any patents or trademarks of Motorola, Inc.
30 1.1 mycroft
31 1.1 mycroft *
32 1.1 mycroft * DYADIC.GEN 1.2 4/30/91
33 1.1 mycroft *
34 1.1 mycroft * DYADIC.GEN --- generic DYADIC template
35 1.1 mycroft *
36 1.1 mycroft * This version saves all registers that will be used by the emulation
37 1.1 mycroft * routines and restores all but FP0 on exit. The FPSR is
38 1.1 mycroft * updated to reflect the result of the operation. Return value
39 1.1 mycroft * is placed in FP0 for single, double and extended results.
40 1.1 mycroft *
41 1.1 mycroft * The package subroutines expect the incoming FPCR to be zeroed
42 1.1 mycroft * since they need extended precision to work properly. The
43 1.1 mycroft * 'final' FPCR is expected in USER_FPCR(a6) so that the calculated result
44 1.1 mycroft * can be properly sized and rounded. Also, if the incoming FPCR
45 1.1 mycroft * has enabled any exceptions, the exception will be taken on the
46 1.1 mycroft * final fmovem in this template.
47 1.1 mycroft *
48 1.1 mycroft * Customizations:
49 1.1 mycroft * 1. Remove the movem.l at the entry and exit of
50 1.1 mycroft * each routine if your compiler treats those
51 1.1 mycroft * registers as scratch.
52 1.1 mycroft * 2. Likewise, don't save FP0/FP1 if they are scratch
53 1.1 mycroft * registers.
54 1.1 mycroft * 3. Delete updating of the fpsr if you only care about
55 1.1 mycroft * the result.
56 1.1 mycroft * 4. Remove the _OPs_ and _OPx_ entry points if your compiler
57 1.1 mycroft * treats everything as doubles.
58 1.1 mycroft * 5. Move the result to d0/d1 if the compiler is that old.
59 1.1 mycroft *
60 1.1 mycroft
61 1.1 mycroft xref _OPa_
62 1.1 mycroft xref tag
63 1.1 mycroft
64 1.1 mycroft xdef _OPs_
65 1.1 mycroft _OPs_:
66 1.1 mycroft link a6,#-LOCAL_SIZE
67 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
68 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
69 1.1 mycroft fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision
70 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
71 1.1 mycroft *
72 1.1 mycroft * copy, convert and tag input arguments
73 1.1 mycroft *
74 1.1 mycroft fmove.s 8(a6),fp0
75 1.1 mycroft fmove.x fp0,FPTEMP(a6)
76 1.1 mycroft lea FPTEMP(a6),a0
77 1.1 mycroft bsr tag
78 1.1 mycroft move.b d0,DTAG(a6)
79 1.1 mycroft
80 1.1 mycroft fmove.s 12(a6),fp0
81 1.1 mycroft fmove.x fp0,ETEMP(a6)
82 1.1 mycroft lea ETEMP(a6),a0
83 1.1 mycroft bsr tag
84 1.1 mycroft move.b d0,STAG(a6)
85 1.1 mycroft
86 1.1 mycroft bsr _OPa_
87 1.1 mycroft
88 1.1 mycroft fmove.l fpsr,d0 ; update status register
89 1.1 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
90 1.1 mycroft swap.w d0
91 1.1 mycroft or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte
92 1.1 mycroft swap.w d0
93 1.1 mycroft fmove.l d0,fpsr
94 1.1 mycroft *
95 1.1 mycroft * Result is now in FP0
96 1.1 mycroft *
97 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
98 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
99 1.1 mycroft unlk a6
100 1.1 mycroft rts
101 1.1 mycroft
102 1.1 mycroft xdef _OPd_
103 1.1 mycroft _OPd_:
104 1.1 mycroft link a6,#-LOCAL_SIZE
105 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
106 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
107 1.1 mycroft fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision
108 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
109 1.1 mycroft *
110 1.1 mycroft * copy, convert and tag input arguments
111 1.1 mycroft *
112 1.1 mycroft fmove.d 8(a6),fp0
113 1.1 mycroft fmove.x fp0,FPTEMP(a6)
114 1.1 mycroft lea FPTEMP(a6),a0
115 1.1 mycroft bsr tag
116 1.1 mycroft move.b d0,DTAG(a6)
117 1.1 mycroft
118 1.1 mycroft fmove.d 16(a6),fp0
119 1.1 mycroft fmove.x fp0,ETEMP(a6)
120 1.1 mycroft lea ETEMP(a6),a0
121 1.1 mycroft bsr tag
122 1.1 mycroft move.b d0,STAG(a6)
123 1.1 mycroft
124 1.1 mycroft bsr _OPa_
125 1.1 mycroft
126 1.1 mycroft fmove.l fpsr,d0 ; update status register
127 1.1 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
128 1.1 mycroft swap.w d0
129 1.1 mycroft or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte
130 1.1 mycroft swap.w d0
131 1.1 mycroft fmove.l d0,fpsr
132 1.1 mycroft *
133 1.1 mycroft * Result is now in FP0
134 1.1 mycroft *
135 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
136 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
137 1.1 mycroft unlk a6
138 1.1 mycroft rts
139 1.1 mycroft
140 1.1 mycroft xdef _OPx_
141 1.1 mycroft _OPx_:
142 1.1 mycroft link a6,#-LOCAL_SIZE
143 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
144 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
145 1.1 mycroft fmovem.l fpsr/fpcr,USER_FPSR(a6) ; user's rounding mode/precision
146 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
147 1.1 mycroft *
148 1.1 mycroft * copy, convert and tag input arguments
149 1.1 mycroft *
150 1.1 mycroft fmove.x 8(a6),fp0
151 1.1 mycroft fmove.x fp0,FPTEMP(a6)
152 1.1 mycroft lea FPTEMP(a6),a0
153 1.1 mycroft bsr tag
154 1.1 mycroft move.b d0,DTAG(a6)
155 1.1 mycroft
156 1.1 mycroft fmove.x 20(a6),fp0
157 1.1 mycroft fmove.x fp0,ETEMP(a6)
158 1.1 mycroft lea ETEMP(a6),a0
159 1.1 mycroft bsr tag
160 1.1 mycroft move.b d0,STAG(a6)
161 1.1 mycroft
162 1.1 mycroft bsr _OPa_
163 1.1 mycroft
164 1.1 mycroft fmove.l fpsr,d0 ; update status register
165 1.1 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
166 1.1 mycroft swap.w d0
167 1.1 mycroft or.b FPSR_QBYTE(a6),d0 ; pickup sign of quotient byte
168 1.1 mycroft swap.w d0
169 1.1 mycroft fmove.l d0,fpsr
170 1.1 mycroft *
171 1.1 mycroft * Result is now in FP0
172 1.1 mycroft *
173 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
174 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
175 1.1 mycroft unlk a6
176 1.1 mycroft rts
177 1.1 mycroft
178