MONADIC.GEN revision 1.2 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 * MONADIC.GEN 1.5 5/18/92
33 1.1 mycroft *
34 1.1 mycroft * MONADIC.GEN 1.4 1/16/92
35 1.1 mycroft *
36 1.1 mycroft * MONADIC.GEN 1.3 4/30/91
37 1.1 mycroft *
38 1.1 mycroft * MONADIC.GEN --- generic MONADIC template
39 1.1 mycroft *
40 1.1 mycroft * This version saves all registers that will be used by the emulation
41 1.1 mycroft * routines and restores all but FP0 on exit. The FPSR is
42 1.1 mycroft * updated to reflect the result of the operation. Return value
43 1.1 mycroft * is placed in FP0 for single, double and extended results.
44 1.1 mycroft *
45 1.1 mycroft * The package subroutines expect the incoming FPCR to be zeroed
46 1.1 mycroft * since they need extended precision to work properly. The
47 1.1 mycroft * 'final' FPCR is expected in d1 so that the calculated result
48 1.1 mycroft * can be properly sized and rounded. Also, if the incoming FPCR
49 1.1 mycroft * has enabled any exceptions, the exception will be taken on the
50 1.1 mycroft * final fmovem in this template.
51 1.1 mycroft *
52 1.1 mycroft * Customizations:
53 1.1 mycroft * 1. Remove the movem.l at the entry and exit of
54 1.1 mycroft * each routine if your compiler treats those
55 1.1 mycroft * registers as scratch.
56 1.1 mycroft * 2. Likewise, don't save FP0/FP1 if they are scratch
57 1.1 mycroft * registers.
58 1.1 mycroft * 3. Delete handling of the fpsr if you only care about
59 1.1 mycroft * the result.
60 1.1 mycroft * 4. Some (most?) C compilers convert all float arguments
61 1.1 mycroft * to double, and provide no support at all for extended
62 1.1 mycroft * precision so remove the _OPs_ and _OPx_ entry points.
63 1.1 mycroft * 5. Move the result to d0/d1 if the compiler is that old.
64 1.1 mycroft *
65 1.1 mycroft
66 1.1 mycroft xref tag
67 1.1 mycroft xref _OPr_
68 1.1 mycroft xref _OPz_
69 1.1 mycroft xref _OPi_
70 1.1 mycroft xref _OPn_
71 1.1 mycroft xref _OPm_
72 1.1 mycroft
73 1.1 mycroft xdef _OPs_
74 1.1 mycroft _OPs_:
75 1.1 mycroft link a6,#-LOCAL_SIZE
76 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
77 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
78 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
79 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
80 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
81 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
82 1.1 mycroft *
83 1.1 mycroft * copy, convert and tag input argument
84 1.1 mycroft *
85 1.1 mycroft fmove.s 8(a6),fp0
86 1.1 mycroft fmove.x fp0,ETEMP(a6)
87 1.1 mycroft lea ETEMP(a6),a0
88 1.1 mycroft bsr tag
89 1.1 mycroft move.b d0,STAG(a6)
90 1.1 mycroft tst.b d0
91 1.1 mycroft bne.b _TMP_2
92 1.1 mycroft bsr _OPr_ ; normalized (regular) number
93 1.1 mycroft bra.b _TMP_6
94 1.1 mycroft _TMP_2:
95 1.1 mycroft cmp.b #$20,d0 ; zero?
96 1.1 mycroft bne.b _TMP_3
97 1.1 mycroft bsr _OPz_
98 1.1 mycroft bra.b _TMP_6
99 1.1 mycroft _TMP_3:
100 1.1 mycroft cmp.b #$40,d0 ; infinity?
101 1.1 mycroft bne.b _TMP_4
102 1.1 mycroft bsr _OPi_
103 1.1 mycroft bra.b _TMP_6
104 1.1 mycroft _TMP_4:
105 1.1 mycroft cmp.b #$60,d0 ; NaN?
106 1.1 mycroft bne.b _TMP_5
107 1.1 mycroft bsr _OPn_
108 1.1 mycroft bra.b _TMP_6
109 1.1 mycroft _TMP_5:
110 1.1 mycroft bsr _OPm_ ; assuming a denorm...
111 1.1 mycroft
112 1.1 mycroft _TMP_6:
113 1.1 mycroft fmove.l fpsr,d0 ; update status register
114 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
115 1.1 mycroft fmove.l d0,fpsr
116 1.1 mycroft *
117 1.1 mycroft * Result is now in FP0
118 1.1 mycroft *
119 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
120 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
121 1.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
122 1.1 mycroft unlk a6
123 1.1 mycroft rts
124 1.1 mycroft
125 1.1 mycroft xdef _OPd_
126 1.1 mycroft _OPd_:
127 1.1 mycroft link a6,#-LOCAL_SIZE
128 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
129 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
130 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
131 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
132 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
133 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
134 1.1 mycroft *
135 1.1 mycroft * copy, convert and tag input argument
136 1.1 mycroft *
137 1.1 mycroft fmove.d 8(a6),fp0
138 1.1 mycroft fmove.x fp0,ETEMP(a6)
139 1.1 mycroft lea ETEMP(a6),a0
140 1.1 mycroft bsr tag
141 1.1 mycroft move.b d0,STAG(a6)
142 1.1 mycroft tst.b d0
143 1.1 mycroft bne.b _TMP_7
144 1.1 mycroft bsr _OPr_ ; normalized (regular) number
145 1.1 mycroft bra.b _TMP_B
146 1.1 mycroft _TMP_7:
147 1.1 mycroft cmp.b #$20,d0 ; zero?
148 1.1 mycroft bne.b _TMP_8
149 1.1 mycroft bsr _OPz_
150 1.1 mycroft bra.b _TMP_B
151 1.1 mycroft _TMP_8:
152 1.1 mycroft cmp.b #$40,d0 ; infinity?
153 1.1 mycroft bne.b _TMP_9
154 1.1 mycroft bsr _OPi_
155 1.1 mycroft bra.b _TMP_B
156 1.1 mycroft _TMP_9:
157 1.1 mycroft cmp.b #$60,d0 ; NaN?
158 1.1 mycroft bne.b _TMP_A
159 1.1 mycroft bsr _OPn_
160 1.1 mycroft bra.b _TMP_B
161 1.1 mycroft _TMP_A:
162 1.1 mycroft bsr _OPm_ ; assuming a denorm...
163 1.1 mycroft
164 1.1 mycroft _TMP_B:
165 1.1 mycroft fmove.l fpsr,d0 ; update status register
166 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
167 1.1 mycroft fmove.l d0,fpsr
168 1.1 mycroft *
169 1.1 mycroft * Result is now in FP0
170 1.1 mycroft *
171 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
172 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
173 1.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
174 1.1 mycroft unlk a6
175 1.1 mycroft rts
176 1.1 mycroft
177 1.1 mycroft xdef _OPx_
178 1.1 mycroft _OPx_:
179 1.1 mycroft link a6,#-LOCAL_SIZE
180 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
181 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
182 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
183 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
184 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
185 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
186 1.1 mycroft *
187 1.1 mycroft * copy, convert and tag input argument
188 1.1 mycroft *
189 1.1 mycroft fmove.x 8(a6),fp0
190 1.1 mycroft fmove.x fp0,ETEMP(a6)
191 1.1 mycroft lea ETEMP(a6),a0
192 1.1 mycroft bsr tag
193 1.1 mycroft move.b d0,STAG(a6)
194 1.1 mycroft tst.b d0
195 1.1 mycroft bne.b _TMP_C
196 1.1 mycroft bsr _OPr_ ; normalized (regular) number
197 1.1 mycroft bra.b _TMP_G
198 1.1 mycroft _TMP_C:
199 1.1 mycroft cmp.b #$20,d0 ; zero?
200 1.1 mycroft bne.b _TMP_D
201 1.1 mycroft bsr _OPz_
202 1.1 mycroft bra.b _TMP_G
203 1.1 mycroft _TMP_D:
204 1.1 mycroft cmp.b #$40,d0 ; infinity?
205 1.1 mycroft bne.b _TMP_E
206 1.1 mycroft bsr _OPi_
207 1.1 mycroft bra.b _TMP_G
208 1.1 mycroft _TMP_E:
209 1.1 mycroft cmp.b #$60,d0 ; NaN?
210 1.1 mycroft bne.b _TMP_F
211 1.1 mycroft bsr _OPn_
212 1.1 mycroft bra.b _TMP_G
213 1.1 mycroft _TMP_F:
214 1.1 mycroft bsr _OPm_ ; assuming a denorm...
215 1.1 mycroft
216 1.1 mycroft _TMP_G:
217 1.1 mycroft fmove.l fpsr,d0 ; update status register
218 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
219 1.1 mycroft fmove.l d0,fpsr
220 1.1 mycroft *
221 1.1 mycroft * Result is now in FP0
222 1.1 mycroft *
223 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
224 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
225 1.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
226 1.1 mycroft unlk a6
227 1.1 mycroft rts
228 1.1 mycroft
229