diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/math/x86_64/fabs.c | 10 | ||||
| -rw-r--r-- | src/math/x86_64/fabs.s | 9 | ||||
| -rw-r--r-- | src/math/x86_64/fabsf.c | 10 | ||||
| -rw-r--r-- | src/math/x86_64/fabsf.s | 7 | 
4 files changed, 20 insertions, 16 deletions
diff --git a/src/math/x86_64/fabs.c b/src/math/x86_64/fabs.c new file mode 100644 index 00000000..16562477 --- /dev/null +++ b/src/math/x86_64/fabs.c @@ -0,0 +1,10 @@ +#include <math.h> + +double fabs(double x) +{ +	double t; +	__asm__ ("pcmpeqd %0, %0" : "=x"(t));          // t = ~0 +	__asm__ ("psrlq   $1, %0" : "+x"(t));          // t >>= 1 +	__asm__ ("andps   %1, %0" : "+x"(x) : "x"(t)); // x &= t +	return x; +} diff --git a/src/math/x86_64/fabs.s b/src/math/x86_64/fabs.s deleted file mode 100644 index 5715005e..00000000 --- a/src/math/x86_64/fabs.s +++ /dev/null @@ -1,9 +0,0 @@ -.global fabs -.type fabs,@function -fabs: -	xor %eax,%eax -	dec %rax -	shr %rax -	movq %rax,%xmm1 -	andpd %xmm1,%xmm0 -	ret diff --git a/src/math/x86_64/fabsf.c b/src/math/x86_64/fabsf.c new file mode 100644 index 00000000..36ea7481 --- /dev/null +++ b/src/math/x86_64/fabsf.c @@ -0,0 +1,10 @@ +#include <math.h> + +float fabsf(float x) +{ +	float t; +	__asm__ ("pcmpeqd %0, %0" : "=x"(t));          // t = ~0 +	__asm__ ("psrld   $1, %0" : "+x"(t));          // t >>= 1 +	__asm__ ("andps   %1, %0" : "+x"(x) : "x"(t)); // x &= t +	return x; +} diff --git a/src/math/x86_64/fabsf.s b/src/math/x86_64/fabsf.s deleted file mode 100644 index 501a1f17..00000000 --- a/src/math/x86_64/fabsf.s +++ /dev/null @@ -1,7 +0,0 @@ -.global fabsf -.type fabsf,@function -fabsf: -	mov $0x7fffffff,%eax -	movq %rax,%xmm1 -	andps %xmm1,%xmm0 -	ret  | 
