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 <[email protected]>
* 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. [email protected]
050-2/C113 (507) 253-7520 home: 507/263-0782
IBM Linux Technology Center - PPC Toolchain