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

TOMOYO Linux Cross Reference
Linux/arch/m68k/fpsp040/kernel_ex.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/kernel_ex.S (Version linux-6.12-rc7) and /arch/i386/fpsp040/kernel_ex.S (Version linux-6.11.7)


  1 |                                                 
  2 |       kernel_ex.sa 3.3 12/19/90                 
  3 |                                                 
  4 | This file contains routines to force excepti    
  5 | fpu for exceptional cases detected or report    
  6 | transcendental functions.  Typically, the t_    
  7 | set the appropriate bits in the USER_FPSR wo    
  8 | The bits are tested in gen_except.sa to dete    
  9 | situation needs to be created on return from    
 10 |                                                 
 11                                                   
 12 |               Copyright (C) Motorola, Inc. 1    
 13 |                       All Rights Reserved       
 14 |                                                 
 15 |       For details on the license for this fi    
 16 |       file, README, in this same directory.     
 17                                                   
 18 KERNEL_EX:    |idnt    2,1 | Motorola 040 Floa    
 19                                                   
 20         |section    8                             
 21                                                   
 22 #include "fpsp.h"                                 
 23                                                   
 24 mns_inf:  .long 0xffff0000,0x00000000,0x000000    
 25 pls_inf:  .long 0x7fff0000,0x00000000,0x000000    
 26 nan:      .long 0x7fff0000,0xffffffff,0xffffff    
 27 huge:     .long 0x7ffe0000,0xffffffff,0xffffff    
 28                                                   
 29         |xref     ovf_r_k                         
 30         |xref     unf_sub                         
 31         |xref     nrm_set                         
 32                                                   
 33         .global   t_dz                            
 34         .global      t_dz2                        
 35         .global      t_operr                      
 36         .global      t_unfl                       
 37         .global      t_ovfl                       
 38         .global      t_ovfl2                      
 39         .global      t_inx2                       
 40         .global   t_frcinx                        
 41         .global   t_extdnrm                       
 42         .global   t_resdnrm                       
 43         .global   dst_nan                         
 44         .global   src_nan                         
 45 |                                                 
 46 |       DZ exception                              
 47 |                                                 
 48 |                                                 
 49 |       if dz trap disabled                       
 50 |               store properly signed inf (use    
 51 |               set FPSR exception status dz b    
 52 |               inf bit, and accrued dz bit       
 53 |               return                            
 54 |               frestore the frame into the ma    
 55 |                                                 
 56 |       else dz trap enabled                      
 57 |               set exception status bit & acc    
 58 |               set flag to disable sto_res fr    
 59 |               return                            
 60 |               frestore the frame into the ma    
 61 |                                                 
 62 | t_dz2 is used by monadic functions such as f    
 63 | t_dz is used by monadic functions such as sa    
 64 | transcendental function).                       
 65 |                                                 
 66 t_dz2:                                            
 67         bsetb   #neg_bit,FPSR_CC(%a6)   |set n    
 68         fmovel  #0,%FPSR                          
 69         btstb   #dz_bit,FPCR_ENABLE(%a6)          
 70         bnes    dz_ena_end                        
 71         bras    m_inf                   |flogx    
 72 t_dz:                                             
 73         fmovel  #0,%FPSR                          
 74         btstb   #dz_bit,FPCR_ENABLE(%a6)          
 75         bnes    dz_ena                            
 76 |                                                 
 77 |       dz disabled                               
 78 |                                                 
 79         btstb   #sign_bit,ETEMP_EX(%a6) |check    
 80         beqs    p_inf                   |branc    
 81                                                   
 82 m_inf:                                            
 83         fmovemx mns_inf,%fp0-%fp0                 
 84         bsetb   #neg_bit,FPSR_CC(%a6)   |set n    
 85         bras    set_fpsr                          
 86 p_inf:                                            
 87         fmovemx pls_inf,%fp0-%fp0                 
 88 set_fpsr:                                         
 89         orl     #dzinf_mask,USER_FPSR(%a6) |se    
 90         rts                                       
 91 |                                                 
 92 |       dz enabled                                
 93 |                                                 
 94 dz_ena:                                           
 95         btstb   #sign_bit,ETEMP_EX(%a6) |check    
 96         beqs    dz_ena_end                        
 97         bsetb   #neg_bit,FPSR_CC(%a6)   |set n    
 98 dz_ena_end:                                       
 99         orl     #dzinf_mask,USER_FPSR(%a6) |se    
