diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f.c | 11 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 26 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c index 856fb0c5..57538375 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c @@ -64,6 +64,17 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int switch(opcode) { + case 0x57: + INST_NAME("VXORPS Gx, Vx, Ex"); + nextop = F8; + GETGX_empty_VXEX(v0, v2, v1, 0); + VEORQ(v0, v2, v1); + if(vex.l) { + GETGY_empty_VYEY(v0, v2, v1); + VEORQ(v0, v2, v1); + } else YMM0(gd) + break; + case 0xC6: INST_NAME("VSHUFPS Gx, Vx, Ex, Ib"); nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 53abb9b5..f5b4cfe0 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -466,6 +466,32 @@ b = ymm_get_reg(dyn, ninst, x1, vex.v, w2, gd, k1, k2); \ a = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, k1, k2) +// Get empty GX, and non-writen VX and EX +#define GETGX_empty_VXEX(gx, vx, ex, D) \ + GETVX(vx, 0); \ + GETEX_Y(ex, 0, D); \ + GETGX_empty(gx) + +// Get empty GY, and non-writen VY and EY +#define GETGY_empty_VYEY(gy, vy, ey) \ + vy = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, (nextop&7)+(rex.b<<3), -1); \ + if(MODREG) \ + ey = ymm_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0, gd, vex.v, -1); \ + else \ + VLD128(ey, ed, fixedaddress+16); \ + gy = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, (nextop&7)+(rex.b<<3), -1) + +// Get EX as a quad, (x1 is used) +#define GETEX_Y(a, w, D) \ + if(MODREG) { \ + a = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), w); \ + } else { \ + if(w) {WILLWRITE2();} else {SMREAD();} \ + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, D); \ + a = fpu_get_scratch(dyn, ninst); \ + VLD128(a, ed, fixedaddress); \ + } + // Get EX as a quad, (x1 is used) #define GETEX(a, w, D) \ if(MODREG) { \ |