diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-28 10:35:11 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-28 10:35:11 +0200 |
| commit | 013643782f14b8545d30157cb33b13d405d29f7c (patch) | |
| tree | 403ea6d98eab0c8f83f344d0bd55a20655c82eba /src/dynarec | |
| parent | cb064f9e5aa57b4ef6ffc5b79104e1df8d4f3b74 (diff) | |
| download | box64-013643782f14b8545d30157cb33b13d405d29f7c.tar.gz box64-013643782f14b8545d30157cb33b13d405d29f7c.zip | |
[ARM64_DYNAREC] Fixed AVX.66.0F3A 06/46/21 opcodes
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 46 |
1 files changed, 6 insertions, 40 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index a79c95a0..69a58b58 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -148,12 +148,13 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(!vex.l) YMM0(gd); break; case 0x06: - INST_NAME("VPERM2F128 Gx, Vx, Ex, Imm8"); + case 0x46: + if(opcode==0x06) { INST_NAME("VPERM2F128 Gx, Vx, Ex, Imm8"); } else { INST_NAME("VPERM2I128 Gx, Vx, Ex, Imm8"); } nextop = F8; if(!vex.l) UDF(0); if(MODREG) { s0 = (nextop&7)+(rex.b<<3); - v1 = sse_get_reg_empty(dyn, ninst, x1, s0); + v1 = sse_get_reg(dyn, ninst, x1, s0, 0); } else { s0 = -1; v1 = fpu_get_scratch(dyn, ninst); @@ -543,9 +544,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip case 0x21: INST_NAME("VINSERTPS Gx, Vx, Ex, Ib"); nextop = F8; - GETGX_empty_VX(v0, v2); if (MODREG) { - v1 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 0); + GETGX_empty_VXEX(v0, v2, v1, 1); u8 = F8; if(v0==v1) { d0 = fpu_get_scratch(dyn, ninst); @@ -557,6 +557,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip VMOVeS(v0, (u8>>4)&3, v1, (u8>>6)&3); } } else { + GETGX_empty_VX(v0, v2); if(v0!=v2) VMOVQ(v0, v2); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1); @@ -680,42 +681,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(!vex.l) YMM0(gd); break; - case 0x46: - INST_NAME("VPERM2I128 Gx, Vx, Ex, Imm8"); - if(!vex.l) { UDF(0); } - nextop = F8; - GETGX_empty_VX(v0, v2); - if(MODREG) {GETEX(v1, 0, 1);} else {addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 1); v1=-1;} - u8 = F8; - // make some qopies in case g==v or g==e - if((v0==v2) && ((u8&0xf0)==0x00)) { - d2 = fpu_get_scratch(dyn, ninst); - VMOVQ(d2, v2); - } else d2 = v2; - if(MODREG && (v0==v1) && ((u8&0xf0)==0x20)) { - d1 = fpu_get_scratch(dyn, ninst); - VMOVQ(d1, v1); - } else d1 = v1; - // grab the needed Y only - if(((u8&0xf)==1) || ((u8>>4)&0xf)==1) {q2 = ymm_get_reg(dyn, ninst, x2, vex.v, 0, gd, (MODREG)?((nextop&7)+(rex.b<<3)):-1, -1);} - if(MODREG && (((u8&0xf)==3) || ((u8>>4)&0xf)==3)) {q1 = ymm_get_reg(dyn, ninst, x2, (nextop&7)+(rex.b<<3), 0, gd, vex.v, -1);} - // go - switch(u8&0xf) { - case 0: if(v0!=v2) VMOVQ(v0, v2); break; - case 1: VMOVQ(v0, q2); break; - case 2: if(MODREG) {if(v0!=v1) VMOVQ(v0, v1);} else {VLDR128_U12(v0, ed, fixedaddress);} break; - case 3: if(MODREG) {VMOVQ(v0, q1);} else {VLDR128_U12(v0, ed, fixedaddress+16);} break; - default: VEORQ(v0, v0, v0); break; - } - GETGY_empty(v0, vex.v, (MODREG)?((nextop&7)+(rex.b<<3)):-1, -1); - switch((u8>>4)&0xf) { - case 0: if(v0!=d2) VMOVQ(v0, d2); break; - case 1: VMOVQ(v0, q2); break; - case 2: if(MODREG) {if(v0!=d1) VMOVQ(v0, d1);} else {VLDR128_U12(v0, ed, fixedaddress);} break; - case 3: if(MODREG) {VMOVQ(v0, q1);} else {VLDR128_U12(v0, ed, fixedaddress+16);} break; - default: VEORQ(v0, v0, v0); break; - } - break; + //case 0x46: // see 0x06 case 0x4A: INST_NAME("VBLENDVPS Gx, Vx, Ex, XMMImm8"); |