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