blob: d2f8db4e7a7120499c526636c8899cb7ec08c0b9 [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>Using the GNU Compiler Collection (GCC): Modifiers</title>
<meta name="description" content="Using the GNU Compiler Collection (GCC): Modifiers">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): Modifiers">
<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="Machine-Constraints.html#Machine-Constraints" rel="next" title="Machine Constraints">
<link href="Multi_002dAlternative.html#Multi_002dAlternative" rel="prev" title="Multi-Alternative">
<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="Modifiers"></a>
<div class="header">
<p>
Next: <a href="Machine-Constraints.html#Machine-Constraints" accesskey="n" rel="next">Machine Constraints</a>, Previous: <a href="Multi_002dAlternative.html#Multi_002dAlternative" accesskey="p" rel="prev">Multi-Alternative</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="Constraint-Modifier-Characters"></a>
<h4 class="subsection">6.42.3 Constraint Modifier Characters</h4>
<a name="index-modifiers-in-constraints"></a>
<a name="index-constraint-modifier-characters"></a>
<p>Here are constraint modifier characters.
</p>
<dl compact="compact">
<dd><a name="index-_003d-in-constraint"></a>
</dd>
<dt>&lsquo;<samp>=</samp>&rsquo;</dt>
<dd><p>Means that this operand is write-only for this instruction: the previous
value is discarded and replaced by output data.
</p>
<a name="index-_002b-in-constraint"></a>
</dd>
<dt>&lsquo;<samp>+</samp>&rsquo;</dt>
<dd><p>Means that this operand is both read and written by the instruction.
</p>
<p>When the compiler fixes up the operands to satisfy the constraints,
it needs to know which operands are inputs to the instruction and
which are outputs from it. &lsquo;<samp>=</samp>&rsquo; identifies an output; &lsquo;<samp>+</samp>&rsquo;
identifies an operand that is both input and output; all other operands
are assumed to be input only.
</p>
<p>If you specify &lsquo;<samp>=</samp>&rsquo; or &lsquo;<samp>+</samp>&rsquo; in a constraint, you put it in the
first character of the constraint string.
</p>
<a name="index-_0026-in-constraint"></a>
<a name="index-earlyclobber-operand"></a>
</dd>
<dt>&lsquo;<samp>&amp;</samp>&rsquo;</dt>
<dd><p>Means (in a particular alternative) that this operand is an
<em>earlyclobber</em> operand, which is modified before the instruction is
finished using the input operands. Therefore, this operand may not lie
in a register that is used as an input operand or as part of any memory
address.
</p>
<p>&lsquo;<samp>&amp;</samp>&rsquo; applies only to the alternative in which it is written. In
constraints with multiple alternatives, sometimes one alternative
requires &lsquo;<samp>&amp;</samp>&rsquo; while others do not. See, for example, the
&lsquo;<samp>movdf</samp>&rsquo; insn of the 68000.
</p>
<p>An input operand can be tied to an earlyclobber operand if its only
use as an input occurs before the early result is written. Adding
alternatives of this form often allows GCC to produce better code
when only some of the inputs can be affected by the earlyclobber.
See, for example, the &lsquo;<samp>mulsi3</samp>&rsquo; insn of the ARM.
</p>
<p>&lsquo;<samp>&amp;</samp>&rsquo; does not obviate the need to write &lsquo;<samp>=</samp>&rsquo;.
</p>
<a name="index-_0025-in-constraint"></a>
</dd>
<dt>&lsquo;<samp>%</samp>&rsquo;</dt>
<dd><p>Declares the instruction to be commutative for this operand and the
following operand. This means that the compiler may interchange the
two operands if that is the cheapest way to make all operands fit the
constraints.
GCC can only handle one commutative pair in an asm; if you use more,
the compiler may fail. Note that you need not use the modifier if
the two alternatives are strictly identical; this would only waste
time in the reload pass. The modifier is not operational after
register allocation, so the result of <code>define_peephole2</code>
and <code>define_split</code>s performed after reload cannot rely on
&lsquo;<samp>%</samp>&rsquo; to make the intended insn match.
</p>
<a name="index-_0023-in-constraint"></a>
</dd>
<dt>&lsquo;<samp>#</samp>&rsquo;</dt>
<dd><p>Says that all following characters, up to the next comma, are to be
ignored as a constraint. They are significant only for choosing
register preferences.
</p>
<a name="index-_002a-in-constraint"></a>
</dd>
<dt>&lsquo;<samp>*</samp>&rsquo;</dt>
<dd><p>Says that the following character should be ignored when choosing
register preferences. &lsquo;<samp>*</samp>&rsquo; has no effect on the meaning of the
constraint as a constraint, and no effect on reloading. For LRA
&lsquo;<samp>*</samp>&rsquo; additionally disparages slightly the alternative if the
following character matches the operand.
</p>
</dd>
</dl>
<hr>
<div class="header">
<p>
Next: <a href="Machine-Constraints.html#Machine-Constraints" accesskey="n" rel="next">Machine Constraints</a>, Previous: <a href="Multi_002dAlternative.html#Multi_002dAlternative" accesskey="p" rel="prev">Multi-Alternative</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>