diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-06 23:22:32 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-06 17:22:32 +0200 |
| commit | c2c5d3b8369b6f9945fddccc5a1d945aff11c6ff (patch) | |
| tree | 83517d9a08d82d334acbc750f0dbe150937fae40 /src | |
| parent | 87baa884d2aabb356bdd2b20b55f65aa5b87058b (diff) | |
| download | box64-c2c5d3b8369b6f9945fddccc5a1d945aff11c6ff.tar.gz box64-c2c5d3b8369b6f9945fddccc5a1d945aff11c6ff.zip | |
[ARM64_DYNAREC][INTERP] Fixed AVX VPERM2F128/VPERM2I128 opcodes (#2907)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 8 | ||||
| -rw-r--r-- | src/emu/x64runavx660f3a.c | 39 |
2 files changed, 5 insertions, 42 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index 42cdb771..bedb1e87 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -167,12 +167,12 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip u8 = F8; GETVX(v2, 0); GETGX_empty(v0); - if((v0==v2) && ((u8&0xf0)==0)) { + if((v0==v2) && ((u8&0b10110000)==0)) { q0 = fpu_get_scratch(dyn, ninst); VMOVQ(q0, v2); v2 = q0; } - if((v0==v1) && ((u8&0xf0)==0x20)) { + if((v0==v1) && ((u8&0b10110000)==0x20)) { q1 = fpu_get_scratch(dyn, ninst); VMOVQ(q1, v1); v1 = q1; @@ -184,8 +184,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip case 3: if(MODREG) { d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); VMOVQ(v0, d1); } else { VLDR128_U12(v0, ed, fixedaddress+16); } break; default: VEORQ(v0, v0, v0); } - if((u8&0xf0)==0x10) { if((u8&0x0f)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); } - if(MODREG && ((u8&0xf0)==0x30)) { if((u8&0x0f)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); } + if((u8&0b10110000)==0x10) { if((u8&0b1011)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); } + if(MODREG && ((u8&0b10110000)==0x30)) { if((u8&0b1011)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); } v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, s0, -1); switch((u8>>4)&0b1011) { case 0: VMOVQ(v0, v2); break; diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c index 42dcaf79..5c0a9780 100644 --- a/src/emu/x64runavx660f3a.c +++ b/src/emu/x64runavx660f3a.c @@ -175,44 +175,6 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) } else GY->u128 = 0; break; - case 0x06: /* VPERM2F128 Gx, Vx, Ex, Imm8 */ - nextop = F8; - GETEX(1); - GETGX; - GETVX; - GETEY; - GETGY; - GETVY; - u8 = F8; - if(!vex.l) EmitSignal(emu, X64_SIGILL, (void*)R_RIP, 0); - if(GX==EX) { - eax1 = *EX; - EX = &eax1; - eay1 = *EY; - EY = &eay1; - } - if(GX==VX) { - eax2 = *VX; - VX = &eax2; - eay2 = *VY; - VY = &eay2; - } - switch(u8&0x0f) { - 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: 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: if(u8&0x80) GY->u128 = 0; break; - } - break; - case 0x08: // VROUNDPS Gx, Ex, u8 nextop = F8; GETEX(1); @@ -758,6 +720,7 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GY->u128 = 0; break; + case 0x06: /* VPERM2F128 Gx, Vx, Ex, Imm8 */ case 0x46: /* VPERM2I128 Gx, Vx, Ex, Imm8 */ nextop = F8; GETEX(1); |