rework langinfo code for ABI compat and for use by time code
[musl] / src / fenv / i386 / fenv.s
index 34101d5..e365b8f 100644 (file)
@@ -1,52 +1,60 @@
-2:     not %ecx
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept: 
+       mov 4(%esp),%ecx
+       not %ecx
+       test $0x3f,%ecx
+       jnz 2f
+1:     fnclex
+       xor %eax,%eax
+       ret
+2:     fnstsw %ax
+       and %ecx,%eax
+       jz 1b
        sub $32,%esp
        fnstenv (%esp)
-       and %ecx,4(%esp)
-       or %edx,4(%esp)
+       mov %al,4(%esp)
        fldenv (%esp)
        add $32,%esp
-       ret
-
-.global feclearexcept
-feclearexcept: 
        xor %eax,%eax
-       mov 4(%esp),%ecx
-       xor %edx,%edx
-       test %ecx,%ecx
-       jnz 2b
        ret
 
 .global feraiseexcept
+.type feraiseexcept,@function
 feraiseexcept: 
+       mov 4(%esp),%eax
+       sub $32,%esp
+       fnstenv (%esp)
+       or %al,4(%esp)
+       fldenv (%esp)
+       add $32,%esp
        xor %eax,%eax
-       mov 4(%esp),%edx
-       xor %ecx,%ecx
-       test %edx,%edx
-       jnz 2b
        ret
 
 .global fesetround
+.type fesetround,@function
 fesetround:
        mov 4(%esp),%ecx
+       push %eax
        xor %eax,%eax
-       sub $32,%esp
-       fnstenv (%esp)
+       fnstcw (%esp)
        andb $0xf3,1(%esp)
-       or %ecx,(%esp)
-       fldenv (%esp)
-       add $32,%esp
+       or %ch,1(%esp)
+       fldcw (%esp)
+       pop %ecx
        ret
 
 .global fegetround
+.type fegetround,@function
 fegetround:
-       sub $28,%esp
-       fnstenv (%esp)
-       mov 4(%esp),%eax
-       add $28,%esp
-       and $0xc,%ah
+       push %eax
+       fnstcw (%esp)
+       pop %eax
+       and $0xc00,%eax
        ret
 
 .global fegetenv
+.type fegetenv,@function
 fegetenv:
        mov 4(%esp),%ecx
        xor %eax,%eax
@@ -54,6 +62,7 @@ fegetenv:
        ret
 
 .global fesetenv
+.type fesetenv,@function
 fesetenv:
        mov 4(%esp),%ecx
        xor %eax,%eax
@@ -73,6 +82,7 @@ fesetenv:
        ret
 
 .global fetestexcept
+.type fetestexcept,@function
 fetestexcept:
        mov 4(%esp),%ecx
        fnstsw %ax