diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-09-24 21:23:48 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-09-24 21:23:48 +0200 |
| commit | 8f5613055d8d0ec991304fa64545e423f040780a (patch) | |
| tree | 431960a5884ebcbd3192e03ad63ba784685d7cb7 | |
| parent | 501e8a77ecb2bd3ca919f693872db7a5bce5bd54 (diff) | |
| download | box64-8f5613055d8d0ec991304fa64545e423f040780a.tar.gz box64-8f5613055d8d0ec991304fa64545e423f040780a.zip | |
[ARM64_DYNAREC] Added more variant of INS/OUT opcodes
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66.c | 77 |
2 files changed, 77 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index d350d567..7cef0ba4 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -3713,7 +3713,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin *ok = 0; } break; - case 0xF0: addr = dynarec64_F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index e18b1573..1119f0a1 100644 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -472,6 +472,38 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MOV32w(x2, (uint16_t)i16); PUSH1_16(x2); break; + case 0x6C: + case 0x6D: + INST_NAME(opcode == 0x6C ? "INSB" : "INSW"); + if(BOX64DRENV(dynarec_safeflags)>1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + } + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL_S(const_native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + break; + case 0x6E: + case 0x6F: + INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSW"); + if(BOX64DRENV(dynarec_safeflags)>1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + } + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL_S(const_native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + break; case 0x70: case 0x71: @@ -1413,6 +1445,51 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0xE4: /* IN AL, Ib */ + case 0xE5: /* IN AX, Ib */ + case 0xE6: /* OUT Ib, AL */ + case 0xE7: /* OUT Ib, AX */ + INST_NAME(opcode==0xE4?"IN AL, Ib":(opcode==0xE5?"IN AX, Ib":(opcode==0xE6?"OUT Ib, AL":"OUT Ib, AX"))); + if (rex.is32bits && BOX64ENV(ignoreint3)) { + F8; + } else { + if(BOX64DRENV(dynarec_safeflags)>1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + } + u8 = F8; + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL_S(const_native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + } + break; + + case 0xEC: /* IN AL, DX */ + case 0xED: /* IN AX, DX */ + case 0xEE: /* OUT DX, AL */ + case 0xEF: /* OUT DX, AX */ + INST_NAME(opcode==0xEC?"IN AL, DX":(opcode==0xED?"IN AX, DX":(opcode==0xEE?"OUT DX, AL":"OUT DX, AX"))); + if(rex.is32bits && BOX64ENV(ignoreint3)) + {} else { + if(BOX64DRENV(dynarec_safeflags)>1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + } + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL_S(const_native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + } + break; case 0xF0: return dynarec64_66F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); |