summaryrefslogtreecommitdiff
path: root/share/doc/gccint/RTL-Template.html
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/gccint/RTL-Template.html')
-rw-r--r--share/doc/gccint/RTL-Template.html342
1 files changed, 342 insertions, 0 deletions
diff --git a/share/doc/gccint/RTL-Template.html b/share/doc/gccint/RTL-Template.html
new file mode 100644
index 0000000..70279a9
--- /dev/null
+++ b/share/doc/gccint/RTL-Template.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Copyright (C) 1988-2023 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Funding Free Software", the Front-Cover
+Texts being (a) (see below), and with the Back-Cover Texts being (b)
+(see below). A copy of the license is included in the section entitled
+"GNU Free Documentation License".
+
+(a) The FSF's Front-Cover Text is:
+
+A GNU Manual
+
+(b) The FSF's Back-Cover Text is:
+
+You have freedom to copy and modify this GNU Manual, like GNU
+ software. Copies published by the Free Software Foundation raise
+ funds for GNU development. -->
+<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
+<head>
+<title>GNU Compiler Collection (GCC) Internals: RTL Template</title>
+
+<meta name="description" content="GNU Compiler Collection (GCC) Internals: RTL Template">
+<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: RTL Template">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link href="index.html#Top" rel="start" title="Top">
+<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
+<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="Machine-Desc.html#Machine-Desc" rel="up" title="Machine Desc">
+<link href="Output-Template.html#Output-Template" rel="next" title="Output Template">
+<link href="Example.html#Example" rel="previous" title="Example">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.indentedblock {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+div.smalldisplay {margin-left: 3.2em}
+div.smallexample {margin-left: 3.2em}
+div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
+div.smalllisp {margin-left: 3.2em}
+kbd {font-style:oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: inherit; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: inherit; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.nocodebreak {white-space:nowrap}
+span.nolinebreak {white-space:nowrap}
+span.roman {font-family:serif; font-weight:normal}
+span.sansserif {font-family:sans-serif; font-weight:normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+<a name="RTL-Template"></a>
+<div class="header">
+<p>
+Next: <a href="Output-Template.html#Output-Template" accesskey="n" rel="next">Output Template</a>, Previous: <a href="Example.html#Example" accesskey="p" rel="previous">Example</a>, Up: <a href="Machine-Desc.html#Machine-Desc" accesskey="u" rel="up">Machine Desc</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<hr>
+<a name="RTL-Template-1"></a>
+<h3 class="section">17.4 RTL Template</h3>
+<a name="index-RTL-insn-template"></a>
+<a name="index-generating-insns"></a>
+<a name="index-insns_002c-generating"></a>
+<a name="index-recognizing-insns"></a>
+<a name="index-insns_002c-recognizing"></a>
+
+<p>The RTL template is used to define which insns match the particular pattern
+and how to find their operands. For named patterns, the RTL template also
+says how to construct an insn from specified operands.
+</p>
+<p>Construction involves substituting specified operands into a copy of the
+template. Matching involves determining the values that serve as the
+operands in the insn being matched. Both of these activities are
+controlled by special expression types that direct matching and
+substitution of the operands.
+</p>
+<dl compact="compact">
+<dd><a name="index-match_005foperand"></a>
+</dd>
+<dt><code>(match_operand:<var>m</var> <var>n</var> <var>predicate</var> <var>constraint</var>)</code></dt>
+<dd><p>This expression is a placeholder for operand number <var>n</var> of
+the insn. When constructing an insn, operand number <var>n</var>
+will be substituted at this point. When matching an insn, whatever
+appears at this position in the insn will be taken as operand
+number <var>n</var>; but it must satisfy <var>predicate</var> or this instruction
+pattern will not match at all.
+</p>
+<p>Operand numbers must be chosen consecutively counting from zero in
+each instruction pattern. There may be only one <code>match_operand</code>
+expression in the pattern for each operand number. Usually operands
+are numbered in the order of appearance in <code>match_operand</code>
+expressions. In the case of a <code>define_expand</code>, any operand numbers
+used only in <code>match_dup</code> expressions have higher values than all
+other operand numbers.
+</p>
+<p><var>predicate</var> is a string that is the name of a function that
+accepts two arguments, an expression and a machine mode.
+See <a href="Predicates.html#Predicates">Predicates</a>. During matching, the function will be called with
+the putative operand as the expression and <var>m</var> as the mode
+argument (if <var>m</var> is not specified, <code>VOIDmode</code> will be used,
+which normally causes <var>predicate</var> to accept any mode). If it
+returns zero, this instruction pattern fails to match.
+<var>predicate</var> may be an empty string; then it means no test is to be
+done on the operand, so anything which occurs in this position is
+valid.
+</p>
+<p>Most of the time, <var>predicate</var> will reject modes other than <var>m</var>&mdash;but
+not always. For example, the predicate <code>address_operand</code> uses
+<var>m</var> as the mode of memory ref that the address should be valid for.
+Many predicates accept <code>const_int</code> nodes even though their mode is
+<code>VOIDmode</code>.
+</p>
+<p><var>constraint</var> controls reloading and the choice of the best register
+class to use for a value, as explained later (see <a href="Constraints.html#Constraints">Constraints</a>).
+If the constraint would be an empty string, it can be omitted.
+</p>
+<p>People are often unclear on the difference between the constraint and the
+predicate. The predicate helps decide whether a given insn matches the
+pattern. The constraint plays no role in this decision; instead, it
+controls various decisions in the case of an insn which does match.
+</p>
+<a name="index-match_005fscratch"></a>
+</dd>
+<dt><code>(match_scratch:<var>m</var> <var>n</var> <var>constraint</var>)</code></dt>
+<dd><p>This expression is also a placeholder for operand number <var>n</var>
+and indicates that operand must be a <code>scratch</code> or <code>reg</code>
+expression.
+</p>
+<p>When matching patterns, this is equivalent to
+</p>
+<div class="smallexample">
+<pre class="smallexample">(match_operand:<var>m</var> <var>n</var> &quot;scratch_operand&quot; <var>constraint</var>)
+</pre></div>
+
+<p>but, when generating RTL, it produces a (<code>scratch</code>:<var>m</var>)
+expression.
+</p>
+<p>If the last few expressions in a <code>parallel</code> are <code>clobber</code>
+expressions whose operands are either a hard register or
+<code>match_scratch</code>, the combiner can add or delete them when
+necessary. See <a href="Side-Effects.html#Side-Effects">Side Effects</a>.
+</p>
+<a name="index-match_005fdup"></a>
+</dd>
+<dt><code>(match_dup <var>n</var>)</code></dt>
+<dd><p>This expression is also a placeholder for operand number <var>n</var>.
+It is used when the operand needs to appear more than once in the
+insn.
+</p>
+<p>In construction, <code>match_dup</code> acts just like <code>match_operand</code>:
+the operand is substituted into the insn being constructed. But in
+matching, <code>match_dup</code> behaves differently. It assumes that operand
+number <var>n</var> has already been determined by a <code>match_operand</code>
+appearing earlier in the recognition template, and it matches only an
+identical-looking expression.
+</p>
+<p>Note that <code>match_dup</code> should not be used to tell the compiler that
+a particular register is being used for two operands (example:
+<code>add</code> that adds one register to another; the second register is
+both an input operand and the output operand). Use a matching
+constraint (see <a href="Simple-Constraints.html#Simple-Constraints">Simple Constraints</a>) for those. <code>match_dup</code> is for the cases where one
+operand is used in two places in the template, such as an instruction
+that computes both a quotient and a remainder, where the opcode takes
+two input operands but the RTL template has to refer to each of those
+twice; once for the quotient pattern and once for the remainder pattern.
+</p>
+<a name="index-match_005foperator"></a>
+</dd>
+<dt><code>(match_operator:<var>m</var> <var>n</var> <var>predicate</var> [<var>operands</var>&hellip;])</code></dt>
+<dd><p>This pattern is a kind of placeholder for a variable RTL expression
+code.
+</p>
+<p>When constructing an insn, it stands for an RTL expression whose
+expression code is taken from that of operand <var>n</var>, and whose
+operands are constructed from the patterns <var>operands</var>.
+</p>
+<p>When matching an expression, it matches an expression if the function
+<var>predicate</var> returns nonzero on that expression <em>and</em> the
+patterns <var>operands</var> match the operands of the expression.
+</p>
+<p>Suppose that the function <code>commutative_operator</code> is defined as
+follows, to match any expression whose operator is one of the
+commutative arithmetic operators of RTL and whose mode is <var>mode</var>:
+</p>
+<div class="smallexample">
+<pre class="smallexample">int
+commutative_operator (x, mode)
+ rtx x;
+ machine_mode mode;
+{
+ enum rtx_code code = GET_CODE (x);
+ if (GET_MODE (x) != mode)
+ return 0;
+ return (GET_RTX_CLASS (code) == RTX_COMM_ARITH
+ || code == EQ || code == NE);
+}
+</pre></div>
+
+<p>Then the following pattern will match any RTL expression consisting
+of a commutative operator applied to two general operands:
+</p>
+<div class="smallexample">
+<pre class="smallexample">(match_operator:SI 3 &quot;commutative_operator&quot;
+ [(match_operand:SI 1 &quot;general_operand&quot; &quot;g&quot;)
+ (match_operand:SI 2 &quot;general_operand&quot; &quot;g&quot;)])
+</pre></div>
+
+<p>Here the vector <code>[<var>operands</var>&hellip;]</code> contains two patterns
+because the expressions to be matched all contain two operands.
+</p>
+<p>When this pattern does match, the two operands of the commutative
+operator are recorded as operands 1 and 2 of the insn. (This is done
+by the two instances of <code>match_operand</code>.) Operand 3 of the insn
+will be the entire commutative expression: use <code>GET_CODE
+(operands[3])</code> to see which commutative operator was used.
+</p>
+<p>The machine mode <var>m</var> of <code>match_operator</code> works like that of
+<code>match_operand</code>: it is passed as the second argument to the
+predicate function, and that function is solely responsible for
+deciding whether the expression to be matched &ldquo;has&rdquo; that mode.
+</p>
+<p>When constructing an insn, argument 3 of the gen-function will specify
+the operation (i.e. the expression code) for the expression to be
+made. It should be an RTL expression, whose expression code is copied
+into a new expression whose operands are arguments 1 and 2 of the
+gen-function. The subexpressions of argument 3 are not used;
+only its expression code matters.
+</p>
+<p>When <code>match_operator</code> is used in a pattern for matching an insn,
+it usually best if the operand number of the <code>match_operator</code>
+is higher than that of the actual operands of the insn. This improves
+register allocation because the register allocator often looks at
+operands 1 and 2 of insns to see if it can do register tying.
+</p>
+<p>There is no way to specify constraints in <code>match_operator</code>. The
+operand of the insn which corresponds to the <code>match_operator</code>
+never has any constraints because it is never reloaded as a whole.
+However, if parts of its <var>operands</var> are matched by
+<code>match_operand</code> patterns, those parts may have constraints of
+their own.
+</p>
+<a name="index-match_005fop_005fdup"></a>
+</dd>
+<dt><code>(match_op_dup:<var>m</var> <var>n</var>[<var>operands</var>&hellip;])</code></dt>
+<dd><p>Like <code>match_dup</code>, except that it applies to operators instead of
+operands. When constructing an insn, operand number <var>n</var> will be
+substituted at this point. But in matching, <code>match_op_dup</code> behaves
+differently. It assumes that operand number <var>n</var> has already been
+determined by a <code>match_operator</code> appearing earlier in the
+recognition template, and it matches only an identical-looking
+expression.
+</p>
+<a name="index-match_005fparallel"></a>
+</dd>
+<dt><code>(match_parallel <var>n</var> <var>predicate</var> [<var>subpat</var>&hellip;])</code></dt>
+<dd><p>This pattern is a placeholder for an insn that consists of a
+<code>parallel</code> expression with a variable number of elements. This
+expression should only appear at the top level of an insn pattern.
+</p>
+<p>When constructing an insn, operand number <var>n</var> will be substituted at
+this point. When matching an insn, it matches if the body of the insn
+is a <code>parallel</code> expression with at least as many elements as the
+vector of <var>subpat</var> expressions in the <code>match_parallel</code>, if each
+<var>subpat</var> matches the corresponding element of the <code>parallel</code>,
+<em>and</em> the function <var>predicate</var> returns nonzero on the
+<code>parallel</code> that is the body of the insn. It is the responsibility
+of the predicate to validate elements of the <code>parallel</code> beyond
+those listed in the <code>match_parallel</code>.
+</p>
+<p>A typical use of <code>match_parallel</code> is to match load and store
+multiple expressions, which can contain a variable number of elements
+in a <code>parallel</code>. For example,
+</p>
+<div class="smallexample">
+<pre class="smallexample">(define_insn &quot;&quot;
+ [(match_parallel 0 &quot;load_multiple_operation&quot;
+ [(set (match_operand:SI 1 &quot;gpc_reg_operand&quot; &quot;=r&quot;)
+ (match_operand:SI 2 &quot;memory_operand&quot; &quot;m&quot;))
+ (use (reg:SI 179))
+ (clobber (reg:SI 179))])]
+ &quot;&quot;
+ &quot;loadm 0,0,%1,%2&quot;)
+</pre></div>
+
+<p>This example comes from <samp>a29k.md</samp>. The function
+<code>load_multiple_operation</code> is defined in <samp>a29k.c</samp> and checks
+that subsequent elements in the <code>parallel</code> are the same as the
+<code>set</code> in the pattern, except that they are referencing subsequent
+registers and memory locations.
+</p>
+<p>An insn that matches this pattern might look like:
+</p>
+<div class="smallexample">
+<pre class="smallexample">(parallel
+ [(set (reg:SI 20) (mem:SI (reg:SI 100)))
+ (use (reg:SI 179))
+ (clobber (reg:SI 179))
+ (set (reg:SI 21)
+ (mem:SI (plus:SI (reg:SI 100)
+ (const_int 4))))
+ (set (reg:SI 22)
+ (mem:SI (plus:SI (reg:SI 100)
+ (const_int 8))))])
+</pre></div>
+
+<a name="index-match_005fpar_005fdup"></a>
+</dd>
+<dt><code>(match_par_dup <var>n</var> [<var>subpat</var>&hellip;])</code></dt>
+<dd><p>Like <code>match_op_dup</code>, but for <code>match_parallel</code> instead of
+<code>match_operator</code>.
+</p>
+</dd>
+</dl>
+
+<hr>
+<div class="header">
+<p>
+Next: <a href="Output-Template.html#Output-Template" accesskey="n" rel="next">Output Template</a>, Previous: <a href="Example.html#Example" accesskey="p" rel="previous">Example</a>, Up: <a href="Machine-Desc.html#Machine-Desc" accesskey="u" rel="up">Machine Desc</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+
+
+
+</body>
+</html>