~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/m68k/fpsp040/get_op.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/m68k/fpsp040/get_op.S (Architecture i386) and /arch/ppc/fpsp040/get_op.S (Architecture ppc)


  1 |                                                 
  2 |       get_op.sa 3.6 5/19/92                     
  3 |                                                 
  4 |       get_op.sa 3.5 4/26/91                     
  5 |                                                 
  6 |  Description: This routine is called by the     
  7 | type exception handler ('unsupp' - vector 55    
  8 | instruction exception handler ('unimp' - vec    
  9 | determines the opclass (0, 2, or 3) and bran    
 10 | opclass handler routine.  See 68881/2 User's    
 11 | for a description of the opclasses.             
 12 |                                                 
 13 | For UNSUPPORTED data/format (exception vecto    
 14 | UNIMPLEMENTED instructions (exception vector    
 15 | applies:                                        
 16 |                                                 
 17 | - For unnormalized numbers (opclass 0, 2, or    
 18 | number(s) is normalized and the operand type    
 19 |                                                 
 20 | - For a packed number (opclass 2) the number    
 21 | operand type tag is updated.                    
 22 |                                                 
 23 | - For denormalized numbers (opclass 0 or 2)     
 24 | changed but passed to the next module.  The     
 25 | unimp is do_func, the next module for unsupp    
 26 |                                                 
 27 | For UNSUPPORTED data/format (exception vecto    
 28 | following applies:                              
 29 |                                                 
 30 | - If there is a move out with a packed numbe    
 31 | number is packed and written to user memory.    
 32 | opclasses the number(s) are written back to     
 33 | and the instruction is then restored back in    
 34 | '040 is then able to complete the instructio    
 35 |                                                 
 36 | For example:                                    
 37 | fadd.x fpm,fpn where the fpm contains an unn    
 38 | The '040 takes an unsupported data trap and     
 39 | routine.  The number is normalized, put back    
 40 | then an frestore is done to restore the inst    
 41 | the '040.  The '040 then re-executes the fad    
 42 | a normalized number in the source and the in    
 43 | successful.                                     
 44 |                                                 
 45 | Next consider if in the process of normalizi    
 46 | normalized number it becomes a denormalized     
 47 | routine which converts the unnorm to a norm     
 48 | detects this and tags the number as a denorm    
 49 | res_func sees the denorm tag and converts th    
 50 | norm.  The instruction is then restored back    
 51 | which re_executes the instruction.              
 52 |                                                 
 53 |                                                 
 54 |               Copyright (C) Motorola, Inc. 1    
 55 |                       All Rights Reserved       
 56 |                                                 
 57 |       For details on the license for this fi    
 58 |       file, README, in this same directory.     
 59                                                   
 60 GET_OP:    |idnt    2,1 | Motorola 040 Floatin    
 61                                                   
 62         |section        8                         
 63                                                   
 64 #include "fpsp.h"                                 
 65                                                   
 66         .global PIRN,PIRZRM,PIRP                  
 67         .global SMALRN,SMALRZRM,SMALRP            
 68         .global BIGRN,BIGRZRM,BIGRP               
 69                                                   
 70 PIRN:                                             
 71         .long 0x40000000,0xc90fdaa2,0x2168c235    
 72 PIRZRM:                                           
 73         .long 0x40000000,0xc90fdaa2,0x2168c234    
 74 PIRP:                                             
 75         .long 0x40000000,0xc90fdaa2,0x2168c235    
 76                                                   
 77 |round to nearest                                 
 78 SMALRN:                                           
 79         .long 0x3ffd0000,0x9a209a84,0xfbcff798    
 80         .long 0x40000000,0xadf85458,0xa2bb4a9a    
 81         .long 0x3fff0000,0xb8aa3b29,0x5c17f0bc    
 82         .long 0x3ffd0000,0xde5bd8a9,0x37287195    
 83         .long 0x00000000,0x00000000,0x00000000    
 84 | round to zero;round to negative infinity        
 85 SMALRZRM:                                         
 86         .long 0x3ffd0000,0x9a209a84,0xfbcff798    
 87         .long 0x40000000,0xadf85458,0xa2bb4a9a    
 88         .long 0x3fff0000,0xb8aa3b29,0x5c17f0bb    
 89         .long 0x3ffd0000,0xde5bd8a9,0x37287195    
 90         .long 0x00000000,0x00000000,0x00000000    
 91 | round to positive infinity                      
 92 SMALRP:                                           
 93         .long 0x3ffd0000,0x9a209a84,0xfbcff799    
 94         .long 0x40000000,0xadf85458,0xa2bb4a9b    
 95         .long 0x3fff0000,0xb8aa3b29,0x5c17f0bc    
 96         .long 0x3ffd0000,0xde5bd8a9,0x37287195    
 97         .long 0x00000000,0x00000000,0x00000000    
 98                                                   
 99 |round to nearest                                 
100 BIGRN:                                            
101         .long 0x3ffe0000,0xb17217f7,0xd1cf79ac    
102         .long 0x40000000,0x935d8ddd,0xaaa8ac17    
103         .long 0x3fff0000,0x80000000,0x00000000    
104                                                   
105         .global PTENRN                            
106 PTENRN:                                           
107         .long 0x40020000,0xA0000000,0x00000000    
108         .long 0x40050000,0xC8000000,0x00000000    
109         .long 0x400C0000,0x9C400000,0x00000000    
110         .long 0x40190000,0xBEBC2000,0x00000000    
111         .long 0x40340000,0x8E1BC9BF,0x04000000    
112         .long 0x40690000,0x9DC5ADA8,0x2B70B59E    
113         .long 0x40D30000,0xC2781F49,0xFFCFA6D5    
114         .long 0x41A80000,0x93BA47C9,0x80E98CE0    
115         .long 0x43510000,0xAA7EEBFB,0x9DF9DE8E    
116         .long 0x46A30000,0xE319A0AE,0xA60E91C7    
117         .long 0x4D480000,0xC9767586,0x81750C17    
118         .long 0x5A920000,0x9E8B3B5D,0xC53D5DE5    
119         .long 0x75250000,0xC4605202,0x8A20979B    
120 |round to minus infinity                          
121 BIGRZRM:                                          
122         .long 0x3ffe0000,0xb17217f7,0xd1cf79ab    
123         .long 0x40000000,0x935d8ddd,0xaaa8ac16    
124         .long 0x3fff0000,0x80000000,0x00000000    
125                                                   
126         .global PTENRM                            
127 PTENRM:                                           
128         .long 0x40020000,0xA0000000,0x00000000    
129         .long 0x40050000,0xC8000000,0x00000000    
130         .long 0x400C0000,0x9C400000,0x00000000    
131         .long 0x40190000,0xBEBC2000,0x00000000    
132         .long 0x40340000,0x8E1BC9BF,0x04000000    
133         .long 0x40690000,0x9DC5ADA8,0x2B70B59D    
134         .long 0x40D30000,0xC2781F49,0xFFCFA6D5    
135         .long 0x41A80000,0x93BA47C9,0x80E98CDF    
136         .long 0x43510000,0xAA7EEBFB,0x9DF9DE8D    
137         .long 0x46A30000,0xE319A0AE,0xA60E91C6    
138         .long 0x4D480000,0xC9767586,0x81750C17    
139         .long 0x5A920000,0x9E8B3B5D,0xC53D5DE5    
140         .long 0x75250000,0xC4605202,0x8A20979A    
141 |round to positive infinity                       
142 BIGRP:                                            
143         .long 0x3ffe0000,0xb17217f7,0xd1cf79ac    
144         .long 0x40000000,0x935d8ddd,0xaaa8ac17    
145         .long 0x3fff0000,0x80000000,0x00000000    
146                                                   
147         .global PTENRP                            
148 PTENRP:                                           
149         .long 0x40020000,0xA0000000,0x00000000    
150         .long 0x40050000,0xC8000000,0x00000000    
151         .long 0x400C0000,0x9C400000,0x00000000    
152         .long 0x40190000,0xBEBC2000,0x00000000    
153         .long 0x40340000,0x8E1BC9BF,0x04000000    
154         .long 0x40690000,0x9DC5ADA8,0x2B70B59E    
155         .long 0x40D30000,0xC2781F49,0xFFCFA6D6    
156         .long 0x41A80000,0x93BA47C9,0x80E98CE0    
157         .long 0x43510000,0xAA7EEBFB,0x9DF9DE8E    
158         .long 0x46A30000,0xE319A0AE,0xA60E91C7    
159         .long 0x4D480000,0xC9767586,0x81750C18    
160         .long 0x5A920000,0x9E8B3B5D,0xC53D5DE6    
161         .long 0x75250000,0xC4605202,0x8A20979B    
162                                                   
163         |xref   nrm_zero                          
164         |xref   decbin                            
165         |xref   round                             
166                                                   
167         .global    get_op                         
168         .global    uns_getop                      
169         .global    uni_getop                      
170 get_op:                                           
171         clrb    DY_MO_FLG(%a6)                    
172         tstb    UFLG_TMP(%a6)   |test flag for    
173         beq     uni_getop                         
174                                                   
175 uns_getop:                                        
176         btstb   #direction_bit,CMDREG1B(%a6)      
177         bne     opclass3        |branch if a f    
178         btstb   #6,CMDREG1B(%a6)                  
179         beqs    uns_notpacked                     
180                                                   
181         bfextu  CMDREG1B(%a6){#3:#3},%d0          
182         cmpb    #3,%d0                            
183         beq     pack_source     |check for a p    
184 uns_notpacked:                                    
185         bsr     chk_dy_mo       |set the dyadi    
186         tstb    DY_MO_FLG(%a6)                    
187         beqs    src_op_ck       |if monadic, g    
188 |                               ;else, check d    
189                                                   
190         btstb   #7,DTAG(%a6)                      
191         beqs    src_op_ck       |if dst op is     
192         bras    dst_ex_dnrm     |else, handle     
193                                                   
194 uni_getop:                                        
195         bfextu  CMDREG1B(%a6){#0:#6},%d0 |get     
196         cmpil   #0x17,%d0               |if op    
197 |                               ;it is FMOVECR    
198 |                                                 
199 | If the instruction is fmovecr, exit get_op.     
200 | in do_func and smovecr.sa.                      
201 |                                                 
202         bne     not_fmovecr     |handle fmovec    
203         rts                                       
204                                                   
205 not_fmovecr:                                      
206         btstb   #E1,E_BYTE(%a6) |if set, there    
207         bne     pack_source     |check for pac    
208                                                   
209 | The following lines of are coded to optimize    
210         moveb   STAG(%a6),%d0                     
211         orb     DTAG(%a6),%d0   |check if eith    
212         bmis    dest_op_ck      |if so, some o    
213         rts                                       
214                                                   
215 dest_op_ck:                                       
216         btstb   #7,DTAG(%a6)    |check for uns    
217         beqs    src_op_ck       |the destinati    
218         bsr     chk_dy_mo       |set dyadic/mo    
219         tstb    DY_MO_FLG(%a6)  |                 
220         beqs    src_op_ck       |if monadic, c    
221 |                                                 
222 | At this point, destination has an extended d    
223 |                                                 
224 dst_ex_dnrm:                                      
225         movew   FPTEMP_EX(%a6),%d0 |get destin    
226         andiw   #0x7fff,%d0     |mask sign, ch    
227         beqs    src_op_ck       |if denorm the    
228 |                               ;denorms are t    
229 |                               ;(unsupp) or d    
230 |                               ;else unnorm f    
231         leal    FPTEMP(%a6),%a0 |point a0 to d    
232         bsr     mk_norm         |go normalize     
233 |                               ;L_SCR1{7:5} =    
234 |                               ;       (000 =    
235 |                               ;L_SCR1{4} = f    
236 |                               ;       0 = ex    
237 |                               ;       1 = ex    
238 |                               ;and puts the     
239 |                               ;on the fsave     
240 |                                                 
241         moveb L_SCR1(%a6),DTAG(%a6) |write the    
242 |                               ;to the fsave     
243 |                               ;through to ch    
244 |                                                 
245 src_op_ck:                                        
246         btstb   #7,STAG(%a6)                      
247         beq     end_getop       |check for uns    
248 |                               ;source operan    
249         btstb   #5,STAG(%a6)                      
250         bnes    src_sd_dnrm     |if bit 5 set,    
251 |                                                 
252 | At this point only unnorms or extended denor    
253 |                                                 
254 src_ex_dnrm:                                      
255         movew   ETEMP_EX(%a6),%d0 |get source     
256         andiw   #0x7fff,%d0     |mask sign, ch    
257         beq     end_getop       |if denorm the    
258 |                               ;handled in do    
259         leal    ETEMP(%a6),%a0  |point a0 to s    
260         bsr     mk_norm         |go normalize     
261 |                               ;L_SCR1{7:5} =    
262 |                               ;       (000 =    
263 |                               ;L_SCR1{4} = f    
264 |                               ;       0 = ex    
265 |                               ;       1 = ex    
266 |                               ;and puts the     
267 |                               ;on the fsave     
268 |                                                 
269         moveb   L_SCR1(%a6),STAG(%a6) |write t    
270         rts                     |end_getop        
271                                                   
272 |                                                 
273 | At this point, only single or double denorms    
274 | If the inst is not fmove, normalize the sour    
275 | do nothing to the input.                        
276 |                                                 
277 src_sd_dnrm:                                      
278         btstb   #4,CMDREG1B(%a6)        |diffe    
279         bnes    is_double                         
280 is_single:                                        
281         movew   #0x3f81,%d1     |write bias fo    
282         bras    common          |goto the comm    
283 is_double:                                        
284         movew   #0x3c01,%d1     |write the bia    
285 common:                                           
286         btstb   #sign_bit,ETEMP_EX(%a6) |grab     
287         beqs    pos                               
288         bset    #15,%d1         |set sign bit     
289 pos:                                              
290         movew   %d1,ETEMP_EX(%a6)                 
291 |                               ;put exponent     
292                                                   
293         movew   CMDREG1B(%a6),%d1                 
294         andw    #0xe3ff,%d1     |clear out sou    
295         orw     #0x0800,%d1     |set source sp    
296         movew   %d1,CMDREG1B(%a6)       |write    
297 |                               ;this is neede    
298         leal    ETEMP(%a6),%a0  |point a0 to s    
299                                                   
300         bsr     mk_norm         |convert sgl/d    
301         moveb   L_SCR1(%a6),STAG(%a6) |put tag    
302         rts                     |end_getop        
303 |                                                 
304 | At this point, the source is definitely pack    
305 | instruction is dyadic or monadic is still un    
306 |                                                 
307 pack_source:                                      
308         movel   FPTEMP_LO(%a6),ETEMP(%a6)         
309 |                               ;number to ete    
310         bsr     chk_dy_mo       |set dyadic/mo    
311         bsr     unpack                            
312                                                   
313         tstb    DY_MO_FLG(%a6)                    
314         beqs    end_getop       |if monadic, e    
315 |                               ;else, fix FPT    
316 pack_dya:                                         
317         bfextu  CMDREG1B(%a6){#6:#3},%d0 |extr    
318         movel   #7,%d1                            
319         subl    %d0,%d1                           
320         clrl    %d0                               
321         bsetl   %d1,%d0         |set up d0 as     
322         fmovemx %d0,FPTEMP(%a6) |write to FPTE    
323                                                   
324         btstb   #7,DTAG(%a6)    |check dest ta    
325         bne     dst_ex_dnrm     |else, handle     
326 |                                                 
327 | Dest is not denormalized.  Check for norm, a    
328 | accordingly.                                    
329 |                                                 
330         moveb   DTAG(%a6),%d0                     
331         andib   #0xf0,%d0               |strip    
332         tstb    %d0             |check for nor    
333         bnes    end_getop       |if inf/nan/ze    
334         movew   FPTEMP_EX(%a6),%d0                
335         andiw   #0x7fff,%d0                       
336         cmpiw   #0x3fff,%d0     |check if fpte    
337         bges    end_getop       |if >= $3fff,     
338         orb     #0x10,DTAG(%a6)                   
339         bras    end_getop                         
340                                                   
341 |                                                 
342 | At this point, it is either an fmoveout pack    
343 |                                                 
344 opclass3:                                         
345         clrb    DY_MO_FLG(%a6)  |set dyadic/mo    
346         bfextu  CMDREG1B(%a6){#4:#2},%d0          
347         cmpib   #3,%d0                            
348         bne     src_ex_dnrm     |if not equal,    
349 |                               ;else it is a     
350 |                               ;exit             
351 end_getop:                                        
352         rts                                       
353                                                   
354 |                                                 
355 | Sets the DY_MO_FLG correctly. This is used o    
356 | unsupported data type exception.  Set if dya    
357 |                                                 
358 chk_dy_mo:                                        
359         movew   CMDREG1B(%a6),%d0                 
360         btstl   #5,%d0          |testing exten    
361         beqs    set_mon         |if bit 5 = 0     
362         btstl   #4,%d0          |know that bit    
363         beqs    set_dya         |if bit 4 = 0     
364         andiw   #0x007f,%d0     |get rid of al    
365         cmpiw   #0x0038,%d0     |if extension     
366         bnes    set_mon                           
367 set_dya:                                          
368         st      DY_MO_FLG(%a6)  |set the inst     
369         rts                                       
370 set_mon:                                          
371         clrb    DY_MO_FLG(%a6)  |set the inst     
372         rts                                       
373 |                                                 
374 |       MK_NORM                                   
375 |                                                 
376 | Normalizes unnormalized numbers, sets tag to    
377 | exception if denorm.                            
378 |                                                 
379 | CASE opclass 0x0 unsupp                         
380 |       mk_norm till msb set                      
381 |       set tag = norm                            
382 |                                                 
383 | CASE opclass 0x0 unimp                          
384 |       mk_norm till msb set or exp = 0           
385 |       if integer bit = 0                        
386 |          tag = denorm                           
387 |       else                                      
388 |          tag = norm                             
389 |                                                 
390 | CASE opclass 011 unsupp                         
391 |       mk_norm till msb set or exp = 0           
392 |       if integer bit = 0                        
393 |          tag = denorm                           
394 |          set unfl_nmcexe = 1                    
395 |       else                                      
396 |          tag = norm                             
397 |                                                 
398 | if exp <= $3fff                                 
399 |   set ete15 or fpte15 = 1                       
400 | else set ete15 or fpte15 = 0                    
401                                                   
402 | input:                                          
403 |       a0 = points to operand to be normalize    
404 | output:                                         
405 |       L_SCR1{7:5} = operand tag (000 = norm,    
406 |       L_SCR1{4}   = fpte15 or ete15 (0 = exp    
407 |       the normalized operand is placed back     
408 mk_norm:                                          
409         clrl    L_SCR1(%a6)                       
410         bclrb   #sign_bit,LOCAL_EX(%a0)           
411         sne     LOCAL_SGN(%a0)  |transform int    
412                                                   
413         cmpib   #0x2c,1+EXC_VEC(%a6) |check if    
414         bnes    uns_data        |branch if uns    
415         bsr     uni_inst        |call if unimp    
416         bras    reload                            
417 uns_data:                                         
418         btstb   #direction_bit,CMDREG1B(%a6) |    
419         bnes    bit_set         |branch if set    
420         bsr     uns_opx         |call if opcla    
421         bras    reload                            
422 bit_set:                                          
423         bsr     uns_op3         |opclass 011      
424 reload:                                           
425         cmpw    #0x3fff,LOCAL_EX(%a0) |if exp     
426         bgts    end_mk          |   fpte15/ete    
427         bsetb   #4,L_SCR1(%a6)  |else set fpte    
428 |                               ;calling routi    
429 |                               ;value on the     
430 |                               ;tag), since t    
431 |                               ;know if it sh    
432 |                               ;ie, it doesn'    
433 |                               ;src op or des    
434 end_mk:                                           
435         bfclr   LOCAL_SGN(%a0){#0:#8}             
436         beqs    end_mk_pos                        
437         bsetb   #sign_bit,LOCAL_EX(%a0) |conve    
438 end_mk_pos:                                       
439         rts                                       
440 |                                                 
441 |     CASE opclass 011 unsupp                     
442 |                                                 
443 uns_op3:                                          
444         bsr     nrm_zero        |normalize til    
445         btstb   #7,LOCAL_HI(%a0)        |if ms    
446         bnes    no_unfl         |then branch      
447 set_unfl:                                         
448         orw     #dnrm_tag,L_SCR1(%a6) |set den    
449         bsetb   #unfl_bit,FPSR_EXCEPT(%a6) |se    
450 no_unfl:                                          
451         rts                                       
452 |                                                 
453 |     CASE opclass 0x0 unsupp                     
454 |                                                 
455 uns_opx:                                          
456         bsr     nrm_zero        |normalize the    
457         btstb   #7,LOCAL_HI(%a0)        |check    
458         beqs    uns_den         |if clear then    
459 uns_nrm:                                          
460         orb     #norm_tag,L_SCR1(%a6) |set tag    
461         rts                                       
462 uns_den:                                          
463         orb     #dnrm_tag,L_SCR1(%a6) |set tag    
464         rts                                       
465 |                                                 
466 |     CASE opclass 0x0 unimp                      
467 |                                                 
468 uni_inst:                                         
469         bsr     nrm_zero                          
470         btstb   #7,LOCAL_HI(%a0)        |check    
471         beqs    uni_den         |if clear then    
472 uni_nrm:                                          
473         orb     #norm_tag,L_SCR1(%a6) |set tag    
474         rts                                       
475 uni_den:                                          
476         orb     #dnrm_tag,L_SCR1(%a6) |set tag    
477         rts                                       
478                                                   
479 |                                                 
480 |       Decimal to binary conversion              
481 |                                                 
482 | Special cases of inf and NaNs are completed     
483 | If the input is an snan, the snan bit is not    
484 |                                                 
485 | input:                                          
486 |       ETEMP(a6)       - points to packed dec    
487 | output:                                         
488 |       fp0     - contains packed string conve    
489 |       ETEMP   - same as fp0                     
490 unpack:                                           
491         movew   CMDREG1B(%a6),%d0       |exami    
492         andw    #0x3b,%d0                         
493         beq     move_unpack     |special handl    
494                                                   
495         movew   ETEMP(%a6),%d0  |get word with    
496         bfextu  %d0{#20:#12},%d1        |get e    
497         cmpiw   #0x0fff,%d1     |test for inf     
498         bnes    try_zero        |if not equal,    
499         bfextu  %d0{#17:#3},%d1 |get SE and y     
500         cmpiw   #7,%d1          |SE and y bits    
501         bnes    try_zero        |if not on, it    
502 |input is of the special cases of inf and NaN     
503         tstl    ETEMP_HI(%a6)   |check ms mant    
504         bnes    fix_nan         |if non-zero,     
505         tstl    ETEMP_LO(%a6)   |check ls mant    
506         bnes    fix_nan         |if non-zero,     
507         bra     finish          |special alrea    
508 fix_nan:                                          
509         btstb   #signan_bit,ETEMP_HI(%a6) |tes    
510         bne     finish                            
511         orl     #snaniop_mask,USER_FPSR(%a6) |    
512         bra     finish                            
513 try_zero:                                         
514         movew   ETEMP_EX+2(%a6),%d0 |get word     
515         andiw   #0x000f,%d0     |clear all but    
516         tstw    %d0             |check for zer    
517         bne     not_spec                          
518         tstl    ETEMP_HI(%a6)   |check words 3    
519         bne     not_spec                          
520         tstl    ETEMP_LO(%a6)   |check words 1    
521         bne     not_spec                          
522         tstl    ETEMP(%a6)      |test sign of     
523         bges    pos_zero                          
524         movel   #0x80000000,ETEMP(%a6) |write     
525         clrl    ETEMP_HI(%a6)                     
526         clrl    ETEMP_LO(%a6)                     
527         bra     finish                            
528 pos_zero:                                         
529         clrl    ETEMP(%a6)                        
530         clrl    ETEMP_HI(%a6)                     
531         clrl    ETEMP_LO(%a6)                     
532         bra     finish                            
533                                                   
534 not_spec:                                         
535         fmovemx %fp0-%fp1,-(%a7)        |save     
536         bsr     decbin                            
537         fmovex %fp0,ETEMP(%a6)  |put the unpac    
538         fmovemx (%a7)+,%fp0-%fp1                  
539         fmovel  #0,%FPSR                |clr f    
540         bra     finish                            
541                                                   
542 |                                                 
543 | Special handling for packed move in:  Same r    
544 | packed cases, but we must set the FPSR condi    
545 |                                                 
546 move_unpack:                                      
547         movew   ETEMP(%a6),%d0  |get word with    
548         bfextu  %d0{#20:#12},%d1        |get e    
549         cmpiw   #0x0fff,%d1     |test for inf     
550         bnes    mtry_zero       |if not equal,    
551         bfextu  %d0{#17:#3},%d1 |get SE and y     
552         cmpiw   #7,%d1          |SE and y bits    
553         bnes    mtry_zero       |if not on, it    
554 |input is of the special cases of inf and NaN     
555         tstl    ETEMP_HI(%a6)   |check ms mant    
556         bnes    mfix_nan                |if no    
557         tstl    ETEMP_LO(%a6)   |check ls mant    
558         bnes    mfix_nan                |if no    
559 |input is inf                                     
560         orl     #inf_mask,USER_FPSR(%a6) |set     
561         tstl    ETEMP(%a6)      |check sign       
562         bge     finish                            
563         orl     #neg_mask,USER_FPSR(%a6) |set     
564         bra     finish          |special alrea    
565 mfix_nan:                                         
566         orl     #nan_mask,USER_FPSR(%a6) |set     
567         moveb   #nan_tag,STAG(%a6)      |set s    
568         btstb   #signan_bit,ETEMP_HI(%a6) |tes    
569         bnes    mn_snan                           
570         orl     #snaniop_mask,USER_FPSR(%a6) |    
571         btstb   #snan_bit,FPCR_ENABLE(%a6) |te    
572         bnes    mn_snan                           
573         bsetb   #signan_bit,ETEMP_HI(%a6) |for    
574 mn_snan:                                          
575         tstl    ETEMP(%a6)      |check for sig    
576         bge     finish          |if clr, go on    
577         orl     #neg_mask,USER_FPSR(%a6) |set     
578         bra     finish                            
579                                                   
580 mtry_zero:                                        
581         movew   ETEMP_EX+2(%a6),%d0 |get word     
582         andiw   #0x000f,%d0     |clear all but    
583         tstw    %d0             |check for zer    
584         bnes    mnot_spec                         
585         tstl    ETEMP_HI(%a6)   |check words 3    
586         bnes    mnot_spec                         
587         tstl    ETEMP_LO(%a6)   |check words 1    
588         bnes    mnot_spec                         
589         tstl    ETEMP(%a6)      |test sign of     
590         bges    mpos_zero                         
591         orl     #neg_mask+z_mask,USER_FPSR(%a6    
592         movel   #0x80000000,ETEMP(%a6) |write     
593         clrl    ETEMP_HI(%a6)                     
594         clrl    ETEMP_LO(%a6)                     
595         bras    finish                            
596 mpos_zero:                                        
597         orl     #z_mask,USER_FPSR(%a6) |set Z     
598         clrl    ETEMP(%a6)                        
599         clrl    ETEMP_HI(%a6)                     
600         clrl    ETEMP_LO(%a6)                     
601         bras    finish                            
602                                                   
603 mnot_spec:                                        
604         fmovemx %fp0-%fp1,-(%a7)        |save     
605         bsr     decbin                            
606         fmovex %fp0,ETEMP(%a6)                    
607 |                               ;put the unpac    
608         fmovemx (%a7)+,%fp0-%fp1                  
609                                                   
610 finish:                                           
611         movew   CMDREG1B(%a6),%d0       |get t    
612         andw    #0xfbff,%d0     |change the so    
613 |                               ;extended (was    
614         movew   %d0,CMDREG1B(%a6)       |write    
615 |                               ;we need to do    
616 |                               ;re-execute th    
617 |                               ;another packe    
618                                                   
619 fix_stag:                                         
620 |Converted result is now in etemp on fsave sta    
621 |tag (stag)                                       
622 |       if (ete =$7fff) then INF or NAN           
623 |               if (etemp = $x.0----0) then       
624 |                       stag = INF                
625 |               else                              
626 |                       stag = NAN                
627 |       else                                      
628 |               if (ete = $0000) then             
629 |                       stag = ZERO               
630 |               else                              
631 |                       stag = NORM               
632 |                                                 
633 | Note also that the etemp_15 bit (just right     
634 | be set accordingly.                             
635 |                                                 
636         movew           ETEMP_EX(%a6),%d1         
637         andiw           #0x7fff,%d1   |strip s    
638         cmpw            #0x7fff,%d1               
639         bnes            z_or_nrm                  
640         movel           ETEMP_HI(%a6),%d1         
641         bnes            is_nan                    
642         movel           ETEMP_LO(%a6),%d1         
643         bnes            is_nan                    
644 is_inf:                                           
645         moveb           #0x40,STAG(%a6)           
646         movel           #0x40,%d0                 
647         rts                                       
648 is_nan:                                           
649         moveb           #0x60,STAG(%a6)           
650         movel           #0x60,%d0                 
651         rts                                       
652 z_or_nrm:                                         
653         tstw            %d1                       
654         bnes            is_nrm                    
655 is_zro:                                           
656 | For a zero, set etemp_15                        
657         moveb           #0x30,STAG(%a6)           
658         movel           #0x20,%d0                 
659         rts                                       
660 is_nrm:                                           
661 | For a norm, check if the exp <= $3fff; if so    
662         cmpiw           #0x3fff,%d1               
663         bles            set_bit15                 
664         moveb           #0,STAG(%a6)              
665         bras            end_is_nrm                
666 set_bit15:                                        
667         moveb           #0x10,STAG(%a6)           
668 end_is_nrm:                                       
669         movel           #0,%d0                    
670 end_fix:                                          
671         rts                                       
672                                                   
673 end_get:                                          
674         rts                                       
675         |end                                      
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php