[backport from gcc-4.8/trunk r186361 ] From: Andreas Schwab Subject: m68k: add bswapsi2 expander Date: Thu, 12 Apr 2012 00:03:05 +0200 List-Archive: The default expansion of bswapsi2 (and bswapdi2) is pretty suboptimal. Tested on m68k-linux. Andreas. gcc/ 2012-04-11 Andreas Schwab * config/m68k/m68k.md (rotrhi3+1): Name it rotrhi_lowpart. (bswapsi2): New expander. --- gcc-4.7.0/gcc/config/m68k/m68k.md.~1~ 2011-11-27 00:59:56.000000000 +0100 +++ gcc-4.7.0/gcc/config/m68k/m68k.md 2012-06-09 21:17:22.000000000 +0200 @@ -5475,7 +5475,7 @@ (define_insn "rotrhi3" "!TARGET_COLDFIRE" "ror%.w %2,%0") -(define_insn "" +(define_insn "rotrhi_lowpart" [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) (rotatert:HI (match_dup 0) (match_operand:HI 1 "general_operand" "dI")))] @@ -5495,6 +5495,19 @@ (define_insn "" (match_operand:QI 1 "general_operand" "dI")))] "!TARGET_COLDFIRE" "ror%.b %1,%0") + +(define_expand "bswapsi2" + [(set (match_operand:SI 0 "register_operand") + (bswap:SI (match_operand:SI 1 "register_operand")))] + "!TARGET_COLDFIRE" +{ + rtx x = operands[0]; + emit_move_insn (x, operands[1]); + emit_insn (gen_rotrhi_lowpart (gen_lowpart (HImode, x), GEN_INT (8))); + emit_insn (gen_rotlsi3 (x, x, GEN_INT (16))); + emit_insn (gen_rotrhi_lowpart (gen_lowpart (HImode, x), GEN_INT (8))); + DONE; +}) ;; Bit set/clear in memory byte.