diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-08-27 11:37:15 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-08-27 11:37:15 +0200 |
| commit | 2e55fc8c3207df407f775a0d531519ad561b8817 (patch) | |
| tree | 776a770b01f78be9c24df7ad901733982c3ec8f1 /src | |
| parent | 5d921acd7d7a56c4b3f660ddd7a5d0b3f20f5564 (diff) | |
| download | box64-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.c | 18 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 10 |
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: |