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

            Bug ID: 104853
           Summary: [RISC-V] -march=rv64g not including extension Zifencei
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: i at rvalue dot moe
  Target Milestone: ---

I'm trying to compile some code including inline assembly instruction
`fence.i`. According to RISC-V ISA spec, G is defined as abbreviation for
IMAFDZicsrZifencei, which includes instruction `fence.i`. But I get assembler
message indicating that `fence.i` is unrecognized.

I report this to GCC instead of binutils because when I use `gcc -S` and then
use `as` manually, it works fine.

Also, it works fine before I upgrade to GCC 11.2.0

Minimum recurrence:

$ gcc --version
gcc (GCC) 11.2.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cat > test.c
int main(){
    asm volatile("fence.i" ::: "memory");
}
$ gcc -c test.c -march=rv64g
test.c: Assembler messages:
test.c:2: Error: unrecognized opcode `fence.i'

Manually use `as`:

$ gcc -S test.c -march=rv64g -o test.s
$ as -march=rv64g test.s -o test.o
$ objdump -d test.o

test.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <main>:
   0:   ff010113                addi    sp,sp,-16
   4:   00813423                sd      s0,8(sp)
   8:   01010413                addi    s0,sp,16
   c:   0000100f                fence.i
  10:   00000793                li      a5,0
  14:   00078513                mv      a0,a5
  18:   00813403                ld      s0,8(sp)
  1c:   01010113                addi    sp,sp,16
  20:   00008067                ret

Reply via email to