diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-08-15 14:07:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-08-15 14:07:51 +0200 |
| commit | 280b1576c332805eb7ca737dd5c47abc63b62663 (patch) | |
| tree | e2c1a6084bd4a5f8fc23842cd77f7920c8e9756b /src | |
| parent | 2dfd449561381f9c70e805c516111a3b964bb720 (diff) | |
| download | box64-280b1576c332805eb7ca737dd5c47abc63b62663.tar.gz box64-280b1576c332805eb7ca737dd5c47abc63b62663.zip | |
[ARM64_DYNAREC] Added AVX.66.0F38 A6 opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c index e8af6c6e..b7fe8a29 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c @@ -24,6 +24,9 @@ #include "dynarec_arm64_functions.h" #include "dynarec_arm64_helper.h" +static const float addsubps[4] = {-1.f, 1.f, -1.f, 1.f}; +static const double addsubpd[2] = {-1., 1.}; + uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog) { (void)ip; (void)need_epilog; @@ -1282,6 +1285,27 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip YMM0(gd); break; + case 0xA6: + INST_NAME("VFMADDSUB213PS/D Gx, Vx, Ex"); + nextop = F8; + q0 = fpu_get_scratch(dyn, ninst); + TABLE64(x2, (rex.w)?((uintptr_t)&addsubpd):((uintptr_t)&addsubps)); + VLDR128_U12(q0, x2, 0); + q1 = fpu_get_scratch(dyn, ninst); + 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) { + VFMULQD(q1, v1, q0); + VFMLAQD(q1, v0, v2); + } else { + VFMULQS(q1, v1, q0); + VFMLAQS(q1, v0, v2); + } + VMOVQ(v0, q1); + } + if(!vex.l) YMM0(gd); + break; + case 0xA8: INST_NAME("VFMADD213PS/D Gx, Vx, Ex"); nextop = F8; @@ -1415,9 +1439,6 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip INST_NAME("VFMADDSUB231PS/D Gx, Vx, Ex"); nextop = F8; q0 = fpu_get_scratch(dyn, ninst); - static float addsubps[4] = {-1.f, 1.f, -1.f, 1.f}; - static double addsubpd[2] = {-1., 1.}; - MAYUSE(addsubps); MAYUSE(addsubpd); TABLE64(x2, (rex.w)?((uintptr_t)&addsubpd):((uintptr_t)&addsubps)); VLDR128_U12(q0, x2, 0); for(int l=0; l<1+vex.l; ++l) { |