On Tue, Mar 17, 2020 at 8:37 AM LIU Zhiwei <zhiwei_...@c-sky.com> wrote: > > Signed-off-by: LIU Zhiwei <zhiwei_...@c-sky.com> > Reviewed-by: Richard Henderson <richard.hender...@linaro.org>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/helper.h | 13 ++++ > target/riscv/insn32.decode | 6 ++ > target/riscv/insn_trans/trans_rvv.inc.c | 85 +++++++++++++++++++++++++ > target/riscv/vector_helper.c | 14 ++++ > 4 files changed, 118 insertions(+) > > diff --git a/target/riscv/helper.h b/target/riscv/helper.h > index 47284c7476..0f36a8ce43 100644 > --- a/target/riscv/helper.h > +++ b/target/riscv/helper.h > @@ -422,3 +422,16 @@ DEF_HELPER_6(vsra_vx_b, void, ptr, ptr, tl, ptr, env, > i32) > DEF_HELPER_6(vsra_vx_h, void, ptr, ptr, tl, ptr, env, i32) > DEF_HELPER_6(vsra_vx_w, void, ptr, ptr, tl, ptr, env, i32) > DEF_HELPER_6(vsra_vx_d, void, ptr, ptr, tl, ptr, env, i32) > + > +DEF_HELPER_6(vnsrl_vv_b, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsrl_vv_h, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsrl_vv_w, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsra_vv_b, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsra_vv_h, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsra_vv_w, void, ptr, ptr, ptr, ptr, env, i32) > +DEF_HELPER_6(vnsrl_vx_b, void, ptr, ptr, tl, ptr, env, i32) > +DEF_HELPER_6(vnsrl_vx_h, void, ptr, ptr, tl, ptr, env, i32) > +DEF_HELPER_6(vnsrl_vx_w, void, ptr, ptr, tl, ptr, env, i32) > +DEF_HELPER_6(vnsra_vx_b, void, ptr, ptr, tl, ptr, env, i32) > +DEF_HELPER_6(vnsra_vx_h, void, ptr, ptr, tl, ptr, env, i32) > +DEF_HELPER_6(vnsra_vx_w, void, ptr, ptr, tl, ptr, env, i32) > diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode > index f6d0f5aec5..89fd2aa4e2 100644 > --- a/target/riscv/insn32.decode > +++ b/target/riscv/insn32.decode > @@ -329,6 +329,12 @@ vsrl_vi 101000 . ..... ..... 011 ..... 1010111 > @r_vm > vsra_vv 101001 . ..... ..... 000 ..... 1010111 @r_vm > vsra_vx 101001 . ..... ..... 100 ..... 1010111 @r_vm > vsra_vi 101001 . ..... ..... 011 ..... 1010111 @r_vm > +vnsrl_vv 101100 . ..... ..... 000 ..... 1010111 @r_vm > +vnsrl_vx 101100 . ..... ..... 100 ..... 1010111 @r_vm > +vnsrl_vi 101100 . ..... ..... 011 ..... 1010111 @r_vm > +vnsra_vv 101101 . ..... ..... 000 ..... 1010111 @r_vm > +vnsra_vx 101101 . ..... ..... 100 ..... 1010111 @r_vm > +vnsra_vi 101101 . ..... ..... 011 ..... 1010111 @r_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 6ed2466e75..a537b507a0 100644 > --- a/target/riscv/insn_trans/trans_rvv.inc.c > +++ b/target/riscv/insn_trans/trans_rvv.inc.c > @@ -1312,3 +1312,88 @@ GEN_OPIVX_GVEC_SHIFT_TRANS(vsra_vx, sars) > GEN_OPIVI_GVEC_TRANS(vsll_vi, 1, vsll_vx, shli) > GEN_OPIVI_GVEC_TRANS(vsrl_vi, 1, vsrl_vx, shri) > GEN_OPIVI_GVEC_TRANS(vsra_vi, 1, vsra_vx, sari) > + > +/* Vector Narrowing Integer Right Shift Instructions */ > +static bool opivv_narrow_check(DisasContext *s, arg_rmrr *a) > +{ > + return (vext_check_isa_ill(s) && > + vext_check_overlap_mask(s, a->rd, a->vm, false) && > + vext_check_reg(s, a->rd, false) && > + vext_check_reg(s, a->rs2, true) && > + vext_check_reg(s, a->rs1, false) && > + vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2, > + 2 << s->lmul) && > + (s->lmul < 0x3) && (s->sew < 0x3)); > +} > + > +/* OPIVV with NARROW */ > +#define GEN_OPIVV_NARROW_TRANS(NAME) \ > +static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \ > +{ \ > + if (opivv_narrow_check(s, a)) { \ > + uint32_t data = 0; \ > + static gen_helper_gvec_4_ptr * const fns[3] = { \ > + gen_helper_##NAME##_b, \ > + gen_helper_##NAME##_h, \ > + gen_helper_##NAME##_w, \ > + }; \ > + data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \ > + data = FIELD_DP32(data, VDATA, VM, a->vm); \ > + data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \ > + tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \ > + vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2), \ > + cpu_env, 0, s->vlen / 8, data, fns[s->sew]); \ > + return true; \ > + } \ > + return false; \ > +} > +GEN_OPIVV_NARROW_TRANS(vnsra_vv) > +GEN_OPIVV_NARROW_TRANS(vnsrl_vv) > + > +static bool opivx_narrow_check(DisasContext *s, arg_rmrr *a) > +{ > + return (vext_check_isa_ill(s) && > + vext_check_overlap_mask(s, a->rd, a->vm, false) && > + vext_check_reg(s, a->rd, false) && > + vext_check_reg(s, a->rs2, true) && > + vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2, > + 2 << s->lmul) && > + (s->lmul < 0x3) && (s->sew < 0x3)); > +} > + > +/* OPIVX with NARROW */ > +#define GEN_OPIVX_NARROW_TRANS(NAME) \ > +static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \ > +{ \ > + if (opivx_narrow_check(s, a)) { \ > + static gen_helper_opivx * const fns[3] = { \ > + gen_helper_##NAME##_b, \ > + gen_helper_##NAME##_h, \ > + gen_helper_##NAME##_w, \ > + }; \ > + return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s);\ > + } \ > + return false; \ > +} > + > +GEN_OPIVX_NARROW_TRANS(vnsra_vx) > +GEN_OPIVX_NARROW_TRANS(vnsrl_vx) > + > +/* OPIVI with NARROW */ > +#define GEN_OPIVI_NARROW_TRANS(NAME, ZX, OPIVX) \ > +static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \ > +{ \ > + if (opivx_narrow_check(s, a)) { \ > + static gen_helper_opivx * const fns[3] = { \ > + gen_helper_##OPIVX##_b, \ > + gen_helper_##OPIVX##_h, \ > + gen_helper_##OPIVX##_w, \ > + }; \ > + return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, \ > + fns[s->sew], s, ZX); \ > + } \ > + return false; \ > +} > + > +GEN_OPIVI_NARROW_TRANS(vnsra_vi, 1, vnsra_vx) > +GEN_OPIVI_NARROW_TRANS(vnsrl_vi, 1, vnsrl_vx) > diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c > index c3518516f0..8d1f32a7ff 100644 > --- a/target/riscv/vector_helper.c > +++ b/target/riscv/vector_helper.c > @@ -1371,3 +1371,17 @@ GEN_VEXT_SHIFT_VX(vsra_vx_b, int8_t, int8_t, H1, H1, > DO_SRL, 0x7, clearb) > GEN_VEXT_SHIFT_VX(vsra_vx_h, int16_t, int16_t, H2, H2, DO_SRL, 0xf, clearh) > GEN_VEXT_SHIFT_VX(vsra_vx_w, int32_t, int32_t, H4, H4, DO_SRL, 0x1f, clearl) > GEN_VEXT_SHIFT_VX(vsra_vx_d, int64_t, int64_t, H8, H8, DO_SRL, 0x3f, clearq) > + > +/* Vector Narrowing Integer Right Shift Instructions */ > +GEN_VEXT_SHIFT_VV(vnsrl_vv_b, uint8_t, uint16_t, H1, H2, DO_SRL, 0xf, > clearb) > +GEN_VEXT_SHIFT_VV(vnsrl_vv_h, uint16_t, uint32_t, H2, H4, DO_SRL, 0x1f, > clearh) > +GEN_VEXT_SHIFT_VV(vnsrl_vv_w, uint32_t, uint64_t, H4, H8, DO_SRL, 0x3f, > clearl) > +GEN_VEXT_SHIFT_VV(vnsra_vv_b, uint8_t, int16_t, H1, H2, DO_SRL, 0xf, clearb) > +GEN_VEXT_SHIFT_VV(vnsra_vv_h, uint16_t, int32_t, H2, H4, DO_SRL, 0x1f, > clearh) > +GEN_VEXT_SHIFT_VV(vnsra_vv_w, uint32_t, int64_t, H4, H8, DO_SRL, 0x3f, > clearl) > +GEN_VEXT_SHIFT_VX(vnsrl_vx_b, uint8_t, uint16_t, H1, H2, DO_SRL, 0xf, clearb) > +GEN_VEXT_SHIFT_VX(vnsrl_vx_h, uint16_t, uint32_t, H2, H4, DO_SRL, 0x1f, > clearh) > +GEN_VEXT_SHIFT_VX(vnsrl_vx_w, uint32_t, uint64_t, H4, H8, DO_SRL, 0x3f, > clearl) > +GEN_VEXT_SHIFT_VX(vnsra_vx_b, int8_t, int16_t, H1, H2, DO_SRL, 0xf, clearb) > +GEN_VEXT_SHIFT_VX(vnsra_vx_h, int16_t, int32_t, H2, H4, DO_SRL, 0x1f, clearh) > +GEN_VEXT_SHIFT_VX(vnsra_vx_w, int32_t, int64_t, H4, H8, DO_SRL, 0x3f, clearl) > -- > 2.23.0 >