fix potential deadlock in dlerror buffer handling at thread exit
[musl] / src / fenv / x32 / fenv.s
1 .global feclearexcept
2 .type feclearexcept,@function
3 feclearexcept:
4                 # maintain exceptions in the sse mxcsr, clear x87 exceptions
5         mov %edi,%ecx
6         and $0x3f,%ecx
7         fnstsw %ax
8         test %eax,%ecx
9         jz 1f
10         fnclex
11 1:      stmxcsr -8(%esp)
12         and $0x3f,%eax
13         or %eax,-8(%esp)
14         test %ecx,-8(%esp)
15         jz 1f
16         not %ecx
17         and %ecx,-8(%esp)
18         ldmxcsr -8(%esp)
19 1:      xor %eax,%eax
20         ret
21
22 .global feraiseexcept
23 .type feraiseexcept,@function
24 feraiseexcept:
25         and $0x3f,%edi
26         stmxcsr -8(%esp)
27         or %edi,-8(%esp)
28         ldmxcsr -8(%esp)
29         xor %eax,%eax
30         ret
31
32 .global __fesetround
33 .hidden __fesetround
34 .type __fesetround,@function
35 __fesetround:
36         push %rax
37         xor %eax,%eax
38         mov %edi,%ecx
39         fnstcw (%esp)
40         andb $0xf3,1(%esp)
41         or %ch,1(%esp)
42         fldcw (%esp)
43         stmxcsr (%esp)
44         shl $3,%ch
45         andb $0x9f,1(%esp)
46         or %ch,1(%esp)
47         ldmxcsr (%esp)
48         pop %rcx
49         ret
50
51 .global fegetround
52 .type fegetround,@function
53 fegetround:
54         push %rax
55         stmxcsr (%esp)
56         pop %rax
57         shr $3,%eax
58         and $0xc00,%eax
59         ret
60
61 .global fegetenv
62 .type fegetenv,@function
63 fegetenv:
64         xor %eax,%eax
65         fnstenv (%edi)
66         stmxcsr 28(%edi)
67         ret
68
69 .global fesetenv
70 .type fesetenv,@function
71 fesetenv:
72         xor %eax,%eax
73         inc %edi
74         jz 1f
75         fldenv -1(%edi)
76         ldmxcsr 27(%edi)
77         ret
78 1:      push %rax
79         push %rax
80         pushq $0xffff
81         pushq $0x37f
82         fldenv (%esp)
83         pushq $0x1f80
84         ldmxcsr (%esp)
85         add $40,%esp
86         ret
87
88 .global fetestexcept
89 .type fetestexcept,@function
90 fetestexcept:
91         and $0x3f,%edi
92         push %rax
93         stmxcsr (%esp)
94         pop %rsi
95         fnstsw %ax
96         or %esi,%eax
97         and %edi,%eax
98         ret