diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-05 15:01:58 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-05 15:01:58 +0100 |
| commit | 0e9b61b3d87359ed275b2ec6338133b8a10e7a9f (patch) | |
| tree | 12bc32262f1282d6e967a50c0c211c317e201275 /src | |
| parent | 4c2008f6cbf413839396e85de3409d3fcabcd541 (diff) | |
| download | box64-0e9b61b3d87359ed275b2ec6338133b8a10e7a9f.tar.gz box64-0e9b61b3d87359ed275b2ec6338133b8a10e7a9f.zip | |
Added 64 63 opcode ([DYNAREC] Too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 32 | ||||
| -rw-r--r-- | src/emu/x64run64.c | 13 |
2 files changed, 44 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 4ec25223..b5542216 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -228,16 +228,39 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_cmp32(dyn, ninst, rex, ed, gd, x3, x4, x5); break; + case 0x63: + INST_NAME("MOVSXD Gd, Ed"); + nextop = F8; + GETGD; + if(rex.w) { + if(MODREG) { // reg <= reg + SXTWx(gd, xRAX+(nextop&7)+(rex.b<<3)); + } else { // mem <= reg + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0); + LDRSW_REG(gd, ed, x4); + } + } else { + if(MODREG) { // reg <= reg + MOVw_REG(gd, xRAX+(nextop&7)+(rex.b<<3)); + } else { // mem <= reg + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0); + LDRw_REG(gd, ed, x4); + } + } + break; + case 0x66: addr = dynarec64_6664(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; case 0x80: nextop = F8; - grab_segdata(dyn, addr, ninst, x1, seg); switch((nextop>>3)&7) { case 0: //ADD INST_NAME("ADD Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -246,6 +269,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR INST_NAME("OR Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -254,6 +278,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: //ADC INST_NAME("ADC Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); @@ -263,6 +288,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 3: //SBB INST_NAME("SBB Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); @@ -272,6 +298,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND INST_NAME("AND Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -280,6 +307,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB INST_NAME("SUB Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -288,6 +316,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR INST_NAME("XOR Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -296,6 +325,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP INST_NAME("CMP Eb, Ib"); + grab_segdata(dyn, addr, ninst, x1, seg); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index a1e5a38b..07ba3590 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -236,6 +236,19 @@ int Run64(x64emu_t *emu, rex_t rex, int seg) break; + case 0x63: /* MOVSXD Gd,Ed */ + nextop = F8; + GETED_OFFS(0, tlsdata); + GETGD; + if(rex.w) + GD->sq[0] = ED->sdword[0]; + else + if(MODREG) + GD->q[0] = ED->dword[0]; // not really a sign extension + else + GD->sdword[0] = ED->sdword[0]; // meh? + break; + case 0x66: return Run6664(emu, rex); |