From 14c9dc5bdbeec9e74cba01e05418d7a24a5fb9fa Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 20 May 2024 22:34:23 +0200 Subject: [RV64_DYNAREC] Fixed some bit manipulation opcodes --- src/dynarec/rv64/dynarec_rv64_0f.c | 12 ++++++++++++ src/dynarec/rv64/dynarec_rv64_660f.c | 10 ++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) (limited to 'src') 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); -- cgit 1.4.1