|
| From: | Richard Henderson |
| Subject: | Re: [PATCH v4 42/47] target/ppc: Refactor VSX_MAX_MINC helper |
| Date: | Tue, 22 Feb 2022 14:40:47 -1000 |
| User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 |
On 2/22/22 04:36, matheus.ferst@eldorado.org.br wrote:
-#define VSX_MAX_MINC(name, max) \
+#define VSX_MAX_MINC(name, op, tp, fld) \
void helper_##name(CPUPPCState *env,
\
ppc_vsr_t *xt, ppc_vsr_t *xa, ppc_vsr_t *xb)
\
{
\
ppc_vsr_t t = { };
\
bool vxsnan_flag = false, vex_flag = false;
\
\
- if (unlikely(float64_is_any_nan(xa->VsrD(0)) || \
- float64_is_any_nan(xb->VsrD(0)))) { \
- if (float64_is_signaling_nan(xa->VsrD(0), &env->fp_status) || \
- float64_is_signaling_nan(xb->VsrD(0), &env->fp_status)) { \
+ if (unlikely(tp##_is_any_nan(xa->fld) || \
+ tp##_is_any_nan(xb->fld))) { \
+ if (tp##_is_signaling_nan(xa->fld, &env->fp_status) || \
+ tp##_is_signaling_nan(xb->fld, &env->fp_status)) { \
vxsnan_flag = true;
\
}
\
- t.VsrD(0) = xb->VsrD(0); \
- } else if ((max && \
- !float64_lt(xa->VsrD(0), xb->VsrD(0), &env->fp_status)) || \
- (!max && \
- float64_lt(xa->VsrD(0), xb->VsrD(0), &env->fp_status))) { \
- t.VsrD(0) = xa->VsrD(0); \
+ t.fld = xb->fld; \
} else {
\
- t.VsrD(0) = xb->VsrD(0); \
+ t.fld = tp##_##op(xa->fld, xb->fld, &env->fp_status); \
}
\
\
vex_flag = fpscr_ve & vxsnan_flag;
\
I think this would be simpler to utilize the result of the compare vs nans:
bool first;
if (max) {
first = tp##_le_quiet(xb->fld, xa->fld, status);
} else {
first = tp##_lt_quiet(xa->fld, xb->fld, status);
}
if (first) {
t.fld = xa->fld;
} else {
t.fld = xb->fld;
if (flags & float_flag_invalid_snan) {
float_invalid_op_vxsnan(env, retaddr);
}
}
xt = *t;
r~
| [Prev in Thread] | Current Thread | [Next in Thread] |