diff options
| author | phorcys <phorcys@126.com> | 2025-06-27 15:19:17 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-27 09:19:17 +0200 |
| commit | 2302adcbb93c0c33fffe12207bed6da383f81c3e (patch) | |
| tree | b004909d9726041c819829303228e1b12d341ab0 | |
| parent | f6bb7310bb3fed9d4a5b7456c5b0860bb753ec54 (diff) | |
| download | box64-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.c | 252 |
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; |