MONADIC.GEN revision 1.3 1 1.3 cgd * $NetBSD: MONADIC.GEN,v 1.3 1994/10/26 07:48:42 cgd Exp $
2 1.3 cgd
3 1.1 mycroft * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4 1.1 mycroft * M68000 Hi-Performance Microprocessor Division
5 1.1 mycroft * M68040 Software Package
6 1.1 mycroft *
7 1.1 mycroft * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8 1.1 mycroft * All rights reserved.
9 1.1 mycroft *
10 1.1 mycroft * THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11 1.1 mycroft * To the maximum extent permitted by applicable law,
12 1.1 mycroft * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13 1.1 mycroft * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14 1.1 mycroft * PARTICULAR PURPOSE and any warranty against infringement with
15 1.1 mycroft * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16 1.1 mycroft * and any accompanying written materials.
17 1.1 mycroft *
18 1.1 mycroft * To the maximum extent permitted by applicable law,
19 1.1 mycroft * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20 1.1 mycroft * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21 1.1 mycroft * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22 1.1 mycroft * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23 1.1 mycroft * SOFTWARE. Motorola assumes no responsibility for the maintenance
24 1.1 mycroft * and support of the SOFTWARE.
25 1.1 mycroft *
26 1.1 mycroft * You are hereby granted a copyright license to use, modify, and
27 1.1 mycroft * distribute the SOFTWARE so long as this entire notice is retained
28 1.1 mycroft * without alteration in any modified and/or redistributed versions,
29 1.1 mycroft * and that such modified versions are clearly identified as such.
30 1.1 mycroft * No licenses are granted by implication, estoppel or otherwise
31 1.1 mycroft * under any patents or trademarks of Motorola, Inc.
32 1.1 mycroft
33 1.1 mycroft *
34 1.1 mycroft * MONADIC.GEN 1.5 5/18/92
35 1.1 mycroft *
36 1.1 mycroft * MONADIC.GEN 1.4 1/16/92
37 1.1 mycroft *
38 1.1 mycroft * MONADIC.GEN 1.3 4/30/91
39 1.1 mycroft *
40 1.1 mycroft * MONADIC.GEN --- generic MONADIC template
41 1.1 mycroft *
42 1.1 mycroft * This version saves all registers that will be used by the emulation
43 1.1 mycroft * routines and restores all but FP0 on exit. The FPSR is
44 1.1 mycroft * updated to reflect the result of the operation. Return value
45 1.1 mycroft * is placed in FP0 for single, double and extended results.
46 1.1 mycroft *
47 1.1 mycroft * The package subroutines expect the incoming FPCR to be zeroed
48 1.1 mycroft * since they need extended precision to work properly. The
49 1.1 mycroft * 'final' FPCR is expected in d1 so that the calculated result
50 1.1 mycroft * can be properly sized and rounded. Also, if the incoming FPCR
51 1.1 mycroft * has enabled any exceptions, the exception will be taken on the
52 1.1 mycroft * final fmovem in this template.
53 1.1 mycroft *
54 1.1 mycroft * Customizations:
55 1.1 mycroft * 1. Remove the movem.l at the entry and exit of
56 1.1 mycroft * each routine if your compiler treats those
57 1.1 mycroft * registers as scratch.
58 1.1 mycroft * 2. Likewise, don't save FP0/FP1 if they are scratch
59 1.1 mycroft * registers.
60 1.1 mycroft * 3. Delete handling of the fpsr if you only care about
61 1.1 mycroft * the result.
62 1.1 mycroft * 4. Some (most?) C compilers convert all float arguments
63 1.1 mycroft * to double, and provide no support at all for extended
64 1.1 mycroft * precision so remove the _OPs_ and _OPx_ entry points.
65 1.1 mycroft * 5. Move the result to d0/d1 if the compiler is that old.
66 1.1 mycroft *
67 1.1 mycroft
68 1.1 mycroft xref tag
69 1.1 mycroft xref _OPr_
70 1.1 mycroft xref _OPz_
71 1.1 mycroft xref _OPi_
72 1.1 mycroft xref _OPn_
73 1.1 mycroft xref _OPm_
74 1.1 mycroft
75 1.1 mycroft xdef _OPs_
76 1.1 mycroft _OPs_:
77 1.1 mycroft link a6,#-LOCAL_SIZE
78 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
79 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
80 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
81 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
82 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
83 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
84 1.1 mycroft *
85 1.1 mycroft * copy, convert and tag input argument
86 1.1 mycroft *
87 1.1 mycroft fmove.s 8(a6),fp0
88 1.1 mycroft fmove.x fp0,ETEMP(a6)
89 1.1 mycroft lea ETEMP(a6),a0
90 1.1 mycroft bsr tag
91 1.1 mycroft move.b d0,STAG(a6)
92 1.1 mycroft tst.b d0
93 1.1 mycroft bne.b _TMP_2
94 1.1 mycroft bsr _OPr_ ; normalized (regular) number
95 1.1 mycroft bra.b _TMP_6
96 1.1 mycroft _TMP_2:
97 1.1 mycroft cmp.b #$20,d0 ; zero?
98 1.1 mycroft bne.b _TMP_3
99 1.1 mycroft bsr _OPz_
100 1.1 mycroft bra.b _TMP_6
101 1.1 mycroft _TMP_3:
102 1.1 mycroft cmp.b #$40,d0 ; infinity?
103 1.1 mycroft bne.b _TMP_4
104 1.1 mycroft bsr _OPi_
105 1.1 mycroft bra.b _TMP_6
106 1.1 mycroft _TMP_4:
107 1.1 mycroft cmp.b #$60,d0 ; NaN?
108 1.1 mycroft bne.b _TMP_5
109 1.1 mycroft bsr _OPn_
110 1.1 mycroft bra.b _TMP_6
111 1.1 mycroft _TMP_5:
112 1.1 mycroft bsr _OPm_ ; assuming a denorm...
113 1.1 mycroft
114 1.1 mycroft _TMP_6:
115 1.1 mycroft fmove.l fpsr,d0 ; update status register
116 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
117 1.1 mycroft fmove.l d0,fpsr
118 1.1 mycroft *
119 1.1 mycroft * Result is now in FP0
120 1.1 mycroft *
121 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
122 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
123 1.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
124 1.1 mycroft unlk a6
125 1.1 mycroft rts
126 1.1 mycroft
127 1.1 mycroft xdef _OPd_
128 1.1 mycroft _OPd_:
129 1.1 mycroft link a6,#-LOCAL_SIZE
130 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
131 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
132 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
133 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
134 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
135 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
136 1.1 mycroft *
137 1.1 mycroft * copy, convert and tag input argument
138 1.1 mycroft *
139 1.1 mycroft fmove.d 8(a6),fp0
140 1.1 mycroft fmove.x fp0,ETEMP(a6)
141 1.1 mycroft lea ETEMP(a6),a0
142 1.1 mycroft bsr tag
143 1.1 mycroft move.b d0,STAG(a6)
144 1.1 mycroft tst.b d0
145 1.1 mycroft bne.b _TMP_7
146 1.1 mycroft bsr _OPr_ ; normalized (regular) number
147 1.1 mycroft bra.b _TMP_B
148 1.1 mycroft _TMP_7:
149 1.1 mycroft cmp.b #$20,d0 ; zero?
150 1.1 mycroft bne.b _TMP_8
151 1.1 mycroft bsr _OPz_
152 1.1 mycroft bra.b _TMP_B
153 1.1 mycroft _TMP_8:
154 1.1 mycroft cmp.b #$40,d0 ; infinity?
155 1.1 mycroft bne.b _TMP_9
156 1.1 mycroft bsr _OPi_
157 1.1 mycroft bra.b _TMP_B
158 1.1 mycroft _TMP_9:
159 1.1 mycroft cmp.b #$60,d0 ; NaN?
160 1.1 mycroft bne.b _TMP_A
161 1.1 mycroft bsr _OPn_
162 1.1 mycroft bra.b _TMP_B
163 1.1 mycroft _TMP_A:
164 1.1 mycroft bsr _OPm_ ; assuming a denorm...
165 1.1 mycroft
166 1.1 mycroft _TMP_B:
167 1.1 mycroft fmove.l fpsr,d0 ; update status register
168 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
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.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
176 1.1 mycroft unlk a6
177 1.1 mycroft rts
178 1.1 mycroft
179 1.1 mycroft xdef _OPx_
180 1.1 mycroft _OPx_:
181 1.1 mycroft link a6,#-LOCAL_SIZE
182 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
183 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
184 1.1 mycroft fmove.l fpsr,USER_FPSR(a6)
185 1.1 mycroft fmove.l fpcr,USER_FPCR(a6)
186 1.1 mycroft fmove.l fpcr,d1 ; user's rounding mode/precision
187 1.1 mycroft fmove.l #0,fpcr ; force rounding mode/prec to extended,rn
188 1.1 mycroft *
189 1.1 mycroft * copy, convert and tag input argument
190 1.1 mycroft *
191 1.1 mycroft fmove.x 8(a6),fp0
192 1.1 mycroft fmove.x fp0,ETEMP(a6)
193 1.1 mycroft lea ETEMP(a6),a0
194 1.1 mycroft bsr tag
195 1.1 mycroft move.b d0,STAG(a6)
196 1.1 mycroft tst.b d0
197 1.1 mycroft bne.b _TMP_C
198 1.1 mycroft bsr _OPr_ ; normalized (regular) number
199 1.1 mycroft bra.b _TMP_G
200 1.1 mycroft _TMP_C:
201 1.1 mycroft cmp.b #$20,d0 ; zero?
202 1.1 mycroft bne.b _TMP_D
203 1.1 mycroft bsr _OPz_
204 1.1 mycroft bra.b _TMP_G
205 1.1 mycroft _TMP_D:
206 1.1 mycroft cmp.b #$40,d0 ; infinity?
207 1.1 mycroft bne.b _TMP_E
208 1.1 mycroft bsr _OPi_
209 1.1 mycroft bra.b _TMP_G
210 1.1 mycroft _TMP_E:
211 1.1 mycroft cmp.b #$60,d0 ; NaN?
212 1.1 mycroft bne.b _TMP_F
213 1.1 mycroft bsr _OPn_
214 1.1 mycroft bra.b _TMP_G
215 1.1 mycroft _TMP_F:
216 1.1 mycroft bsr _OPm_ ; assuming a denorm...
217 1.1 mycroft
218 1.1 mycroft _TMP_G:
219 1.1 mycroft fmove.l fpsr,d0 ; update status register
220 1.2 mycroft or.b FPSR_AEXCEPT(a6),d0 ;add previously accrued exceptions
221 1.1 mycroft fmove.l d0,fpsr
222 1.1 mycroft *
223 1.1 mycroft * Result is now in FP0
224 1.1 mycroft *
225 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
226 1.1 mycroft fmovem.x USER_FP1(a6),fp1-fp3 ; note: FP0 not restored
227 1.2 mycroft fmove.l USER_FPCR(a6),fpcr ; fpcr restored
228 1.1 mycroft unlk a6
229 1.1 mycroft rts
230 1.1 mycroft
231