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

            Bug ID: 114376
           Summary: s390: Inefficient __builtin_bswap16
           Product: gcc
           Version: 13.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: ---

unsigned short swap16(unsigned short in)
{
   return __builtin_bswap16(in);
}

generates -O3 -march=z196

swap16(unsigned short):
        lrvr    %r2,%r2
        srl     %r2,16
        llghr   %r2,%r2
        br      %r14

More efficient for 64-bit is:

unsigned short swap16_2(unsigned short in)
{
   return __builtin_bswap64(in) >> 48;
}

Which generates:

swap16_2(unsigned short):
        lrvgr   %r2,%r2
        srlg    %r2,%r2,48
        br      %r14

For 31-bit lrvr should be used.

Reply via email to