kernel_ex.sa revision 1.2 1 1.2 cgd * $NetBSD: kernel_ex.sa,v 1.2 1994/10/26 07:49:12 cgd Exp $
2 1.2 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 * kernel_ex.sa 3.3 12/19/90
35 1.1 mycroft *
36 1.1 mycroft * This file contains routines to force exception status in the
37 1.1 mycroft * fpu for exceptional cases detected or reported within the
38 1.1 mycroft * transcendental functions. Typically, the t_xx routine will
39 1.1 mycroft * set the appropriate bits in the USER_FPSR word on the stack.
40 1.1 mycroft * The bits are tested in gen_except.sa to determine if an exceptional
41 1.1 mycroft * situation needs to be created on return from the FPSP.
42 1.1 mycroft *
43 1.1 mycroft
44 1.1 mycroft KERNEL_EX IDNT 2,1 Motorola 040 Floating Point Software Package
45 1.1 mycroft
46 1.1 mycroft section 8
47 1.1 mycroft
48 1.1 mycroft include fpsp.h
49 1.1 mycroft
50 1.1 mycroft mns_inf dc.l $ffff0000,$00000000,$00000000
51 1.1 mycroft pls_inf dc.l $7fff0000,$00000000,$00000000
52 1.1 mycroft nan dc.l $7fff0000,$ffffffff,$ffffffff
53 1.1 mycroft huge dc.l $7ffe0000,$ffffffff,$ffffffff
54 1.1 mycroft
55 1.1 mycroft xref ovf_r_k
56 1.1 mycroft xref unf_sub
57 1.1 mycroft xref nrm_set
58 1.1 mycroft
59 1.1 mycroft xdef t_dz
60 1.1 mycroft xdef t_dz2
61 1.1 mycroft xdef t_operr
62 1.1 mycroft xdef t_unfl
63 1.1 mycroft xdef t_ovfl
64 1.1 mycroft xdef t_ovfl2
65 1.1 mycroft xdef t_inx2
66 1.1 mycroft xdef t_frcinx
67 1.1 mycroft xdef t_extdnrm
68 1.1 mycroft xdef t_resdnrm
69 1.1 mycroft xdef dst_nan
70 1.1 mycroft xdef src_nan
71 1.1 mycroft *
72 1.1 mycroft * DZ exception
73 1.1 mycroft *
74 1.1 mycroft *
75 1.1 mycroft * if dz trap disabled
76 1.1 mycroft * store properly signed inf (use sign of etemp) into fp0
77 1.1 mycroft * set FPSR exception status dz bit, condition code
78 1.1 mycroft * inf bit, and accrued dz bit
79 1.1 mycroft * return
80 1.1 mycroft * frestore the frame into the machine (done by unimp_hd)
81 1.1 mycroft *
82 1.1 mycroft * else dz trap enabled
83 1.1 mycroft * set exception status bit & accrued bits in FPSR
84 1.1 mycroft * set flag to disable sto_res from corrupting fp register
85 1.1 mycroft * return
86 1.1 mycroft * frestore the frame into the machine (done by unimp_hd)
87 1.1 mycroft *
88 1.1 mycroft * t_dz2 is used by monadic functions such as flogn (from do_func).
89 1.1 mycroft * t_dz is used by monadic functions such as satanh (from the
90 1.1 mycroft * transcendental function).
91 1.1 mycroft *
92 1.1 mycroft t_dz2:
93 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set neg bit in FPSR
94 1.1 mycroft fmove.l #0,FPSR ;clr status bits (Z set)
95 1.1 mycroft btst.b #dz_bit,FPCR_ENABLE(a6) ;test FPCR for dz exc enabled
96 1.1 mycroft bne.b dz_ena_end
97 1.1 mycroft bra.b m_inf ;flogx always returns -inf
98 1.1 mycroft t_dz:
99 1.1 mycroft fmove.l #0,FPSR ;clr status bits (Z set)
100 1.1 mycroft btst.b #dz_bit,FPCR_ENABLE(a6) ;test FPCR for dz exc enabled
101 1.1 mycroft bne.b dz_ena
102 1.1 mycroft *
103 1.1 mycroft * dz disabled
104 1.1 mycroft *
105 1.1 mycroft btst.b #sign_bit,ETEMP_EX(a6) ;check sign for neg or pos
106 1.1 mycroft beq.b p_inf ;branch if pos sign
107 1.1 mycroft
108 1.1 mycroft m_inf:
109 1.1 mycroft fmovem.x mns_inf,fp0 ;load -inf
110 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set neg bit in FPSR
111 1.1 mycroft bra.b set_fpsr
112 1.1 mycroft p_inf:
113 1.1 mycroft fmovem.x pls_inf,fp0 ;load +inf
114 1.1 mycroft set_fpsr:
115 1.1 mycroft or.l #dzinf_mask,USER_FPSR(a6) ;set I,DZ,ADZ
116 1.1 mycroft rts
117 1.1 mycroft *
118 1.1 mycroft * dz enabled
119 1.1 mycroft *
120 1.1 mycroft dz_ena:
121 1.1 mycroft btst.b #sign_bit,ETEMP_EX(a6) ;check sign for neg or pos
122 1.1 mycroft beq.b dz_ena_end
123 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set neg bit in FPSR
124 1.1 mycroft dz_ena_end:
125 1.1 mycroft or.l #dzinf_mask,USER_FPSR(a6) ;set I,DZ,ADZ
126 1.1 mycroft st.b STORE_FLG(a6)
127 1.1 mycroft rts
128 1.1 mycroft *
129 1.1 mycroft * OPERR exception
130 1.1 mycroft *
131 1.1 mycroft * if (operr trap disabled)
132 1.1 mycroft * set FPSR exception status operr bit, condition code
133 1.1 mycroft * nan bit; Store default NAN into fp0
134 1.1 mycroft * frestore the frame into the machine (done by unimp_hd)
135 1.1 mycroft *
136 1.1 mycroft * else (operr trap enabled)
137 1.1 mycroft * set FPSR exception status operr bit, accrued operr bit
138 1.1 mycroft * set flag to disable sto_res from corrupting fp register
139 1.1 mycroft * frestore the frame into the machine (done by unimp_hd)
140 1.1 mycroft *
141 1.1 mycroft t_operr:
142 1.1 mycroft or.l #opnan_mask,USER_FPSR(a6) ;set NaN, OPERR, AIOP
143 1.1 mycroft
144 1.1 mycroft btst.b #operr_bit,FPCR_ENABLE(a6) ;test FPCR for operr enabled
145 1.1 mycroft bne.b op_ena
146 1.1 mycroft
147 1.1 mycroft fmovem.x nan,fp0 ;load default nan
148 1.1 mycroft rts
149 1.1 mycroft op_ena:
150 1.1 mycroft st.b STORE_FLG(a6) ;do not corrupt destination
151 1.1 mycroft rts
152 1.1 mycroft
153 1.1 mycroft *
154 1.1 mycroft * t_unfl --- UNFL exception
155 1.1 mycroft *
156 1.1 mycroft * This entry point is used by all routines requiring unfl, inex2,
157 1.1 mycroft * aunfl, and ainex to be set on exit.
158 1.1 mycroft *
159 1.1 mycroft * On entry, a0 points to the exceptional operand. The final exceptional
160 1.1 mycroft * operand is built in FP_SCR1 and only the sign from the original operand
161 1.1 mycroft * is used.
162 1.1 mycroft *
163 1.1 mycroft t_unfl:
164 1.1 mycroft clr.l FP_SCR1(a6) ;set exceptional operand to zero
165 1.1 mycroft clr.l FP_SCR1+4(a6)
166 1.1 mycroft clr.l FP_SCR1+8(a6)
167 1.1 mycroft tst.b (a0) ;extract sign from caller's exop
168 1.1 mycroft bpl.b unfl_signok
169 1.1 mycroft bset #sign_bit,FP_SCR1(a6)
170 1.1 mycroft unfl_signok:
171 1.1 mycroft lea.l FP_SCR1(a6),a0
172 1.1 mycroft or.l #unfinx_mask,USER_FPSR(a6)
173 1.1 mycroft * ;set UNFL, INEX2, AUNFL, AINEX
174 1.1 mycroft unfl_con:
175 1.1 mycroft btst.b #unfl_bit,FPCR_ENABLE(a6)
176 1.1 mycroft beq.b unfl_dis
177 1.1 mycroft
178 1.1 mycroft unfl_ena:
179 1.1 mycroft bfclr STAG(a6){5:3} ;clear wbtm66,wbtm1,wbtm0
180 1.1 mycroft bset.b #wbtemp15_bit,WB_BYTE(a6) ;set wbtemp15
181 1.1 mycroft bset.b #sticky_bit,STICKY(a6) ;set sticky bit
182 1.1 mycroft
183 1.1 mycroft bclr.b #E1,E_BYTE(a6)
184 1.1 mycroft
185 1.1 mycroft unfl_dis:
186 1.1 mycroft bfextu FPCR_MODE(a6){0:2},d0 ;get round precision
187 1.1 mycroft
188 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0)
189 1.1 mycroft sne LOCAL_SGN(a0) ;convert to internal ext format
190 1.1 mycroft
191 1.1 mycroft bsr unf_sub ;returns IEEE result at a0
192 1.1 mycroft * ;and sets FPSR_CC accordingly
193 1.1 mycroft
194 1.1 mycroft bfclr LOCAL_SGN(a0){0:8} ;convert back to IEEE ext format
195 1.1 mycroft beq.b unfl_fin
196 1.1 mycroft
197 1.1 mycroft bset.b #sign_bit,LOCAL_EX(a0)
198 1.1 mycroft bset.b #sign_bit,FP_SCR1(a6) ;set sign bit of exc operand
199 1.1 mycroft
200 1.1 mycroft unfl_fin:
201 1.1 mycroft fmovem.x (a0),fp0 ;store result in fp0
202 1.1 mycroft rts
203 1.1 mycroft
204 1.1 mycroft
205 1.1 mycroft *
206 1.1 mycroft * t_ovfl2 --- OVFL exception (without inex2 returned)
207 1.1 mycroft *
208 1.1 mycroft * This entry is used by scale to force catastrophic overflow. The
209 1.1 mycroft * ovfl, aovfl, and ainex bits are set, but not the inex2 bit.
210 1.1 mycroft *
211 1.1 mycroft t_ovfl2:
212 1.1 mycroft or.l #ovfl_inx_mask,USER_FPSR(a6)
213 1.1 mycroft move.l ETEMP(a6),FP_SCR1(a6)
214 1.1 mycroft move.l ETEMP_HI(a6),FP_SCR1+4(a6)
215 1.1 mycroft move.l ETEMP_LO(a6),FP_SCR1+8(a6)
216 1.1 mycroft *
217 1.1 mycroft * Check for single or double round precision. If single, check if
218 1.1 mycroft * the lower 40 bits of ETEMP are zero; if not, set inex2. If double,
219 1.1 mycroft * check if the lower 21 bits are zero; if not, set inex2.
220 1.1 mycroft *
221 1.1 mycroft move.b FPCR_MODE(a6),d0
222 1.1 mycroft andi.b #$c0,d0
223 1.1 mycroft beq.w t_work ;if extended, finish ovfl processing
224 1.1 mycroft cmpi.b #$40,d0 ;test for single
225 1.1 mycroft bne.b t_dbl
226 1.1 mycroft t_sgl:
227 1.1 mycroft tst.b ETEMP_LO(a6)
228 1.1 mycroft bne.b t_setinx2
229 1.1 mycroft move.l ETEMP_HI(a6),d0
230 1.1 mycroft andi.l #$ff,d0 ;look at only lower 8 bits
231 1.1 mycroft bne.b t_setinx2
232 1.1 mycroft bra.w t_work
233 1.1 mycroft t_dbl:
234 1.1 mycroft move.l ETEMP_LO(a6),d0
235 1.1 mycroft andi.l #$7ff,d0 ;look at only lower 11 bits
236 1.1 mycroft beq.w t_work
237 1.1 mycroft t_setinx2:
238 1.1 mycroft or.l #inex2_mask,USER_FPSR(a6)
239 1.1 mycroft bra.b t_work
240 1.1 mycroft *
241 1.1 mycroft * t_ovfl --- OVFL exception
242 1.1 mycroft *
243 1.1 mycroft *** Note: the exc operand is returned in ETEMP.
244 1.1 mycroft *
245 1.1 mycroft t_ovfl:
246 1.1 mycroft or.l #ovfinx_mask,USER_FPSR(a6)
247 1.1 mycroft t_work:
248 1.1 mycroft btst.b #ovfl_bit,FPCR_ENABLE(a6) ;test FPCR for ovfl enabled
249 1.1 mycroft beq.b ovf_dis
250 1.1 mycroft
251 1.1 mycroft ovf_ena:
252 1.1 mycroft clr.l FP_SCR1(a6) ;set exceptional operand
253 1.1 mycroft clr.l FP_SCR1+4(a6)
254 1.1 mycroft clr.l FP_SCR1+8(a6)
255 1.1 mycroft
256 1.1 mycroft bfclr STAG(a6){5:3} ;clear wbtm66,wbtm1,wbtm0
257 1.1 mycroft bclr.b #wbtemp15_bit,WB_BYTE(a6) ;clear wbtemp15
258 1.1 mycroft bset.b #sticky_bit,STICKY(a6) ;set sticky bit
259 1.1 mycroft
260 1.1 mycroft bclr.b #E1,E_BYTE(a6)
261 1.1 mycroft * ;fall through to disabled case
262 1.1 mycroft
263 1.1 mycroft * For disabled overflow call 'ovf_r_k'. This routine loads the
264 1.1 mycroft * correct result based on the rounding precision, destination
265 1.1 mycroft * format, rounding mode and sign.
266 1.1 mycroft *
267 1.1 mycroft ovf_dis:
268 1.1 mycroft bsr ovf_r_k ;returns unsigned ETEMP_EX
269 1.1 mycroft * ;and sets FPSR_CC accordingly.
270 1.1 mycroft bfclr ETEMP_SGN(a6){0:8} ;fix sign
271 1.1 mycroft beq.b ovf_pos
272 1.1 mycroft bset.b #sign_bit,ETEMP_EX(a6)
273 1.1 mycroft bset.b #sign_bit,FP_SCR1(a6) ;set exceptional operand sign
274 1.1 mycroft ovf_pos:
275 1.1 mycroft fmovem.x ETEMP(a6),fp0 ;move the result to fp0
276 1.1 mycroft rts
277 1.1 mycroft
278 1.1 mycroft
279 1.1 mycroft *
280 1.1 mycroft * INEX2 exception
281 1.1 mycroft *
282 1.1 mycroft * The inex2 and ainex bits are set.
283 1.1 mycroft *
284 1.1 mycroft t_inx2:
285 1.1 mycroft or.l #inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
286 1.1 mycroft rts
287 1.1 mycroft
288 1.1 mycroft *
289 1.1 mycroft * Force Inex2
290 1.1 mycroft *
291 1.1 mycroft * This routine is called by the transcendental routines to force
292 1.1 mycroft * the inex2 exception bits set in the FPSR. If the underflow bit
293 1.1 mycroft * is set, but the underflow trap was not taken, the aunfl bit in
294 1.1 mycroft * the FPSR must be set.
295 1.1 mycroft *
296 1.1 mycroft t_frcinx:
297 1.1 mycroft or.l #inx2a_mask,USER_FPSR(a6) ;set INEX2, AINEX
298 1.1 mycroft btst.b #unfl_bit,FPSR_EXCEPT(a6) ;test for unfl bit set
299 1.1 mycroft beq.b no_uacc1 ;if clear, do not set aunfl
300 1.1 mycroft bset.b #aunfl_bit,FPSR_AEXCEPT(a6)
301 1.1 mycroft no_uacc1:
302 1.1 mycroft rts
303 1.1 mycroft
304 1.1 mycroft *
305 1.1 mycroft * DST_NAN
306 1.1 mycroft *
307 1.1 mycroft * Determine if the destination nan is signalling or non-signalling,
308 1.1 mycroft * and set the FPSR bits accordingly. See the MC68040 User's Manual
309 1.1 mycroft * section 3.2.2.5 NOT-A-NUMBERS.
310 1.1 mycroft *
311 1.1 mycroft dst_nan:
312 1.1 mycroft btst.b #sign_bit,FPTEMP_EX(a6) ;test sign of nan
313 1.1 mycroft beq.b dst_pos ;if clr, it was positive
314 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set N bit
315 1.1 mycroft dst_pos:
316 1.1 mycroft btst.b #signan_bit,FPTEMP_HI(a6) ;check if signalling
317 1.1 mycroft beq.b dst_snan ;branch if signalling
318 1.1 mycroft
319 1.1 mycroft fmove.l d1,fpcr ;restore user's rmode/prec
320 1.1 mycroft fmove.x FPTEMP(a6),fp0 ;return the non-signalling nan
321 1.1 mycroft *
322 1.1 mycroft * Check the source nan. If it is signalling, snan will be reported.
323 1.1 mycroft *
324 1.1 mycroft move.b STAG(a6),d0
325 1.1 mycroft andi.b #$e0,d0
326 1.1 mycroft cmpi.b #$60,d0
327 1.1 mycroft bne.b no_snan
328 1.1 mycroft btst.b #signan_bit,ETEMP_HI(a6) ;check if signalling
329 1.1 mycroft bne.b no_snan
330 1.1 mycroft or.l #snaniop_mask,USER_FPSR(a6) ;set NAN, SNAN, AIOP
331 1.1 mycroft no_snan:
332 1.1 mycroft rts
333 1.1 mycroft
334 1.1 mycroft dst_snan:
335 1.1 mycroft btst.b #snan_bit,FPCR_ENABLE(a6) ;check if trap enabled
336 1.1 mycroft beq.b dst_dis ;branch if disabled
337 1.1 mycroft
338 1.1 mycroft or.b #nan_tag,DTAG(a6) ;set up dtag for nan
339 1.1 mycroft st.b STORE_FLG(a6) ;do not store a result
340 1.1 mycroft or.l #snaniop_mask,USER_FPSR(a6) ;set NAN, SNAN, AIOP
341 1.1 mycroft rts
342 1.1 mycroft
343 1.1 mycroft dst_dis:
344 1.1 mycroft bset.b #signan_bit,FPTEMP_HI(a6) ;set SNAN bit in sop
345 1.1 mycroft fmove.l d1,fpcr ;restore user's rmode/prec
346 1.1 mycroft fmove.x FPTEMP(a6),fp0 ;load non-sign. nan
347 1.1 mycroft or.l #snaniop_mask,USER_FPSR(a6) ;set NAN, SNAN, AIOP
348 1.1 mycroft rts
349 1.1 mycroft
350 1.1 mycroft *
351 1.1 mycroft * SRC_NAN
352 1.1 mycroft *
353 1.1 mycroft * Determine if the source nan is signalling or non-signalling,
354 1.1 mycroft * and set the FPSR bits accordingly. See the MC68040 User's Manual
355 1.1 mycroft * section 3.2.2.5 NOT-A-NUMBERS.
356 1.1 mycroft *
357 1.1 mycroft src_nan:
358 1.1 mycroft btst.b #sign_bit,ETEMP_EX(a6) ;test sign of nan
359 1.1 mycroft beq.b src_pos ;if clr, it was positive
360 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set N bit
361 1.1 mycroft src_pos:
362 1.1 mycroft btst.b #signan_bit,ETEMP_HI(a6) ;check if signalling
363 1.1 mycroft beq.b src_snan ;branch if signalling
364 1.1 mycroft fmove.l d1,fpcr ;restore user's rmode/prec
365 1.1 mycroft fmove.x ETEMP(a6),fp0 ;return the non-signalling nan
366 1.1 mycroft rts
367 1.1 mycroft
368 1.1 mycroft src_snan:
369 1.1 mycroft btst.b #snan_bit,FPCR_ENABLE(a6) ;check if trap enabled
370 1.1 mycroft beq.b src_dis ;branch if disabled
371 1.1 mycroft bset.b #signan_bit,ETEMP_HI(a6) ;set SNAN bit in sop
372 1.1 mycroft or.b #norm_tag,DTAG(a6) ;set up dtag for norm
373 1.1 mycroft or.b #nan_tag,STAG(a6) ;set up stag for nan
374 1.1 mycroft st.b STORE_FLG(a6) ;do not store a result
375 1.1 mycroft or.l #snaniop_mask,USER_FPSR(a6) ;set NAN, SNAN, AIOP
376 1.1 mycroft rts
377 1.1 mycroft
378 1.1 mycroft src_dis:
379 1.1 mycroft bset.b #signan_bit,ETEMP_HI(a6) ;set SNAN bit in sop
380 1.1 mycroft fmove.l d1,fpcr ;restore user's rmode/prec
381 1.1 mycroft fmove.x ETEMP(a6),fp0 ;load non-sign. nan
382 1.1 mycroft or.l #snaniop_mask,USER_FPSR(a6) ;set NAN, SNAN, AIOP
383 1.1 mycroft rts
384 1.1 mycroft
385 1.1 mycroft *
386 1.1 mycroft * For all functions that have a denormalized input and that f(x)=x,
387 1.1 mycroft * this is the entry point
388 1.1 mycroft *
389 1.1 mycroft t_extdnrm:
390 1.1 mycroft or.l #unfinx_mask,USER_FPSR(a6)
391 1.1 mycroft * ;set UNFL, INEX2, AUNFL, AINEX
392 1.1 mycroft bra.b xdnrm_con
393 1.1 mycroft *
394 1.1 mycroft * Entry point for scale with extended denorm. The function does
395 1.1 mycroft * not set inex2, aunfl, or ainex.
396 1.1 mycroft *
397 1.1 mycroft t_resdnrm:
398 1.1 mycroft or.l #unfl_mask,USER_FPSR(a6)
399 1.1 mycroft
400 1.1 mycroft xdnrm_con:
401 1.1 mycroft btst.b #unfl_bit,FPCR_ENABLE(a6)
402 1.1 mycroft beq.b xdnrm_dis
403 1.1 mycroft
404 1.1 mycroft *
405 1.1 mycroft * If exceptions are enabled, the additional task of setting up WBTEMP
406 1.1 mycroft * is needed so that when the underflow exception handler is entered,
407 1.1 mycroft * the user perceives no difference between what the 040 provides vs.
408 1.1 mycroft * what the FPSP provides.
409 1.1 mycroft *
410 1.1 mycroft xdnrm_ena:
411 1.1 mycroft move.l a0,-(a7)
412 1.1 mycroft
413 1.1 mycroft move.l LOCAL_EX(a0),FP_SCR1(a6)
414 1.1 mycroft move.l LOCAL_HI(a0),FP_SCR1+4(a6)
415 1.1 mycroft move.l LOCAL_LO(a0),FP_SCR1+8(a6)
416 1.1 mycroft
417 1.1 mycroft lea FP_SCR1(a6),a0
418 1.1 mycroft
419 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0)
420 1.1 mycroft sne LOCAL_SGN(a0) ;convert to internal ext format
421 1.1 mycroft tst.w LOCAL_EX(a0) ;check if input is denorm
422 1.1 mycroft beq.b xdnrm_dn ;if so, skip nrm_set
423 1.1 mycroft bsr nrm_set ;normalize the result (exponent
424 1.1 mycroft * ;will be negative
425 1.1 mycroft xdnrm_dn:
426 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0) ;take off false sign
427 1.1 mycroft bfclr LOCAL_SGN(a0){0:8} ;change back to IEEE ext format
428 1.1 mycroft beq.b xdep
429 1.1 mycroft bset.b #sign_bit,LOCAL_EX(a0)
430 1.1 mycroft xdep:
431 1.1 mycroft bfclr STAG(a6){5:3} ;clear wbtm66,wbtm1,wbtm0
432 1.1 mycroft bset.b #wbtemp15_bit,WB_BYTE(a6) ;set wbtemp15
433 1.1 mycroft bclr.b #sticky_bit,STICKY(a6) ;clear sticky bit
434 1.1 mycroft bclr.b #E1,E_BYTE(a6)
435 1.1 mycroft move.l (a7)+,a0
436 1.1 mycroft xdnrm_dis:
437 1.1 mycroft bfextu FPCR_MODE(a6){0:2},d0 ;get round precision
438 1.1 mycroft bne.b not_ext ;if not round extended, store
439 1.1 mycroft * ;IEEE defaults
440 1.1 mycroft is_ext:
441 1.1 mycroft btst.b #sign_bit,LOCAL_EX(a0)
442 1.1 mycroft beq.b xdnrm_store
443 1.1 mycroft
444 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6) ;set N bit in FPSR_CC
445 1.1 mycroft
446 1.1 mycroft bra.b xdnrm_store
447 1.1 mycroft
448 1.1 mycroft not_ext:
449 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0)
450 1.1 mycroft sne LOCAL_SGN(a0) ;convert to internal ext format
451 1.1 mycroft bsr unf_sub ;returns IEEE result pointed by
452 1.1 mycroft * ;a0; sets FPSR_CC accordingly
453 1.1 mycroft bfclr LOCAL_SGN(a0){0:8} ;convert back to IEEE ext format
454 1.1 mycroft beq.b xdnrm_store
455 1.1 mycroft bset.b #sign_bit,LOCAL_EX(a0)
456 1.1 mycroft xdnrm_store:
457 1.1 mycroft fmovem.x (a0),fp0 ;store result in fp0
458 1.1 mycroft rts
459 1.1 mycroft
460 1.1 mycroft *
461 1.1 mycroft * This subroutine is used for dyadic operations that use an extended
462 1.1 mycroft * denorm within the kernel. The approach used is to capture the frame,
463 1.1 mycroft * fix/restore.
464 1.1 mycroft *
465 1.1 mycroft xdef t_avoid_unsupp
466 1.1 mycroft t_avoid_unsupp:
467 1.1 mycroft link a2,#-LOCAL_SIZE ;so that a2 fpsp.h negative
468 1.1 mycroft * ;offsets may be used
469 1.1 mycroft fsave -(a7)
470 1.1 mycroft tst.b 1(a7) ;check if idle, exit if so
471 1.1 mycroft beq.w idle_end
472 1.1 mycroft btst.b #E1,E_BYTE(a2) ;check for an E1 exception if
473 1.1 mycroft * ;enabled, there is an unsupp
474 1.1 mycroft beq.w end_avun ;else, exit
475 1.1 mycroft btst.b #7,DTAG(a2) ;check for denorm destination
476 1.1 mycroft beq.b src_den ;else, must be a source denorm
477 1.1 mycroft *
478 1.1 mycroft * handle destination denorm
479 1.1 mycroft *
480 1.1 mycroft lea FPTEMP(a2),a0
481 1.1 mycroft btst.b #sign_bit,LOCAL_EX(a0)
482 1.1 mycroft sne LOCAL_SGN(a0) ;convert to internal ext format
483 1.1 mycroft bclr.b #7,DTAG(a2) ;set DTAG to norm
484 1.1 mycroft bsr nrm_set ;normalize result, exponent
485 1.1 mycroft * ;will become negative
486 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0) ;get rid of fake sign
487 1.1 mycroft bfclr LOCAL_SGN(a0){0:8} ;convert back to IEEE ext format
488 1.1 mycroft beq.b ck_src_den ;check if source is also denorm
489 1.1 mycroft bset.b #sign_bit,LOCAL_EX(a0)
490 1.1 mycroft ck_src_den:
491 1.1 mycroft btst.b #7,STAG(a2)
492 1.1 mycroft beq.b end_avun
493 1.1 mycroft src_den:
494 1.1 mycroft lea ETEMP(a2),a0
495 1.1 mycroft btst.b #sign_bit,LOCAL_EX(a0)
496 1.1 mycroft sne LOCAL_SGN(a0) ;convert to internal ext format
497 1.1 mycroft bclr.b #7,STAG(a2) ;set STAG to norm
498 1.1 mycroft bsr nrm_set ;normalize result, exponent
499 1.1 mycroft * ;will become negative
500 1.1 mycroft bclr.b #sign_bit,LOCAL_EX(a0) ;get rid of fake sign
501 1.1 mycroft bfclr LOCAL_SGN(a0){0:8} ;convert back to IEEE ext format
502 1.1 mycroft beq.b den_com
503 1.1 mycroft bset.b #sign_bit,LOCAL_EX(a0)
504 1.1 mycroft den_com:
505 1.1 mycroft move.b #$fe,CU_SAVEPC(a2) ;set continue frame
506 1.1 mycroft clr.w NMNEXC(a2) ;clear NMNEXC
507 1.1 mycroft bclr.b #E1,E_BYTE(a2)
508 1.1 mycroft * fmove.l FPSR,FPSR_SHADOW(a2)
509 1.1 mycroft * bset.b #SFLAG,E_BYTE(a2)
510 1.1 mycroft * bset.b #XFLAG,T_BYTE(a2)
511 1.1 mycroft end_avun:
512 1.1 mycroft frestore (a7)+
513 1.1 mycroft unlk a2
514 1.1 mycroft rts
515 1.1 mycroft idle_end:
516 1.1 mycroft add.l #4,a7
517 1.1 mycroft unlk a2
518 1.1 mycroft rts
519 1.1 mycroft end
520