New .md construct: define_insn_and_rewrite
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 31 May 2019 16:27:49 +0000 (16:27 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 31 May 2019 16:27:49 +0000 (16:27 +0000)
commitf4fde1b378ad68fb2dec6719ed26c1b901488e03
treea6089ff5ae9f140f131b42e288966eb32e0b353c
parentb1bb4869e2708c1385352e4d960833e1b258859b
New .md construct: define_insn_and_rewrite

Several SVE patterns need define_insn_and_splits that generate the
same insn_code, but with different operands.  That's probably a
niche requirement, but it's cropping up often enough on the ACLE
branch that I think it would be good to have a syntactic sugar for it.

This patch therefore adds a new construct called define_insn_and_rewrite.
It's basically a define_insn_and_split with an implicit split pattern,
obtained by copying the insn pattern and replacing match_operands with
match_dups and match_operators with match_op_dups.

2019-05-31  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* doc/md.texi: Document define_insn_and_rewrite.
* rtl.def (DEFINE_INSN_AND_REWRITE): New rtx code.
* gensupport.c (queue_elem): Update comment.
(replace_operands_with_dups): New function.
(gen_rewrite_sequence): Likewise.
(process_rtx): Handle DEFINE_INSN_AND_REWRITE.
* read-rtl.c (apply_subst_iterator): Likewise.
(add_condition_to_rtx, named_rtx_p): Likewise.
(rtx_reader::read_rtx_operand): Likewise.
* config/aarch64/aarch64-sve.md
(while_ult<GPI:mode><PRED_ALL:mode>_cc): Rename to...
(*while_ult<GPI:mode><PRED_ALL:mode>_cc): ...this and use
define_insn_and_rewrite.
(*cond_<optab><mode>_any): Turn into define_insn_and_rewrites.
Remove separate define_split.

From-SVN: r271815
gcc/ChangeLog
gcc/config/aarch64/aarch64-sve.md
gcc/doc/md.texi
gcc/gensupport.c
gcc/read-rtl.c
gcc/rtl.def