about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-20 22:34:23 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-20 22:34:23 +0200
commit14c9dc5bdbeec9e74cba01e05418d7a24a5fb9fa (patch)
tree2c31e2909162d2e8351baa50741a9de0f6043705 /src
parent181457b69f4eda0c39bc1286359704acbcd077c2 (diff)
downloadbox64-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.c12
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c10
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);