diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 52 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 5 |
2 files changed, 31 insertions, 26 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index bf46d302..6c6aa8cd 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -86,7 +86,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1 , xRAX); MOV32w(x2, i32); emit_add16(dyn, ninst, x1, x2, x3, x4, x6); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x06: INST_NAME("PUSH ES"); @@ -126,7 +126,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1, xRAX); MOV32w(x2, i32); emit_or16(dyn, ninst, x1, x2, x3, x4); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x0F: switch(rep) { @@ -180,7 +180,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1, xRAX); MOV64x(x2, u64); emit_adc16(dyn, ninst, x1, x2, x3, x4, x5); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x19: INST_NAME("SBB Ew, Gw"); @@ -222,7 +222,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni u64 = F16; MOV64x(x2, u64); emit_sbb16(dyn, ninst, x1, x2, x3, x4, x5); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x1E: INST_NAME("PUSH DS"); @@ -260,7 +260,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1, xRAX); MOV32w(x2, i32); emit_and16(dyn, ninst, x1, x2, x3, x4); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x29: INST_NAME("SUB Ew, Gw"); @@ -289,7 +289,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1, xRAX); MOV32w(x2, i32); emit_sub16(dyn, ninst, x1, x2, x3, x4, x5); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x31: INST_NAME("XOR Ew, Gw"); @@ -336,7 +336,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEXTH(x1, xRAX); MOV32w(x2, i32); emit_xor16(dyn, ninst, x1, x2, x3, x4, x5); - INSH(xRAX, x1, x3, x4, 1, 0); + INSHz(xRAX, x1, x3, x4, 1, 0); break; case 0x39: INST_NAME("CMP Ew, Gw"); @@ -548,8 +548,8 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETGD; GETED(0); MV(x1, gd); - INSH(gd, ed, x3, x4, 1, 1); - INSH(ed, x1, x3, x4, 0, 1); + INSHz(gd, ed, x3, x4, 1, 1); + INSHz(ed, x1, x3, x4, 0, 1); } else { GETGD; addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0); @@ -594,7 +594,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MARK2; SMDMB(); - INSH(gd, x1, x3, x4, 1, 0); + INSHz(gd, x1, x3, x4, 1, 0); } break; case 0x89: @@ -604,7 +604,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(MODREG) { ed = xRAX+(nextop&7)+(rex.b<<3); if (ed != gd) { - INSH(ed, gd, x2, x3, 1, 1); + INSHz(ed, gd, x2, x3, 1, 1); } } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); @@ -619,21 +619,21 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(MODREG) { ed = xRAX+(nextop&7)+(rex.b<<3); if (ed != gd) { - INSH(gd, ed, x2, x3, 1, 1); + INSHz(gd, ed, x2, x3, 1, 1); } } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); SMREADLOCK(lock); LHU(x1, ed, fixedaddress); - INSH(gd, x1, x2, x3, 1, 0); + INSHz(gd, x1, x2, x3, 1, 0); } break; case 0x8C: - INST_NAME("MOV Ed, Seg"); + INST_NAME("MOV Ew, Seg"); nextop = F8; LHU(x3, xEmu, offsetof(x64emu_t, segs[(nextop & 0x38) >> 3])); if ((nextop & 0xC0) == 0xC0) { // reg <= seg - INSH(xRAX + (nextop & 7) + (rex.b << 3), x3, x1, x2, 1, 0); + INSHz(xRAX + (nextop & 7) + (rex.b << 3), x3, x1, x2, 1, 0); } else { // mem <= seg addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); SH(x3, ed, fixedaddress); @@ -654,15 +654,15 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { INST_NAME("XCHG AX, Reg"); MV(x2, xRAX); - INSH(xRAX, gd, x3, x4, 1, 1); - INSH(gd, x2, x3, x4, 0, 1); + INSHz(xRAX, gd, x3, x4, 1, 1); + INSHz(gd, x2, x3, x4, 0, 1); } break; case 0x98: INST_NAME("CBW"); SLLI(x1, xRAX, 56); SRAI(x1, x1, 56); - INSH(xRAX, x1, x2, x3, 1, 1); + INSHz(xRAX, x1, x2, x3, 1, 1); break; case 0x99: INST_NAME("CWD"); @@ -706,7 +706,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (isLockAddress(u64)) lock = 1; else lock = 0; SMREADLOCK(lock); LHU(x2, x1, 0); - INSH(xRAX, x2, x3, x4, 1, 0); + INSHz(xRAX, x2, x3, x4, 1, 0); break; case 0xA3: INST_NAME("MOV Od,EAX"); @@ -865,7 +865,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETDIR(x1, x2, 2); LHU(x2, xRSI, 0); ADD(xRSI, xRSI, x1); - INSH(xRAX, x2, x3, x4, 1, 0); + INSHz(xRAX, x2, x3, x4, 1, 0); } break; case 0xAF: @@ -928,7 +928,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni u16 = F16; MOV32w(x1, u16); gd = xRAX + (opcode & 7) + (rex.b << 3); - INSH(gd, x1, x2, x3, 1, 0); + INSHz(gd, x1, x2, x3, 1, 0); break; case 0xC1: @@ -1026,7 +1026,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ed = xRAX + (nextop & 7) + (rex.b << 3); u16 = F16; MOV32w(x1, u16); - INSH(ed, x1, x2, x3, 1, 0); + INSHz(ed, x1, x2, x3, 1, 0); } else { addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 2); u16 = F16; @@ -1201,8 +1201,8 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } DIVUW(x9, x2, ed); REMUW(x4, x2, ed); - INSH(xRAX, x9, x5, x6, 1, 1); - INSH(xRDX, x4, x5, x6, 0, 1); + INSHz(xRAX, x9, x5, x6, 1, 1); + INSHz(xRDX, x4, x5, x6, 0, 1); break; case 7: INST_NAME("IDIV Ew"); @@ -1226,8 +1226,8 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni OR(x2, x2, x3); DIVW(x3, x2, ed); REMW(x4, x2, ed); - INSH(xRAX, x3, x5, x6, 1, 1); - INSH(xRDX, x4, x5, x6, 0, 1); + INSHz(xRAX, x3, x5, x6, 1, 1); + INSHz(xRDX, x4, x5, x6, 0, 1); break; default: DEFAULT; diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index af302ce0..7c927e06 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -862,6 +862,11 @@ f28–31 ft8–11 FP temporaries Caller OR(rd, rd, rs); \ } +// Insert low 16bits in rs to low 16bits of rd +#define INSHz(rd, rs, s1, s2, init_s1, zexth_rs) \ + INSH(rd, rs, s1, s2, init_s1, zexth_rs) \ + if (rex.is32bits) AND(rd, rd, xMASK); + // Rotate left (register) #define ROL(rd, rs1, rs2) EMIT(R_type(0b0110000, rs2, rs1, 0b001, rd, 0b0110011)) // Rotate left word (register) |