about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-17 10:50:33 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-17 10:50:33 +0200
commit248cd2e749dcc5931113a405e232e9a90c130089 (patch)
tree6eddccb3f60c2969ae2a839280866f91a4a6fb0a /src
parent3b550eeed3ecd47546ad0c0664a458af463c57af (diff)
downloadbox64-248cd2e749dcc5931113a405e232e9a90c130089.tar.gz
box64-248cd2e749dcc5931113a405e232e9a90c130089.zip
Fixed nexttoward(f) wrapped functions, and improved long double handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x87emu_private.c15
-rwxr-xr-xsrc/include/x64emu.h1
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrapper.c10
-rw-r--r--src/wrapped/generated/wrapper.h2
-rwxr-xr-xsrc/wrapped/wrappedlibm_private.h4
6 files changed, 29 insertions, 5 deletions
diff --git a/src/emu/x87emu_private.c b/src/emu/x87emu_private.c
index 5f638bfb..cd35c116 100755
--- a/src/emu/x87emu_private.c
+++ b/src/emu/x87emu_private.c
@@ -196,6 +196,21 @@ double FromLD(void* ld)
     return ret;
 }
 
+#ifndef HAVE_LD80BITS
+long double LD2localLD(void* ld)
+{
+    // local implementation may not be try Quad precision, but double-double precision, so simple way to keep the 80bits precision in the conversion
+    double ret;
+    LD2D(ld, &ret);
+    return ret;
+}
+#else
+long double LD2localLD(void* ld)
+{
+    return *(long double*)ld;
+}
+#endif
+
 void fpu_loadenv(x64emu_t* emu, char* p, int b16)
 {
     emu->cw = *(uint16_t*)p;
diff --git a/src/include/x64emu.h b/src/include/x64emu.h
index 21f435c8..0a928afd 100755
--- a/src/include/x64emu.h
+++ b/src/include/x64emu.h
@@ -55,6 +55,7 @@ void UnimpOpcode(x64emu_t* emu);
 uint64_t ReadTSC(x64emu_t* emu);
 
 double FromLD(void* ld);        // long double (80bits pointer) -> double
+long double LD2localLD(void* ld);        // long double (80bits pointer) -> long double (80 or 128bits)
 void LD2D(void* ld, void* d);   // long double (80bits) -> double (64bits)
 void D2LD(void* d, void* ld);   // double (64bits) -> long double (64bits)
 
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 233e764e..a09d15d4 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -143,11 +143,13 @@
 #() fFif
 #() fFfi
 #() fFff
+#() fFfD
 #() fFfp
 #() fFpp
 #() dFid
 #() dFdi
 #() dFdd
+#() dFdD
 #() dFdp
 #() dFLL
 #() dFpi
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 9595e7fa..51dd6c20 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -177,11 +177,13 @@ typedef uint64_t (*UFpp_t)(void*, void*);
 typedef float (*fFif_t)(int64_t, float);
 typedef float (*fFfi_t)(float, int64_t);
 typedef float (*fFff_t)(float, float);
+typedef float (*fFfD_t)(float, long double);
 typedef float (*fFfp_t)(float, void*);
 typedef float (*fFpp_t)(void*, void*);
 typedef double (*dFid_t)(int64_t, double);
 typedef double (*dFdi_t)(double, int64_t);
 typedef double (*dFdd_t)(double, double);
+typedef double (*dFdD_t)(double, long double);
 typedef double (*dFdp_t)(double, void*);
 typedef double (*dFLL_t)(uintptr_t, uintptr_t);
 typedef double (*dFpi_t)(void*, int64_t);
@@ -1385,11 +1387,13 @@ void UFpp(x64emu_t *emu, uintptr_t fcn) { UFpp_t fn = (UFpp_t)fcn; R_RAX=fn((voi
 void fFif(x64emu_t *emu, uintptr_t fcn) { fFif_t fn = (fFif_t)fcn; emu->xmm[0].f[0]=fn((int64_t)R_RDI, emu->xmm[0].f[0]); }
 void fFfi(x64emu_t *emu, uintptr_t fcn) { fFfi_t fn = (fFfi_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], (int64_t)R_RDI); }
 void fFff(x64emu_t *emu, uintptr_t fcn) { fFff_t fn = (fFff_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], emu->xmm[1].f[0]); }
+void fFfD(x64emu_t *emu, uintptr_t fcn) { fFfD_t fn = (fFfD_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], LD2localLD((void*)(R_RSP + 8))); }
 void fFfp(x64emu_t *emu, uintptr_t fcn) { fFfp_t fn = (fFfp_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], (void*)R_RDI); }
 void fFpp(x64emu_t *emu, uintptr_t fcn) { fFpp_t fn = (fFpp_t)fcn; emu->xmm[0].f[0]=fn((void*)R_RDI, (void*)R_RSI); }
 void dFid(x64emu_t *emu, uintptr_t fcn) { dFid_t fn = (dFid_t)fcn; emu->xmm[0].d[0]=fn((int64_t)R_RDI, emu->xmm[0].d[0]); }
 void dFdi(x64emu_t *emu, uintptr_t fcn) { dFdi_t fn = (dFdi_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], (int64_t)R_RDI); }
 void dFdd(x64emu_t *emu, uintptr_t fcn) { dFdd_t fn = (dFdd_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], emu->xmm[1].d[0]); }
