mirror of https://git.musl-libc.org/git/musl
committed by
Rich Felker
8 changed files with 42 additions and 50 deletions
@ -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 |
|
||||
@ -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 |
|
||||
@ -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 |
|
||||
@ -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…
Reference in new issue