Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1906 | serge | 1 | #include |
2 | #include |
||
3 | #include |
||
4 | #define FE_ROUNDING_MASK \ |
||
5 | (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO) |
||
6 | |||
7 | float |
||
8 | modff (float value, float* iptr) |
||
9 | { |
||
10 | float int_part; |
||
11 | unsigned short saved_cw; |
||
12 | unsigned short tmp_cw; |
||
13 | /* truncate */ |
||
14 | asm ("fnstcw %0;" : "=m" (saved_cw)); /* save control word */ |
||
15 | tmp_cw = (saved_cw & ~FE_ROUNDING_MASK) | FE_TOWARDZERO; |
||
16 | asm ("fldcw %0;" : : "m" (tmp_cw)); |
||
17 | asm ("frndint;" : "=t" (int_part) : "0" (value)); /* round */ |
||
18 | asm ("fldcw %0;" : : "m" (saved_cw)); /* restore saved cw */ |
||
19 | if (iptr) |
||
20 | *iptr = int_part; |
||
21 | return (isinf (value) ? 0.0F : value - int_part); |
||
22 | } |