https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120333

            Bug ID: 120333
           Summary: RISC-V: Wrong code with bitmanip extension
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kristerw at gcc dot gnu.org
  Target Milestone: ---

Compiling with -O3 -march=rv64gcb causes the function foo below to be
miscompiled:

__attribute__ ((noipa)) _Bool
foo (unsigned char ch, unsigned long mask) {
  return (mask << (0x3f - (ch & 0x3f))) >> 0x3f;
}

int main()
{
  if (!foo (0x3f, 0x8000000000000000ul))
    __builtin_abort ();
  return 0;
}

The generated assembly fails to take the last shift into account:

foo:
        li      a5,63
        andn    a0,a5,a0
        bext    a0,a1,a0
        ret

Reply via email to