diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-05-01 11:13:01 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-05-01 11:13:01 +0200 |
| commit | 830cc8a4982364cdb4ff8ca2423981b1a3a3d684 (patch) | |
| tree | 0d66e807bd5ea8208b4fafee27a146e7385fc6ee /src | |
| parent | 16b0922ec54fe8355b7288f262b5da011320523f (diff) | |
| download | box64-830cc8a4982364cdb4ff8ca2423981b1a3a3d684.tar.gz box64-830cc8a4982364cdb4ff8ca2423981b1a3a3d684.zip | |
[INTERP] Fixed edge-case for VPERM2[F/I]128 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runavx660f3a.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c index 83f71646..5c4292e9 100644 --- a/src/emu/x64runavx660f3a.c +++ b/src/emu/x64runavx660f3a.c @@ -202,14 +202,14 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 1 : GX->u128 = VY->u128; break; case 2 : GX->u128 = EX->u128; break; case 3 : GX->u128 = EY->u128; break; - default: GX->u128 = 0; break; + default: if(u8&0x08) GX->u128 = 0; break; } switch((u8>>4)&0x0f) { case 0 : GY->u128 = VX->u128; break; case 1 : GY->u128 = VY->u128; break; case 2 : GY->u128 = EX->u128; break; case 3 : GY->u128 = EY->u128; break; - default: GY->u128 = 0; break; + default: if(u8&0x80) GY->u128 = 0; break; } break; @@ -780,14 +780,14 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) eay2 = *VY; VY = &eay2; } - switch(u8&0x0f) { + switch(u8&0b1011) { case 0 : GX->u128 = VX->u128; break; case 1 : GX->u128 = VY->u128; break; case 2 : GX->u128 = EX->u128; break; case 3 : GX->u128 = EY->u128; break; default: GX->u128 = 0; break; } - switch((u8>>4)&0x0f) { + switch((u8>>4)&0b1011) { case 0 : GY->u128 = VX->u128; break; case 1 : GY->u128 = VY->u128; break; case 2 : GY->u128 = EX->u128; break; |