diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-03-10 16:54:20 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-10 09:54:20 +0100 |
| commit | d7c7a716fe19dcc041a1e1fbfaf5601babb4c047 (patch) | |
| tree | a6df8082dcc31c2b1429f26eaacbb231045f32ab /src | |
| parent | 41bee356344a25439c688338275ca7604961939c (diff) | |
| download | box64-d7c7a716fe19dcc041a1e1fbfaf5601babb4c047.tar.gz box64-d7c7a716fe19dcc041a1e1fbfaf5601babb4c047.zip | |
[RV64_DYNAREC] Optimized PMOVZX and PMOVSX opcodes for vector 1.0 (#2430)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f_vector.c | 393 |
1 files changed, 269 insertions, 124 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f_vector.c b/src/dynarec/rv64/dynarec_rv64_660f_vector.c index 0d2c2097..e2b82792 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_660f_vector.c @@ -495,88 +495,161 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i case 0x20: INST_NAME("PMOVSXBW Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.5); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.5); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x21: INST_NAME("PMOVSXBD Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.25); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); - VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); - VMV_V_V(q0, v1); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.25); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); + VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + VMV_V_V(q0, v1); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF4(q0, q1, VECTOR_UNMASKED); + } + break; break; case 0x22: INST_NAME("PMOVSXBQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.125); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); - VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADD_VX(v0, v1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.125); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); + VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADD_VX(v0, v1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF8(q0, q1, VECTOR_UNMASKED); + } break; case 0x23: INST_NAME("PMOVSXWD Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x24: INST_NAME("PMOVSXWQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v1); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADD_VX(v1, v0, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v1); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF4(q0, q1, VECTOR_UNMASKED); + } break; case 0x25: INST_NAME("PMOVSXDQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADD_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VSEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x28: INST_NAME("PMULDQ Gx, Ex"); @@ -631,88 +704,160 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i case 0x30: INST_NAME("PMOVZXBW Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.5); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.5); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x31: INST_NAME("PMOVZXBD Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.25); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); - VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); - VMV_V_V(q0, v1); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.25); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); + VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + VMV_V_V(q0, v1); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF4(q0, q1, VECTOR_UNMASKED); + } break; case 0x32: INST_NAME("PMOVZXBQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.125); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); - VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADDU_VX(v0, v1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW8, VECTOR_LMUL1, 0.125); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); + VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADDU_VX(v0, v1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF8(q0, q1, VECTOR_UNMASKED); + } break; case 0x33: INST_NAME("PMOVZXWD Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.5); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x34: INST_NAME("PMOVZXWQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v1); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW16, VECTOR_LMUL1, 0.25); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADDU_VX(v1, v0, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v1); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF4(q0, q1, VECTOR_UNMASKED); + } break; case 0x35: INST_NAME("PMOVZXDQ Gx, Ex"); nextop = F8; - SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); - GETEX_vector(q1, 0, 0, VECTOR_SEW8); - GETGX_empty_vector(q0); - v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); - vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); - VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); - SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); - VMV_V_V(q0, v0); + if (rv64_xtheadvector) { + SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + v0 = fpu_get_scratch_lmul(dyn, VECTOR_LMUL2); + vector_vsetvli(dyn, ninst, x1, VECTOR_SEW32, VECTOR_LMUL1, 0.5); + VWADDU_VX(v0, q1, xZR, VECTOR_UNMASKED); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + VMV_V_V(q0, v0); + } else { + if (!MODREG) SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1); + GETEX_vector(q1, 0, 0, VECTOR_SEW8); + GETGX_empty_vector(q0); + SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } + VZEXT_VF2(q0, q1, VECTOR_UNMASKED); + } break; case 0x37: INST_NAME("PCMPGTQ Gx, Ex"); |