Please excuse a comment from the gallery:

On Mon, 28 Sep 2020, will schmidt via Gcc-patches wrote:
> On Fri, 2020-09-04 at 12:52 -0300, Raoni Fassina Firmino via Gcc-patches 
> wrote:

> > 2020-08-13  Raoni Fassina Firmino  <ra...@linux.ibm.com>
> >
> > gcc/ChangeLog:

> >     * config/rs6000/rs6000.md (fegetroundsi): New pattern.
> >     (feclearexceptsi): New Pattern.
> >     (feraiseexceptsi): New Pattern.

> > +(define_expand "feraiseexceptsi"
> > +  [(use (match_operand:SI 1 "const_int_operand" "n"))
> > +   (set (match_operand:SI 0 "gpc_reg_operand")
> > +   (const_int 0))]
> > +  "TARGET_HARD_FLOAT"
> > +{
> > +  switch (INTVAL (operands[1]))
> > +    {
> > +    case 0x2000000:  /* FE_INEXACT */
> > +    case 0x4000000:  /* FE_DIVBYZERO */
> > +    case 0x8000000:  /* FE_UNDERFLOW */
> > +    case 0x10000000: /* FE_OVERFLOW */
> > +      break;
> > +    default:
> > +      FAIL;
> > +    }
> > +
> > +  rtx tmp = gen_rtx_CONST_INT (SImode, __builtin_clz (INTVAL 
> > (operands[1])));

This doesn't appear to be very portable, to any-cxx11-compiler
that doesn't pretend to be gcc-intrinsics-compatible.

If the valid values had been more complicated, there'd be
bitmap.c:bitmap_last_set_bit to follow for a suitable portable
pattern.  It conditionalizes like:
#if GCC_VERSION >= 3004
  gcc_assert (sizeof (long) == sizeof (word));
  bit_no += BITMAP_WORD_BITS - __builtin_clzl (word) - 1;
#else
...
#endif

Better, there's "ffs".

brgds, H-P
PS. No less than four targets fail like that.  Meh.

Reply via email to