mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
s390x/tcg: Implement VECTOR LOAD WITH LENGTH
We can reuse the helper introduced along with VECTOR LOAD TO BLOCK BOUNDARY. We just have to take care of converting the highest index into a length. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20190307121539.12842-18-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
76dbd28935
commit
f6c7ff6757
3 changed files with 22 additions and 0 deletions
|
@ -1008,6 +1008,8 @@
|
|||
F(0xe722, VLVG, VRS_b, V, la2, r3, 0, 0, vlvg, 0, IF_VEC)
|
||||
/* VECTOR LOAD VR FROM GRS DISJOINT */
|
||||
F(0xe762, VLVGP, VRR_f, V, r2, r3, 0, 0, vlvgp, 0, IF_VEC)
|
||||
/* VECTOR LOAD WITH LENGTH */
|
||||
F(0xe737, VLL, VRS_b, V, la2, r3_32u, 0, 0, vll, 0, IF_VEC)
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/* COMPARE AND SWAP AND PURGE */
|
||||
|
|
|
@ -5794,6 +5794,13 @@ static void in2_r3_sr32(DisasContext *s, DisasFields *f, DisasOps *o)
|
|||
}
|
||||
#define SPEC_in2_r3_sr32 0
|
||||
|
||||
static void in2_r3_32u(DisasContext *s, DisasFields *f, DisasOps *o)
|
||||
{
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
tcg_gen_ext32u_i64(o->in2, regs[get_field(f, r3)]);
|
||||
}
|
||||
#define SPEC_in2_r3_32u 0
|
||||
|
||||
static void in2_r2_32s(DisasContext *s, DisasFields *f, DisasOps *o)
|
||||
{
|
||||
o->in2 = tcg_temp_new_i64();
|
||||
|
|
|
@ -519,3 +519,16 @@ static DisasJumpType op_vlvgp(DisasContext *s, DisasOps *o)
|
|||
write_vec_element_i64(o->in2, get_field(s->fields, v1), 1, ES_64);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType op_vll(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
const int v1_offs = vec_full_reg_offset(get_field(s->fields, v1));
|
||||
TCGv_ptr a0 = tcg_temp_new_ptr();
|
||||
|
||||
/* convert highest index into an actual length */
|
||||
tcg_gen_addi_i64(o->in2, o->in2, 1);
|
||||
tcg_gen_addi_ptr(a0, cpu_env, v1_offs);
|
||||
gen_helper_vll(cpu_env, a0, o->addr1, o->in2);
|
||||
tcg_temp_free_ptr(a0);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue