diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/fenv/x86_64/fenv.s | 41 | 
1 files changed, 23 insertions, 18 deletions
| diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s index 11aa3da2..443e35a2 100644 --- a/src/fenv/x86_64/fenv.s +++ b/src/fenv/x86_64/fenv.s @@ -1,32 +1,37 @@ -2:	not %edi +.global feclearexcept +.type feclearexcept,@function +feclearexcept: +	mov %edi,%ecx +	not %ecx +	stmxcsr -8(%rsp) +	and %ecx,-8(%rsp) +	ldmxcsr -8(%rsp) +	test $0x3f,%ecx +	jnz 2f +1:	fnclex +	xor %eax,%eax +	ret +2:	fnstsw %ax +	and %ecx,%eax +	jz 1b  	sub $32,%rsp  	fnstenv (%rsp) -	and %edi,4(%rsp) -	or %esi,4(%rsp) +	mov %al,4(%rsp)  	fldenv (%rsp) -	stmxcsr (%rsp) -	and %edi,(%rsp) -	ldmxcsr (%rsp)  	add $32,%rsp -	ret - -.global feclearexcept -.type feclearexcept,@function -feclearexcept:	  	xor %eax,%eax -	xor %esi,%esi -	test %edi,%edi -	jnz 2b  	ret  .global feraiseexcept  .type feraiseexcept,@function  feraiseexcept:	 +	stmxcsr -8(%rsp) +	or %edi,-8(%rsp) +	ldmxcsr -8(%rsp) +	fnstenv -32(%rsp) +	or %edi,-28(%rsp) +	fldenv -32(%rsp)  	xor %eax,%eax -	mov %edi,%esi -	xor %edi,%edi -	test %esi,%esi -	jnz 2b  	ret  .global fesetround | 
