about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-01 12:11:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-01 12:11:10 +0200
commit198eea49a83909209d203eea2e718112cca5dc48 (patch)
tree76de95dcf7ce8e503433316cff8e73c29028f75a /src
parentb500a6ebc20785176ff10b1683d2df184fdda5b4 (diff)
downloadbox64-198eea49a83909209d203eea2e718112cca5dc48.tar.gz
box64-198eea49a83909209d203eea2e718112cca5dc48.zip
[ARM64_DYNAREC] Small changes in a few AVX shift opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c27
1 files changed, 6 insertions, 21 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
index 503d8a63..f59c6121 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
@@ -1074,7 +1074,6 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                 if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
                 if(!MODREG) q0 = v1;
                 if(rex.w) {
-                    VEORQ(q1, q1, q1);
                     MOVI_32(q1, 64);
                     // no 64bits vmin/vmax
                     UQXTN_32(q0, v1);
@@ -1083,7 +1082,6 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                     NEGQ_64(q0, q0);
                     USHLQ_64(v0, v2, q0); 
                 } else {
-                    VEORQ(q1, q1, q1);
                     MOVIQ_32(q1, 32);
                     UMINQ_32(q0, v1, q1);
                     NEGQ_32(q0, q0);
@@ -1093,29 +1091,18 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(!vex.l) YMM0(gd);
             break;
         case 0x46:
-            INST_NAME("VPSRAVD/Q Gx, Vx, Ex");
+            INST_NAME("VPSRAVD Gx, Vx, Ex");
             nextop = F8;
+            if(rex.w) {DEFAULT; return addr;}
             if(MODREG) q0 = fpu_get_scratch(dyn, ninst);
             q1 = 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(!MODREG) q0 = v1;
-                if(rex.w) {
-                    VEORQ(q1, q1, q1);
-                    MOVI_32(q1, 64);
-                    // no 64bits vmin/vmax
-                    UQXTN_32(q0, v1);
-                    UMIN_32(q0, q0, q1);
-                    UXTL_32(q0, q0);
-                    NEGQ_64(q0, q0);
-                    SSHLQ_64(v0, v2, q0); 
-                } else {
-                    VEORQ(q1, q1, q1);
-                    MOVIQ_32(q1, 32);
-                    UMINQ_32(q0, v1, q1);
-                    NEGQ_32(q0, q0);
-                    SSHLQ_32(v0, v2, q0);
-                }
+                MOVIQ_32(q1, 32);
+                UMINQ_32(q0, v1, q1);
+                NEGQ_32(q0, q0);
+                SSHLQ_32(v0, v2, q0);
             }
             if(!vex.l) YMM0(gd);
             break;
@@ -1128,7 +1115,6 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                 if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); }
                 if(!MODREG) q0 = v1;
                 if(rex.w) {
-                    VEORQ(q1, q1, q1);
                     MOVI_32(q1, 64);
                     // no 64bits vmin/vmax
                     UQXTN_32(q0, v1);
@@ -1136,7 +1122,6 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                     UXTL_32(q0, q0);
                     USHLQ_64(v0, v2, q0); 
                 } else {
-                    VEORQ(q1, q1, q1);
                     MOVIQ_32(q1, 32);
                     UMINQ_32(q0, v1, q1);
                     USHLQ_32(v0, v2, q0);