about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-08-27 11:37:15 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-08-27 11:37:15 +0200
commit2e55fc8c3207df407f775a0d531519ad561b8817 (patch)
tree776a770b01f78be9c24df7ad901733982c3ec8f1 /src
parent5d921acd7d7a56c4b3f660ddd7a5d0b3f20f5564 (diff)
downloadbox64-2e55fc8c3207df407f775a0d531519ad561b8817.tar.gz
box64-2e55fc8c3207df407f775a0d531519ad561b8817.zip
[ARM64_DYNAREC] Fixed some issue with some opcode handling 8bits values (fixed gogdl from Heroic issue, probably other program too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c18
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c10
4 files changed, 18 insertions, 18 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index c434dbd2..84cf7daa 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1045,12 +1045,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     ed = (nextop&7);
                     eb1 = xRAX+(ed&3);
-                    eb2 = ((ed&4)>>2);
+                    eb2 = ((ed&4)<<1);
                 }
-                UBFXw(x1, eb1, eb2*8, 8);
+                UBFXw(x1, eb1, eb2, 8);
                 // do the swap 14 -> ed, 1 -> gd
-                BFIx(gb1, x1, gb2*8, 8);
-                BFIx(eb1, x4, eb2*8, 8);
+                BFIx(gb1, x1, gb2, 8);
+                BFIx(eb1, x4, eb2, 8);
             } else {
                 SMDMB();
                 GETGB(x4);
@@ -1062,7 +1062,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 STLXRB(x3, x4, ed);
                 CBNZx_MARKLOCK(x3);
                 SMDMB();
-                BFIx(gb1, x1, gb2*8, 8);
+                BFIx(gb1, x1, gb2, 8);
             }
             break;
         case 0x87:
@@ -1101,12 +1101,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 gb2 = 0;
                 gb1 = xRAX + gd;
             } else {
-                gb2 = ((gd&4)>>2);
+                gb2 = ((gd&4)<<1);
                 gb1 = xRAX+(gd&3);
             }
             if(gb2) {
                 gd = x4;
-                UBFXw(gd, gb1, gb2*8, 8);
+                UBFXw(gd, gb1, gb2, 8);
             } else {
                 gd = gb1;   // no need to extract
             }
@@ -1147,7 +1147,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {
                 gd = (nextop&0x38)>>3;
                 gb1 = xRAX+(gd&3);
-                gb2 = ((gd&4)>>2);
+                gb2 = ((gd&4)<<1);
             }
             if(MODREG) {
                 if(rex.rex) {
@@ -1170,7 +1170,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 LDB(x4, wback, fixedaddress);
                 ed = x4;
             }
-            BFIx(gb1, ed, gb2*8, 8);
+            BFIx(gb1, ed, gb2, 8);
             break;
         case 0x8B:
             INST_NAME("MOV Gd, Ed");
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index d88f3b69..5f91ec76 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -514,7 +514,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {
                 gd = (nextop&0x38)>>3;
                 gb1 = xRAX+(gd&3);
-                gb2 = ((gd&4)>>2);
+                gb2 = ((gd&4)<<1);
             }
             if(MODREG) {
                 if(rex.rex) {
@@ -538,7 +538,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 LDRB_REG(x4, wback, x4);
                 ed = x4;
             }
-            BFIx(gb1, ed, gb2*8, 8);
+            BFIx(gb1, ed, gb2, 8);
             break;
         case 0x89:
             INST_NAME("MOV Seg:Ed, Gd");
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 06e1e93a..7c4ea045 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -761,12 +761,12 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 gb2 = 0;

                 gb1 = xRAX + gd;

             } else {

-                gb2 = ((gd&4)>>2);

+                gb2 = ((gd&4)<<1);

                 gb1 = xRAX+(gd&3);

             }

             if(gb2) {

                 gd = x4;

-                UBFXw(gd, gb1, gb2*8, 8);

+                UBFXw(gd, gb1, gb2, 8);

             } else {

                 gd = gb1;   // no need to extract

             }

diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index 07e4b766..9f43f6b8 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -887,12 +887,12 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     ed = (nextop&7);
                     eb1 = xRAX+(ed&3);
-                    eb2 = ((ed&4)>>2);
+                    eb2 = ((ed&4)<<1);
                 }
-                UBFXw(x1, eb1, eb2*8, 8);
+                UBFXw(x1, eb1, eb2, 8);
                 // do the swap 14 -> ed, 1 -> gd
-                BFIx(gb1, x1, gb2*8, 8);
-                BFIx(eb1, x4, eb2*8, 8);
+                BFIx(gb1, x1, gb2, 8);
+                BFIx(eb1, x4, eb2, 8);
             } else {
                 SMDMB();
                 GETGB(x4);
@@ -904,7 +904,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 STLXRB(x3, x4, ed);
                 CBNZx_MARKLOCK(x3);
                 SMDMB();
-                BFIx(gb1, x1, gb2*8, 8);
+                BFIx(gb1, x1, gb2, 8);
             }
             break;
         case 0x87: