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.