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

            Bug ID: 108049
           Summary: s390: Compiler adds extra zero extend after xoring 2
                    zero extended values
           Product: gcc
           Version: 12.2.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: ---

Same issue for PPC: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107949

extern unsigned char magic1[256];

unsigned int hash(const unsigned char inp[4])
{
   const unsigned long long INIT = 0x1ULL;
   unsigned long long h1 = INIT;
   h1 = magic1[((unsigned long long)inp[0]) ^ h1];
   h1 = magic1[((unsigned long long)inp[1]) ^ h1];
   h1 = magic1[((unsigned long long)inp[2]) ^ h1];
   h1 = magic1[((unsigned long long)inp[3]) ^ h1];
   return h1;
}

hash(unsigned char const*):
        llgc    %r4,1(%r2) <= zero extends to 64-bit
        lgrl    %r1,.LC0
        llgc    %r3,0(%r2) <= zero extends to 64-bit
        xilf    %r3,1 
        llgc    %r3,0(%r3,%r1)
        xr      %r3,%r4 <= should be 64-bit xor
        llgc    %r4,2(%r2) <= zero extends to 64-bit
        llgcr   %r3,%r3 <= unnecessary
        llgc    %r2,3(%r2)
        llgc    %r3,0(%r3,%r1)
        xr      %r3,%r4 <= should be 64-bit xor
        llgcr   %r3,%r3 <= unnecessary
        llgc    %r3,0(%r3,%r1) <= zero extends to 64-bit
        xrk     %r2,%r3,%r2 <= should be 64-bit xor
        llgcr   %r2,%r2 <= unnecessary
        llgc    %r2,0(%r2,%r1)
        br      %r14

Smaller sample:
unsigned long long tiny2(const unsigned char *inp)
{
  unsigned long long a = inp[0];
  unsigned long long b = inp[1];
  return a ^ b;
}

tiny2(unsigned char const*):
        llgc    %r1,0(%r2)
        llgc    %r2,1(%r2)
        xrk     %r2,%r1,%r2
        llgcr   %r2,%r2
        br      %r14
  • [Bug target/108049] New: s390:... jens.seifert at de dot ibm.com via Gcc-bugs

Reply via email to