diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 10:50:33 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 10:50:33 +0200 |
| commit | 248cd2e749dcc5931113a405e232e9a90c130089 (patch) | |
| tree | 6eddccb3f60c2969ae2a839280866f91a4a6fb0a /src | |
| parent | 3b550eeed3ecd47546ad0c0664a458af463c57af (diff) | |
| download | box64-248cd2e749dcc5931113a405e232e9a90c130089.tar.gz box64-248cd2e749dcc5931113a405e232e9a90c130089.zip | |
Fixed nexttoward(f) wrapped functions, and improved long double handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x87emu_private.c | 15 | ||||
| -rwxr-xr-x | src/include/x64emu.h | 1 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 10 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibm_private.h | 4 |
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) |