x_snan.sa revision 1.3.46.1 1 1.3.46.1 thorpej * $NetBSD: x_snan.sa,v 1.3.46.1 2002/01/10 19:45:27 thorpej 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 * x_snan.sa 3.3 7/1/91
35 1.1 mycroft *
36 1.1 mycroft * fpsp_snan --- FPSP handler for signalling NAN exception
37 1.1 mycroft *
38 1.1 mycroft * SNAN for float -> integer conversions (integer conversion of
39 1.1 mycroft * an SNAN) is a non-maskable run-time exception.
40 1.1 mycroft *
41 1.1 mycroft * For trap disabled the 040 does the following:
42 1.1 mycroft * If the dest data format is s, d, or x, then the SNAN bit in the NAN
43 1.1 mycroft * is set to one and the resulting non-signaling NAN (truncated if
44 1.1 mycroft * necessary) is transferred to the dest. If the dest format is b, w,
45 1.1 mycroft * or l, then garbage is written to the dest (actually the upper 32 bits
46 1.1 mycroft * of the mantissa are sent to the integer unit).
47 1.1 mycroft *
48 1.1 mycroft * For trap enabled the 040 does the following:
49 1.1 mycroft * If the inst is move_out, then the results are the same as for trap
50 1.1 mycroft * disabled with the exception posted. If the instruction is not move_
51 1.1 mycroft * out, the dest. is not modified, and the exception is posted.
52 1.1 mycroft *
53 1.1 mycroft
54 1.1 mycroft X_SNAN IDNT 2,1 Motorola 040 Floating Point Software Package
55 1.1 mycroft
56 1.1 mycroft section 8
57 1.1 mycroft
58 1.1 mycroft include fpsp.h
59 1.1 mycroft
60 1.1 mycroft xref get_fline
61 1.1 mycroft xref mem_write
62 1.1 mycroft xref real_snan
63 1.1 mycroft xref real_inex
64 1.1 mycroft xref fpsp_done
65 1.1 mycroft xref reg_dest
66 1.1 mycroft
67 1.1 mycroft xdef fpsp_snan
68 1.1 mycroft fpsp_snan:
69 1.1 mycroft link a6,#-LOCAL_SIZE
70 1.1 mycroft fsave -(a7)
71 1.1 mycroft movem.l d0-d1/a0-a1,USER_DA(a6)
72 1.1 mycroft fmovem.x fp0-fp3,USER_FP0(a6)
73 1.1 mycroft fmovem.l fpcr/fpsr/fpiar,USER_FPCR(a6)
74 1.1 mycroft
75 1.1 mycroft *
76 1.1 mycroft * Check if trap enabled
77 1.1 mycroft *
78 1.1 mycroft btst.b #snan_bit,FPCR_ENABLE(a6)
79 1.1 mycroft bne.b ena ;If enabled, then branch
80 1.1 mycroft
81 1.1 mycroft bsr.l move_out ;else SNAN disabled
82 1.1 mycroft *
83 1.1 mycroft * It is possible to have an inex1 exception with the
84 1.1 mycroft * snan. If the inex enable bit is set in the FPCR, and either
85 1.3.46.1 thorpej * inex2 or inex1 occurred, we must clean up and branch to the
86 1.1 mycroft * real inex handler.
87 1.1 mycroft *
88 1.1 mycroft ck_inex:
89 1.1 mycroft move.b FPCR_ENABLE(a6),d0
90 1.1 mycroft and.b FPSR_EXCEPT(a6),d0
91 1.1 mycroft andi.b #$3,d0
92 1.1 mycroft beq.w end_snan
93 1.1 mycroft *
94 1.1 mycroft * Inexact enabled and reported, and we must take an inexact exception.
95 1.1 mycroft *
96 1.1 mycroft take_inex:
97 1.1 mycroft move.b #INEX_VEC,EXC_VEC+1(a6)
98 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
99 1.1 mycroft fmovem.x USER_FP0(a6),fp0-fp3
100 1.1 mycroft fmovem.l USER_FPCR(a6),fpcr/fpsr/fpiar
101 1.1 mycroft frestore (a7)+
102 1.1 mycroft unlk a6
103 1.1 mycroft bra.l real_inex
104 1.1 mycroft *
105 1.1 mycroft * SNAN is enabled. Check if inst is move_out.
106 1.1 mycroft * Make any corrections to the 040 output as necessary.
107 1.1 mycroft *
108 1.1 mycroft ena:
109 1.1 mycroft btst.b #5,CMDREG1B(a6) ;if set, inst is move out
110 1.1 mycroft beq.w not_out
111 1.1 mycroft
112 1.1 mycroft bsr.l move_out
113 1.1 mycroft
114 1.1 mycroft report_snan:
115 1.1 mycroft move.b (a7),VER_TMP(a6)
116 1.1 mycroft cmpi.b #VER_40,(a7) ;test for orig unimp frame
117 1.1 mycroft bne.b ck_rev
118 1.1 mycroft moveq.l #13,d0 ;need to zero 14 lwords
119 1.1 mycroft bra.b rep_con
120 1.1 mycroft ck_rev:
121 1.1 mycroft moveq.l #11,d0 ;need to zero 12 lwords
122 1.1 mycroft rep_con:
123 1.1 mycroft clr.l (a7)
124 1.1 mycroft loop1:
125 1.1 mycroft clr.l -(a7) ;clear and dec a7
126 1.1 mycroft dbra.w d0,loop1
127 1.1 mycroft move.b VER_TMP(a6),(a7) ;format a busy frame
128 1.1 mycroft move.b #BUSY_SIZE-4,1(a7)
129 1.1 mycroft move.l USER_FPSR(a6),FPSR_SHADOW(a6)
130 1.1 mycroft or.l #sx_mask,E_BYTE(a6)
131 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
132 1.1 mycroft fmovem.x USER_FP0(a6),fp0-fp3
133 1.1 mycroft fmovem.l USER_FPCR(a6),fpcr/fpsr/fpiar
134 1.1 mycroft frestore (a7)+
135 1.1 mycroft unlk a6
136 1.1 mycroft bra.l real_snan
137 1.1 mycroft *
138 1.1 mycroft * Exit snan handler by expanding the unimp frame into a busy frame
139 1.1 mycroft *
140 1.1 mycroft end_snan:
141 1.1 mycroft bclr.b #E1,E_BYTE(a6)
142 1.1 mycroft
143 1.1 mycroft move.b (a7),VER_TMP(a6)
144 1.1 mycroft cmpi.b #VER_40,(a7) ;test for orig unimp frame
145 1.1 mycroft bne.b ck_rev2
146 1.1 mycroft moveq.l #13,d0 ;need to zero 14 lwords
147 1.1 mycroft bra.b rep_con2
148 1.1 mycroft ck_rev2:
149 1.1 mycroft moveq.l #11,d0 ;need to zero 12 lwords
150 1.1 mycroft rep_con2:
151 1.1 mycroft clr.l (a7)
152 1.1 mycroft loop2:
153 1.1 mycroft clr.l -(a7) ;clear and dec a7
154 1.1 mycroft dbra.w d0,loop2
155 1.1 mycroft move.b VER_TMP(a6),(a7) ;format a busy frame
156 1.1 mycroft move.b #BUSY_SIZE-4,1(a7) ;write busy size
157 1.1 mycroft move.l USER_FPSR(a6),FPSR_SHADOW(a6)
158 1.1 mycroft or.l #sx_mask,E_BYTE(a6)
159 1.1 mycroft movem.l USER_DA(a6),d0-d1/a0-a1
160 1.1 mycroft fmovem.x USER_FP0(a6),fp0-fp3
161 1.1 mycroft fmovem.l USER_FPCR(a6),fpcr/fpsr/fpiar
162 1.1 mycroft frestore (a7)+
163 1.1 mycroft unlk a6
164 1.1 mycroft bra.l fpsp_done
165 1.1 mycroft
166 1.1 mycroft *
167 1.1 mycroft * Move_out
168 1.1 mycroft *
169 1.1 mycroft move_out:
170 1.1 mycroft move.l EXC_EA(a6),a0 ;get <ea> from exc frame
171 1.1 mycroft
172 1.1 mycroft bfextu CMDREG1B(a6){3:3},d0 ;move rx field to d0{2:0}
173 1.2 mycroft tst.l d0 ;check for long
174 1.1 mycroft beq.b sto_long ;branch if move_out long
175 1.1 mycroft
176 1.1 mycroft cmpi.l #4,d0 ;check for word
177 1.1 mycroft beq.b sto_word ;branch if move_out word
178 1.1 mycroft
179 1.1 mycroft cmpi.l #6,d0 ;check for byte
180 1.1 mycroft beq.b sto_byte ;branch if move_out byte
181 1.1 mycroft
182 1.1 mycroft *
183 1.1 mycroft * Not byte, word or long
184 1.1 mycroft *
185 1.1 mycroft rts
186 1.1 mycroft *
187 1.1 mycroft * Get the 32 most significant bits of etemp mantissa
188 1.1 mycroft *
189 1.1 mycroft sto_long:
190 1.1 mycroft move.l ETEMP_HI(a6),d1
191 1.1 mycroft move.l #4,d0 ;load byte count
192 1.1 mycroft *
193 1.1 mycroft * Set signalling nan bit
194 1.1 mycroft *
195 1.1 mycroft bset.l #30,d1
196 1.1 mycroft *
197 1.1 mycroft * Store to the users destination address
198 1.1 mycroft *
199 1.1 mycroft tst.l a0 ;check if <ea> is 0
200 1.1 mycroft beq.b wrt_dn ;destination is a data register
201 1.1 mycroft
202 1.1 mycroft move.l d1,-(a7) ;move the snan onto the stack
203 1.1 mycroft move.l a0,a1 ;load dest addr into a1
204 1.1 mycroft move.l a7,a0 ;load src addr of snan into a0
205 1.1 mycroft bsr.l mem_write ;write snan to user memory
206 1.1 mycroft move.l (a7)+,d1 ;clear off stack
207 1.1 mycroft rts
208 1.1 mycroft *
209 1.1 mycroft * Get the 16 most significant bits of etemp mantissa
210 1.1 mycroft *
211 1.1 mycroft sto_word:
212 1.1 mycroft move.l ETEMP_HI(a6),d1
213 1.1 mycroft move.l #2,d0 ;load byte count
214 1.1 mycroft *
215 1.1 mycroft * Set signalling nan bit
216 1.1 mycroft *
217 1.1 mycroft bset.l #30,d1
218 1.1 mycroft *
219 1.1 mycroft * Store to the users destination address
220 1.1 mycroft *
221 1.1 mycroft tst.l a0 ;check if <ea> is 0
222 1.1 mycroft beq.b wrt_dn ;destination is a data register
223 1.1 mycroft
224 1.1 mycroft move.l d1,-(a7) ;move the snan onto the stack
225 1.1 mycroft move.l a0,a1 ;load dest addr into a1
226 1.1 mycroft move.l a7,a0 ;point to low word
227 1.1 mycroft bsr.l mem_write ;write snan to user memory
228 1.1 mycroft move.l (a7)+,d1 ;clear off stack
229 1.1 mycroft rts
230 1.1 mycroft *
231 1.1 mycroft * Get the 8 most significant bits of etemp mantissa
232 1.1 mycroft *
233 1.1 mycroft sto_byte:
234 1.1 mycroft move.l ETEMP_HI(a6),d1
235 1.1 mycroft move.l #1,d0 ;load byte count
236 1.1 mycroft *
237 1.1 mycroft * Set signalling nan bit
238 1.1 mycroft *
239 1.1 mycroft bset.l #30,d1
240 1.1 mycroft *
241 1.1 mycroft * Store to the users destination address
242 1.1 mycroft *
243 1.1 mycroft tst.l a0 ;check if <ea> is 0
244 1.1 mycroft beq.b wrt_dn ;destination is a data register
245 1.1 mycroft move.l d1,-(a7) ;move the snan onto the stack
246 1.1 mycroft move.l a0,a1 ;load dest addr into a1
247 1.1 mycroft move.l a7,a0 ;point to source byte
248 1.1 mycroft bsr.l mem_write ;write snan to user memory
249 1.1 mycroft move.l (a7)+,d1 ;clear off stack
250 1.1 mycroft rts
251 1.1 mycroft
252 1.1 mycroft *
253 1.1 mycroft * wrt_dn --- write to a data register
254 1.1 mycroft *
255 1.1 mycroft * We get here with D1 containing the data to write and D0 the
256 1.1 mycroft * number of bytes to write: 1=byte,2=word,4=long.
257 1.1 mycroft *
258 1.1 mycroft wrt_dn:
259 1.1 mycroft move.l d1,L_SCR1(a6) ;data
260 1.1 mycroft move.l d0,-(a7) ;size
261 1.1 mycroft bsr.l get_fline ;returns fline word in d0
262 1.1 mycroft move.l d0,d1
263 1.1 mycroft andi.l #$7,d1 ;d1 now holds register number
264 1.1 mycroft move.l (sp)+,d0 ;get original size
265 1.1 mycroft cmpi.l #4,d0
266 1.1 mycroft beq.b wrt_long
267 1.1 mycroft cmpi.l #2,d0
268 1.1 mycroft bne.b wrt_byte
269 1.1 mycroft wrt_word:
270 1.1 mycroft or.l #$8,d1
271 1.1 mycroft bra.l reg_dest
272 1.1 mycroft wrt_long:
273 1.1 mycroft or.l #$10,d1
274 1.1 mycroft bra.l reg_dest
275 1.1 mycroft wrt_byte:
276 1.1 mycroft bra.l reg_dest
277 1.1 mycroft *
278 1.1 mycroft * Check if it is a src nan or dst nan
279 1.1 mycroft *
280 1.1 mycroft not_out:
281 1.1 mycroft move.l DTAG(a6),d0
282 1.1 mycroft bfextu d0{0:3},d0 ;isolate dtag in lsbs
283 1.1 mycroft
284 1.1 mycroft cmpi.b #3,d0 ;check for nan in destination
285 1.1 mycroft bne.b issrc ;destination nan has priority
286 1.1 mycroft dst_nan:
287 1.1 mycroft btst.b #6,FPTEMP_HI(a6) ;check if dest nan is an snan
288 1.1 mycroft bne.b issrc ;no, so check source for snan
289 1.1 mycroft move.w FPTEMP_EX(a6),d0
290 1.1 mycroft bra.b cont
291 1.1 mycroft issrc:
292 1.1 mycroft move.w ETEMP_EX(a6),d0
293 1.1 mycroft cont:
294 1.1 mycroft btst.l #15,d0 ;test for sign of snan
295 1.1 mycroft beq.b clr_neg
296 1.1 mycroft bset.b #neg_bit,FPSR_CC(a6)
297 1.1 mycroft bra.w report_snan
298 1.1 mycroft clr_neg:
299 1.1 mycroft bclr.b #neg_bit,FPSR_CC(a6)
300 1.1 mycroft bra.w report_snan
301 1.1 mycroft
302 1.1 mycroft end
303