This does the same thing for bswap<mode>2 that I previously did for bswapdi2. The predicates for bswap<mode>2_{load,store} are now indexed_or_indirect_operand, and bswap<mode>2 uses rs6000_force_indexed_or_indirect_mem to make sure the address is appropriate for that predicate.
Bootstrap/regtest passes on ppc64le power8/power9, ok for trunk? Thanks! Aaron 2018-11-05 Aaron Sawdey <acsaw...@linux.ibm.com> * config/rs6000/rs6000.md (bswap<mode>2): Force address into register if not in indexed or indirect form. (bswap<mode>2_load): Change predicate to indexed_or_indirect_operand. (bswap<mode>2_store): Ditto. Index: gcc/config/rs6000/rs6000.md =================================================================== --- gcc/config/rs6000/rs6000.md (revision 265753) +++ gcc/config/rs6000/rs6000.md (working copy) @@ -2411,9 +2411,15 @@ src = force_reg (<MODE>mode, src); if (MEM_P (src)) - emit_insn (gen_bswap<mode>2_load (dest, src)); + { + src = rs6000_force_indexed_or_indirect_mem (src); + emit_insn (gen_bswap<mode>2_load (dest, src)); + } else if (MEM_P (dest)) - emit_insn (gen_bswap<mode>2_store (dest, src)); + { + dest = rs6000_force_indexed_or_indirect_mem (dest); + emit_insn (gen_bswap<mode>2_store (dest, src)); + } else emit_insn (gen_bswap<mode>2_reg (dest, src)); DONE; @@ -2421,13 +2427,13 @@ (define_insn "bswap<mode>2_load" [(set (match_operand:HSI 0 "gpc_reg_operand" "=r") - (bswap:HSI (match_operand:HSI 1 "memory_operand" "Z")))] + (bswap:HSI (match_operand:HSI 1 "indexed_or_indirect_operand" "Z")))] "" "l<wd>brx %0,%y1" [(set_attr "type" "load")]) (define_insn "bswap<mode>2_store" - [(set (match_operand:HSI 0 "memory_operand" "=Z") + [(set (match_operand:HSI 0 "indexed_or_indirect_operand" "=Z") (bswap:HSI (match_operand:HSI 1 "gpc_reg_operand" "r")))] "" "st<wd>brx %1,%y0" -- Aaron Sawdey, Ph.D. acsaw...@linux.vnet.ibm.com 050-2/C113 (507) 253-7520 home: 507/263-0782 IBM Linux Technology Center - PPC Toolchain