diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2020-01-05 18:47:02 +0300 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-03-24 16:27:06 -0400 |
commit | 87026f6843f45573d6ac93c791c0597ba7f4e693 (patch) | |
tree | 100b2f71cceb6e64a3b492b3fe2727616de458e4 /src/math | |
parent | 33338ebc853d37c80f0f236cc7a92cb0acc6aace (diff) | |
download | musl-87026f6843f45573d6ac93c791c0597ba7f4e693.tar.gz musl-87026f6843f45573d6ac93c791c0597ba7f4e693.tar.bz2 musl-87026f6843f45573d6ac93c791c0597ba7f4e693.tar.xz musl-87026f6843f45573d6ac93c791c0597ba7f4e693.zip |
math: move x86_64 fabs, fabsf to C with inline asm
Diffstat (limited to 'src/math')
-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 |