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