diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-11-16 15:11:19 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-11-16 15:11:19 +0100 |
| commit | 5b89a2375afae7b2b9bf66e0d0d046ecd5923456 (patch) | |
| tree | 4f7133d859f7d60a38404090ddb0b3a9c7cb9789 /src | |
| parent | c0d19de08d30c961e0c884c0feab4e7f57265dc1 (diff) | |
| download | box64-5b89a2375afae7b2b9bf66e0d0d046ecd5923456.tar.gz box64-5b89a2375afae7b2b9bf66e0d0d046ecd5923456.zip | |
[DYNAREC] Fixed RCR and RCL opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_printer.c | 2 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 16 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_0f.c | 4 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_67.c | 4 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.h | 2 |
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); \ |