mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
math: move x87-family remainder functions to C with inline asm
This commit is contained in:
parent
51f4f8c512
commit
b173e4262f
8 changed files with 42 additions and 50 deletions
12
src/math/i386/remainder.c
Normal file
12
src/math/i386/remainder.c
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
double remainder(double x, double y)
|
||||||
|
{
|
||||||
|
unsigned short fpsr;
|
||||||
|
// fprem1 does not introduce excess precision into x
|
||||||
|
do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||||
|
while (fpsr & 0x400);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
weak_alias(remainder, drem);
|
|
@ -1,14 +0,0 @@
|
||||||
.global remainder
|
|
||||||
.type remainder,@function
|
|
||||||
remainder:
|
|
||||||
.weak drem
|
|
||||||
.type drem,@function
|
|
||||||
drem:
|
|
||||||
fldl 12(%esp)
|
|
||||||
fldl 4(%esp)
|
|
||||||
1: fprem1
|
|
||||||
fnstsw %ax
|
|
||||||
sahf
|
|
||||||
jp 1b
|
|
||||||
fstp %st(1)
|
|
||||||
ret
|
|
12
src/math/i386/remainderf.c
Normal file
12
src/math/i386/remainderf.c
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
float remainderf(float x, float y)
|
||||||
|
{
|
||||||
|
unsigned short fpsr;
|
||||||
|
// fprem1 does not introduce excess precision into x
|
||||||
|
do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||||
|
while (fpsr & 0x400);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
weak_alias(remainderf, dremf);
|
|
@ -1,14 +0,0 @@
|
||||||
.global remainderf
|
|
||||||
.type remainderf,@function
|
|
||||||
remainderf:
|
|
||||||
.weak dremf
|
|
||||||
.type dremf,@function
|
|
||||||
dremf:
|
|
||||||
flds 8(%esp)
|
|
||||||
flds 4(%esp)
|
|
||||||
1: fprem1
|
|
||||||
fnstsw %ax
|
|
||||||
sahf
|
|
||||||
jp 1b
|
|
||||||
fstp %st(1)
|
|
||||||
ret
|
|
9
src/math/i386/remainderl.c
Normal file
9
src/math/i386/remainderl.c
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
long double remainderl(long double x, long double y)
|
||||||
|
{
|
||||||
|
unsigned short fpsr;
|
||||||
|
do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||||
|
while (fpsr & 0x400);
|
||||||
|
return x;
|
||||||
|
}
|
|
@ -1,11 +0,0 @@
|
||||||
.global remainderl
|
|
||||||
.type remainderl,@function
|
|
||||||
remainderl:
|
|
||||||
fldt 16(%esp)
|
|
||||||
fldt 4(%esp)
|
|
||||||
1: fprem1
|
|
||||||
fnstsw %ax
|
|
||||||
sahf
|
|
||||||
jp 1b
|
|
||||||
fstp %st(1)
|
|
||||||
ret
|
|
9
src/math/x86_64/remainderl.c
Normal file
9
src/math/x86_64/remainderl.c
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
long double remainderl(long double x, long double y)
|
||||||
|
{
|
||||||
|
unsigned short fpsr;
|
||||||
|
do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||||
|
while (fpsr & 0x400);
|
||||||
|
return x;
|
||||||
|
}
|
|
@ -1,11 +0,0 @@
|
||||||
.global remainderl
|
|
||||||
.type remainderl,@function
|
|
||||||
remainderl:
|
|
||||||
fldt 24(%rsp)
|
|
||||||
fldt 8(%rsp)
|
|
||||||
1: fprem1
|
|
||||||
fnstsw %ax
|
|
||||||
testb $4,%ah
|
|
||||||
jnz 1b
|
|
||||||
fstp %st(1)
|
|
||||||
ret
|
|
Loading…
Add table
Reference in a new issue