Skip to content

Commit

Permalink
rs6000: using pli for constant splitting
Browse files Browse the repository at this point in the history
For constant building e.g. r120=0x66666666, which does not fit 'li or lis',
'pli' is used to build this constant via 'emit_move_insn'.

While for a complicated constant, e.g. 0x6666666666666666ULL, when using
'rs6000_emit_set_long_const' to split the constant recursively, it fails to
use 'pli' to build the half part constant: 0x66666666.

'rs6000_emit_set_long_const' could be updated to use 'pli' to build half
part of the constant when necessary.  For example: 0x6666666666666666ULL,
"pli 3,1717986918; rldimi 3,3,32,0" can be used.

gcc/ChangeLog:

	* config/rs6000/rs6000.cc (rs6000_emit_set_long_const): Add code to use
	pli for 34bit constant.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/const-build-1.c: New test.
  • Loading branch information
Jiufu Guo committed Dec 13, 2023
1 parent 97b3b38 commit a9046f1
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
7 changes: 7 additions & 0 deletions gcc/config/rs6000/rs6000.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10521,6 +10521,13 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c, int *num_insns)
emit_insn (dest_or_insn);
};

if (TARGET_PREFIXED && SIGNED_INTEGER_34BIT_P (c))
{
/* li/lis/pli */
count_or_emit_insn (dest, GEN_INT (c));
return;
}

if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
|| (ud4 == 0 && ud3 == 0 && ud2 == 0 && !(ud1 & 0x8000)))
{
Expand Down
9 changes: 9 additions & 0 deletions gcc/testsuite/gcc.target/powerpc/const-build-1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/* { dg-do compile { target lp64 } } */
/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
/* { dg-require-effective-target power10_ok } */

unsigned long long msk66() { return 0x6666666666666666ULL; }

/* { dg-final { scan-assembler-times {\mpli\M} 1 } } */
/* { dg-final { scan-assembler-not {\mli\M} } } */
/* { dg-final { scan-assembler-not {\mlis\M} } } */

0 comments on commit a9046f1

Please sign in to comment.