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
99