about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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;