target/hexagon: Use float32_muladd_scalbn for helper_sffma_sc

This instruction has a special case that 0 * x + c returns c
without the normal sign folding that comes with 0 + -0.
Use the new float_muladd_suppress_add_product_zero to
describe this.

Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-12-08 14:14:36 -06:00
parent 2eca1928f9
commit 904624ab8e

View File

@ -1080,15 +1080,10 @@ static float32 check_nan(float32 dst, float32 x, float_status *fp_status)
float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV, float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
float32 RsV, float32 RtV, float32 PuV) float32 RsV, float32 RtV, float32 PuV)
{ {
size4s_t tmp;
arch_fpop_start(env); arch_fpop_start(env);
RxV = check_nan(RxV, RxV, &env->fp_status); RxV = float32_muladd_scalbn(RsV, RtV, RxV, fSXTN(8, 64, PuV),
RxV = check_nan(RxV, RsV, &env->fp_status); float_muladd_suppress_add_product_zero,
RxV = check_nan(RxV, RtV, &env->fp_status); &env->fp_status);
tmp = internal_fmafx(RsV, RtV, RxV, fSXTN(8, 64, PuV), &env->fp_status);
if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
RxV = tmp;
}
arch_fpop_end(env); arch_fpop_end(env);
return RxV; return RxV;
} }