On Wed, Nov 20, 2019 at 04:35:24PM +0000, Richard Sandiford wrote:
> Actually, this doesn't work because *_operators want rtxes rather
> than codes.  I can get around that by passing op0 and op1 for
> the existing rtxes.  For the conversion at the end, I can do:
> 
>   machine_mode compared_mode = GET_MODE (XEXP (op0, 0));
> 
>   if (code == ORDERED && INTEGRAL_MODE_P (compared_mode))
>     return const_true_rtx;

This should be all !HONOR_NANS?  Also LTGT should be turned into NE,
under that same condition.  So something like

  if (!HONOR_NANS (mode))
    {
      /* UNORDERED cannot happen without NaNs.  */
      mask &= ~1;

      /* LTGT is written as NE, and ORDERED just is always true,
         without NaNs.  */
      if (mask == 12 || mask == 14)
        mask |= 1;
    }

before returning true for 15.

>   if (is_unsigned)
>     code = unsigned_condition (code);
> 
> Or I can add signed_comparison_p and unsigned_comparison_p functions
> that take codes instead of rtxes.

That may be easier, dunno.

Thanks,


Segher

Reply via email to