diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-05-31 16:27:49 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-05-31 16:27:49 +0000 |
commit | f4fde1b378ad68fb2dec6719ed26c1b901488e03 (patch) | |
tree | a6089ff5ae9f140f131b42e288966eb32e0b353c /gcc/rtl.def | |
parent | b1bb4869e2708c1385352e4d960833e1b258859b (diff) | |
download | gcc-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.def | 6 |
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) |