target/arm: Implement VFP fp16 VLDR and VSTR
Implement the fp16 versions of the VFP VLDR/VSTR (immediate). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200828183354.27913-12-peter.maydell@linaro.org
This commit is contained in:
parent
1b88b054c5
commit
274afbb121
|
@ -886,6 +886,41 @@ static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_dp *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool trans_VLDR_VSTR_hp(DisasContext *s, arg_VLDR_VSTR_sp *a)
|
||||
{
|
||||
uint32_t offset;
|
||||
TCGv_i32 addr, tmp;
|
||||
|
||||
if (!dc_isar_feature(aa32_fp16_arith, s)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!vfp_access_check(s)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* imm8 field is offset/2 for fp16, unlike fp32 and fp64 */
|
||||
offset = a->imm << 1;
|
||||
if (!a->u) {
|
||||
offset = -offset;
|
||||
}
|
||||
|
||||
/* For thumb, use of PC is UNPREDICTABLE. */
|
||||
addr = add_reg_for_lit(s, a->rn, offset);
|
||||
tmp = tcg_temp_new_i32();
|
||||
if (a->l) {
|
||||
gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
|
||||
neon_store_reg32(tmp, a->vd);
|
||||
} else {
|
||||
neon_load_reg32(tmp, a->vd);
|
||||
gen_aa32_st16(s, tmp, addr, get_mem_index(s));
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
tcg_temp_free_i32(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_VLDR_VSTR_sp(DisasContext *s, arg_VLDR_VSTR_sp *a)
|
||||
{
|
||||
uint32_t offset;
|
||||
|
|
|
@ -79,8 +79,7 @@ VMOV_single ---- 1110 000 l:1 .... rt:4 1010 . 001 0000 vn=%vn_sp
|
|||
VMOV_64_sp ---- 1100 010 op:1 rt2:4 rt:4 1010 00.1 .... vm=%vm_sp
|
||||
VMOV_64_dp ---- 1100 010 op:1 rt2:4 rt:4 1011 00.1 .... vm=%vm_dp
|
||||
|
||||
# Note that the half-precision variants of VLDR and VSTR are
|
||||
# not part of this decodetree at all because they have bits [9:8] == 0b01
|
||||
VLDR_VSTR_hp ---- 1101 u:1 .0 l:1 rn:4 .... 1001 imm:8 vd=%vd_sp
|
||||
VLDR_VSTR_sp ---- 1101 u:1 .0 l:1 rn:4 .... 1010 imm:8 vd=%vd_sp
|
||||
VLDR_VSTR_dp ---- 1101 u:1 .0 l:1 rn:4 .... 1011 imm:8 vd=%vd_dp
|
||||
|
||||
|
|
Loading…
Reference in a new issue