1570af302Sopenharmony_ci.hidden __hwcap
2570af302Sopenharmony_ci
3570af302Sopenharmony_ci.global feclearexcept
4570af302Sopenharmony_ci.type feclearexcept,@function
5570af302Sopenharmony_cifeclearexcept:
6570af302Sopenharmony_ci	mov 4(%esp),%ecx
7570af302Sopenharmony_ci	and $0x3f,%ecx
8570af302Sopenharmony_ci	fnstsw %ax
9570af302Sopenharmony_ci		# consider sse fenv as well if the cpu has XMM capability
10570af302Sopenharmony_ci	call 1f
11570af302Sopenharmony_ci1:	addl $__hwcap-1b,(%esp)
12570af302Sopenharmony_ci	pop %edx
13570af302Sopenharmony_ci	testl $0x02000000,(%edx)
14570af302Sopenharmony_ci	jz 2f
15570af302Sopenharmony_ci		# maintain exceptions in the sse mxcsr, clear x87 exceptions
16570af302Sopenharmony_ci	test %eax,%ecx
17570af302Sopenharmony_ci	jz 1f
18570af302Sopenharmony_ci	fnclex
19570af302Sopenharmony_ci1:	push %edx
20570af302Sopenharmony_ci	stmxcsr (%esp)
21570af302Sopenharmony_ci	pop %edx
22570af302Sopenharmony_ci	and $0x3f,%eax
23570af302Sopenharmony_ci	or %eax,%edx
24570af302Sopenharmony_ci	test %edx,%ecx
25570af302Sopenharmony_ci	jz 1f
26570af302Sopenharmony_ci	not %ecx
27570af302Sopenharmony_ci	and %ecx,%edx
28570af302Sopenharmony_ci	push %edx
29570af302Sopenharmony_ci	ldmxcsr (%esp)
30570af302Sopenharmony_ci	pop %edx
31570af302Sopenharmony_ci1:	xor %eax,%eax
32570af302Sopenharmony_ci	ret
33570af302Sopenharmony_ci		# only do the expensive x87 fenv load/store when needed
34570af302Sopenharmony_ci2:	test %eax,%ecx
35570af302Sopenharmony_ci	jz 1b
36570af302Sopenharmony_ci	not %ecx
37570af302Sopenharmony_ci	and %ecx,%eax
38570af302Sopenharmony_ci	test $0x3f,%eax
39570af302Sopenharmony_ci	jz 1f
40570af302Sopenharmony_ci	fnclex
41570af302Sopenharmony_ci	jmp 1b
42570af302Sopenharmony_ci1:	sub $32,%esp
43570af302Sopenharmony_ci	fnstenv (%esp)
44570af302Sopenharmony_ci	mov %al,4(%esp)
45570af302Sopenharmony_ci	fldenv (%esp)
46570af302Sopenharmony_ci	add $32,%esp
47570af302Sopenharmony_ci	xor %eax,%eax
48570af302Sopenharmony_ci	ret
49570af302Sopenharmony_ci
50570af302Sopenharmony_ci.global feraiseexcept
51570af302Sopenharmony_ci.type feraiseexcept,@function
52570af302Sopenharmony_ciferaiseexcept:
53570af302Sopenharmony_ci	mov 4(%esp),%eax
54570af302Sopenharmony_ci	and $0x3f,%eax
55570af302Sopenharmony_ci	sub $32,%esp
56570af302Sopenharmony_ci	fnstenv (%esp)
57570af302Sopenharmony_ci	or %al,4(%esp)
58570af302Sopenharmony_ci	fldenv (%esp)
59570af302Sopenharmony_ci	add $32,%esp
60570af302Sopenharmony_ci	xor %eax,%eax
61570af302Sopenharmony_ci	ret
62570af302Sopenharmony_ci
63570af302Sopenharmony_ci.global __fesetround
64570af302Sopenharmony_ci.hidden __fesetround
65570af302Sopenharmony_ci.type __fesetround,@function
66570af302Sopenharmony_ci__fesetround:
67570af302Sopenharmony_ci	mov 4(%esp),%ecx
68570af302Sopenharmony_ci	push %eax
69570af302Sopenharmony_ci	xor %eax,%eax
70570af302Sopenharmony_ci	fnstcw (%esp)
71570af302Sopenharmony_ci	andb $0xf3,1(%esp)
72570af302Sopenharmony_ci	or %ch,1(%esp)
73570af302Sopenharmony_ci	fldcw (%esp)
74570af302Sopenharmony_ci		# consider sse fenv as well if the cpu has XMM capability
75570af302Sopenharmony_ci	call 1f
76570af302Sopenharmony_ci1:	addl $__hwcap-1b,(%esp)
77570af302Sopenharmony_ci	pop %edx
78570af302Sopenharmony_ci	testl $0x02000000,(%edx)
79570af302Sopenharmony_ci	jz 1f
80570af302Sopenharmony_ci	stmxcsr (%esp)
81570af302Sopenharmony_ci	shl $3,%ch
82570af302Sopenharmony_ci	andb $0x9f,1(%esp)
83570af302Sopenharmony_ci	or %ch,1(%esp)
84570af302Sopenharmony_ci	ldmxcsr (%esp)
85570af302Sopenharmony_ci1:	pop %ecx
86570af302Sopenharmony_ci	ret
87570af302Sopenharmony_ci
88570af302Sopenharmony_ci.global fegetround
89570af302Sopenharmony_ci.type fegetround,@function
90570af302Sopenharmony_cifegetround:
91570af302Sopenharmony_ci	push %eax
92570af302Sopenharmony_ci	fnstcw (%esp)
93570af302Sopenharmony_ci	pop %eax
94570af302Sopenharmony_ci	and $0xc00,%eax
95570af302Sopenharmony_ci	ret
96570af302Sopenharmony_ci
97570af302Sopenharmony_ci.global fegetenv
98570af302Sopenharmony_ci.type fegetenv,@function
99570af302Sopenharmony_cifegetenv:
100570af302Sopenharmony_ci	mov 4(%esp),%ecx
101570af302Sopenharmony_ci	xor %eax,%eax
102570af302Sopenharmony_ci	fnstenv (%ecx)
103570af302Sopenharmony_ci		# consider sse fenv as well if the cpu has XMM capability
104570af302Sopenharmony_ci	call 1f
105570af302Sopenharmony_ci1:	addl $__hwcap-1b,(%esp)
106570af302Sopenharmony_ci	pop %edx
107570af302Sopenharmony_ci	testl $0x02000000,(%edx)
108570af302Sopenharmony_ci	jz 1f
109570af302Sopenharmony_ci	push %eax
110570af302Sopenharmony_ci	stmxcsr (%esp)
111570af302Sopenharmony_ci	pop %edx
112570af302Sopenharmony_ci	and $0x3f,%edx
113570af302Sopenharmony_ci	or %edx,4(%ecx)
114570af302Sopenharmony_ci1:	ret
115570af302Sopenharmony_ci
116570af302Sopenharmony_ci.global fesetenv
117570af302Sopenharmony_ci.type fesetenv,@function
118570af302Sopenharmony_cifesetenv:
119570af302Sopenharmony_ci	mov 4(%esp),%ecx
120570af302Sopenharmony_ci	xor %eax,%eax
121570af302Sopenharmony_ci	inc %ecx
122570af302Sopenharmony_ci	jz 1f
123570af302Sopenharmony_ci	fldenv -1(%ecx)
124570af302Sopenharmony_ci	movl -1(%ecx),%ecx
125570af302Sopenharmony_ci	jmp 2f
126570af302Sopenharmony_ci1:	push %eax
127570af302Sopenharmony_ci	push %eax
128570af302Sopenharmony_ci	push %eax
129570af302Sopenharmony_ci	push %eax
130570af302Sopenharmony_ci	pushl $0xffff
131570af302Sopenharmony_ci	push %eax
132570af302Sopenharmony_ci	pushl $0x37f
133570af302Sopenharmony_ci	fldenv (%esp)
134570af302Sopenharmony_ci	add $28,%esp
135570af302Sopenharmony_ci		# consider sse fenv as well if the cpu has XMM capability
136570af302Sopenharmony_ci2:	call 1f
137570af302Sopenharmony_ci1:	addl $__hwcap-1b,(%esp)
138570af302Sopenharmony_ci	pop %edx
139570af302Sopenharmony_ci	testl $0x02000000,(%edx)
140570af302Sopenharmony_ci	jz 1f
141570af302Sopenharmony_ci		# mxcsr := same rounding mode, cleared exceptions, default mask
142570af302Sopenharmony_ci	and $0xc00,%ecx
143570af302Sopenharmony_ci	shl $3,%ecx
144570af302Sopenharmony_ci	or $0x1f80,%ecx
145570af302Sopenharmony_ci	mov %ecx,4(%esp)
146570af302Sopenharmony_ci	ldmxcsr 4(%esp)
147570af302Sopenharmony_ci1:	ret
148570af302Sopenharmony_ci
149570af302Sopenharmony_ci.global fetestexcept
150570af302Sopenharmony_ci.type fetestexcept,@function
151570af302Sopenharmony_cifetestexcept:
152570af302Sopenharmony_ci	mov 4(%esp),%ecx
153570af302Sopenharmony_ci	and $0x3f,%ecx
154570af302Sopenharmony_ci	fnstsw %ax
155570af302Sopenharmony_ci		# consider sse fenv as well if the cpu has XMM capability
156570af302Sopenharmony_ci	call 1f
157570af302Sopenharmony_ci1:	addl $__hwcap-1b,(%esp)
158570af302Sopenharmony_ci	pop %edx
159570af302Sopenharmony_ci	testl $0x02000000,(%edx)
160570af302Sopenharmony_ci	jz 1f
161570af302Sopenharmony_ci	stmxcsr 4(%esp)
162570af302Sopenharmony_ci	or 4(%esp),%eax
163570af302Sopenharmony_ci1:	and %ecx,%eax
164570af302Sopenharmony_ci	ret
165