master
1.hidden __hwcap
2
3.global feclearexcept
4.type feclearexcept,@function
5feclearexcept:
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
111: 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
191: 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
311: xor %eax,%eax
32 ret
33 # only do the expensive x87 fenv load/store when needed
342: 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
421: 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
52feraiseexcept:
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
761: 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)
851: pop %ecx
86 ret
87
88.global fegetround
89.type fegetround,@function
90fegetround:
91 push %eax
92 fnstcw (%esp)
93 pop %eax
94 and $0xc00,%eax
95 ret
96
97.global fegetenv
98.type fegetenv,@function
99fegetenv:
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
1051: 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)
1141: ret
115
116.global fesetenv
117.type fesetenv,@function
118fesetenv:
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
1261: 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
1362: call 1f
1371: 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)
1471: ret
148
149.global fetestexcept
150.type fetestexcept,@function
151fetestexcept:
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
1571: addl $__hwcap-1b,(%esp)
158 pop %edx
159 testl $0x02000000,(%edx)
160 jz 1f
161 stmxcsr 4(%esp)
162 or 4(%esp),%eax
1631: and %ecx,%eax
164 ret