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

            Bug ID: 118687
           Summary: RISC-V extensions for inline asm code (vs. llvm)
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vineetg at gcc dot gnu.org
                CC: charlie at rivosinc dot com, jeffreyalaw at gmail dot com
  Target Milestone: ---

I think I know the resolution but opening this bug for discussion anyways.

Charlie reported some kernel code has an inline asm whcih uses a LI + large
const, which can possibly be synthesized optimally with bitmanip extension.

long ret_from_fork()
{
    long ret;

        asm ("li        %[ret],%[c1]\n"
                : [ret] "=r" (ret)
                : [c1] "i" (0x0123456789abcdefull));
        return ret;
}

However gcc is ignoring the bitmanip flag and generating the "invalid asm"

ret_from_fork:
        li      a0,81985529216486895
        ret

Ultimately the assembler synthesizes it using basic codegen (it is not expected
to re-implement the compiler anyways).

 lui    a0,0x92
 addiw  a0,a0,-1493
 slli   a0,a0,0xc
 addi   a0,a0,965
 slli   a0,a0,0xd
 addi   a0,a0,-1347
 slli   a0,a0,0xc
 addi   a0,a0,-529
 ret

The question is - is this as designed or a bug. My guy says inline asm is meant
to keep the compiler out of the way so gcc is doing the right thing.

But then RISC-V llvm seems to be generating the optimal bitmanip enabled
sequence for the same test.

https://godbolt.org/z/W3G4e6qnv

Reply via email to