[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 53/64] target/riscv: vector mask population count vmpopc
From: |
Alistair Francis |
Subject: |
[PULL v2 53/64] target/riscv: vector mask population count vmpopc |
Date: |
Thu, 2 Jul 2020 09:23:43 -0700 |
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20200701152549.1218-51-zhiwei_liu@c-sky.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
target/riscv/helper.h | 2 ++
target/riscv/insn32.decode | 1 +
target/riscv/insn_trans/trans_rvv.inc.c | 32 +++++++++++++++++++++++++
target/riscv/vector_helper.c | 20 ++++++++++++++++
4 files changed, 55 insertions(+)
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
index 292279f0c5..abae503b9c 100644
--- a/target/riscv/helper.h
+++ b/target/riscv/helper.h
@@ -1101,3 +1101,5 @@ DEF_HELPER_6(vmor_mm, void, ptr, ptr, ptr, ptr, env, i32)
DEF_HELPER_6(vmnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
DEF_HELPER_6(vmornot_mm, void, ptr, ptr, ptr, ptr, env, i32)
DEF_HELPER_6(vmxnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
+
+DEF_HELPER_4(vmpopc_m, tl, ptr, ptr, env, i32)
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index c71cbef182..971c06c09e 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -555,6 +555,7 @@ vmor_mm 011010 - ..... ..... 010 ..... 1010111 @r
vmnor_mm 011110 - ..... ..... 010 ..... 1010111 @r
vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
+vmpopc_m 010100 . ..... ----- 010 ..... 1010111 @r2_vm
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c
b/target/riscv/insn_trans/trans_rvv.inc.c
index e2954aa99a..f2d229b151 100644
--- a/target/riscv/insn_trans/trans_rvv.inc.c
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
@@ -2389,3 +2389,35 @@ GEN_MM_TRANS(vmor_mm)
GEN_MM_TRANS(vmnor_mm)
GEN_MM_TRANS(vmornot_mm)
GEN_MM_TRANS(vmxnor_mm)
+
+/* Vector mask population count vmpopc */
+static bool trans_vmpopc_m(DisasContext *s, arg_rmr *a)
+{
+ if (vext_check_isa_ill(s)) {
+ TCGv_ptr src2, mask;
+ TCGv dst;
+ TCGv_i32 desc;
+ uint32_t data = 0;
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
+
+ mask = tcg_temp_new_ptr();
+ src2 = tcg_temp_new_ptr();
+ dst = tcg_temp_new();
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
+
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
+
+ gen_helper_vmpopc_m(dst, mask, src2, cpu_env, desc);
+ gen_set_gpr(a->rd, dst);
+
+ tcg_temp_free_ptr(mask);
+ tcg_temp_free_ptr(src2);
+ tcg_temp_free(dst);
+ tcg_temp_free_i32(desc);
+ return true;
+ }
+ return false;
+}
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index ca44e733e8..63933060fc 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -4542,3 +4542,23 @@ GEN_VEXT_MASK_VV(vmor_mm, DO_OR)
GEN_VEXT_MASK_VV(vmnor_mm, DO_NOR)
GEN_VEXT_MASK_VV(vmornot_mm, DO_ORNOT)
GEN_VEXT_MASK_VV(vmxnor_mm, DO_XNOR)
+
+/* Vector mask population count vmpopc */
+target_ulong HELPER(vmpopc_m)(void *v0, void *vs2, CPURISCVState *env,
+ uint32_t desc)
+{
+ target_ulong cnt = 0;
+ uint32_t mlen = vext_mlen(desc);
+ uint32_t vm = vext_vm(desc);
+ uint32_t vl = env->vl;
+ int i;
+
+ for (i = 0; i < vl; i++) {
+ if (vm || vext_elem_mask(v0, mlen, i)) {
+ if (vext_elem_mask(vs2, mlen, i)) {
+ cnt++;
+ }
+ }
+ }
+ return cnt;
+}
--
2.27.0
- [PULL v2 43/64] target/riscv: vector floating-point classify instructions, (continued)
- [PULL v2 43/64] target/riscv: vector floating-point classify instructions, Alistair Francis, 2020/07/02
- [PULL v2 44/64] target/riscv: vector floating-point merge instructions, Alistair Francis, 2020/07/02
- [PULL v2 47/64] target/riscv: narrowing floating-point/integer type-convert instructions, Alistair Francis, 2020/07/02
- [PULL v2 46/64] target/riscv: widening floating-point/integer type-convert instructions, Alistair Francis, 2020/07/02
- [PULL v2 45/64] target/riscv: vector floating-point/integer type-convert instructions, Alistair Francis, 2020/07/02
- [PULL v2 48/64] target/riscv: vector single-width integer reduction instructions, Alistair Francis, 2020/07/02
- [PULL v2 50/64] target/riscv: vector single-width floating-point reduction instructions, Alistair Francis, 2020/07/02
- [PULL v2 49/64] target/riscv: vector wideing integer reduction instructions, Alistair Francis, 2020/07/02
- [PULL v2 51/64] target/riscv: vector widening floating-point reduction instructions, Alistair Francis, 2020/07/02
- [PULL v2 52/64] target/riscv: vector mask-register logical instructions, Alistair Francis, 2020/07/02
- [PULL v2 53/64] target/riscv: vector mask population count vmpopc,
Alistair Francis <=
- [PULL v2 56/64] target/riscv: vector iota instruction, Alistair Francis, 2020/07/02
- [PULL v2 55/64] target/riscv: set-X-first mask bit, Alistair Francis, 2020/07/02
- [PULL v2 54/64] target/riscv: vmfirst find-first-set mask bit, Alistair Francis, 2020/07/02
- [PULL v2 57/64] target/riscv: vector element index instruction, Alistair Francis, 2020/07/02
- [PULL v2 58/64] target/riscv: integer extract instruction, Alistair Francis, 2020/07/02
- [PULL v2 59/64] target/riscv: integer scalar move instruction, Alistair Francis, 2020/07/02
- [PULL v2 60/64] target/riscv: floating-point scalar move instructions, Alistair Francis, 2020/07/02
- [PULL v2 61/64] target/riscv: vector slide instructions, Alistair Francis, 2020/07/02
- [PULL v2 64/64] target/riscv: configure and turn on vector extension from command line, Alistair Francis, 2020/07/02
- [PULL v2 62/64] target/riscv: vector register gather instruction, Alistair Francis, 2020/07/02