diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-06 10:56:59 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-06 10:56:59 +0100 |
| commit | 18e0af6b3844253d4c8214e458427e863df0204d (patch) | |
| tree | e0d54f4af56506bcf3437eae1ed3f87230a9bfad /src | |
| parent | ed87cc1b1ead7129da93a09a6cbdbbf11d2c5e40 (diff) | |
| download | box64-18e0af6b3844253d4c8214e458427e863df0204d.tar.gz box64-18e0af6b3844253d4c8214e458427e863df0204d.zip | |
[INTERPRETER] Added support for unaligned F0 0F BA /5 opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runf0.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index a7ff67b8..10747155 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -494,17 +494,31 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) } while(tmp32s); } else { tmp8u&=31; - do { - tmp32u = native_lock_read_d(ED); - if(tmp32u & (1<<tmp8u)) { - SET_FLAG(F_CF); - tmp32s = 0; - } else { - tmp32u ^= (1<<tmp8u); - tmp32s = native_lock_write_d(ED, tmp32u); - CLEAR_FLAG(F_CF); - } - } while(tmp32s); + if((uintptr_t)ED&3) { + do { + tmp32u = native_lock_read_b(ED+(tmp8u>>3)); + if(tmp32u & (1<<(tmp8u&7))) { + SET_FLAG(F_CF); + tmp32s = 0; + } else { + tmp32u ^= (1<<(tmp8u&7)); + tmp32s = native_lock_write_b(ED+(tmp8u>>3), tmp32u); + CLEAR_FLAG(F_CF); + } + } while(tmp32s); + } else { + do { + tmp32u = native_lock_read_d(ED); + if(tmp32u & (1<<tmp8u)) { + SET_FLAG(F_CF); + tmp32s = 0; + } else { + tmp32u ^= (1<<tmp8u); + tmp32s = native_lock_write_d(ED, tmp32u); + CLEAR_FLAG(F_CF); + } + } while(tmp32s); + } } #else pthread_mutex_lock(&my_context->mutex_lock); |