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
> 

Reply via email to