target/arm: Convert FMOVI (scalar, immediate) to decodetree
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20240912024114.1097832-13-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
3d44e070a6
commit
c777e73cbe
@ -1180,3 +1180,7 @@ FMAXV_s 0110 1110 00 11000 01111 10 ..... ..... @rr_q1e2
|
||||
|
||||
FMINV_h 0.00 1110 10 11000 01111 10 ..... ..... @qrr_h
|
||||
FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2
|
||||
|
||||
# Floating-point Immediate
|
||||
|
||||
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
|
||||
|
@ -6888,6 +6888,31 @@ TRANS(FMINNMV_s, do_fp_reduction, a, gen_helper_vfp_minnums)
|
||||
TRANS(FMAXV_s, do_fp_reduction, a, gen_helper_vfp_maxs)
|
||||
TRANS(FMINV_s, do_fp_reduction, a, gen_helper_vfp_mins)
|
||||
|
||||
/*
|
||||
* Floating-point Immediate
|
||||
*/
|
||||
|
||||
static bool trans_FMOVI_s(DisasContext *s, arg_FMOVI_s *a)
|
||||
{
|
||||
switch (a->esz) {
|
||||
case MO_32:
|
||||
case MO_64:
|
||||
break;
|
||||
case MO_16:
|
||||
if (!dc_isar_feature(aa64_fp16, s)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
if (fp_access_check(s)) {
|
||||
uint64_t imm = vfp_expand_imm(a->esz, a->imm);
|
||||
write_fp_dreg(s, a->rd, tcg_constant_i64(imm));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Shift a TCGv src by TCGv shift_amount, put result in dst.
|
||||
* Note that it is the caller's responsibility to ensure that the
|
||||
* shift amount is in range (ie 0..31 or 0..63) and provide the ARM
|
||||
@ -8625,53 +8650,6 @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
|
||||
}
|
||||
}
|
||||
|
||||
/* Floating point immediate
|
||||
* 31 30 29 28 24 23 22 21 20 13 12 10 9 5 4 0
|
||||
* +---+---+---+-----------+------+---+------------+-------+------+------+
|
||||
* | M | 0 | S | 1 1 1 1 0 | type | 1 | imm8 | 1 0 0 | imm5 | Rd |
|
||||
* +---+---+---+-----------+------+---+------------+-------+------+------+
|
||||
*/
|
||||
static void disas_fp_imm(DisasContext *s, uint32_t insn)
|
||||
{
|
||||
int rd = extract32(insn, 0, 5);
|
||||
int imm5 = extract32(insn, 5, 5);
|
||||
int imm8 = extract32(insn, 13, 8);
|
||||
int type = extract32(insn, 22, 2);
|
||||
int mos = extract32(insn, 29, 3);
|
||||
uint64_t imm;
|
||||
MemOp sz;
|
||||
|
||||
if (mos || imm5) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case 0:
|
||||
sz = MO_32;
|
||||
break;
|
||||
case 1:
|
||||
sz = MO_64;
|
||||
break;
|
||||
case 3:
|
||||
sz = MO_16;
|
||||
if (dc_isar_feature(aa64_fp16, s)) {
|
||||
break;
|
||||
}
|
||||
/* fallthru */
|
||||
default:
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!fp_access_check(s)) {
|
||||
return;
|
||||
}
|
||||
|
||||
imm = vfp_expand_imm(sz, imm8);
|
||||
write_fp_dreg(s, rd, tcg_constant_i64(imm));
|
||||
}
|
||||
|
||||
/* Handle floating point <=> fixed point conversions. Note that we can
|
||||
* also deal with fp <=> integer conversions as a special case (scale == 64)
|
||||
* OPTME: consider handling that special case specially or at least skipping
|
||||
@ -9091,7 +9069,7 @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
|
||||
switch (ctz32(extract32(insn, 12, 4))) {
|
||||
case 0: /* [15:12] == xxx1 */
|
||||
/* Floating point immediate */
|
||||
disas_fp_imm(s, insn);
|
||||
unallocated_encoding(s); /* in decodetree */
|
||||
break;
|
||||
case 1: /* [15:12] == xx10 */
|
||||
/* Floating point compare */
|
||||
|
Loading…
Reference in New Issue
Block a user