fix dup3 ignoring all flags but O_CLOEXEC on archs with SYS_dup2 syscall
[musl] / src / fenv / i386 / fenv.s
1 .hidden __hwcap
2
3 .global feclearexcept
4 .type feclearexcept,@function
5 feclearexcept:  
6         mov 4(%esp),%ecx
7         and $0x3f,%ecx
8         fnstsw %ax
9                 # consider sse fenv as well if the cpu has XMM capability
10         call 1f
11 1:      addl $__hwcap-1b,(%esp)
12         pop %edx
13         testl $0x02000000,(%edx)
14         jz 2f
15                 # maintain exceptions in the sse mxcsr, clear x87 exceptions
16         test %eax,%ecx
17         jz 1f
18         fnclex
19 1:      push %edx
20         stmxcsr (%esp)
21         pop %edx
22         and $0x3f,%eax
23         or %eax,%edx
24         test %edx,%ecx
25         jz 1f
26         not %ecx
27         and %ecx,%edx
28         push %edx
29         ldmxcsr (%esp)
30         pop %edx
31 1:      xor %eax,%eax
32         ret
33                 # only do the expensive x87 fenv load/store when needed
34 2:      test %eax,%ecx
35         jz 1b
36         not %ecx
37         and %ecx,%eax
38         test $0x3f,%eax
39         jz 1f
40         fnclex
41         jmp 1b
42 1:      sub $32,%esp
43         fnstenv (%esp)
44         mov %al,4(%esp)
45         fldenv (%esp)
46         add $32,%esp
47         xor %eax,%eax
48         ret
49
50 .global feraiseexcept
51 .type feraiseexcept,@function
52 feraiseexcept:  
53         mov 4(%esp),%eax
54         and $0x3f,%eax
55         sub $32,%esp
56         fnstenv (%esp)
57         or %al,4(%esp)
58         fldenv (%esp)
59         add $32,%esp
60         xor %eax,%eax
61         ret
62
63 .global __fesetround
64 .hidden __fesetround
65 .type __fesetround,@function
66 __fesetround:
67         mov 4(%esp),%ecx
68         push %eax
69         xor %eax,%eax
70         fnstcw (%esp)
71         andb $0xf3,1(%esp)
72         or %ch,1(%esp)
73         fldcw (%esp)
74                 # consider sse fenv as well if the cpu has XMM capability
75         call 1f
76 1:      addl $__hwcap-1b,(%esp)
77         pop %edx
78         testl $0x02000000,(%edx)
79         jz 1f
80         stmxcsr (%esp)
81         shl $3,%ch
82         andb $0x9f,1(%esp)
83         or %ch,1(%esp)
84         ldmxcsr (%esp)
85 1:      pop %ecx
86         ret
87
88 .global fegetround
89 .type fegetround,@function
90 fegetround:
91         push %eax
92         fnstcw (%esp)
93         pop %eax
94         and $0xc00,%eax
95         ret
96
97 .global fegetenv
98 .type fegetenv,@function
99 fegetenv:
100         mov 4(%esp),%ecx
101         xor %eax,%eax
102         fnstenv (%ecx)
103                 # consider sse fenv as well if the cpu has XMM capability
104         call 1f
105 1:      addl $__hwcap-1b,(%esp)
106         pop %edx
107         testl $0x02000000,(%edx)
108         jz 1f
109         push %eax
110         stmxcsr (%esp)
111         pop %edx
112         and $0x3f,%edx
113         or %edx,4(%ecx)
114 1:      ret
115
116 .global fesetenv
117 .type fesetenv,@function
118 fesetenv:
119         mov 4(%esp),%ecx
120         xor %eax,%eax
121         inc %ecx
122         jz 1f
123         fldenv -1(%ecx)
124         movl -1(%ecx),%ecx
125         jmp 2f
126 1:      push %eax
127         push %eax
128         push %eax
129         push %eax
130         pushl $0xffff
131         push %eax
132         pushl $0x37f
133         fldenv (%esp)
134         add $28,%esp
135                 # consider sse fenv as well if the cpu has XMM capability
136 2:      call 1f
137 1:      addl $__hwcap-1b,(%esp)
138         pop %edx
139         testl $0x02000000,(%edx)
140         jz 1f
141                 # mxcsr := same rounding mode, cleared exceptions, default mask
142         and $0xc00,%ecx
143         shl $3,%ecx
144         or $0x1f80,%ecx
145         mov %ecx,4(%esp)
146         ldmxcsr 4(%esp)
147 1:      ret
148
149 .global fetestexcept
150 .type fetestexcept,@function
151 fetestexcept:
152         mov 4(%esp),%ecx
153         and $0x3f,%ecx
154         fnstsw %ax
155                 # consider sse fenv as well if the cpu has XMM capability
156         call 1f
157 1:      addl $__hwcap-1b,(%esp)
158         pop %edx
159         testl $0x02000000,(%edx)
160         jz 1f
161         stmxcsr 4(%esp)
162         or 4(%esp),%eax
163 1:      and %ecx,%eax
164         ret