diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-12 15:50:11 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-12 15:50:11 +0100 |
| commit | 7fcc6e010cee7de78b8fd3cfa3f88ad1f59aa89c (patch) | |
| tree | cc7361d51c2ef164d4a673d50b7dea1c3acfebdf /src | |
| parent | 5d2ae4aa1e1927de529bf42adc85899e850b2d4c (diff) | |
| download | box64-7fcc6e010cee7de78b8fd3cfa3f88ad1f59aa89c.tar.gz box64-7fcc6e010cee7de78b8fd3cfa3f88ad1f59aa89c.zip | |
[ARM64_DYNAREC] Some fixes to shift opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index ec2faa63..5d7689c6 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1739,6 +1739,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; emit_rol8c(dyn, ninst, x1, u8&7, x4, x5); EBBACK; + } else { + FAKEED; + F8; } break; case 1: @@ -1749,6 +1752,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = F8; emit_ror8c(dyn, ninst, x1, u8&7, x4, x5); EBBACK; + } else { + FAKEED; + F8; } break; case 2: @@ -1782,6 +1788,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&0x1f; emit_shl8c(dyn, ninst, ed, u8, x4, x5); EBBACK; + } else { + FAKEED; + F8; } break; case 5: @@ -1792,6 +1801,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&0x1f; emit_shr8c(dyn, ninst, ed, u8, x4, x5); EBBACK; + } else { + FAKEED; + F8; } break; case 7: @@ -1802,6 +1814,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&0x1f; emit_sar8c(dyn, ninst, ed, u8, x4, x5); EBBACK; + } else { + FAKEED; + F8; } break; } @@ -1817,6 +1832,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&(rex.w?0x3f:0x1f); emit_rol32c(dyn, ninst, rex, ed, u8, x3, x4); WBACK; + } else { + FAKEED; + F8; } break; case 1: @@ -1827,6 +1845,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&(rex.w?0x3f:0x1f); emit_ror32c(dyn, ninst, rex, ed, u8, x3, x4); WBACK; + } else { + FAKEED; + F8; } break; case 2: @@ -1860,6 +1881,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&(rex.w?0x3f:0x1f); emit_shl32c(dyn, ninst, rex, ed, u8, x3, x4); WBACK; + } else { + FAKEED; + F8; } break; case 5: @@ -1870,6 +1894,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&(rex.w?0x3f:0x1f); emit_shr32c(dyn, ninst, rex, ed, u8, x3, x4); WBACK; + } else { + FAKEED; + F8; } break; case 7: @@ -1880,6 +1907,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = (F8)&(rex.w?0x3f:0x1f); emit_sar32c(dyn, ninst, rex, ed, u8, x3, x4); WBACK; + } else { + FAKEED; + F8; } break; } @@ -2204,14 +2234,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_OF|X_CF, SF_SUBSET); UFLAG_IF { TSTw_mask(xRCX, 0, 0b00100); //mask=0x00000001f + B_NEXT(cEQ); } ANDw_mask(x2, xRCX, 0, 0b00010); //mask=0x000000007 MOV32w(x4, 8); SUBx_REG(x2, x4, x2); GETEB(x1, 0); - UFLAG_IF { - B_NEXT(cEQ); - } ORRw_REG_LSL(ed, ed, ed, 8); LSRw_REG(ed, ed, x2); EBBACK; @@ -2277,13 +2305,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined UFLAG_IF { ANDSw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f + B_NEXT(cEQ); } else { ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f } GETEB(x1, 0); - UFLAG_IF { - B_NEXT(cEQ); - } emit_shl8(dyn, ninst, x1, x2, x5, x4); EBBACK; break; @@ -2292,13 +2318,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined UFLAG_IF { ANDSw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f + B_NEXT(cEQ); } else { ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f } GETEB(x1, 0); - UFLAG_IF { - B_NEXT(cEQ); - } emit_shr8(dyn, ninst, x1, x2, x5, x4); EBBACK; break; |