100         st      STORE_FLG(%a6)                    
101         rts                                       
102 |                                                 
103 |       OPERR exception                           
104 |                                                 
105 |       if (operr trap disabled)                  
106 |               set FPSR exception status oper    
107 |               nan bit; Store default NAN int    
108 |               frestore the frame into the ma    
109 |                                                 
110 |       else (operr trap enabled)                 
111 |               set FPSR exception status oper    
112 |               set flag to disable sto_res fr    
113 |               frestore the frame into the ma    
114 |                                                 
115 t_operr:                                          
116         orl     #opnan_mask,USER_FPSR(%a6) |se    
117                                                   
118         btstb   #operr_bit,FPCR_ENABLE(%a6) |t    
119         bnes    op_ena                            
120                                                   
121         fmovemx nan,%fp0-%fp0           |load     
122         rts                                       
123 op_ena:                                           
124         st      STORE_FLG(%a6)          |do no    
125         rts                                       
126                                                   
127 |                                                 
128 |       t_unfl --- UNFL exception                 
129 |                                                 
130 | This entry point is used by all routines req    
131 | aunfl, and ainex to be set on exit.             
132 |                                                 
133 | On entry, a0 points to the exceptional opera    
134 | operand is built in FP_SCR1 and only the sig    
135 | is used.                                        
136 |                                                 
137 t_unfl:                                           
138         clrl    FP_SCR1(%a6)            |set e    
139         clrl    FP_SCR1+4(%a6)                    
140         clrl    FP_SCR1+8(%a6)                    
141         tstb    (%a0)                   |extra    
142         bpls    unfl_signok                       
143         bset    #sign_bit,FP_SCR1(%a6)            
144 unfl_signok:                                      
145         leal    FP_SCR1(%a6),%a0                  
146         orl     #unfinx_mask,USER_FPSR(%a6)       
147 |                                       ;set U    
148 unfl_con:                                         
149         btstb   #unfl_bit,FPCR_ENABLE(%a6)        
150         beqs    unfl_dis                          
151                                                   
152 unfl_ena:                                         
153         bfclr   STAG(%a6){#5:#3}                  
154         bsetb   #wbtemp15_bit,WB_BYTE(%a6) |se    
155         bsetb   #sticky_bit,STICKY(%a6) |set s    
156                                                   
157         bclrb   #E1,E_BYTE(%a6)                   
158                                                   
159 unfl_dis:                                         
160         bfextu  FPCR_MODE(%a6){#0:#2},%d0         
161                                                   
162         bclrb   #sign_bit,LOCAL_EX(%a0)           
163         sne     LOCAL_SGN(%a0)          |conve    
164                                                   
165         bsr     unf_sub                 |retur    
166 |                                       ;and s    
167                                                   
168         bfclr   LOCAL_SGN(%a0){#0:#8}   |conve    
169         beqs    unfl_fin                          
170                                                   
171         bsetb   #sign_bit,LOCAL_EX(%a0)           
172         bsetb   #sign_bit,FP_SCR1(%a6)  |set s    
173                                                   
174 unfl_fin:                                         
175         fmovemx (%a0),%fp0-%fp0         |store    
176         rts                                       
177                                                   
178                                                   
179 |                                                 
180 |       t_ovfl2 --- OVFL exception (without in    
181 |                                                 
182 | This entry is used by scale to force catastr    
183 | ovfl, aovfl, and ainex bits are set, but not    
184 |                                                 
185 t_ovfl2:                                          
186         orl     #ovfl_inx_mask,USER_FPSR(%a6)     
187         movel   ETEMP(%a6),FP_SCR1(%a6)           
188         movel   ETEMP_HI(%a6),FP_SCR1+4(%a6)      
189         movel   ETEMP_LO(%a6),FP_SCR1+8(%a6)      
190 |                                                 
191 | Check for single or double round precision.     
192 | the lower 40 bits of ETEMP are zero; if not,    
193 | check if the lower 21 bits are zero; if not,    
194 |                                                 
195         moveb   FPCR_MODE(%a6),%d0                
196         andib   #0xc0,%d0                         
197         beq     t_work          |if extended,     
198         cmpib   #0x40,%d0               |test     
199         bnes    t_dbl                             
200 t_sgl:                                            
201         tstb    ETEMP_LO(%a6)                     
202         bnes    t_setinx2                         
203         movel   ETEMP_HI(%a6),%d0                 
204         andil   #0xff,%d0               |look     
205         bnes    t_setinx2                         
206         bra     t_work                            
207 t_dbl:                                            
208         movel   ETEMP_LO(%a6),%d0                 
209         andil   #0x7ff,%d0      |look at only     
210         beq     t_work                            
211 t_setinx2:                                        
212         orl     #inex2_mask,USER_FPSR(%a6)        
213         bras    t_work                            
214 |                                                 
215 |       t_ovfl --- OVFL exception                 
216 |                                                 
217 |** Note: the exc operand is returned in ETEMP    
218 |                                                 
219 t_ovfl:                                           
220         orl     #ovfinx_mask,USER_FPSR(%a6)       
221 t_work:                                           
222         btstb   #ovfl_bit,FPCR_ENABLE(%a6) |te    
223         beqs    ovf_dis                           
224                                                   
225 ovf_ena:                                          
226         clrl    FP_SCR1(%a6)            |set e    
227         clrl    FP_SCR1+4(%a6)                    
228         clrl    FP_SCR1+8(%a6)                    
229                                                   
230         bfclr   STAG(%a6){#5:#3}                  
231         bclrb   #wbtemp15_bit,WB_BYTE(%a6) |cl    
232         bsetb   #sticky_bit,STICKY(%a6) |set s    
233                                                   
234         bclrb   #E1,E_BYTE(%a6)                   
235 |                                       ;fall     
236                                                   
237 | For disabled overflow call 'ovf_r_k'.  This     
238 | correct result based on the rounding precisi    
239 | format, rounding mode and sign.                 
240 |                                                 
241 ovf_dis:                                          
242         bsr     ovf_r_k                 |retur    
243 |                                       ;and s    
244         bfclr   ETEMP_SGN(%a6){#0:#8}   |fix s    
245         beqs    ovf_pos                           
246         bsetb   #sign_bit,ETEMP_EX(%a6)           
247         bsetb   #sign_bit,FP_SCR1(%a6)  |set e    
248 ovf_pos:                                          
249         fmovemx ETEMP(%a6),%fp0-%fp0              
250         rts                                       
251                                                   
252                                                   
253 |                                                 
254 |       INEX2 exception                           
255 |                                                 
256 | The inex2 and ainex bits are set.               
257 |                                                 
258 t_inx2:                                           
259         orl     #inx2a_mask,USER_FPSR(%a6) |se    
260         rts                                       
261                                                   
262 |                                                 
263 |       Force Inex2                               
264 |                                                 
265 | This routine is called by the transcendental    
266 | the inex2 exception bits set in the FPSR.  I    
267 | is set, but the underflow trap was not taken    
268 | the FPSR must be set.                           
269 |                                                 
270 t_frcinx:                                         
271         orl     #inx2a_mask,USER_FPSR(%a6) |se    
272         btstb   #unfl_bit,FPSR_EXCEPT(%a6) |te    
273         beqs    no_uacc1                |if cl    
274         bsetb   #aunfl_bit,FPSR_AEXCEPT(%a6)      
275 no_uacc1:                                         
276         rts                                       
277                                                   
278 |                                                 
279 |       DST_NAN                                   
280 |                                                 
281 | Determine if the destination nan is signalli    
282 | and set the FPSR bits accordingly.  See the     
283 | section 3.2.2.5 NOT-A-NUMBERS.                  
284 |                                                 
285 dst_nan:                                          
286         btstb   #sign_bit,FPTEMP_EX(%a6) |test    
287         beqs    dst_pos                 |if cl    
288         bsetb   #neg_bit,FPSR_CC(%a6)   |set N    
289 dst_pos:                                          
290         btstb   #signan_bit,FPTEMP_HI(%a6) |ch    
291         beqs    dst_snan                |branc    
292                                                   
293         fmovel  %d1,%fpcr                         
294         fmovex FPTEMP(%a6),%fp0         |retur    
295 |                                                 
296 | Check the source nan.  If it is signalling,     
297 |                                                 
298         moveb   STAG(%a6),%d0                     
299         andib   #0xe0,%d0                         
300         cmpib   #0x60,%d0                         
301         bnes    no_snan                           
302         btstb   #signan_bit,ETEMP_HI(%a6) |che    
303         bnes    no_snan                           
304         orl     #snaniop_mask,USER_FPSR(%a6) |    
305 no_snan:                                          
306         rts                                       
307                                                   
308 dst_snan:                                         
309         btstb   #snan_bit,FPCR_ENABLE(%a6) |ch    
310         beqs    dst_dis                 |branc    
311                                                   
312         orb     #nan_tag,DTAG(%a6)      |set u    
313         st      STORE_FLG(%a6)          |do no    
314         orl     #snaniop_mask,USER_FPSR(%a6) |    
315         rts                                       
316                                                   
317 dst_dis:                                          
318         bsetb   #signan_bit,FPTEMP_HI(%a6) |se    
319         fmovel  %d1,%fpcr                         
320         fmovex FPTEMP(%a6),%fp0         |load     
321         orl     #snaniop_mask,USER_FPSR(%a6) |    
322         rts                                       
323                                                   
324 |                                                 
325 |       SRC_NAN                                   
326 |                                                 
327 | Determine if the source nan is signalling or    
328 | and set the FPSR bits accordingly.  See the     
329 | section 3.2.2.5 NOT-A-NUMBERS.                  
330 |                                                 
331 src_nan:                                          
332         btstb   #sign_bit,ETEMP_EX(%a6) |test     
333         beqs    src_pos                 |if cl    
334         bsetb   #neg_bit,FPSR_CC(%a6)   |set N    
335 src_pos:                                          
336         btstb   #signan_bit,ETEMP_HI(%a6) |che    
337         beqs    src_snan                |branc    
338         fmovel  %d1,%fpcr                         
339         fmovex ETEMP(%a6),%fp0          |retur    
340         rts                                       
341                                                   
342 src_snan:                                         
343         btstb   #snan_bit,FPCR_ENABLE(%a6) |ch    
344         beqs    src_dis                 |branc    
345         bsetb   #signan_bit,ETEMP_HI(%a6) |set    
346         orb     #norm_tag,DTAG(%a6)     |set u    
347         orb     #nan_tag,STAG(%a6)      |set u    
348         st      STORE_FLG(%a6)          |do no    
349         orl     #snaniop_mask,USER_FPSR(%a6) |    
350         rts                                       
351                                                   
352 src_dis:                                          
353         bsetb   #signan_bit,ETEMP_HI(%a6) |set    
354         fmovel  %d1,%fpcr                         
355         fmovex ETEMP(%a6),%fp0          |load     
356         orl     #snaniop_mask,USER_FPSR(%a6) |    
357         rts                                       
358                                                   
359 |                                                 
360 | For all functions that have a denormalized i    
361 | this is the entry point                         
362 |                                                 
363 t_extdnrm:                                        
364         orl     #unfinx_mask,USER_FPSR(%a6)       
365 |                                       ;set U    
366         bras    xdnrm_con                         
367 |                                                 
368 | Entry point for scale with extended denorm.     
369 | not set inex2, aunfl, or ainex.                 
370 |                                                 
371 t_resdnrm:                                        
372         orl     #unfl_mask,USER_FPSR(%a6)         
373                                                   
374 xdnrm_con:                                        
375         btstb   #unfl_bit,FPCR_ENABLE(%a6)        
376         beqs    xdnrm_dis                         
377                                                   
378 |                                                 
379 | If exceptions are enabled, the additional ta    
380 | is needed so that when the underflow excepti    
381 | the user perceives no difference between wha    
382 | what the FPSP provides.                         
383 |                                                 
384 xdnrm_ena:                                        
385         movel   %a0,-(%a7)                        
386                                                   
387         movel   LOCAL_EX(%a0),FP_SCR1(%a6)        
388         movel   LOCAL_HI(%a0),FP_SCR1+4(%a6)      
389         movel   LOCAL_LO(%a0),FP_SCR1+8(%a6)      
390                                                   
391         lea     FP_SCR1(%a6),%a0                  
392                                                   
393         bclrb   #sign_bit,LOCAL_EX(%a0)           
394         sne     LOCAL_SGN(%a0)          |conve    
395         tstw    LOCAL_EX(%a0)           |check    
396         beqs    xdnrm_dn                |if so    
397         bsr     nrm_set                 |norma    
398 |                                       ;will     
399 xdnrm_dn:                                         
400         bclrb   #sign_bit,LOCAL_EX(%a0) |take     
401         bfclr   LOCAL_SGN(%a0){#0:#8}   |chang    
402         beqs    xdep                              
403         bsetb   #sign_bit,LOCAL_EX(%a0)           
404 xdep:                                             
405         bfclr   STAG(%a6){#5:#3}                  
406         bsetb   #wbtemp15_bit,WB_BYTE(%a6) |se    
407         bclrb   #sticky_bit,STICKY(%a6) |clear    
408         bclrb   #E1,E_BYTE(%a6)                   
409         movel   (%a7)+,%a0                        
410 xdnrm_dis:                                        
411         bfextu  FPCR_MODE(%a6){#0:#2},%d0         
412         bnes    not_ext                 |if no    
413 |                                       ;IEEE     
414 is_ext:                                           
415         btstb   #sign_bit,LOCAL_EX(%a0)           
416         beqs    xdnrm_store                       
417                                                   
418         bsetb   #neg_bit,FPSR_CC(%a6)   |set N    
419                                                   
420         bras    xdnrm_store                       
421                                                   
422 not_ext:                                          
423         bclrb   #sign_bit,LOCAL_EX(%a0)           
424         sne     LOCAL_SGN(%a0)          |conve    
425         bsr     unf_sub                 |retur    
426 |                                       ;a0; s    
427         bfclr   LOCAL_SGN(%a0){#0:#8}   |conve    
428         beqs    xdnrm_store                       
429         bsetb   #sign_bit,LOCAL_EX(%a0)           
430 xdnrm_store:                                      
431         fmovemx (%a0),%fp0-%fp0         |store    
432         rts                                       
433                                                   
434 |                                                 
435 | This subroutine is used for dyadic operation    
436 | denorm within the kernel. The approach used     
437 | fix/restore.                                    
438 |                                                 
439         .global t_avoid_unsupp                    
440 t_avoid_unsupp:                                   
441         link    %a2,#-LOCAL_SIZE                  
442 |                                       ;offse    
443         fsave   -(%a7)                            
444         tstb    1(%a7)                  |check    
445         beq     idle_end                          
446         btstb   #E1,E_BYTE(%a2)         |check    
447 |                                       ;enabl    
448         beq     end_avun                |else,    
449         btstb   #7,DTAG(%a2)            |check    
450         beqs    src_den                 |else,    
451 |                                                 
452 | handle destination denorm                       
453 |                                                 
454         lea     FPTEMP(%a2),%a0                   
455         btstb   #sign_bit,LOCAL_EX(%a0)           
456         sne     LOCAL_SGN(%a0)          |conve    
457         bclrb   #7,DTAG(%a2)            |set D    
458         bsr     nrm_set                 |norma    
459 |                                       ;will     
460         bclrb   #sign_bit,LOCAL_EX(%a0) |get r    
461         bfclr   LOCAL_SGN(%a0){#0:#8}   |conve    
462         beqs    ck_src_den              |check    
463         bsetb   #sign_bit,LOCAL_EX(%a0)           
464 ck_src_den:                                       
465         btstb   #7,STAG(%a2)                      
466         beqs    end_avun                          
467 src_den:                                          
468         lea     ETEMP(%a2),%a0                    
469         btstb   #sign_bit,LOCAL_EX(%a0)           
470         sne     LOCAL_SGN(%a0)          |conve    
471         bclrb   #7,STAG(%a2)            |set S    
472         bsr     nrm_set                 |norma    
473 |                                       ;will     
474         bclrb   #sign_bit,LOCAL_EX(%a0) |get r    
475         bfclr   LOCAL_SGN(%a0){#0:#8}   |conve    
476         beqs    den_com                           
477         bsetb   #sign_bit,LOCAL_EX(%a0)           
478 den_com:                                          
479         moveb   #0xfe,CU_SAVEPC(%a2)    |set c    
480         clrw    NMNEXC(%a2)             |clear    
481         bclrb   #E1,E_BYTE(%a2)                   
482 |       fmove.l %FPSR,FPSR_SHADOW(%a2)            
483 |       bset.b  #SFLAG,E_BYTE(%a2)                
484 |       bset.b  #XFLAG,T_BYTE(%a2)                
485 end_avun:                                         
486         frestore (%a7)+                           
487         unlk    %a2                               
488         rts                                       
489 idle_end:                                         
490         addl    #4,%a7                            
491         unlk    %a2                               
492         rts                                       
493         |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