mirror of
git://git.musl-libc.org/musl
synced 2025-01-25 16:13:35 +00:00
math: move x87-family fmod functions to C with inline asm
This commit is contained in:
parent
b173e4262f
commit
bc87299ce7
10
src/math/i386/fmod.c
Normal file
10
src/math/i386/fmod.c
Normal file
@ -0,0 +1,10 @@
|
||||
#include <math.h>
|
||||
|
||||
double fmod(double x, double y)
|
||||
{
|
||||
unsigned short fpsr;
|
||||
// fprem does not introduce excess precision into x
|
||||
do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||
while (fpsr & 0x400);
|
||||
return x;
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
.global fmod
|
||||
.type fmod,@function
|
||||
fmod:
|
||||
fldl 12(%esp)
|
||||
fldl 4(%esp)
|
||||
1: fprem
|
||||
fnstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
fstp %st(1)
|
||||
ret
|
10
src/math/i386/fmodf.c
Normal file
10
src/math/i386/fmodf.c
Normal file
@ -0,0 +1,10 @@
|
||||
#include <math.h>
|
||||
|
||||
float fmodf(float x, float y)
|
||||
{
|
||||
unsigned short fpsr;
|
||||
// fprem does not introduce excess precision into x
|
||||
do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||
while (fpsr & 0x400);
|
||||
return x;
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
.global fmodf
|
||||
.type fmodf,@function
|
||||
fmodf:
|
||||
flds 8(%esp)
|
||||
flds 4(%esp)
|
||||
1: fprem
|
||||
fnstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
fstp %st(1)
|
||||
ret
|
9
src/math/i386/fmodl.c
Normal file
9
src/math/i386/fmodl.c
Normal file
@ -0,0 +1,9 @@
|
||||
#include <math.h>
|
||||
|
||||
long double fmodl(long double x, long double y)
|
||||
{
|
||||
unsigned short fpsr;
|
||||
do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||
while (fpsr & 0x400);
|
||||
return x;
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
.global fmodl
|
||||
.type fmodl,@function
|
||||
fmodl:
|
||||
fldt 16(%esp)
|
||||
fldt 4(%esp)
|
||||
1: fprem
|
||||
fnstsw %ax
|
||||
sahf
|
||||
jp 1b
|
||||
fstp %st(1)
|
||||
ret
|
9
src/math/x86_64/fmodl.c
Normal file
9
src/math/x86_64/fmodl.c
Normal file
@ -0,0 +1,9 @@
|
||||
#include <math.h>
|
||||
|
||||
long double fmodl(long double x, long double y)
|
||||
{
|
||||
unsigned short fpsr;
|
||||
do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
|
||||
while (fpsr & 0x400);
|
||||
return x;
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
.global fmodl
|
||||
.type fmodl,@function
|
||||
fmodl:
|
||||
fldt 24(%rsp)
|
||||
fldt 8(%rsp)
|
||||
1: fprem
|
||||
fnstsw %ax
|
||||
testb $4,%ah
|
||||
jnz 1b
|
||||
fstp %st(1)
|
||||
ret
|
Loading…
Reference in New Issue
Block a user