math: move x87-family fmod functions to C with inline asm

This commit is contained in:
Alexander Monakov
2020-03-24 16:31:36 -04:00
committed by Rich Felker
parent b173e4262f
commit bc87299ce7
8 changed files with 38 additions and 44 deletions
+10
View 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;
}
-11
View File
@@ -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
View 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;
}
-11
View File
@@ -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
View 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;
}
-11
View File
@@ -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
View 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;
}
-11
View File
@@ -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