+void dFdD(x64emu_t *emu, uintptr_t fcn) { dFdD_t fn = (dFdD_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], LD2localLD((void*)(R_RSP + 8))); }
 void dFdp(x64emu_t *emu, uintptr_t fcn) { dFdp_t fn = (dFdp_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], (void*)R_RDI); }
 void dFLL(x64emu_t *emu, uintptr_t fcn) { dFLL_t fn = (dFLL_t)fcn; emu->xmm[0].d[0]=fn((uintptr_t)R_RDI, (uintptr_t)R_RSI); }
 void dFpi(x64emu_t *emu, uintptr_t fcn) { dFpi_t fn = (dFpi_t)fcn; emu->xmm[0].d[0]=fn((void*)R_RDI, (int64_t)R_RSI); }
@@ -2437,9 +2441,9 @@ void iFEppu(x64emu_t *emu, uintptr_t fcn) { iFEppu_t fn = (iFEppu_t)fcn; R_RAX=(
 #endif
 
 #if defined(HAVE_LD80BITS)
-void DFD(x64emu_t *emu, uintptr_t fcn) { DFD_t fn = (DFD_t)fcn; long double ld=fn(*(long double*)(R_RSP + 8)); fpu_do_push(emu); ST0val = ld; }
-void DFDD(x64emu_t *emu, uintptr_t fcn) { DFDD_t fn = (DFDD_t)fcn; long double ld=fn(*(long double*)(R_RSP + 8), *(long double*)(R_RSP + 24)); fpu_do_push(emu); ST0val = ld; }
-void DFDp(x64emu_t *emu, uintptr_t fcn) { DFDp_t fn = (DFDp_t)fcn; long double ld=fn(*(long double*)(R_RSP + 8), (void*)R_RDI); fpu_do_push(emu); ST0val = ld; }
+void DFD(x64emu_t *emu, uintptr_t fcn) { DFD_t fn = (DFD_t)fcn; long double ld=fn(LD2localLD((void*)(R_RSP + 8))); fpu_do_push(emu); ST0val = ld; }
+void DFDD(x64emu_t *emu, uintptr_t fcn) { DFDD_t fn = (DFDD_t)fcn; long double ld=fn(LD2localLD((void*)(R_RSP + 8)), LD2localLD((void*)(R_RSP + 24))); fpu_do_push(emu); ST0val = ld; }
+void DFDp(x64emu_t *emu, uintptr_t fcn) { DFDp_t fn = (DFDp_t)fcn; long double ld=fn(LD2localLD((void*)(R_RSP + 8)), (void*)R_RDI); fpu_do_push(emu); ST0val = ld; }
 #endif
 
 #if !defined(HAVE_LD80BITS)
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index f0bc6966..c65a1809 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -173,11 +173,13 @@ void UFpp(x64emu_t *emu, uintptr_t fnc);
 void fFif(x64emu_t *emu, uintptr_t fnc);
 void fFfi(x64emu_t *emu, uintptr_t fnc);
 void fFff(x64emu_t *emu, uintptr_t fnc);
+void fFfD(x64emu_t *emu, uintptr_t fnc);
 void fFfp(x64emu_t *emu, uintptr_t fnc);
 void fFpp(x64emu_t *emu, uintptr_t fnc);
 void dFid(x64emu_t *emu, uintptr_t fnc);
 void dFdi(x64emu_t *emu, uintptr_t fnc);
 void dFdd(x64emu_t *emu, uintptr_t fnc);
+void dFdD(x64emu_t *emu, uintptr_t fnc);
 void dFdp(x64emu_t *emu, uintptr_t fnc);
 void dFLL(x64emu_t *emu, uintptr_t fnc);
 void dFpi(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibm_private.h b/src/wrapped/wrappedlibm_private.h
index 26204366..cd58d8cd 100755
--- a/src/wrapped/wrappedlibm_private.h
+++ b/src/wrapped/wrappedlibm_private.h
@@ -345,8 +345,8 @@ GOW(nearbyintf, fFf)
 GOW(nextafter, dFdd)
 GOW(nextafterf, fFff)
 // nextafterl   // Weak
-GOW(nexttoward, dFdd)
-GOW(nexttowardf, fFff)
+GOW(nexttoward, dFdD)
+GOW(nexttowardf, fFfD)
 // nexttowardl  // Weak
 GOW(pow, dFdd)
 GOW(pow10, dFd)