diff options
| author | Rich Felker <dalias@aerifal.cx> | 2012-03-17 19:29:00 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2012-03-17 19:29:00 -0400 | 
| commit | 316e024f63af0d0d2bb0df3dfce2620f4be827d1 (patch) | |
| tree | c1dbe320f1034df38f293016f00f5bf7dc6f0128 /src | |
| parent | 9cb6878e747909c7a45dd1c4dd550ac62e1f7690 (diff) | |
| download | musl-316e024f63af0d0d2bb0df3dfce2620f4be827d1.tar.gz | |
optimize x86 feclearexcept
if all exception flags will be cleared, we can avoid the expensive
store/reload of the environment and just use the fnclex instruction.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fenv/i386/fenv.s | 36 | 
1 files changed, 20 insertions, 16 deletions
diff --git a/src/fenv/i386/fenv.s b/src/fenv/i386/fenv.s index 647b7961..e365b8f4 100644 --- a/src/fenv/i386/fenv.s +++ b/src/fenv/i386/fenv.s @@ -1,30 +1,34 @@ -2:	not %ecx +.global feclearexcept +.type feclearexcept,@function +feclearexcept:	 +	mov 4(%esp),%ecx +	not %ecx +	test $0x3f,%ecx +	jnz 2f +1:	fnclex +	xor %eax,%eax +	ret +2:	fnstsw %ax +	and %ecx,%eax +	jz 1b  	sub $32,%esp  	fnstenv (%esp) -	and %ecx,4(%esp) -	or %edx,4(%esp) +	mov %al,4(%esp)  	fldenv (%esp)  	add $32,%esp -	ret - -.global feclearexcept -.type feclearexcept,@function -feclearexcept:	  	xor %eax,%eax -	mov 4(%esp),%ecx -	xor %edx,%edx -	test %ecx,%ecx -	jnz 2b  	ret  .global feraiseexcept  .type feraiseexcept,@function  feraiseexcept:	 +	mov 4(%esp),%eax +	sub $32,%esp +	fnstenv (%esp) +	or %al,4(%esp) +	fldenv (%esp) +	add $32,%esp  	xor %eax,%eax -	mov 4(%esp),%edx -	xor %ecx,%ecx -	test %edx,%edx -	jnz 2b  	ret  .global fesetround  | 
