Side-Effects.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  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: Side Effects</title>
  20. <meta name="description" content="GNU Compiler Collection (GCC) Internals: Side Effects">
  21. <meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Side Effects">
  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="RTL.html#RTL" rel="up" title="RTL">
  30. <link href="Incdec.html#Incdec" rel="next" title="Incdec">
  31. <link href="RTL-Declarations.html#RTL-Declarations" rel="prev" title="RTL Declarations">
  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="Side-Effects"></a>
  63. <div class="header">
  64. <p>
  65. Next: <a href="Incdec.html#Incdec" accesskey="n" rel="next">Incdec</a>, Previous: <a href="RTL-Declarations.html#RTL-Declarations" accesskey="p" rel="prev">RTL Declarations</a>, Up: <a href="RTL.html#RTL" accesskey="u" rel="up">RTL</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="Side-Effect-Expressions"></a>
  69. <h3 class="section">13.15 Side Effect Expressions</h3>
  70. <a name="index-RTL-side-effect-expressions"></a>
  71. <p>The expression codes described so far represent values, not actions.
  72. But machine instructions never produce values; they are meaningful
  73. only for their side effects on the state of the machine. Special
  74. expression codes are used to represent side effects.
  75. </p>
  76. <p>The body of an instruction is always one of these side effect codes;
  77. the codes described above, which represent values, appear only as
  78. the operands of these.
  79. </p>
  80. <dl compact="compact">
  81. <dd><a name="index-set"></a>
  82. </dd>
  83. <dt><code>(set <var>lval</var> <var>x</var>)</code></dt>
  84. <dd><p>Represents the action of storing the value of <var>x</var> into the place
  85. represented by <var>lval</var>. <var>lval</var> must be an expression
  86. representing a place that can be stored in: <code>reg</code> (or <code>subreg</code>,
  87. <code>strict_low_part</code> or <code>zero_extract</code>), <code>mem</code>, <code>pc</code>,
  88. <code>parallel</code>, or <code>cc0</code>.
  89. </p>
  90. <p>If <var>lval</var> is a <code>reg</code>, <code>subreg</code> or <code>mem</code>, it has a
  91. machine mode; then <var>x</var> must be valid for that mode.
  92. </p>
  93. <p>If <var>lval</var> is a <code>reg</code> whose machine mode is less than the full
  94. width of the register, then it means that the part of the register
  95. specified by the machine mode is given the specified value and the
  96. rest of the register receives an undefined value. Likewise, if
  97. <var>lval</var> is a <code>subreg</code> whose machine mode is narrower than
  98. the mode of the register, the rest of the register can be changed in
  99. an undefined way.
  100. </p>
  101. <p>If <var>lval</var> is a <code>strict_low_part</code> of a subreg, then the part
  102. of the register specified by the machine mode of the <code>subreg</code> is
  103. given the value <var>x</var> and the rest of the register is not changed.
  104. </p>
  105. <p>If <var>lval</var> is a <code>zero_extract</code>, then the referenced part of
  106. the bit-field (a memory or register reference) specified by the
  107. <code>zero_extract</code> is given the value <var>x</var> and the rest of the
  108. bit-field is not changed. Note that <code>sign_extract</code> can not
  109. appear in <var>lval</var>.
  110. </p>
  111. <p>If <var>lval</var> is <code>(cc0)</code>, it has no machine mode, and <var>x</var> may
  112. be either a <code>compare</code> expression or a value that may have any mode.
  113. The latter case represents a &ldquo;test&rdquo; instruction. The expression
  114. <code>(set (cc0) (reg:<var>m</var> <var>n</var>))</code> is equivalent to
  115. <code>(set (cc0) (compare (reg:<var>m</var> <var>n</var>) (const_int 0)))</code>.
  116. Use the former expression to save space during the compilation.
  117. </p>
  118. <p>If <var>lval</var> is a <code>parallel</code>, it is used to represent the case of
  119. a function returning a structure in multiple registers. Each element
  120. of the <code>parallel</code> is an <code>expr_list</code> whose first operand is a
  121. <code>reg</code> and whose second operand is a <code>const_int</code> representing the
  122. offset (in bytes) into the structure at which the data in that register
  123. corresponds. The first element may be null to indicate that the structure
  124. is also passed partly in memory.
  125. </p>
  126. <a name="index-jump-instructions-and-set"></a>
  127. <a name="index-if_005fthen_005felse-usage"></a>
  128. <p>If <var>lval</var> is <code>(pc)</code>, we have a jump instruction, and the
  129. possibilities for <var>x</var> are very limited. It may be a
  130. <code>label_ref</code> expression (unconditional jump). It may be an
  131. <code>if_then_else</code> (conditional jump), in which case either the
  132. second or the third operand must be <code>(pc)</code> (for the case which
  133. does not jump) and the other of the two must be a <code>label_ref</code>
  134. (for the case which does jump). <var>x</var> may also be a <code>mem</code> or
  135. <code>(plus:SI (pc) <var>y</var>)</code>, where <var>y</var> may be a <code>reg</code> or a
  136. <code>mem</code>; these unusual patterns are used to represent jumps through
  137. branch tables.
  138. </p>
  139. <p>If <var>lval</var> is neither <code>(cc0)</code> nor <code>(pc)</code>, the mode of
  140. <var>lval</var> must not be <code>VOIDmode</code> and the mode of <var>x</var> must be
  141. valid for the mode of <var>lval</var>.
  142. </p>
  143. <a name="index-SET_005fDEST"></a>
  144. <a name="index-SET_005fSRC"></a>
  145. <p><var>lval</var> is customarily accessed with the <code>SET_DEST</code> macro and
  146. <var>x</var> with the <code>SET_SRC</code> macro.
  147. </p>
  148. <a name="index-return"></a>
  149. </dd>
  150. <dt><code>(return)</code></dt>
  151. <dd><p>As the sole expression in a pattern, represents a return from the
  152. current function, on machines where this can be done with one
  153. instruction, such as VAXen. On machines where a multi-instruction
  154. &ldquo;epilogue&rdquo; must be executed in order to return from the function,
  155. returning is done by jumping to a label which precedes the epilogue, and
  156. the <code>return</code> expression code is never used.
  157. </p>
  158. <p>Inside an <code>if_then_else</code> expression, represents the value to be
  159. placed in <code>pc</code> to return to the caller.
  160. </p>
  161. <p>Note that an insn pattern of <code>(return)</code> is logically equivalent to
  162. <code>(set (pc) (return))</code>, but the latter form is never used.
  163. </p>
  164. <a name="index-simple_005freturn"></a>
  165. </dd>
  166. <dt><code>(simple_return)</code></dt>
  167. <dd><p>Like <code>(return)</code>, but truly represents only a function return, while
  168. <code>(return)</code> may represent an insn that also performs other functions
  169. of the function epilogue. Like <code>(return)</code>, this may also occur in
  170. conditional jumps.
  171. </p>
  172. <a name="index-call-1"></a>
  173. </dd>
  174. <dt><code>(call <var>function</var> <var>nargs</var>)</code></dt>
  175. <dd><p>Represents a function call. <var>function</var> is a <code>mem</code> expression
  176. whose address is the address of the function to be called.
  177. <var>nargs</var> is an expression which can be used for two purposes: on
  178. some machines it represents the number of bytes of stack argument; on
  179. others, it represents the number of argument registers.
  180. </p>
  181. <p>Each machine has a standard machine mode which <var>function</var> must
  182. have. The machine description defines macro <code>FUNCTION_MODE</code> to
  183. expand into the requisite mode name. The purpose of this mode is to
  184. specify what kind of addressing is allowed, on machines where the
  185. allowed kinds of addressing depend on the machine mode being
  186. addressed.
  187. </p>
  188. <a name="index-clobber"></a>
  189. </dd>
  190. <dt><code>(clobber <var>x</var>)</code></dt>
  191. <dd><p>Represents the storing or possible storing of an unpredictable,
  192. undescribed value into <var>x</var>, which must be a <code>reg</code>,
  193. <code>scratch</code>, <code>parallel</code> or <code>mem</code> expression.
  194. </p>
  195. <p>One place this is used is in string instructions that store standard
  196. values into particular hard registers. It may not be worth the
  197. trouble to describe the values that are stored, but it is essential to
  198. inform the compiler that the registers will be altered, lest it
  199. attempt to keep data in them across the string instruction.
  200. </p>
  201. <p>If <var>x</var> is <code>(mem:BLK (const_int 0))</code> or
  202. <code>(mem:BLK (scratch))</code>, it means that all memory
  203. locations must be presumed clobbered. If <var>x</var> is a <code>parallel</code>,
  204. it has the same meaning as a <code>parallel</code> in a <code>set</code> expression.
  205. </p>
  206. <p>Note that the machine description classifies certain hard registers as
  207. &ldquo;call-clobbered&rdquo;. All function call instructions are assumed by
  208. default to clobber these registers, so there is no need to use
  209. <code>clobber</code> expressions to indicate this fact. Also, each function
  210. call is assumed to have the potential to alter any memory location,
  211. unless the function is declared <code>const</code>.
  212. </p>
  213. <p>If the last group of expressions in a <code>parallel</code> are each a
  214. <code>clobber</code> expression whose arguments are <code>reg</code> or
  215. <code>match_scratch</code> (see <a href="RTL-Template.html#RTL-Template">RTL Template</a>) expressions, the combiner
  216. phase can add the appropriate <code>clobber</code> expressions to an insn it
  217. has constructed when doing so will cause a pattern to be matched.
  218. </p>
  219. <p>This feature can be used, for example, on a machine that whose multiply
  220. and add instructions don&rsquo;t use an MQ register but which has an
  221. add-accumulate instruction that does clobber the MQ register. Similarly,
  222. a combined instruction might require a temporary register while the
  223. constituent instructions might not.
  224. </p>
  225. <p>When a <code>clobber</code> expression for a register appears inside a
  226. <code>parallel</code> with other side effects, the register allocator
  227. guarantees that the register is unoccupied both before and after that
  228. insn if it is a hard register clobber. For pseudo-register clobber,
  229. the register allocator and the reload pass do not assign the same hard
  230. register to the clobber and the input operands if there is an insn
  231. alternative containing the &lsquo;<samp>&amp;</samp>&rsquo; constraint (see <a href="Modifiers.html#Modifiers">Modifiers</a>) for
  232. the clobber and the hard register is in register classes of the
  233. clobber in the alternative. You can clobber either a specific hard
  234. register, a pseudo register, or a <code>scratch</code> expression; in the
  235. latter two cases, GCC will allocate a hard register that is available
  236. there for use as a temporary.
  237. </p>
  238. <p>For instructions that require a temporary register, you should use
  239. <code>scratch</code> instead of a pseudo-register because this will allow the
  240. combiner phase to add the <code>clobber</code> when required. You do this by
  241. coding (<code>clobber</code> (<code>match_scratch</code> &hellip;)). If you do
  242. clobber a pseudo register, use one which appears nowhere else&mdash;generate
  243. a new one each time. Otherwise, you may confuse CSE.
  244. </p>
  245. <p>There is one other known use for clobbering a pseudo register in a
  246. <code>parallel</code>: when one of the input operands of the insn is also
  247. clobbered by the insn. In this case, using the same pseudo register in
  248. the clobber and elsewhere in the insn produces the expected results.
  249. </p>
  250. <a name="index-use"></a>
  251. </dd>
  252. <dt><code>(use <var>x</var>)</code></dt>
  253. <dd><p>Represents the use of the value of <var>x</var>. It indicates that the
  254. value in <var>x</var> at this point in the program is needed, even though
  255. it may not be apparent why this is so. Therefore, the compiler will
  256. not attempt to delete previous instructions whose only effect is to
  257. store a value in <var>x</var>. <var>x</var> must be a <code>reg</code> expression.
  258. </p>
  259. <p>In some situations, it may be tempting to add a <code>use</code> of a
  260. register in a <code>parallel</code> to describe a situation where the value
  261. of a special register will modify the behavior of the instruction.
  262. A hypothetical example might be a pattern for an addition that can
  263. either wrap around or use saturating addition depending on the value
  264. of a special control register:
  265. </p>
  266. <div class="smallexample">
  267. <pre class="smallexample">(parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
  268. (reg:SI 4)] 0))
  269. (use (reg:SI 1))])
  270. </pre></div>
  271. <p>This will not work, several of the optimizers only look at expressions
  272. locally; it is very likely that if you have multiple insns with
  273. identical inputs to the <code>unspec</code>, they will be optimized away even
  274. if register 1 changes in between.
  275. </p>
  276. <p>This means that <code>use</code> can <em>only</em> be used to describe
  277. that the register is live. You should think twice before adding
  278. <code>use</code> statements, more often you will want to use <code>unspec</code>
  279. instead. The <code>use</code> RTX is most commonly useful to describe that
  280. a fixed register is implicitly used in an insn. It is also safe to use
  281. in patterns where the compiler knows for other reasons that the result
  282. of the whole pattern is variable, such as &lsquo;<samp>movmem<var>m</var></samp>&rsquo; or
  283. &lsquo;<samp>call</samp>&rsquo; patterns.
  284. </p>
  285. <p>During the reload phase, an insn that has a <code>use</code> as pattern
  286. can carry a reg_equal note. These <code>use</code> insns will be deleted
  287. before the reload phase exits.
  288. </p>
  289. <p>During the delayed branch scheduling phase, <var>x</var> may be an insn.
  290. This indicates that <var>x</var> previously was located at this place in the
  291. code and its data dependencies need to be taken into account. These
  292. <code>use</code> insns will be deleted before the delayed branch scheduling
  293. phase exits.
  294. </p>
  295. <a name="index-parallel"></a>
  296. </dd>
  297. <dt><code>(parallel [<var>x0</var> <var>x1</var> &hellip;])</code></dt>
  298. <dd><p>Represents several side effects performed in parallel. The square
  299. brackets stand for a vector; the operand of <code>parallel</code> is a
  300. vector of expressions. <var>x0</var>, <var>x1</var> and so on are individual
  301. side effect expressions&mdash;expressions of code <code>set</code>, <code>call</code>,
  302. <code>return</code>, <code>simple_return</code>, <code>clobber</code> or <code>use</code>.
  303. </p>
  304. <p>&ldquo;In parallel&rdquo; means that first all the values used in the individual
  305. side-effects are computed, and second all the actual side-effects are
  306. performed. For example,
  307. </p>
  308. <div class="smallexample">
  309. <pre class="smallexample">(parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
  310. (set (mem:SI (reg:SI 1)) (reg:SI 1))])
  311. </pre></div>
  312. <p>says unambiguously that the values of hard register 1 and the memory
  313. location addressed by it are interchanged. In both places where
  314. <code>(reg:SI 1)</code> appears as a memory address it refers to the value
  315. in register 1 <em>before</em> the execution of the insn.
  316. </p>
  317. <p>It follows that it is <em>incorrect</em> to use <code>parallel</code> and
  318. expect the result of one <code>set</code> to be available for the next one.
  319. For example, people sometimes attempt to represent a jump-if-zero
  320. instruction this way:
  321. </p>
  322. <div class="smallexample">
  323. <pre class="smallexample">(parallel [(set (cc0) (reg:SI 34))
  324. (set (pc) (if_then_else
  325. (eq (cc0) (const_int 0))
  326. (label_ref &hellip;)
  327. (pc)))])
  328. </pre></div>
  329. <p>But this is incorrect, because it says that the jump condition depends
  330. on the condition code value <em>before</em> this instruction, not on the
  331. new value that is set by this instruction.
  332. </p>
  333. <a name="index-peephole-optimization_002c-RTL-representation"></a>
  334. <p>Peephole optimization, which takes place together with final assembly
  335. code output, can produce insns whose patterns consist of a <code>parallel</code>
  336. whose elements are the operands needed to output the resulting
  337. assembler code&mdash;often <code>reg</code>, <code>mem</code> or constant expressions.
  338. This would not be well-formed RTL at any other stage in compilation,
  339. but it is OK then because no further optimization remains to be done.
  340. However, the definition of the macro <code>NOTICE_UPDATE_CC</code>, if
  341. any, must deal with such insns if you define any peephole optimizations.
  342. </p>
  343. <a name="index-cond_005fexec"></a>
  344. </dd>
  345. <dt><code>(cond_exec [<var>cond</var> <var>expr</var>])</code></dt>
  346. <dd><p>Represents a conditionally executed expression. The <var>expr</var> is
  347. executed only if the <var>cond</var> is nonzero. The <var>cond</var> expression
  348. must not have side-effects, but the <var>expr</var> may very well have
  349. side-effects.
  350. </p>
  351. <a name="index-sequence"></a>
  352. </dd>
  353. <dt><code>(sequence [<var>insns</var> &hellip;])</code></dt>
  354. <dd><p>Represents a sequence of insns. If a <code>sequence</code> appears in the
  355. chain of insns, then each of the <var>insns</var> that appears in the sequence
  356. must be suitable for appearing in the chain of insns, i.e. must satisfy
  357. the <code>INSN_P</code> predicate.
  358. </p>
  359. <p>After delay-slot scheduling is completed, an insn and all the insns that
  360. reside in its delay slots are grouped together into a <code>sequence</code>.
  361. The insn requiring the delay slot is the first insn in the vector;
  362. subsequent insns are to be placed in the delay slot.
  363. </p>
  364. <p><code>INSN_ANNULLED_BRANCH_P</code> is set on an insn in a delay slot to
  365. indicate that a branch insn should be used that will conditionally annul
  366. the effect of the insns in the delay slots. In such a case,
  367. <code>INSN_FROM_TARGET_P</code> indicates that the insn is from the target of
  368. the branch and should be executed only if the branch is taken; otherwise
  369. the insn should be executed only if the branch is not taken.
  370. See <a href="Delay-Slots.html#Delay-Slots">Delay Slots</a>.
  371. </p>
  372. <p>Some back ends also use <code>sequence</code> objects for purposes other than
  373. delay-slot groups. This is not supported in the common parts of the
  374. compiler, which treat such sequences as delay-slot groups.
  375. </p>
  376. <p>DWARF2 Call Frame Address (CFA) adjustments are sometimes also expressed
  377. using <code>sequence</code> objects as the value of a <code>RTX_FRAME_RELATED_P</code>
  378. note. This only happens if the CFA adjustments cannot be easily derived
  379. from the pattern of the instruction to which the note is attached. In
  380. such cases, the value of the note is used instead of best-guesing the
  381. semantics of the instruction. The back end can attach notes containing
  382. a <code>sequence</code> of <code>set</code> patterns that express the effect of the
  383. parent instruction.
  384. </p></dd>
  385. </dl>
  386. <p>These expression codes appear in place of a side effect, as the body of
  387. an insn, though strictly speaking they do not always describe side
  388. effects as such:
  389. </p>
  390. <dl compact="compact">
  391. <dd><a name="index-asm_005finput"></a>
  392. </dd>
  393. <dt><code>(asm_input <var>s</var>)</code></dt>
  394. <dd><p>Represents literal assembler code as described by the string <var>s</var>.
  395. </p>
  396. <a name="index-unspec"></a>
  397. <a name="index-unspec_005fvolatile"></a>
  398. </dd>
  399. <dt><code>(unspec [<var>operands</var> &hellip;] <var>index</var>)</code></dt>
  400. <dt><code>(unspec_volatile [<var>operands</var> &hellip;] <var>index</var>)</code></dt>
  401. <dd><p>Represents a machine-specific operation on <var>operands</var>. <var>index</var>
  402. selects between multiple machine-specific operations.
  403. <code>unspec_volatile</code> is used for volatile operations and operations
  404. that may trap; <code>unspec</code> is used for other operations.
  405. </p>
  406. <p>These codes may appear inside a <code>pattern</code> of an
  407. insn, inside a <code>parallel</code>, or inside an expression.
  408. </p>
  409. <a name="index-addr_005fvec"></a>
  410. </dd>
  411. <dt><code>(addr_vec:<var>m</var> [<var>lr0</var> <var>lr1</var> &hellip;])</code></dt>
  412. <dd><p>Represents a table of jump addresses. The vector elements <var>lr0</var>,
  413. etc., are <code>label_ref</code> expressions. The mode <var>m</var> specifies
  414. how much space is given to each address; normally <var>m</var> would be
  415. <code>Pmode</code>.
  416. </p>
  417. <a name="index-addr_005fdiff_005fvec"></a>
  418. </dd>
  419. <dt><code>(addr_diff_vec:<var>m</var> <var>base</var> [<var>lr0</var> <var>lr1</var> &hellip;] <var>min</var> <var>max</var> <var>flags</var>)</code></dt>
  420. <dd><p>Represents a table of jump addresses expressed as offsets from
  421. <var>base</var>. The vector elements <var>lr0</var>, etc., are <code>label_ref</code>
  422. expressions and so is <var>base</var>. The mode <var>m</var> specifies how much
  423. space is given to each address-difference. <var>min</var> and <var>max</var>
  424. are set up by branch shortening and hold a label with a minimum and a
  425. maximum address, respectively. <var>flags</var> indicates the relative
  426. position of <var>base</var>, <var>min</var> and <var>max</var> to the containing insn
  427. and of <var>min</var> and <var>max</var> to <var>base</var>. See rtl.def for details.
  428. </p>
  429. <a name="index-prefetch"></a>
  430. </dd>
  431. <dt><code>(prefetch:<var>m</var> <var>addr</var> <var>rw</var> <var>locality</var>)</code></dt>
  432. <dd><p>Represents prefetch of memory at address <var>addr</var>.
  433. Operand <var>rw</var> is 1 if the prefetch is for data to be written, 0 otherwise;
  434. targets that do not support write prefetches should treat this as a normal
  435. prefetch.
  436. Operand <var>locality</var> specifies the amount of temporal locality; 0 if there
  437. is none or 1, 2, or 3 for increasing levels of temporal locality;
  438. targets that do not support locality hints should ignore this.
  439. </p>
  440. <p>This insn is used to minimize cache-miss latency by moving data into a
  441. cache before it is accessed. It should use only non-faulting data prefetch
  442. instructions.
  443. </p></dd>
  444. </dl>
  445. <hr>
  446. <div class="header">
  447. <p>
  448. Next: <a href="Incdec.html#Incdec" accesskey="n" rel="next">Incdec</a>, Previous: <a href="RTL-Declarations.html#RTL-Declarations" accesskey="p" rel="prev">RTL Declarations</a>, Up: <a href="RTL.html#RTL" accesskey="u" rel="up">RTL</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>
  449. </div>
  450. </body>
  451. </html>