mirror of https://github.com/xemu-project/xemu.git
target/arm: Implement VFP fp16 VMOV between gp and halfprec registers
Implement the VFP fp16 variant of VMOV that transfers a 16-bit value between a general purpose register and a VFP register. Note that Rt == 15 is UNPREDICTABLE; since this insn is v8 and later only we have no need to replicate the old "updates CPSR.NZCV" behaviour that the singleprec version of this insn does. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200828183354.27913-22-peter.maydell@linaro.org
This commit is contained in:
parent
f61e5c43b8
commit
46a4b85452
|
@ -809,6 +809,40 @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trans_VMOV_half(DisasContext *s, arg_VMOV_single *a)
|
||||||
|
{
|
||||||
|
TCGv_i32 tmp;
|
||||||
|
|
||||||
|
if (!dc_isar_feature(aa32_fp16_arith, s)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->rt == 15) {
|
||||||
|
/* UNPREDICTABLE; we choose to UNDEF */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!vfp_access_check(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->l) {
|
||||||
|
/* VFP to general purpose register */
|
||||||
|
tmp = tcg_temp_new_i32();
|
||||||
|
neon_load_reg32(tmp, a->vn);
|
||||||
|
tcg_gen_andi_i32(tmp, tmp, 0xffff);
|
||||||
|
store_reg(s, a->rt, tmp);
|
||||||
|
} else {
|
||||||
|
/* general purpose register to VFP */
|
||||||
|
tmp = load_reg(s, a->rt);
|
||||||
|
tcg_gen_andi_i32(tmp, tmp, 0xffff);
|
||||||
|
neon_store_reg32(tmp, a->vn);
|
||||||
|
tcg_temp_free_i32(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a)
|
static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a)
|
||||||
{
|
{
|
||||||
TCGv_i32 tmp;
|
TCGv_i32 tmp;
|
||||||
|
|
|
@ -74,6 +74,7 @@ VDUP ---- 1110 1 b:1 q:1 0 .... rt:4 1011 . 0 e:1 1 0000 \
|
||||||
vn=%vn_dp
|
vn=%vn_dp
|
||||||
|
|
||||||
VMSR_VMRS ---- 1110 111 l:1 reg:4 rt:4 1010 0001 0000
|
VMSR_VMRS ---- 1110 111 l:1 reg:4 rt:4 1010 0001 0000
|
||||||
|
VMOV_half ---- 1110 000 l:1 .... rt:4 1001 . 001 0000 vn=%vn_sp
|
||||||
VMOV_single ---- 1110 000 l:1 .... rt:4 1010 . 001 0000 vn=%vn_sp
|
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_sp ---- 1100 010 op:1 rt2:4 rt:4 1010 00.1 .... vm=%vm_sp
|
||||||
|
|
Loading…
Reference in New Issue