about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c52
-rw-r--r--src/dynarec/rv64/rv64_emitter.h5
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)