On 05/29/2015 10:23 AM, Richard Sandiford wrote:
> +  /* Check whether the predicate accepts const scalar ints (which always
> +     have a stored mode of VOIDmode, but logically have a real mode)
> +     and whether it matches anything besides const scalar ints.  */
> +  bool matches_const_scalar_int_p = false;
> +  bool matches_other_p = false;
> +  for (int i = 0; i < NUM_RTX_CODE; ++i)
> +    if (p->codes[i])
> +      switch (i)
> +     {
> +     CASE_CONST_SCALAR_INT:
> +       matches_const_scalar_int_p = true;
> +       break;
> +
> +     default:
> +       matches_other_p = true;
> +       break;
> +     }
> +
> +  /* There's no need for a mode check if the predicate only accepts
> +     constant integers.  The code checks in the predicate are enough
> +     to establish that the mode is VOIDmode.
> +
> +     Note that the predicate itself should check whether a scalar
> +     integer is in range of the given mode.  */
> +  if (!matches_other_p && !p->codes[CONST_DOUBLE])
> +    return;

I think perhaps it would be cleaner to not use CASE_CONST_SCALAR_INT,
and then do

  switch (i)
    {
    case CONST_INT:
    case CONST_WIDE_INT:
      matches_const_scalar_int_p = true;
      break;

    case CONST_DOUBLE:
      if (!TARGET_SUPPORTS_WIDE_INT)
        matches_const_scalar_int_p = true;
      matches_other_p = true;
      break;

    default:
      matches_other_p = true;
      break;
    }

  if (!matches_other_p)
    return;

Otherwise ok.


r~

Reply via email to