1 #include <fpu_control.h>
5 extern void __ieee_set_fp_control (unsigned long);
6 extern unsigned long __ieee_get_fp_control (void);
9 static inline unsigned long
14 asm ("trapb; mf_fpcr $f0; trapb; stt $f0,%0" : "m="(fpcr
));
20 wrfpcr (unsigned long fpcr
)
22 asm volatile ("ldt $f0,%0; trapb; mt_fpcr $f0; trapb" :: "m"(fpcr
));
27 __setfpucw (unsigned short fpu_control
)
29 unsigned long fpcr
= 0, fpcw
= 0;
32 fpu_control
= _FPU_DEFAULT
;
34 /* first, set dynamic rounding mode: */
37 fpcr
&= ~FPCR_DYN_MASK
;
38 switch (fpu_control
& 0xc00) {
39 case _FPU_RC_NEAREST
: fpcr
|= FPCR_DYN_NORMAL
; break;
40 case _FPU_RC_DOWN
: fpcr
|= FPCR_DYN_MINUS
; break;
41 case _FPU_RC_UP
: fpcr
|= FPCR_DYN_PLUS
; break;
42 case _FPU_RC_ZERO
: fpcr
|= FPCR_DYN_CHOPPED
; break;
46 /* now tell kernel about traps that we like to hear about: */
48 fpcw
= __ieee_get_fp_control();
49 fpcw
&= ~IEEE_TRAP_ENABLE_MASK
;
51 if (!(fpu_control
& _FPU_MASK_IM
))
52 fpcw
|= IEEE_TRAP_ENABLE_INV
;
53 if (!(fpu_control
& _FPU_MASK_DM
))
54 fpcw
|= IEEE_TRAP_ENABLE_UNF
;
55 if (!(fpu_control
& _FPU_MASK_ZM
))
56 fpcw
|= IEEE_TRAP_ENABLE_DZE
;
57 if (!(fpu_control
& _FPU_MASK_OM
))
58 fpcw
|= IEEE_TRAP_ENABLE_OVF
;
59 if (!(fpu_control
& _FPU_MASK_PM
))
60 fpcw
|= IEEE_TRAP_ENABLE_INE
;
62 __ieee_set_fp_control(fpcw
);
64 __fpu_control
= fpu_control
; /* update global copy */