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

            Bug ID: 93893
           Summary: MIPS32r2: GCC is unable to figure out that it can use
                    a single INS instruction instead of SLL+OR
           Product: gcc
           Version: 9.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: siarhei.siamashka at gmail dot com
  Target Milestone: ---

Created attachment 47891
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47891&action=edit
Testcase for a single INS instruction vs. SLL+OR

$ mipsel-unknown-linux-gnu-gcc -c -Os -march=mips32r2 testcase.c 
$ mipsel-unknown-linux-gnu-objdump -d testcase.o

testcase.o:     file format elf32-tradlittlemips


Disassembly of section .text:

00000000 <transpose_c>:
   0:   8c820000        lw      v0,0(a0)
   4:   94a30000        lhu     v1,0(a1)
   8:   00021400        sll     v0,v0,0x10
   c:   00431025        or      v0,v0,v1
  10:   03e00008        jr      ra
  14:   acc20000        sw      v0,0(a2)

00000018 <transpose_inline_asm>:
  18:   8ca20000        lw      v0,0(a1)
  1c:   8c830000        lw      v1,0(a0)
  20:   7c62fc04        ins     v0,v1,0x10,0x10
  24:   03e00008        jr      ra
  28:   acc20000        sw      v0,0(a2)
  2c:   00000000        nop


The C implementation uses an extra instruction compared to the inline assembly
variant of the same function.

Reply via email to