On Thu, 2026-08-20 at 21:03 -0700, Richard Henderson wrote: > Populate it in all vector ldst operations. > Not yet used within the helpers. > > Signed-off-by: Richard Henderson <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > target/riscv/internals.h | 3 +++ > target/riscv/tcg/insn_trans/trans_rvv.c.inc | 25 ++++++++++++++++--- > -- > 2 files changed, 23 insertions(+), 5 deletions(-) > > diff --git a/target/riscv/internals.h b/target/riscv/internals.h > index 9e4da39ea0..b7ffb6098c 100644 > --- a/target/riscv/internals.h > +++ b/target/riscv/internals.h > @@ -94,6 +94,9 @@ FIELD(VDATA, VTA, 4, 1) > FIELD(VDATA, VTA_ALL_1S, 5, 1) > FIELD(VDATA, VMA, 6, 1) > FIELD(VDATA, NF, 7, 4) > +FIELD(VDATA, MEM_IDX, 11, 3) > +FIELD(VDATA, BSWAP, 14, 1) > +FIELD(VDATA, ALIGN, 15, 1) > > /* float point classify helpers */ > target_ulong fclass_h_bf16(uint64_t frs1); > diff --git a/target/riscv/tcg/insn_trans/trans_rvv.c.inc > b/target/riscv/tcg/insn_trans/trans_rvv.c.inc > index a22e2cae6c..3916236762 100644 > --- a/target/riscv/tcg/insn_trans/trans_rvv.c.inc > +++ b/target/riscv/tcg/insn_trans/trans_rvv.c.inc > @@ -693,6 +693,14 @@ static uint8_t vext_get_emul(DisasContext *s, > uint8_t eew) > typedef void gen_helper_ldst_us(TCGv_ptr, TCGv_ptr, TCGv, > TCGv_env, TCGv_i32); > > +static uint32_t vdata_add_memopidx(DisasContext *s, uint32_t data) > +{ > + data = FIELD_DP32(data, VDATA, MEM_IDX, s->mem_idx); > + data = FIELD_DP32(data, VDATA, BSWAP, s->mo_endianness != 0); > + data = FIELD_DP32(data, VDATA, ALIGN, !s->cfg_ptr->ext_zicclsm); > + return data; > +} > + > static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data, > gen_helper_ldst_us *fn, DisasContext *s, > bool is_store) > @@ -712,6 +720,7 @@ static bool ldst_us_trans(uint32_t vd, uint32_t > rs1, uint32_t data, > * The first part is vlen in bytes (vlenb), encoded in maxsz of > simd_desc. > * The second part is lmul, encoded in data of simd_desc. > */ > + data = vdata_add_memopidx(s, data); > desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb, > s->cfg_ptr->vlenb, data)); > > @@ -890,6 +899,8 @@ static bool ldst_stride_trans(uint32_t vd, > uint32_t rs1, uint32_t rs2, > mask = tcg_temp_new_ptr(); > base = get_gpr(s, rs1, EXT_NONE); > stride = get_gpr(s, rs2, EXT_NONE); > + > + data = vdata_add_memopidx(s, data); > desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb, > s->cfg_ptr->vlenb, data)); > > @@ -991,6 +1002,8 @@ static bool ldst_index_trans(uint32_t vd, > uint32_t rs1, uint32_t vs2, > mask = tcg_temp_new_ptr(); > index = tcg_temp_new_ptr(); > base = get_gpr(s, rs1, EXT_NONE); > + > + data = vdata_add_memopidx(s, data); > desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb, > s->cfg_ptr->vlenb, data)); > > @@ -1127,6 +1140,8 @@ static bool ldff_trans(uint32_t vd, uint32_t > rs1, uint32_t data, > dest = tcg_temp_new_ptr(); > mask = tcg_temp_new_ptr(); > base = get_gpr(s, rs1, EXT_NONE); > + > + data = vdata_add_memopidx(s, data); > desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb, > s->cfg_ptr->vlenb, data)); > > @@ -1231,15 +1246,15 @@ static bool ldst_whole_trans(uint32_t vd, > uint32_t rs1, uint32_t nf, > } > } > } else { > - TCGv_ptr dest; > - TCGv base; > + TCGv_ptr dest = tcg_temp_new_ptr(); > + TCGv base = get_gpr(s, rs1, EXT_NONE); > TCGv_i32 desc; > uint32_t data = FIELD_DP32(0, VDATA, NF, nf); > data = FIELD_DP32(data, VDATA, VM, 1); > - dest = tcg_temp_new_ptr(); > + data = vdata_add_memopidx(s, data); > + > desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb, > - s->cfg_ptr->vlenb, data)); > - base = get_gpr(s, rs1, EXT_NONE); > + s->cfg_ptr->vlenb, data)); > tcg_gen_addi_ptr(dest, tcg_env, vreg_ofs(s, vd)); > fn(dest, base, tcg_env, desc); > } > -- > 2.43.0 >
