Modifiers.html 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>GNU Compiler Collection (GCC) Internals: Modifiers</title>
  20. <meta name="description" content="GNU Compiler Collection (GCC) Internals: Modifiers">
  21. <meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Modifiers">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Constraints.html#Constraints" rel="up" title="Constraints">
  30. <link href="Machine-Constraints.html#Machine-Constraints" rel="next" title="Machine Constraints">
  31. <link href="Class-Preferences.html#Class-Preferences" rel="prev" title="Class Preferences">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style:oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="Modifiers"></a>
  63. <div class="header">
  64. <p>
  65. Next: <a href="Machine-Constraints.html#Machine-Constraints" accesskey="n" rel="next">Machine Constraints</a>, Previous: <a href="Class-Preferences.html#Class-Preferences" accesskey="p" rel="prev">Class Preferences</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>
  66. </div>
  67. <hr>
  68. <a name="Constraint-Modifier-Characters"></a>
  69. <h4 class="subsection">16.8.4 Constraint Modifier Characters</h4>
  70. <a name="index-modifiers-in-constraints"></a>
  71. <a name="index-constraint-modifier-characters"></a>
  72. <p>Here are constraint modifier characters.
  73. </p>
  74. <dl compact="compact">
  75. <dd><a name="index-_003d-in-constraint"></a>
  76. </dd>
  77. <dt>&lsquo;<samp>=</samp>&rsquo;</dt>
  78. <dd><p>Means that this operand is written to by this instruction:
  79. the previous value is discarded and replaced by new data.
  80. </p>
  81. <a name="index-_002b-in-constraint"></a>
  82. </dd>
  83. <dt>&lsquo;<samp>+</samp>&rsquo;</dt>
  84. <dd><p>Means that this operand is both read and written by the instruction.
  85. </p>
  86. <p>When the compiler fixes up the operands to satisfy the constraints,
  87. it needs to know which operands are read by the instruction and
  88. which are written by it. &lsquo;<samp>=</samp>&rsquo; identifies an operand which is only
  89. written; &lsquo;<samp>+</samp>&rsquo; identifies an operand that is both read and written; all
  90. other operands are assumed to only be read.
  91. </p>
  92. <p>If you specify &lsquo;<samp>=</samp>&rsquo; or &lsquo;<samp>+</samp>&rsquo; in a constraint, you put it in the
  93. first character of the constraint string.
  94. </p>
  95. <a name="index-_0026-in-constraint"></a>
  96. <a name="index-earlyclobber-operand"></a>
  97. </dd>
  98. <dt>&lsquo;<samp>&amp;</samp>&rsquo;</dt>
  99. <dd><p>Means (in a particular alternative) that this operand is an
  100. <em>earlyclobber</em> operand, which is written before the instruction is
  101. finished using the input operands. Therefore, this operand may not lie
  102. in a register that is read by the instruction or as part of any memory
  103. address.
  104. </p>
  105. <p>&lsquo;<samp>&amp;</samp>&rsquo; applies only to the alternative in which it is written. In
  106. constraints with multiple alternatives, sometimes one alternative
  107. requires &lsquo;<samp>&amp;</samp>&rsquo; while others do not. See, for example, the
  108. &lsquo;<samp>movdf</samp>&rsquo; insn of the 68000.
  109. </p>
  110. <p>A operand which is read by the instruction can be tied to an earlyclobber
  111. operand if its only use as an input occurs before the early result is
  112. written. Adding alternatives of this form often allows GCC to produce
  113. better code when only some of the read operands can be affected by the
  114. earlyclobber. See, for example, the &lsquo;<samp>mulsi3</samp>&rsquo; insn of the ARM.
  115. </p>
  116. <p>Furthermore, if the <em>earlyclobber</em> operand is also a read/write
  117. operand, then that operand is written only after it&rsquo;s used.
  118. </p>
  119. <p>&lsquo;<samp>&amp;</samp>&rsquo; does not obviate the need to write &lsquo;<samp>=</samp>&rsquo; or &lsquo;<samp>+</samp>&rsquo;. As
  120. <em>earlyclobber</em> operands are always written, a read-only
  121. <em>earlyclobber</em> operand is ill-formed and will be rejected by the
  122. compiler.
  123. </p>
  124. <a name="index-_0025-in-constraint"></a>
  125. </dd>
  126. <dt>&lsquo;<samp>%</samp>&rsquo;</dt>
  127. <dd><p>Declares the instruction to be commutative for this operand and the
  128. following operand. This means that the compiler may interchange the
  129. two operands if that is the cheapest way to make all operands fit the
  130. constraints. &lsquo;<samp>%</samp>&rsquo; applies to all alternatives and must appear as
  131. the first character in the constraint. Only read-only operands can use
  132. &lsquo;<samp>%</samp>&rsquo;.
  133. </p>
  134. <p>This is often used in patterns for addition instructions
  135. that really have only two operands: the result must go in one of the
  136. arguments. Here for example, is how the 68000 halfword-add
  137. instruction is defined:
  138. </p>
  139. <div class="smallexample">
  140. <pre class="smallexample">(define_insn &quot;addhi3&quot;
  141. [(set (match_operand:HI 0 &quot;general_operand&quot; &quot;=m,r&quot;)
  142. (plus:HI (match_operand:HI 1 &quot;general_operand&quot; &quot;%0,0&quot;)
  143. (match_operand:HI 2 &quot;general_operand&quot; &quot;di,g&quot;)))]
  144. &hellip;)
  145. </pre></div>
  146. <p>GCC can only handle one commutative pair in an asm; if you use more,
  147. the compiler may fail. Note that you need not use the modifier if
  148. the two alternatives are strictly identical; this would only waste
  149. time in the reload pass.
  150. The modifier is not operational after
  151. register allocation, so the result of <code>define_peephole2</code>
  152. and <code>define_split</code>s performed after reload cannot rely on
  153. &lsquo;<samp>%</samp>&rsquo; to make the intended insn match.
  154. </p>
  155. <a name="index-_0023-in-constraint"></a>
  156. </dd>
  157. <dt>&lsquo;<samp>#</samp>&rsquo;</dt>
  158. <dd><p>Says that all following characters, up to the next comma, are to be
  159. ignored as a constraint. They are significant only for choosing
  160. register preferences.
  161. </p>
  162. <a name="index-_002a-in-constraint"></a>
  163. </dd>
  164. <dt>&lsquo;<samp>*</samp>&rsquo;</dt>
  165. <dd><p>Says that the following character should be ignored when choosing
  166. register preferences. &lsquo;<samp>*</samp>&rsquo; has no effect on the meaning of the
  167. constraint as a constraint, and no effect on reloading. For LRA
  168. &lsquo;<samp>*</samp>&rsquo; additionally disparages slightly the alternative if the
  169. following character matches the operand.
  170. </p>
  171. <p>Here is an example: the 68000 has an instruction to sign-extend a
  172. halfword in a data register, and can also sign-extend a value by
  173. copying it into an address register. While either kind of register is
  174. acceptable, the constraints on an address-register destination are
  175. less strict, so it is best if register allocation makes an address
  176. register its goal. Therefore, &lsquo;<samp>*</samp>&rsquo; is used so that the &lsquo;<samp>d</samp>&rsquo;
  177. constraint letter (for data register) is ignored when computing
  178. register preferences.
  179. </p>
  180. <div class="smallexample">
  181. <pre class="smallexample">(define_insn &quot;extendhisi2&quot;
  182. [(set (match_operand:SI 0 &quot;general_operand&quot; &quot;=*d,a&quot;)
  183. (sign_extend:SI
  184. (match_operand:HI 1 &quot;general_operand&quot; &quot;0,g&quot;)))]
  185. &hellip;)
  186. </pre></div>
  187. </dd>
  188. </dl>
  189. <hr>
  190. <div class="header">
  191. <p>
  192. Next: <a href="Machine-Constraints.html#Machine-Constraints" accesskey="n" rel="next">Machine Constraints</a>, Previous: <a href="Class-Preferences.html#Class-Preferences" accesskey="p" rel="prev">Class Preferences</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>
  193. </div>
  194. </body>
  195. </html>