5 #if (defined __i386__) || (defined __x86_64__)
7 /* Macros for accessing the hardware control word. */
8 #define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw))
9 #define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw))
10 #define _SSE_GETCSR(csr) __asm__ ("stmxcsr %0" : "=m" (*&csr))
11 #define _SSE_SETCSR(csr) __asm__ ("ldmxcsr %0" : : "m" (*&csr))
13 #define FPU_ROUNDING_CONTROL_MASK 0x0C00
14 #define FPU_ROUNDING_CONTROL_SHIFT 10
15 #define SSE_ROUNDING_CONTROL_MASK 0x00006000
16 #define SSE_ROUNDING_CONTROL_SHIFT 13
18 static inline C_Int_t
fegetround (void) {
21 _FPU_GETCW (fpuControl
);
22 return (fpuControl
& FPU_ROUNDING_CONTROL_MASK
)
23 >> FPU_ROUNDING_CONTROL_SHIFT
;
26 static inline C_Int_t
fesetround (C_Int_t mode
) {
32 _FPU_GETCW (fpuControl
);
33 fpuControl
&= ~FPU_ROUNDING_CONTROL_MASK
;
34 fpuControl
|= mode
<< FPU_ROUNDING_CONTROL_SHIFT
;
35 _FPU_SETCW (fpuControl
);
38 _SSE_GETCSR (sseControl
);
39 sseControl
&= ~SSE_ROUNDING_CONTROL_MASK
;
40 sseControl
|= mode
<< SSE_ROUNDING_CONTROL_SHIFT
;
41 _SSE_SETCSR (sseControl
);
46 #elif (defined __UCLIBC__)
48 /* Use whatever we got from fpu_control.h for this CPU model */
49 #define FE_MASK (FE_DOWNWARD|FE_TONEAREST|FE_TOWARDZERO|FE_UPWARD)
51 static inline int fegetround () {
52 fpu_control_t controlWord
;
53 _FPU_GETCW(controlWord
);
54 return controlWord
& FE_MASK
;
57 static inline int fesetround (int mode
) {
58 fpu_control_t controlWord
;
60 _FPU_GETCW (controlWord
);
61 controlWord
= (controlWord
& ~FE_MASK
) | mode
;
62 _FPU_SETCW (controlWord
);
69 #error fe{get,set}round not implemented
73 #endif /* !HAS_FEROUND */
75 C_Int_t
IEEEReal_getRoundingMode (void) {
79 C_Int_t
IEEEReal_setRoundingMode (C_Int_t m
) {
80 assert (m
!= IEEEReal_RoundingMode_FE_NOSUPPORT
);
81 return fesetround (m
);