aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtl.def
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-05-31 16:27:49 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-05-31 16:27:49 +0000
commitf4fde1b378ad68fb2dec6719ed26c1b901488e03 (patch)
treea6089ff5ae9f140f131b42e288966eb32e0b353c /gcc/rtl.def
parentb1bb4869e2708c1385352e4d960833e1b258859b (diff)
downloadgcc-f4fde1b378ad68fb2dec6719ed26c1b901488e03.zip
gcc-f4fde1b378ad68fb2dec6719ed26c1b901488e03.tar.gz
gcc-f4fde1b378ad68fb2dec6719ed26c1b901488e03.tar.bz2
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
Diffstat (limited to 'gcc/rtl.def')
-rw-r--r--gcc/rtl.def6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/rtl.def b/gcc/rtl.def
index f4c9d94..63b09b3 100644
--- a/gcc/rtl.def
+++ b/gcc/rtl.def
@@ -936,6 +936,12 @@ DEF_RTL_EXPR(DEFINE_SPLIT, "define_split", "EsES", RTX_EXTRA)
7: optionally, a vector of attributes for this insn. */
DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsTsESV", RTX_EXTRA)
+/* A form of define_insn_and_split in which the split insn pattern (operand 5)
+ is determined automatically by replacing match_operands with match_dups
+ and match_operators with match_op_dups. The operands are the same as
+ define_insn_and_split but with operand 5 removed. */
+DEF_RTL_EXPR(DEFINE_INSN_AND_REWRITE, "define_insn_and_rewrite", "sEsTsSV", RTX_EXTRA)
+
/* Definition of an RTL peephole operation.
Follows the same arguments as define_split. */
DEF_RTL_EXPR(DEFINE_PEEPHOLE2, "define_peephole2", "EsES", RTX_EXTRA)