mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
target/s390x: vxeh2: Update for changes to vector shifts
Signed-off-by: David Miller <dmiller423@gmail.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: David Hildenbrand <david@redhat.com> Tested-by: Thomas Huth <thuth@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Message-Id: <20220428094708.84835-8-david@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
1d706f3141
commit
b7a50eb7d6
4 changed files with 96 additions and 51 deletions
|
@ -2018,21 +2018,42 @@ static DisasJumpType op_ves(DisasContext *s, DisasOps *o)
|
|||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType gen_vsh_by_byte(DisasContext *s, DisasOps *o,
|
||||
gen_helper_gvec_2i *gen,
|
||||
gen_helper_gvec_3 *gen_ve2)
|
||||
{
|
||||
bool byte = s->insn->data;
|
||||
|
||||
if (!byte && s390_has_feat(S390_FEAT_VECTOR_ENH2)) {
|
||||
gen_gvec_3_ool(get_field(s, v1), get_field(s, v2),
|
||||
get_field(s, v3), 0, gen_ve2);
|
||||
} else {
|
||||
TCGv_i64 shift = tcg_temp_new_i64();
|
||||
|
||||
read_vec_element_i64(shift, get_field(s, v3), 7, ES_8);
|
||||
tcg_gen_andi_i64(shift, shift, byte ? 0x78 : 7);
|
||||
gen_gvec_2i_ool(get_field(s, v1), get_field(s, v2), shift, 0, gen);
|
||||
tcg_temp_free_i64(shift);
|
||||
}
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType op_vsl(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
TCGv_i64 shift = tcg_temp_new_i64();
|
||||
return gen_vsh_by_byte(s, o, gen_helper_gvec_vsl,
|
||||
gen_helper_gvec_vsl_ve2);
|
||||
}
|
||||
|
||||
read_vec_element_i64(shift, get_field(s, v3), 7, ES_8);
|
||||
if (s->fields.op2 == 0x74) {
|
||||
tcg_gen_andi_i64(shift, shift, 0x7);
|
||||
} else {
|
||||
tcg_gen_andi_i64(shift, shift, 0x78);
|
||||
}
|
||||
static DisasJumpType op_vsra(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
return gen_vsh_by_byte(s, o, gen_helper_gvec_vsra,
|
||||
gen_helper_gvec_vsra_ve2);
|
||||
}
|
||||
|
||||
gen_gvec_2i_ool(get_field(s, v1), get_field(s, v2),
|
||||
shift, 0, gen_helper_gvec_vsl);
|
||||
tcg_temp_free_i64(shift);
|
||||
return DISAS_NEXT;
|
||||
static DisasJumpType op_vsrl(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
return gen_vsh_by_byte(s, o, gen_helper_gvec_vsrl,
|
||||
gen_helper_gvec_vsrl_ve2);
|
||||
}
|
||||
|
||||
static DisasJumpType op_vsldb(DisasContext *s, DisasOps *o)
|
||||
|
@ -2064,40 +2085,6 @@ static DisasJumpType op_vsldb(DisasContext *s, DisasOps *o)
|
|||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType op_vsra(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
TCGv_i64 shift = tcg_temp_new_i64();
|
||||
|
||||
read_vec_element_i64(shift, get_field(s, v3), 7, ES_8);
|
||||
if (s->fields.op2 == 0x7e) {
|
||||
tcg_gen_andi_i64(shift, shift, 0x7);
|
||||
} else {
|
||||
tcg_gen_andi_i64(shift, shift, 0x78);
|
||||
}
|
||||
|
||||
gen_gvec_2i_ool(get_field(s, v1), get_field(s, v2),
|
||||
shift, 0, gen_helper_gvec_vsra);
|
||||
tcg_temp_free_i64(shift);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType op_vsrl(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
TCGv_i64 shift = tcg_temp_new_i64();
|
||||
|
||||
read_vec_element_i64(shift, get_field(s, v3), 7, ES_8);
|
||||
if (s->fields.op2 == 0x7c) {
|
||||
tcg_gen_andi_i64(shift, shift, 0x7);
|
||||
} else {
|
||||
tcg_gen_andi_i64(shift, shift, 0x78);
|
||||
}
|
||||
|
||||
gen_gvec_2i_ool(get_field(s, v1), get_field(s, v2),
|
||||
shift, 0, gen_helper_gvec_vsrl);
|
||||
tcg_temp_free_i64(shift);
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static DisasJumpType op_vs(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
const uint8_t es = get_field(s, m4);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue