@@ -2204,6 +2204,11 @@ INSN_LASX(xvclz_h, xx)
INSN_LASX(xvclz_w, xx)
INSN_LASX(xvclz_d, xx)
+INSN_LASX(xvpcnt_b, xx)
+INSN_LASX(xvpcnt_h, xx)
+INSN_LASX(xvpcnt_w, xx)
+INSN_LASX(xvpcnt_d, xx)
+
INSN_LASX(xvreplgr2vr_b, xr)
INSN_LASX(xvreplgr2vr_h, xr)
INSN_LASX(xvreplgr2vr_w, xr)
@@ -1059,3 +1059,8 @@ DEF_HELPER_3(xvclz_b, void, env, i32, i32)
DEF_HELPER_3(xvclz_h, void, env, i32, i32)
DEF_HELPER_3(xvclz_w, void, env, i32, i32)
DEF_HELPER_3(xvclz_d, void, env, i32, i32)
+
+DEF_HELPER_3(xvpcnt_b, void, env, i32, i32)
+DEF_HELPER_3(xvpcnt_h, void, env, i32, i32)
+DEF_HELPER_3(xvpcnt_w, void, env, i32, i32)
+DEF_HELPER_3(xvpcnt_d, void, env, i32, i32)
@@ -2153,6 +2153,11 @@ TRANS(xvclz_h, gen_xx, gen_helper_xvclz_h)
TRANS(xvclz_w, gen_xx, gen_helper_xvclz_w)
TRANS(xvclz_d, gen_xx, gen_helper_xvclz_d)
+TRANS(xvpcnt_b, gen_xx, gen_helper_xvpcnt_b)
+TRANS(xvpcnt_h, gen_xx, gen_helper_xvpcnt_h)
+TRANS(xvpcnt_w, gen_xx, gen_helper_xvpcnt_w)
+TRANS(xvpcnt_d, gen_xx, gen_helper_xvpcnt_d)
+
static bool gvec_dupx(DisasContext *ctx, arg_xr *a, MemOp mop)
{
TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
@@ -1802,6 +1802,11 @@ xvclz_h 0111 01101001 11000 00101 ..... ..... @xx
xvclz_w 0111 01101001 11000 00110 ..... ..... @xx
xvclz_d 0111 01101001 11000 00111 ..... ..... @xx
+xvpcnt_b 0111 01101001 11000 01000 ..... ..... @xx
+xvpcnt_h 0111 01101001 11000 01001 ..... ..... @xx
+xvpcnt_w 0111 01101001 11000 01010 ..... ..... @xx
+xvpcnt_d 0111 01101001 11000 01011 ..... ..... @xx
+
xvreplgr2vr_b 0111 01101001 11110 00000 ..... ..... @xr
xvreplgr2vr_h 0111 01101001 11110 00001 ..... ..... @xr
xvreplgr2vr_w 0111 01101001 11110 00010 ..... ..... @xr
@@ -2102,3 +2102,20 @@ XDO_2OP(xvclz_b, 8, UXB, DO_CLZ_B)
XDO_2OP(xvclz_h, 16, UXH, DO_CLZ_H)
XDO_2OP(xvclz_w, 32, UXW, DO_CLZ_W)
XDO_2OP(xvclz_d, 64, UXD, DO_CLZ_D)
+
+#define XVPCNT(NAME, BIT, E, FN) \
+void HELPER(NAME)(CPULoongArchState *env, uint32_t xd, uint32_t xj) \
+{ \
+ int i; \
+ XReg *Xd = &(env->fpr[xd].xreg); \
+ XReg *Xj = &(env->fpr[xj].xreg); \
+ \
+ for (i = 0; i < LASX_LEN / BIT; i++) { \
+ Xd->E(i) = FN(Xj->E(i)); \
+ } \
+}
+
+XVPCNT(xvpcnt_b, 8, UXB, ctpop8)
+XVPCNT(xvpcnt_h, 16, UXH, ctpop16)
+XVPCNT(xvpcnt_w, 32, UXW, ctpop32)
+XVPCNT(xvpcnt_d, 64, UXD, ctpop64)
This patch includes: - VPCNT.{B/H/W/D}. Signed-off-by: Song Gao <gaosong@loongson.cn> --- target/loongarch/disas.c | 5 +++++ target/loongarch/helper.h | 5 +++++ target/loongarch/insn_trans/trans_lasx.c.inc | 5 +++++ target/loongarch/insns.decode | 5 +++++ target/loongarch/lasx_helper.c | 17 +++++++++++++++++ 5 files changed, 37 insertions(+)