| 1 | .hidden __hwcap |
| 2 | |
| 3 | .global feclearexcept |
| 4 | .type feclearexcept,@function |
| 5 | feclearexcept:	 |
| 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 |
| 11 | 1:	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 |
| 19 | 1:	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 |
| 31 | 1:	xor %eax,%eax |
| 32 | 	ret |
| 33 | 		# only do the expensive x87 fenv load/store when needed |
| 34 | 2:	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 |
| 42 | 1:	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 |
| 52 | feraiseexcept:	 |
| 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 |
| 76 | 1:	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) |
| 85 | 1:	pop %ecx |
| 86 | 	ret |
| 87 | |
| 88 | .global fegetround |
| 89 | .type fegetround,@function |
| 90 | fegetround: |
| 91 | 	push %eax |
| 92 | 	fnstcw (%esp) |
| 93 | 	pop %eax |
| 94 | 	and $0xc00,%eax |
| 95 | 	ret |
| 96 | |
| 97 | .global fegetenv |
| 98 | .type fegetenv,@function |
| 99 | fegetenv: |
| 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 |
| 105 | 1:	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) |
| 114 | 1:	ret |
| 115 | |
| 116 | .global fesetenv |
| 117 | .type fesetenv,@function |
| 118 | fesetenv: |
| 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 |
| 126 | 1:	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 |
| 136 | 2:	call 1f |
| 137 | 1:	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) |
| 147 | 1:	ret |
| 148 | |
| 149 | .global fetestexcept |
| 150 | .type fetestexcept,@function |
| 151 | fetestexcept: |
| 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 |
| 157 | 1:	addl $__hwcap-1b,(%esp) |
| 158 | 	pop %edx |
| 159 | 	testl $0x02000000,(%edx) |
| 160 | 	jz 1f |
| 161 | 	stmxcsr 4(%esp) |
| 162 | 	or 4(%esp),%eax |
| 163 | 1:	and %ecx,%eax |
| 164 | 	ret |