diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-23 16:31:53 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-23 16:32:04 +0200 |
| commit | 604ab2252658e85791bfd3d5a04f546b554f23c3 (patch) | |
| tree | 281ee1bd7b09f6e06ac4f70f566aac55c70179a0 /src | |
| parent | 85d09df9382d2ce581f89e9fee2e7d862e21e891 (diff) | |
| download | box64-604ab2252658e85791bfd3d5a04f546b554f23c3.tar.gz box64-604ab2252658e85791bfd3d5a04f546b554f23c3.zip | |
[ARM64_DYNAREC] Added 66 D9 /6 and 66 DD /4 /6 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66.c | 49 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 27 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.h | 2 |
3 files changed, 76 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index df5bcb32..15ce091b 100644 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -13,6 +13,7 @@ #include "box64stack.h" #include "callback.h" #include "emu/x64run_private.h" +#include "emu/x87emu_private.h" #include "x64trace.h" #include "dynarec_native.h" #include "custommem.h" @@ -1244,6 +1245,54 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; } break; + + case 0xD9: + nextop = F8; + if(MODREG) { + DEFAULT; + } else + switch((nextop>>3)&7) { + case 6: + INST_NAME("FNSTENV Ed"); + MESSAGE(LOG_DUMP, "Need Optimization\n"); + fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE? + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(ed!=x1) {MOVx_REG(x1, ed);} + MOV32w(x2, 1); + CALL(fpu_savenv, -1); + break; + default: + DEFAULT; + } + break; + + case 0xDD: + nextop = F8; + if(MODREG) { + DEFAULT; + } else + switch((nextop>>3)&7) { + case 4: + INST_NAME("FRSTOR Ed"); + MESSAGE(LOG_DUMP, "Need Optimization\n"); + fpu_purgecache(dyn, ninst, 0, x1, x2, x3); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(ed!=x1) {MOVx_REG(x1, ed);} + CALL(native_frstor16, -1); + break; + case 6: + INST_NAME("FNSAVE Ed"); + MESSAGE(LOG_DUMP, "Need Optimization\n"); + fpu_purgecache(dyn, ninst, 0, x1, x2, x3); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(ed!=x1) {MOVx_REG(x1, ed);} + CALL(native_fsave16, -1); + CALL(reset_fpu, -1); + break; + default: + DEFAULT; + } + break; case 0xF0: return dynarec64_66F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index 07dad6bf..1cb2834d 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -204,7 +204,18 @@ void native_fsave(x64emu_t* emu, uint8_t* ed) uint8_t* p = ed; p += 28; for (int i=0; i<8; ++i) { - LD2D(p, &ST(i).d); + LD2D(p, &emu->x87[7-i].d); + p+=10; + } +} +void native_fsave16(x64emu_t* emu, uint8_t* ed) +{ + fpu_savenv(emu, (char*)ed, 1); + + uint8_t* p = ed; + p += 14; + for (int i=0; i<8; ++i) { + LD2D(p, &emu->x87[7-i].d); p+=10; } } @@ -215,7 +226,19 @@ void native_frstor(x64emu_t* emu, uint8_t* ed) uint8_t* p = ed; p += 28; for (int i=0; i<8; ++i) { - D2LD(&ST(i).d, p); + D2LD(&emu->x87[7-i].d, p); + p+=10; + } + +} +void native_frstor16(x64emu_t* emu, uint8_t* ed) +{ + fpu_loadenv(emu, (char*)ed, 1); + + uint8_t* p = ed; + p += 14; + for (int i=0; i<8; ++i) { + D2LD(&emu->x87[7-i].d, p); p+=10; } diff --git a/src/dynarec/dynarec_native_functions.h b/src/dynarec/dynarec_native_functions.h index 6e7fc46d..533dfeeb 100644 --- a/src/dynarec/dynarec_native_functions.h +++ b/src/dynarec/dynarec_native_functions.h @@ -30,7 +30,9 @@ void native_fistp64(x64emu_t* emu, int64_t* ed); void native_fistt64(x64emu_t* emu, int64_t* ed); void native_fld(x64emu_t* emu, uint8_t* ed); void native_fsave(x64emu_t* emu, uint8_t* ed); +void native_fsave16(x64emu_t* emu, uint8_t* ed); void native_frstor(x64emu_t* emu, uint8_t* ed); +void native_frstor16(x64emu_t* emu, uint8_t* ed); void native_fprem1(x64emu_t* emu); void native_aesd(x64emu_t* emu, int xmm); |