فهرست منبع

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

Alexander Monakov 5 سال پیش
والد
کامیت
bc87299ce7
8فایلهای تغییر یافته به همراه38 افزوده شده و 44 حذف شده
  1. 10 0
      src/math/i386/fmod.c
  2. 0 11
      src/math/i386/fmod.s
  3. 10 0
      src/math/i386/fmodf.c
  4. 0 11
      src/math/i386/fmodf.s
  5. 9 0
      src/math/i386/fmodl.c
  6. 0 11
      src/math/i386/fmodl.s
  7. 9 0
      src/math/x86_64/fmodl.c
  8. 0 11
      src/math/x86_64/fmodl.s

+ 10 - 0
src/math/i386/fmod.c

@@ -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;
+}

+ 0 - 11
src/math/i386/fmod.s

@@ -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 - 0
src/math/i386/fmodf.c

@@ -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;
+}

+ 0 - 11
src/math/i386/fmodf.s

@@ -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 - 0
src/math/i386/fmodl.c

@@ -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;
+}

+ 0 - 11
src/math/i386/fmodl.s

@@ -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 - 0
src/math/x86_64/fmodl.c

@@ -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;
+}

+ 0 - 11
src/math/x86_64/fmodl.s

@@ -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