about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-11-16 15:11:19 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-11-16 15:11:19 +0100
commit5b89a2375afae7b2b9bf66e0d0d046ecd5923456 (patch)
tree4f7133d859f7d60a38404090ddb0b3a9c7cb9789 /src
parentc0d19de08d30c961e0c884c0feab4e7f57265dc1 (diff)
downloadbox64-5b89a2375afae7b2b9bf66e0d0d046ecd5923456.tar.gz
box64-5b89a2375afae7b2b9bf66e0d0d046ecd5923456.zip
[DYNAREC] Fixed RCR and RCL opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/arm64_printer.c2
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c16
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_0f.c4
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_67.c4
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_helper.h2
5 files changed, 13 insertions, 15 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c
index cccf33db..4bad45d5 100755
--- a/src/dynarec/arm64/arm64_printer.c
+++ b/src/dynarec/arm64/arm64_printer.c
@@ -776,7 +776,7 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         return buff;

     }

     if(isMask(opcode, "10011011U10mmmmm011111nnnnnddddd", &a)) {

-        snprintf(buff, sizeof(buff), "%cMULH %s, %s, %s", a.U?'U':'S', Xt[Rd], Wt[Rn], Wt[Rm]);

+        snprintf(buff, sizeof(buff), "%cMULH %s, %s, %s", a.U?'U':'S', Xt[Rd], Xt[Rn], Xt[Rm]);

         return buff;

     }

     if(isMask(opcode, "f0011011000mmmmm0aaaaannnnnddddd", &a)) {

diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 71c8ca6e..3b3af4bf 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1542,7 +1542,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = F8;
                     MOV32w(x2, u8);
                     CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4);
-                    SBACK(x1);
+                    WBACK;
                     break;
                 case 3:
                     INST_NAME("RCR Ed, Ib");
@@ -1553,7 +1553,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = F8;
                     MOV32w(x2, u8);
                     CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4);
-                    SBACK(x1);
+                    WBACK;
                     break;
                 case 4:
                 case 6:
@@ -1856,8 +1856,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SETFLAGS(X_OF|X_CF, SF_SET);
                     MOV32w(x2, 1);
                     GETEDW(x4, x1, 0);
-                    CALL_(rcl32, ed, x4);
-                    SBACK(x1);
+                    CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4);
+                    WBACK;
                     break;
                 case 3:
                     INST_NAME("RCR Ed, 1");
@@ -1866,8 +1866,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SETFLAGS(X_OF|X_CF, SF_SET);
                     MOV32w(x2, 1);
                     GETEDW(x4, x1, 0);
-                    CALL_(rcr32, ed, x4);
-                    SBACK(x1);
+                    CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4);
+                    WBACK;
                     break;
                 case 4:
                 case 6:
@@ -1961,7 +1961,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if(!rex.w && MODREG) {MOVw_REG(ed, ed);}
                     B_NEXT(cEQ);
                     CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4);
-                    SBACK(x1);
+                    WBACK;
                     break;
                 case 3:
                     INST_NAME("RCR Ed, CL");
@@ -1977,7 +1977,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if(!rex.w && MODREG) {MOVw_REG(ed, ed);}
                     B_NEXT(cEQ);
                     CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4);
-                    SBACK(x1);
+                    WBACK;
                     break;
                 case 4:
                 case 6:
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 79578406..427177be 100755
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1149,7 +1149,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETGD;

             MOVxw_REG(x2, gd);

             CALL_(rex.w?((void*)shld64):((void*)shld32), ed, x4);

-            SBACK(x1);

+            WBACK;

             break;

 

         case 0xAB:

@@ -1209,7 +1209,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETGD;

             MOVxw_REG(x2, gd);

             CALL_(rex.w?((void*)shrd64):((void*)shrd32), ed, x4);

-            SBACK(x1);

+            WBACK;

             break;

 

         case 0xAE:

diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 17a89479..aeae1dd3 100755
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -693,7 +693,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = F8;

                     MOV32w(x2, u8);

                     CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4);

-                    SBACK(x1);

+                    WBACK;

                     break;

                 case 3:

                     INST_NAME("RCR Ed, Ib");

@@ -704,7 +704,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = F8;

                     MOV32w(x2, u8);

                     CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4);

-                    SBACK(x1);

+                    WBACK;

                     break;

                 case 4:

                 case 6:

diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index ab14a8e6..008c14e5 100755
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -132,8 +132,6 @@
 #define WBACKx      if(wback) {STRx_U12(ed, wback, fixedaddress);}
 // Write back ed in wback (if wback not 0)
 #define WBACKw      if(wback) {STRw_U12(ed, wback, fixedaddress);}
-// Send back wb to either ed or wback
-#define SBACK(wb)   if(wback) {STRxw_U12(wb, wback, fixedaddress);} else {MOVxw_REG(ed, wb);}
 //GETEDO can use r1 for ed, and r2 for wback. wback is 0 if ed is xEAX..xEDI
 #define GETEDO(O, D)   if(MODREG) {                     \
                     ed = xRAX+(nextop&7)+(rex.b<<3);    \