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_00_3.c6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_emit_shift.c30
2 files changed, 14 insertions, 22 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c
index 15346729..f5fd7f9c 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_3.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_3.c
@@ -692,7 +692,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     INST_NAME("ROL Ed, CL");
                     SETFLAGS(X_OF|X_CF, SF_SUBSET);
                     GETED(0);
-                    emit_rol32(dyn, ninst, rex, ed, xRCX, x3, x4);
+                    ANDI(x6, xRCX, rex.w ? 0x3f : 0x1f);
+                    emit_rol32(dyn, ninst, rex, ed, x6, x3, x4);
                     WBACK;
                     if(!wback && !rex.w) ZEROUP(ed);
                     break;
@@ -700,7 +701,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     INST_NAME("ROR Ed, CL");
                     SETFLAGS(X_OF|X_CF, SF_SUBSET);
                     GETED(0);
-                    emit_ror32(dyn, ninst, rex, ed, xRCX, x3, x4);
+                    ANDI(x6, xRCX, rex.w ? 0x3f : 0x1f);
+                    emit_ror32(dyn, ninst, rex, ed, x6, x3, x4);
                     WBACK;
                     if(!wback && !rex.w) ZEROUP(ed);
                     break;
diff --git a/src/dynarec/rv64/dynarec_rv64_emit_shift.c b/src/dynarec/rv64/dynarec_rv64_emit_shift.c
index 6a3e917e..7f858cf9 100644
--- a/src/dynarec/rv64/dynarec_rv64_emit_shift.c
+++ b/src/dynarec/rv64/dynarec_rv64_emit_shift.c
@@ -946,15 +946,10 @@ void emit_rol32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
 {
     int64_t j64;
 
-    if(rex.w) {
-        ANDI(s4, s2, 0x3f);
-    } else {
-        ANDI(s4, s2, 0x1f);
-    }
     if (!rex.w) {
         ZEROUP(s1);
     }
-    BEQ_NEXT(s4, xZR);
+    BEQ_NEXT(s2, xZR);
     IFX(X_PEND) {
         SDxw(s2, xEmu, offsetof(x64emu_t, op2));
         SET_DF(s4, rex.w?d_rol64:d_rol32);
@@ -964,14 +959,14 @@ void emit_rol32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
 
     if(rv64_zbb) {
         if (rex.w) {
-            ROL(s1, s1, s4);
+            ROL(s1, s1, s2);
         } else {
-            ROLW(s1, s1, s4);
+            ROLW(s1, s1, s2);
             ZEROUP(s1);
         }
     } else {
-        SLLxw(s3, s1, s4);
-        NEG(s4, s4);
+        SLLxw(s3, s1, s2);
+        NEG(s4, s2);
         ADDI(s4, s4, rex.w?64:32);
         SRLxw(s1, s1, s4);
         OR(s1, s3, s1);
@@ -1003,15 +998,10 @@ void emit_ror32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
 {
     int64_t j64;
 
-    if(rex.w) {
-        ANDI(s4, s2, 0x3f);
-    } else {
-        ANDI(s4, s2, 0x1f);
-    }
     if (!rex.w) {
         ZEROUP(s1);
     }
-    BEQ_NEXT(s4, xZR);
+    BEQ_NEXT(s2, xZR);
     IFX(X_PEND) {
         SDxw(s2, xEmu, offsetof(x64emu_t, op2));
         SET_DF(s4, rex.w?d_ror64:d_ror32);
@@ -1021,14 +1011,14 @@ void emit_ror32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
 
     if(rv64_zbb) {
         if (rex.w) {
-            ROR(s1, s1, s4);
+            ROR(s1, s1, s2);
         } else {
-            RORW(s1, s1, s4);
+            RORW(s1, s1, s2);
             ZEROUP(s1);
         }
     } else {
-        SRLxw(s3, s1, s4);
-        NEG(s4, s4);
+        SRLxw(s3, s1, s2);
+        NEG(s4, s2);
         ADDI(s4, s4, rex.w?64:32);
         SLLxw(s1, s1, s4);
         OR(s1, s3, s1);