https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63259
--- Comment #6 from Oleg Endo <olegendo at gcc dot gnu.org> --- With r218705 on SH (-O2 -m4 -ml) I get the following: unsigned short test_099 (unsigned short a, unsigned short b) { return (((a & 0xFF00) >> 8) | ((a & 0xFF) << 8)); } compiles to: extu.w r4,r4 rts swap.b r4,r0 unsigned short test_08 (unsigned short a, unsigned short b) { return b + (((a & 0xFF00) >> 8) | ((a & 0xFF) << 8)); } compiles to: extu.w r4,r4 mov r4,r0 shll8 r4 shlr8 r0 or r0,r4 add r4,r5 rts extu.w r5,r0 Byte swapping of signed short types seems to be not working: short test_func_111 (short a, short b, short c) { return (((a & 0xFF00) >> 8) | ((a & 0xFF) << 8)); } exts.w r4,r4 mov r4,r0 shlr8 r0 extu.b r0,r0 shll8 r4 or r0,r4 rts exts.w r4,r0