about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-07 13:41:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-07 13:41:59 +0100
commit98959e902b76ba4d818d3d8293b4ee6bfc82b5dc (patch)
treef9f470a056e33c695bef1c570ecfd88f9ea9c638 /src
parent548a8ac87b5bcbefb17a31722f9eceb80beb62cf (diff)
downloadbox64-98959e902b76ba4d818d3d8293b4ee6bfc82b5dc.tar.gz
box64-98959e902b76ba4d818d3d8293b4ee6bfc82b5dc.zip
Better way to handle multiple 3E/26 and F2/F3 prefixes ([DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_native_pass.c13
-rw-r--r--src/emu/x64run.c11
2 files changed, 14 insertions, 10 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 29d11d0e..b6b31c12 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -107,12 +107,13 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
 
         rep = 0;
         uint8_t pk = PK(0);
-        while((pk==0xF2) || (pk==0xF3)) {
-            rep = pk-0xF1;
-            ++addr;
-            pk = PK(0);
-        }
-        while(pk==0x3E || pk==0x26) {   //Branch Taken Hint ignored, same for ES: prefix
+        while((pk==0xF2) || (pk==0xF3) || (pk==0x3E) || (pk==0x26)) {
+            switch(pk) {
+                case 0xF2: rep = 1; break;
+                case 0xF3: rep = 2; break;
+                case 0x3E:
+                case 0x26: /* ignored */ break;
+            }
             ++addr;
             pk = PK(0);
         }
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index b9b6ddf7..7faa06c9 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -81,12 +81,15 @@ x64emurun:
         opcode = F8;
         
         rep = 0;
-        while((opcode==0xF2) || (opcode==0xF3)) {
-            rep = opcode-0xF1;
+        while((opcode==0xF2) || (opcode==0xF3) || (opcode==0x3E) || (opcode==0x26)) {
+            switch (opcode) {
+                case 0xF2: rep = 1; break;
+                case 0xF3: rep = 2; break;
+                case 0x3E:
+                case 0x26: /* ignored*/ break;
+            }
             opcode = F8;
         }
-        while((opcode==0x3E) || (opcode==0x26))   //Branch Taken Hint ignored
-            opcode = F8;
         rex.rex = 0;
         rex.is32bits = is32bits;
         if(!is32bits)