about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-06-27 15:19:17 +0800
committerGitHub <noreply@github.com>2025-06-27 09:19:17 +0200
commit2302adcbb93c0c33fffe12207bed6da383f81c3e (patch)
treeb004909d9726041c819829303228e1b12d341ab0
parentf6bb7310bb3fed9d4a5b7456c5b0860bb753ec54 (diff)
downloadbox64-2302adcbb93c0c33fffe12207bed6da383f81c3e.tar.gz
box64-2302adcbb93c0c33fffe12207bed6da383f81c3e.zip
[LA64_DYNAREC] Add la64 avx load/store ops part 4. (#2775)
*  VEX.66.0f.38  VMOVSX{BW,BD,BQ,WD,WQ,DQ}/VMOVZX{BW,BD,BQ,WD,WQ,DQ}
-rw-r--r--src/dynarec/la64/dynarec_la64_avx_66_0f38.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_avx_66_0f38.c b/src/dynarec/la64/dynarec_la64_avx_66_0f38.c
index 1c2d70ad..1c5af097 100644
--- a/src/dynarec/la64/dynarec_la64_avx_66_0f38.c
+++ b/src/dynarec/la64/dynarec_la64_avx_66_0f38.c
@@ -85,6 +85,132 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t i
             GETGY_empty_EY_xy(q0, q2, 0);
             XVREPLVE0_Q(q0, q2);
             break;
+        case 0x20:
+            INST_NAME("VPMOVSXBW Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_H_B(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_H_B(q0, q1, 0);
+            }
+            break;
+        case 0x21:
+            INST_NAME("VPMOVSXBD Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_H_B(q0, q1, 0);
+                XVSLLWIL_W_H(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_H_B(q0, q1, 0);
+                VSLLWIL_W_H(q0, q0, 0);
+            }
+            break;
+        case 0x22:
+            INST_NAME("VPMOVSXBQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_H_B(q0, q1, 0);
+                XVSLLWIL_W_H(q0, q0, 0);
+                XVSLLWIL_D_W(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    SMREAD();
+                    addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                    LD_H(x5, ed, fixedaddress);
+                    q1 = fpu_get_scratch(dyn);
+                    MOVGR2FR_W(q1, x5);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_H_B(q0, q1, 0);
+                VSLLWIL_W_H(q0, q0, 0);
+                VSLLWIL_D_W(q0, q0, 0);
+            }
+            break;
+        case 0x23:
+            INST_NAME("VPMOVSXWD Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_W_H(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_W_H(q0, q1, 0);
+            }
+            break;
+        case 0x24:
+            INST_NAME("VPMOVSXWQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_W_H(q0, q1, 0);
+                XVSLLWIL_D_W(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_W_H(q0, q1, 0);
+                VSLLWIL_D_W(q0, q0, 0);
+            }
+            break;
+        case 0x25:
+            INST_NAME("VPMOVSXDQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_D_W(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_D_W(q0, q1, 0);
+            }
+            break;
         case 0x2C:
             INST_NAME("VMASKMOVPS Gx, Vx, Ex");
             nextop = F8;
@@ -147,6 +273,132 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t i
                 PUTEYx(v0);
             }
             break;
+        case 0x30:
+            INST_NAME("VPMOVZXBW Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_HU_BU(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_HU_BU(q0, q1, 0);
+            }
+            break;
+        case 0x31:
+            INST_NAME("VPMOVZXBD Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_HU_BU(q0, q1, 0);
+                XVSLLWIL_WU_HU(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_HU_BU(q0, q1, 0);
+                VSLLWIL_WU_HU(q0, q0, 0);
+            }
+            break;
+        case 0x32:
+            INST_NAME("VPMOVZXBQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_HU_BU(q0, q1, 0);
+                XVSLLWIL_WU_HU(q0, q0, 0);
+                XVSLLWIL_DU_WU(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    SMREAD();
+                    addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                    LD_H(x5, ed, fixedaddress);
+                    q1 = fpu_get_scratch(dyn);
+                    MOVGR2FR_W(q1, x5);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_HU_BU(q0, q1, 0);
+                VSLLWIL_WU_HU(q0, q0, 0);
+                VSLLWIL_DU_WU(q0, q0, 0);
+            }
+            break;
+        case 0x33:
+            INST_NAME("VPMOVZXWD Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_WU_HU(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_WU_HU(q0, q1, 0);
+            }
+            break;
+        case 0x34:
+            INST_NAME("VPMOVZXWQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYy_empty(q0);
+                XVSLLWIL_WU_HU(q0, q1, 0);
+                XVSLLWIL_DU_WU(q0, q0, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSS(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_WU_HU(q0, q1, 0);
+                VSLLWIL_DU_WU(q0, q0, 0);
+            }
+            break;
+        case 0x35:
+            INST_NAME("VPMOVZXDQ Gx, Ex");
+            nextop = F8;
+            if (vex.l) {
+                GETEYx(q1, 0, 0);
+                GETGYy_empty(q0);
+                XVSLLWIL_DU_WU(q0, q1, 0);
+            } else {
+                if (MODREG) {
+                    GETEYx(q1, 0, 0);
+                } else {
+                    GETEYSD(q1, 0, 0);
+                }
+                GETGYx_empty(q0);
+                VSLLWIL_DU_WU(q0, q1, 0);
+            }
+            break;
         case 0x8C:
             INST_NAME("VPMASKMOVD/Q Gx, Vx, Ex");
             nextop = F8;