diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-20 22:34:23 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-20 22:34:23 +0200 |
| commit | 14c9dc5bdbeec9e74cba01e05418d7a24a5fb9fa (patch) | |
| tree | 2c31e2909162d2e8351baa50741a9de0f6043705 /src | |
| parent | 181457b69f4eda0c39bc1286359704acbcd077c2 (diff) | |
| download | box64-14c9dc5bdbeec9e74cba01e05418d7a24a5fb9fa.tar.gz box64-14c9dc5bdbeec9e74cba01e05418d7a24a5fb9fa.zip | |
[RV64_DYNAREC] Fixed some bit manipulation opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 10 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 13063c85..902d8675 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1351,6 +1351,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } break; case 0xAC: @@ -1522,6 +1524,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } break; case 0xB6: @@ -1600,6 +1604,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } MARK; break; @@ -1627,6 +1633,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } MARK; break; @@ -1649,6 +1657,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } break; default: @@ -1683,6 +1693,8 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (wback) { SDxw(ed, wback, fixedaddress); SMWRITE(); + } else if(!rex.w) { + ZEROUP(ed); } break; case 0xBC: diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 70200fed..f66bb2aa 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -2381,7 +2381,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int BEXTI(x3, ed, u8); // F_CF is 1 ANDI(xFlags, xFlags, ~1); OR(xFlags, xFlags, x3); - if (u8 <= 10) { + if (u8 <= 0x10) { XORI(ed, ed, (1LL << u8)); } else { MOV64xw(x3, (1LL << u8)); @@ -2411,7 +2411,13 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ed = x1; wback = x3; } - BEXT(x4, ed, gd, x2); // F_CF is 1 + if (rv64_zbs) + BEXT_(x4, ed, gd); + else { + ANDI(x2, gd, rex.w ? 0x3f : 0xf); + SRL(x4, ed, x2); + ANDI(x4, x4, 1); + } ANDI(xFlags, xFlags, ~1); OR(xFlags, xFlags, x4); ADDI(x4, xZR, 1); |