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

            Bug ID: 93176
           Summary: PPC: inefficient 64-bit constant consecutive ones
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jens.seifert at de dot ibm.com
  Target Milestone: ---

All 64-bit constants containing a sequence of ones can be constructed with 2
instructions (li/lis + rldicl). gcc creates up to 5 instructions.

Input:
unsigned long long onesLI()
{
   return 0x00FFFFFFFFFFFF00ULL; // expected: li 3,0xFF00 ; rldicl 3,3,0,8
}

unsigned long long onesLIS()
{
   return 0x00FFFFFFFF000000ULL; // expected: lis 3,0xFF00 ; rldicl 3,3,0,8
}

unsigned long long onesHI()
{
   return 0x00FFFF0000000000ULL; // expected: lis 3,0xFFFF ; rldicl 3,3,8,8
}

Command line:
gcc -O2 -maix64 -save-temps const.C

Output:
._Z6onesLIv:
LFB..2:
        lis 3,0xff
        ori 3,3,0xffff
        sldi 3,3,32
        oris 3,3,0xffff
        ori 3,3,0xff00
        blr


._Z7onesLISv:
LFB..3:
        lis 3,0xff
        ori 3,3,0xffff
        sldi 3,3,32
        oris 3,3,0xff00
        blr

._Z6onesHIv:
LFB..4:
        lis 3,0xff
        ori 3,3,0xff00
        sldi 3,3,32
        blr

Reply via email to