3607
load_element(dest, tcg_env, endian_ofs(s, vreg, idx), s->sew, sign);
3608
}
3609
3610
-/* Integer Scalar Move Instruction */
3610
+typedef void gen_helper_vset_velem0(TCGv_ptr, TCGv_i64, TCGv_env, TCGv_i32);
3611
3612
-static void store_element(TCGv_i64 val, TCGv_ptr base,
3613
- int ofs, int sew)
3612
+static void vec_element_storei_tail(DisasContext *s, int vreg, TCGv_i64 val)
3613
{
3615
- switch (sew) {
3616
- case MO_8:
3617
- tcg_gen_st8_i64(val, base, ofs);
3618
- break;
3619
- case MO_16:
3620
- tcg_gen_st16_i64(val, base, ofs);
3621
- break;
3622
- case MO_32:
3623
- tcg_gen_st32_i64(val, base, ofs);
3624
- break;
3625
- case MO_64:
3626
- tcg_gen_st_i64(val, base, ofs);
3627
- break;
3628
- default:
3629
- g_assert_not_reached();
3630
- }
3631
-}
3614
+ static gen_helper_vset_velem0 * const fns[4] = {
3615
+ gen_helper_vset_velem0_b, gen_helper_vset_velem0_h,
3616
+ gen_helper_vset_velem0_w, gen_helper_vset_velem0_d,
3617
+ };
3618
+ TCGv_ptr dest = tcg_temp_new_ptr();
3619
+ uint32_t data = FIELD_DP32(0, VDATA, VTA, s->vta);
3620
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(s->cfg_ptr->vlenb,
3621
+ s->cfg_ptr->vlenb, data));
3622
3633
-/*
3634
- * Store vreg[idx] = val.
3635
- * The index must be in range of VLMAX.
3636
- */
3637
-static void vec_element_storei(DisasContext *s, int vreg,
3638
- int idx, TCGv_i64 val)
3639
-{
3640
- store_element(val, tcg_env, endian_ofs(s, vreg, idx), s->sew);
3623
+ tcg_gen_addi_ptr(dest, tcg_env, vreg_ofs(s, vreg));
3624
+ fns[s->sew](dest, val, tcg_env, desc);
3625
}
3626
3627
/* vmv.x.s rd, vs2 # x[rd] = vs2[0] */
3668
*/
3669
s1 = get_gpr(s, a->rs1, EXT_NONE);
3670
tcg_gen_ext_tl_i64(t1, s1);
3687
- vec_element_storei(s, a->rd, 0, t1);
3671
+ vec_element_storei_tail(s, a->rd, t1);
3672
gen_set_label(over);
3673
tcg_gen_movi_tl(cpu_vstart, 0);
3674
finalize_rvv_inst(s);
3725
t1 = tcg_temp_new_i64();
3726
do_nanbox(s, t1, cpu_fpr[a->rs1]);
3727
3744
- vec_element_storei(s, a->rd, 0, t1);
3728
+ vec_element_storei_tail(s, a->rd, t1);
3729
3730
gen_set_label(over);
3731
tcg_gen_movi_tl(cpu_vstart, 0);