target/arm: Use correct FPST for VCMLA, VCADD on fp16
When we implemented the VCMLA and VCADD insns we put in the code to handle fp16, but left it using the standard fp status flags. Correct them to use FPST_STD_F16 for fp16 operations. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20200806104453.30393-5-peter.maydell@linaro.org
This commit is contained in:
parent
aaae563bc7
commit
b34aa5129e
|
@ -181,7 +181,7 @@ static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
|
||||||
}
|
}
|
||||||
|
|
||||||
opr_sz = (1 + a->q) * 8;
|
opr_sz = (1 + a->q) * 8;
|
||||||
fpst = fpstatus_ptr(FPST_STD);
|
fpst = fpstatus_ptr(a->size == 0 ? FPST_STD_F16 : FPST_STD);
|
||||||
fn_gvec_ptr = a->size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
|
fn_gvec_ptr = a->size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
|
||||||
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
||||||
vfp_reg_offset(1, a->vn),
|
vfp_reg_offset(1, a->vn),
|
||||||
|
@ -218,7 +218,7 @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
|
||||||
}
|
}
|
||||||
|
|
||||||
opr_sz = (1 + a->q) * 8;
|
opr_sz = (1 + a->q) * 8;
|
||||||
fpst = fpstatus_ptr(FPST_STD);
|
fpst = fpstatus_ptr(a->size == 0 ? FPST_STD_F16 : FPST_STD);
|
||||||
fn_gvec_ptr = a->size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
|
fn_gvec_ptr = a->size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
|
||||||
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
||||||
vfp_reg_offset(1, a->vn),
|
vfp_reg_offset(1, a->vn),
|
||||||
|
@ -322,7 +322,7 @@ static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
|
||||||
fn_gvec_ptr = (a->size ? gen_helper_gvec_fcmlas_idx
|
fn_gvec_ptr = (a->size ? gen_helper_gvec_fcmlas_idx
|
||||||
: gen_helper_gvec_fcmlah_idx);
|
: gen_helper_gvec_fcmlah_idx);
|
||||||
opr_sz = (1 + a->q) * 8;
|
opr_sz = (1 + a->q) * 8;
|
||||||
fpst = fpstatus_ptr(FPST_STD);
|
fpst = fpstatus_ptr(a->size == 0 ? FPST_STD_F16 : FPST_STD);
|
||||||
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
|
||||||
vfp_reg_offset(1, a->vn),
|
vfp_reg_offset(1, a->vn),
|
||||||
vfp_reg_offset(1, a->vm),
|
vfp_reg_offset(1, a->vm),
|
||||||
|
|
Loading…
Reference in a new issue