target/arm: Handle FPCR.NEP for 3-input scalar operations

Handle FPCR.NEP for the 3-input scalar operations which use
do_fmla_scalar_idx() and do_fmadd(), by making them call the
appropriate write_fp_*reg_merging() functions.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Peter Maydell 2025-02-01 16:39:20 +00:00
parent 78dcfe20e9
commit 0378199dc2

View File

@ -6345,7 +6345,7 @@ static bool do_fmla_scalar_idx(DisasContext *s, arg_rrx_e *a, bool neg)
gen_vfp_negd(t1, t1); gen_vfp_negd(t1, t1);
} }
gen_helper_vfp_muladdd(t0, t1, t2, t0, fpstatus_ptr(FPST_A64)); gen_helper_vfp_muladdd(t0, t1, t2, t0, fpstatus_ptr(FPST_A64));
write_fp_dreg(s, a->rd, t0); write_fp_dreg_merging(s, a->rd, a->rd, t0);
} }
break; break;
case MO_32: case MO_32:
@ -6359,7 +6359,7 @@ static bool do_fmla_scalar_idx(DisasContext *s, arg_rrx_e *a, bool neg)
gen_vfp_negs(t1, t1); gen_vfp_negs(t1, t1);
} }
gen_helper_vfp_muladds(t0, t1, t2, t0, fpstatus_ptr(FPST_A64)); gen_helper_vfp_muladds(t0, t1, t2, t0, fpstatus_ptr(FPST_A64));
write_fp_sreg(s, a->rd, t0); write_fp_sreg_merging(s, a->rd, a->rd, t0);
} }
break; break;
case MO_16: case MO_16:
@ -6377,7 +6377,7 @@ static bool do_fmla_scalar_idx(DisasContext *s, arg_rrx_e *a, bool neg)
} }
gen_helper_advsimd_muladdh(t0, t1, t2, t0, gen_helper_advsimd_muladdh(t0, t1, t2, t0,
fpstatus_ptr(FPST_A64_F16)); fpstatus_ptr(FPST_A64_F16));
write_fp_sreg(s, a->rd, t0); write_fp_hreg_merging(s, a->rd, a->rd, t0);
} }
break; break;
default: default:
@ -6856,7 +6856,7 @@ static bool do_fmadd(DisasContext *s, arg_rrrr_e *a, bool neg_a, bool neg_n)
} }
fpst = fpstatus_ptr(FPST_A64); fpst = fpstatus_ptr(FPST_A64);
gen_helper_vfp_muladdd(ta, tn, tm, ta, fpst); gen_helper_vfp_muladdd(ta, tn, tm, ta, fpst);
write_fp_dreg(s, a->rd, ta); write_fp_dreg_merging(s, a->rd, a->ra, ta);
} }
break; break;
@ -6874,7 +6874,7 @@ static bool do_fmadd(DisasContext *s, arg_rrrr_e *a, bool neg_a, bool neg_n)
} }
fpst = fpstatus_ptr(FPST_A64); fpst = fpstatus_ptr(FPST_A64);
gen_helper_vfp_muladds(ta, tn, tm, ta, fpst); gen_helper_vfp_muladds(ta, tn, tm, ta, fpst);
write_fp_sreg(s, a->rd, ta); write_fp_sreg_merging(s, a->rd, a->ra, ta);
} }
break; break;
@ -6895,7 +6895,7 @@ static bool do_fmadd(DisasContext *s, arg_rrrr_e *a, bool neg_a, bool neg_n)
} }
fpst = fpstatus_ptr(FPST_A64_F16); fpst = fpstatus_ptr(FPST_A64_F16);
gen_helper_advsimd_muladdh(ta, tn, tm, ta, fpst); gen_helper_advsimd_muladdh(ta, tn, tm, ta, fpst);
write_fp_sreg(s, a->rd, ta); write_fp_hreg_merging(s, a->rd, a->ra, ta);
} }
break; break;