On Fri, Sep 20, 2024 at 08:01:58AM +0200, Richard Biener wrote:
> > P.S. I have a patch to replace UNSPEC_IEEE_M{AX,IN} with IF_THEN_ELSE
> > (except for the 3dNOW! PFMIN/MAX, those actually are documented to behave
> > differently), but it actually doesn't improve anything much, as
> > simplify_const_relational_operation nor simplify_ternary_operation aren't
> > able to fold comparisons with two CONST_VECTOR operands or IF_THEN_ELSE
> > with 3 CONST_VECTOR operands.
> > So, maybe better approach will be to generic fold the builtins with constant
> > arguments (maybe leaving NaNs to runtime).
> 
> It would be possible to fold them in the gimple folding hook to VEC_COND_EXPRs
> with the chance the min/max operation being lost when expanding to RTL.

Sure, but we don't actually pattern recognize 
typedef float v4sf __attribute__((vector_size (sizeof (4 * sizeof (float)))));

v4sf
foo (v4sf x, v4sf y)
{
  return x < y ? y : x;
}
back to maxpd etc.  So it wouldn't be an optimization in most cases, at
least until we do that, user was looking for such insn or better with 
_mm_max_ps...
Maybe we should.

For scalar ('-Dvector_size(x)=') this is currently matched in ce2.

Exception-wise, seems the insn raise Invalid on NaN input (either) and if y
is SNaN, actually propagate it rather than turn it into QNaN, so I think it
is actually an exact match for x < y ? y : x (or x > y ? y : x).

        Jakub

Reply via email to