https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87870
Bug ID: 87870 Summary: ppc64le generates poor code when loading constants into TImode vars Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: bergner at gcc dot gnu.org Target Milestone: --- bergner@pike:~/gcc/BUGS/PR87507$ cat bug.i __int128 foo (void) { return 1; } bergner@pike:~/gcc/BUGS/PR87507$ /home/bergner/gcc/build/gcc-fsf-mainline-pr87507-base-debug/gcc/xgcc -B/home/bergner/gcc/build/gcc-fsf-mainline-pr87507-base-debug/gcc -O2 -S bug.i bergner@pike:~/gcc/BUGS/PR87507$ cat bug.s foo: .LCF0: 0: addis 2,12,.TOC.-.LCF0@ha addi 2,2,.TOC.-.LCF0@l addis 9,2,.LC0@toc@ha addi 9,9,.LC0@toc@l ld 3,0(9) ld 4,8(9) blr If you compile with -mno-altivec, then we get the two li insn code you'd expect. The problem is that vsx_mov<mode>_64 doesn't have support for loading constants into gprs, whereas movti_ppc64 (which is used when not targeting a cpu with a vector unit) does.