diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-24 15:01:35 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-24 15:01:46 +0200 |
| commit | fcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47 (patch) | |
| tree | 7c3ba3519cf1a9ebdbca47fe3310dbc531212707 /src/dynarec | |
| parent | 2ee846f48e7fa9b103f0949f63f91712ca7b03ca (diff) | |
| download | box64-fcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47.tar.gz box64-fcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47.zip | |
Added support for XSAVE/XRSTOR ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 34 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 6 |
3 files changed, 33 insertions, 11 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index 581d4821..e62caec5 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -68,15 +68,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(MODREG) switch(nextop) { case 0xD0: - INST_NAME("FAKE xgetbv"); - SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - GETIP(ip); - STORE_XEMU_CALL(xRIP); - CALL(native_ud, -1); - LOAD_XEMU_CALL(xRIP); - jump_to_epilog(dyn, 0, xRIP, ninst); - *need_epilog = 0; - *ok = 0; + INST_NAME("XGETBV"); + CMPSw_REG(xRCX, xZR); + B_MARK(cEQ); + UDF(0); + MARK; + MOV32w(xRAX, 0b11); + MOV32w(xRDX, 0); break; case 0xE0: case 0xE1: @@ -1805,6 +1803,24 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin LDRw_U12(x4, xEmu, offsetof(x64emu_t, mxcsr)); STW(x4, ed, fixedaddress); break; + case 4: + INST_NAME("XSAVE 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);} + MOV32w(x2, rex.is32bits); + CALL((void*)fpu_xsave, -1); + break; + case 5: + INST_NAME("XRSTOR 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);} + MOV32w(x2, rex.is32bits); + CALL((void*)fpu_xrstor, -1); + break; case 7: INST_NAME("CLFLUSH Ed"); MESSAGE(LOG_DUMP, "Need Optimization?\n"); diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index 6d056fa2..18c42025 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -66,6 +66,9 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(MODREG) { switch(nextop) { case 0xD0: + //TODO + DEFAULT; + /* INST_NAME("FAKE xgetbv"); nextop = F8; addr = fakeed(dyn, addr, ninst, nextop); @@ -77,6 +80,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni jump_to_epilog(dyn, 0, xRIP, ninst); *need_epilog = 0; *ok = 0; + */ break; default: DEFAULT; diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 4159068f..7c5dfe01 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -66,7 +66,9 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(MODREG) { switch(nextop) { case 0xD0: - INST_NAME("FAKE xgetbv"); + //TODO + DEFAULT; + /*INST_NAME("FAKE xgetbv"); nextop = F8; addr = fakeed(dyn, addr, ninst, nextop); SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -76,7 +78,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LOAD_XEMU_CALL(); jump_to_epilog(dyn, 0, xRIP, ninst); *need_epilog = 0; - *ok = 0; + *ok = 0;*/ break; case 0xF9: |