about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-31 15:51:07 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-31 15:51:07 +0200
commit34809e48d81db027b8f91d2167d6ea4db5a88e69 (patch)
tree4728a80adbb85d83816cb0c2cbedf35ddd17e2e6 /src
parent6749c2d1a6d1762b3a2ad87c0bc70a65359d1c08 (diff)
downloadbox64-34809e48d81db027b8f91d2167d6ea4db5a88e69.tar.gz
box64-34809e48d81db027b8f91d2167d6ea4db5a88e69.zip
[ARM64_DYNAREC] Some fixes to AVX opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c9
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c9
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h1
5 files changed, 17 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx.c b/src/dynarec/arm64/dynarec_arm64_avx.c
index 56236005..14d79ad4 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx.c
@@ -59,8 +59,8 @@ uintptr_t dynarec64_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         addr = dynarec64_AVX_66_0F3A(dyn, addr, ip, ninst, vex, ok, need_epilog);
     else {DEFAULT;}
 
-    if(*ok==-1) {
-        printf_log(LOG_INFO, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
+    if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) {
+        dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
     }
     return addr;
 }
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
index 7b1af9e2..06044df1 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
@@ -193,10 +193,10 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
                 GETGX_empty(v0);
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0);
-                VLD128(v0, ed, fixedaddress);
+                VLDR128_U12(v0, ed, fixedaddress);
                 if(vex.l) {
                     GETGY_empty(v0, -1, -1, -1);
-                    VLD128(v0, ed, fixedaddress+16);
+                    VLDR128_U12(v0, ed, fixedaddress+16);
                 }
             }
             if(!vex.l) YMM0(gd);
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
index 14dfd263..e77eca69 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
@@ -115,8 +115,9 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             // create mask
             VSSHRQ_32(q0, v2, 31);
             VBITQ(v1, v0, q0);
-            if(!MODREG)
+            if(!MODREG) {
                 VST128(v1, ed, fixedaddress);
+            }
             if(vex.l) {
                 GETGYVYEY(v0, v2, v1);
                 VSSHRQ_32(q0, v2, 31);
@@ -133,14 +134,16 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             // create mask
             VSSHRQ_64(q0, v2, 63);
             VBITQ(v1, v0, q0);
-            if(!MODREG)
+            if(!MODREG) {
                 VST128(v1, ed, fixedaddress);
+            }
             if(vex.l) {
                 GETGYVYEY(v0, v2, v1);
                 VSSHRQ_64(q0, v2, 63);
                 VBITQ(v1, v0, q0);
-                if(!MODREG)
+                if(!MODREG) {
                     VST128(v1, ed, fixedaddress+16);
+                }
             }
             break;
 
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
index c27310b6..ee1fa401 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
@@ -120,8 +120,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             }
             u8 = F8;
             VMOVHto(ed, v0, u8&7);
-            if(!MODREG)
+            if(!MODREG) {
                 STH(ed, wback, fixedaddress);
+            }
             break;
         case 0x16:
             INST_NAME("VPEXTRD/Q Ed, Gx, imm8");
@@ -140,8 +141,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             } else {
                 VMOVSto(ed, v0, u8&3);
             }
-            if(!MODREG)
+            if(!MODREG) {
                 STxw(ed, wback, fixedaddress);
+            }
             break;
         case 0x17:
             INST_NAME("VEXTRACTPS Ed, Gx, imm8");
@@ -156,8 +158,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             }
             u8 = F8;
             VMOVSto(ed, v0, u8&3);
-            if(!MODREG)
+            if(!MODREG) {
                 STW(ed, wback, fixedaddress);
+            }
             break;
         case 0x18:
             INST_NAME("VINSERTF128 Gx, Vx, Ex, imm8");
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index e455acda..b72b4e99 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -517,6 +517,7 @@
     } else {                                                                                            \
         if(w) {WILLWRITE2();} else {SMREAD();}                                                          \
         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, D);  \
+        unscaled = 0;                                                                                   \
         a = fpu_get_scratch(dyn, ninst);                                                                \
         VLD128(a, ed, fixedaddress);                                                                    \
     }