about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-08-15 14:07:51 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-08-15 14:07:51 +0200
commit280b1576c332805eb7ca737dd5c47abc63b62663 (patch)
treee2c1a6084bd4a5f8fc23842cd77f7920c8e9756b /src
parent2dfd449561381f9c70e805c516111a3b964bb720 (diff)
downloadbox64-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.c27
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) {