diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-07 13:41:59 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-07 13:41:59 +0100 |
| commit | 98959e902b76ba4d818d3d8293b4ee6bfc82b5dc (patch) | |
| tree | f9f470a056e33c695bef1c570ecfd88f9ea9c638 /src | |
| parent | 548a8ac87b5bcbefb17a31722f9eceb80beb62cf (diff) | |
| download | box64-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.c | 13 | ||||
| -rw-r--r-- | src/emu/x64run.c | 11 |
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) |