diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-14 11:26:49 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-14 11:26:49 +0200 |
| commit | c9a6d4c05a22f611f599ee7d9f40f946162ca5f1 (patch) | |
| tree | db4ec54564a80f9042c3215b693a01433783817a /src | |
| parent | a66b4e257ab32907a5484000e04af8a4b96d8eb9 (diff) | |
| download | box64-c9a6d4c05a22f611f599ee7d9f40f946162ca5f1.tar.gz box64-c9a6d4c05a22f611f599ee7d9f40f946162ca5f1.zip | |
[ARM64_DYNAREC] Added AVX.66.0F38 8C/9C/9F/BE opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c index 92a5c0a4..0bb1b37c 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c @@ -943,6 +943,25 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(!vex.l) YMM0(gd); break; + case 0x8C: + INST_NAME("VMASKMOVD/Q Vx, Ex, Gx"); + nextop = F8; + q0 = fpu_get_scratch(dyn, ninst); + for(int l=0; l<1+vex.l; ++l) { + if(!l) { + GETGX_empty_VXEX(v0, v2, v1, 0); + } else { + GETGY_empty_VYEY(v0, v2, v1); + } + if(rex.w) + VSSHRQ_64(q0, v2, 63); + else + VSSHRQ_32(q0, v2, 31); + VANDQ(v0, v1, q0); + } + if(!vex.l) YMM0(gd); + break; + case 0x8E: INST_NAME("VMASKMOVD/Q Ex, Vx, Gx"); nextop = F8; @@ -1080,7 +1099,18 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } YMM0(gd); break; - + case 0x9C: + INST_NAME("VFNMADD132PS/D Gx, Vx, Ex"); + nextop = F8; + for(int l=0; l<1+vex.l; ++l) { + if(!l) { GETGX_VXEX(v0, v2, v1, 0); } else { GETGY_VYEY(v0, v2, v1); } + if(!l && v0!=v2) q0 = fpu_get_scratch(dyn, ninst); + if(v0!=v2) VMOVQ(q0, v2); else q0 = v2; + if(rex.w) VFMLSQD(q0, v0, v1); else VFMLSQS(q0, v0, v1); + VMOVQ(v0, q0); + } + if(!vex.l) YMM0(gd); + break; case 0x9D: INST_NAME("VFNMADD132SS/D Gx, Vx, Ex"); nextop = F8; @@ -1098,6 +1128,23 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip YMM0(gd); break; + case 0x9F: + INST_NAME("VFNMSUB132SS/D Gx, Vx, Ex"); + nextop = F8; + GETGX(v0, 1); + GETVX(v2, 0); + if(rex.w) {GETEXSD(v1, 0, 0);} else {GETEXSS(v1, 0, 0);} + q0 = fpu_get_scratch(dyn, ninst); + if(rex.w) { + FNMADD_64(q0, v2, v1, v0); + VMOVeD(v0, 0, q0, 0); + } else { + FNMADD_32(q0, v2, v1, v0); + VMOVeS(v0, 0, q0, 0); + } + YMM0(gd); + break; + case 0xA8: INST_NAME("VFMADD213PS/D Gx, Vx, Ex"); nextop = F8; @@ -1303,6 +1350,15 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } YMM0(gd); break; + case 0xBE: + INST_NAME("VFNMSUB231PS/D Gx, Vx, Ex"); + nextop = F8; + for(int l=0; l<1+vex.l; ++l) { + if(!l) { GETGX_VXEX(v0, v2, v1, 0); } else { GETGY_VYEY(v0, v2, v1); } + if(rex.w) { VFMLAQD(v0, v1, v2); VFNEGQD(v0, v0); } else { VFMLAQS(v0, v1, v2); VFNEGQS(v0, v0); } + } + if(!vex.l) YMM0(gd); + break; case 0xDC: INST_NAME("VAESENC Gx, Vx, Ex"); // AES-NI |