https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106550
Bug ID: 106550
Summary: [rs6000] sub-optimal constant generation
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: guojiufu at gcc dot gnu.org
Target Milestone: ---
There is 'pli' which supports a 34bits immediate, so to generate a 64bits
constant we just need 3 instructions at most.
void
foo (unsigned long long *a)
{
*a = 0x020805006106003;
}
On the trunk, below asm is generated:
.file "test.c"
.machine power10
.abiversion 2
.section ".text"
.align 2
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
.localentry foo,1
lis 9,0x20
ori 9,9,0x8050
sldi 9,9,32
oris 9,9,0x610
ori 9,9,0x6003
std 9,0(3)
blr
.long 0
.byte 0,0,0,0,0,0,0,0
.cfi_endproc
.LFE0:
.size foo,.-foo
.ident "GCC: (GNU) 13.0.0 20220729 (experimental)"
.section .note.GNU-stack,"",@progbits
The compiling command: gcc -O2 -std=c99 test.c -S -mcpu=power10