target/arm: Implement new VFP fp16 insn VMOVX

The fp16 extension includes a new instruction VMOVX, which copies the
upper 16 bits of a 32-bit source VFP register into the lower 16
bits of the destination and zeroes the high half of the destination.
Implement it.

Backports f61e5c43b86907dea17f431b528d806659d62bcb
This commit is contained in:
Peter Maydell 2021-03-01 16:24:48 -05:00 committed by Lioncash
parent 3dd587e3df
commit 58485bca97
2 changed files with 29 additions and 0 deletions

View file

@ -3544,3 +3544,29 @@ static bool trans_VINS(DisasContext *s, arg_VINS *a)
tcg_temp_free_i32(tcg_ctx, rd);
return true;
}
static bool trans_VMOVX(DisasContext *s, arg_VINS *a)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
TCGv_i32 rm;
if (!dc_isar_feature(aa32_fp16_arith, s)) {
return false;
}
if (s->vec_len != 0 || s->vec_stride != 0) {
return false;
}
if (!vfp_access_check(s)) {
return true;
}
/* Set Vd to high half of Vm */
rm = tcg_temp_new_i32(tcg_ctx);
neon_load_reg32(s, rm, a->vm);
tcg_gen_shri_i32(tcg_ctx, rm, rm, 16);
neon_store_reg32(s, rm, a->vd);
tcg_temp_free_i32(tcg_ctx, rm);
return true;
}

View file

@ -75,5 +75,8 @@ VCVT 1111 1110 1.11 11 rm:2 .... 1010 op:1 1.0 .... \
VCVT 1111 1110 1.11 11 rm:2 .... 1011 op:1 1.0 .... \
vm=%vm_dp vd=%vd_sp sz=3
VMOVX 1111 1110 1.11 0000 .... 1010 01 . 0 .... \
vd=%vd_sp vm=%vm_sp
VINS 1111 1110 1.11 0000 .... 1010 11 . 0 .... \
vd=%vd_sp vm=%vm_sp