blob: e85aa0248c152186f689c6aba924513a8751bf0f [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2015 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.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Compiler Collection (GCC) Internals: Multi-Alternative</title>
<meta name="description" content="GNU Compiler Collection (GCC) Internals: Multi-Alternative">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Multi-Alternative">
<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="Constraints.html#Constraints" rel="up" title="Constraints">
<link href="Class-Preferences.html#Class-Preferences" rel="next" title="Class Preferences">
<link href="Simple-Constraints.html#Simple-Constraints" rel="prev" title="Simple Constraints">
<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="Multi_002dAlternative"></a>
<div class="header">
<p>
Next: <a href="Class-Preferences.html#Class-Preferences" accesskey="n" rel="next">Class Preferences</a>, Previous: <a href="Simple-Constraints.html#Simple-Constraints" accesskey="p" rel="prev">Simple Constraints</a>, Up: <a href="Constraints.html#Constraints" accesskey="u" rel="up">Constraints</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="Multiple-Alternative-Constraints"></a>
<h4 class="subsection">16.8.2 Multiple Alternative Constraints</h4>
<a name="index-multiple-alternative-constraints"></a>
<p>Sometimes a single instruction has multiple alternative sets of possible
operands. For example, on the 68000, a logical-or instruction can combine
register or an immediate value into memory, or it can combine any kind of
operand into a register; but it cannot combine one memory location into
another.
</p>
<p>These constraints are represented as multiple alternatives. An alternative
can be described by a series of letters for each operand. The overall
constraint for an operand is made from the letters for this operand
from the first alternative, a comma, the letters for this operand from
the second alternative, a comma, and so on until the last alternative.
Here is how it is done for fullword logical-or on the 68000:
</p>
<div class="smallexample">
<pre class="smallexample">(define_insn &quot;iorsi3&quot;
[(set (match_operand:SI 0 &quot;general_operand&quot; &quot;=m,d&quot;)
(ior:SI (match_operand:SI 1 &quot;general_operand&quot; &quot;%0,0&quot;)
(match_operand:SI 2 &quot;general_operand&quot; &quot;dKs,dmKs&quot;)))]
&hellip;)
</pre></div>
<p>The first alternative has &lsquo;<samp>m</samp>&rsquo; (memory) for operand 0, &lsquo;<samp>0</samp>&rsquo; for
operand 1 (meaning it must match operand 0), and &lsquo;<samp>dKs</samp>&rsquo; for operand
2. The second alternative has &lsquo;<samp>d</samp>&rsquo; (data register) for operand 0,
&lsquo;<samp>0</samp>&rsquo; for operand 1, and &lsquo;<samp>dmKs</samp>&rsquo; for operand 2. The &lsquo;<samp>=</samp>&rsquo; and
&lsquo;<samp>%</samp>&rsquo; in the constraints apply to all the alternatives; their
meaning is explained in the next section (see <a href="Class-Preferences.html#Class-Preferences">Class Preferences</a>).
</p>
<p>If all the operands fit any one alternative, the instruction is valid.
Otherwise, for each alternative, the compiler counts how many instructions
must be added to copy the operands so that that alternative applies.
The alternative requiring the least copying is chosen. If two alternatives
need the same amount of copying, the one that comes first is chosen.
These choices can be altered with the &lsquo;<samp>?</samp>&rsquo; and &lsquo;<samp>!</samp>&rsquo; characters:
</p>
<dl compact="compact">
<dd><a name="index-_003f-in-constraint"></a>
<a name="index-question-mark"></a>
</dd>
<dt><code>?</code></dt>
<dd><p>Disparage slightly the alternative that the &lsquo;<samp>?</samp>&rsquo; appears in,
as a choice when no alternative applies exactly. The compiler regards
this alternative as one unit more costly for each &lsquo;<samp>?</samp>&rsquo; that appears
in it.
</p>
<a name="index-_0021-in-constraint"></a>
<a name="index-exclamation-point"></a>
</dd>
<dt><code>!</code></dt>
<dd><p>Disparage severely the alternative that the &lsquo;<samp>!</samp>&rsquo; appears in.
This alternative can still be used if it fits without reloading,
but if reloading is needed, some other alternative will be used.
</p></dd>
</dl>
<p>When an insn pattern has multiple alternatives in its constraints, often
the appearance of the assembler code is determined mostly by which
alternative was matched. When this is so, the C code for writing the
assembler code can use the variable <code>which_alternative</code>, which is
the ordinal number of the alternative that was actually satisfied (0 for
the first, 1 for the second alternative, etc.). See <a href="Output-Statement.html#Output-Statement">Output Statement</a>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Class-Preferences.html#Class-Preferences" accesskey="n" rel="next">Class Preferences</a>, Previous: <a href="Simple-Constraints.html#Simple-Constraints" accesskey="p" rel="prev">Simple Constraints</a>, Up: <a href="Constraints.html#Constraints" accesskey="u" rel="up">Constraints</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>