Populate it in all vector ldst operations. Not yet used within the helpers.
Signed-off-by: Richard Henderson <[email protected]> --- 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
