Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

3 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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-2020 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 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>Insn Splitting (GNU Compiler Collection (GCC) Internals)</title>
  21. <meta name="description" content="Insn Splitting (GNU Compiler Collection (GCC) Internals)">
  22. <meta name="keywords" content="Insn Splitting (GNU Compiler Collection (GCC) Internals)">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  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="Machine-Desc.html#Machine-Desc" rel="up" title="Machine Desc">
  30. <link href="Including-Patterns.html#Including-Patterns" rel="next" title="Including Patterns">
  31. <link href="Expander-Definitions.html#Expander-Definitions" rel="prev" title="Expander Definitions">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  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.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="Insn-Splitting"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="Including-Patterns.html#Including-Patterns" accesskey="n" rel="next">Including Patterns</a>, Previous: <a href="Expander-Definitions.html#Expander-Definitions" accesskey="p" rel="prev">Expander Definitions</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>
  65. </div>
  66. <hr>
  67. <a name="Defining-How-to-Split-Instructions"></a>
  68. <h3 class="section">17.16 Defining How to Split Instructions</h3>
  69. <a name="index-insn-splitting"></a>
  70. <a name="index-instruction-splitting"></a>
  71. <a name="index-splitting-instructions"></a>
  72. <p>There are two cases where you should specify how to split a pattern
  73. into multiple insns. On machines that have instructions requiring
  74. delay slots (see <a href="Delay-Slots.html#Delay-Slots">Delay Slots</a>) or that have instructions whose
  75. output is not available for multiple cycles (see <a href="Processor-pipeline-description.html#Processor-pipeline-description">Processor pipeline description</a>), the compiler phases that optimize these cases need to
  76. be able to move insns into one-instruction delay slots. However, some
  77. insns may generate more than one machine instruction. These insns
  78. cannot be placed into a delay slot.
  79. </p>
  80. <p>Often you can rewrite the single insn as a list of individual insns,
  81. each corresponding to one machine instruction. The disadvantage of
  82. doing so is that it will cause the compilation to be slower and require
  83. more space. If the resulting insns are too complex, it may also
  84. suppress some optimizations. The compiler splits the insn if there is a
  85. reason to believe that it might improve instruction or delay slot
  86. scheduling.
  87. </p>
  88. <p>The insn combiner phase also splits putative insns. If three insns are
  89. merged into one insn with a complex expression that cannot be matched by
  90. some <code>define_insn</code> pattern, the combiner phase attempts to split
  91. the complex pattern into two insns that are recognized. Usually it can
  92. break the complex pattern into two patterns by splitting out some
  93. subexpression. However, in some other cases, such as performing an
  94. addition of a large constant in two insns on a RISC machine, the way to
  95. split the addition into two insns is machine-dependent.
  96. </p>
  97. <a name="index-define_005fsplit"></a>
  98. <p>The <code>define_split</code> definition tells the compiler how to split a
  99. complex insn into several simpler insns. It looks like this:
  100. </p>
  101. <div class="smallexample">
  102. <pre class="smallexample">(define_split
  103. [<var>insn-pattern</var>]
  104. &quot;<var>condition</var>&quot;
  105. [<var>new-insn-pattern-1</var>
  106. <var>new-insn-pattern-2</var>
  107. &hellip;]
  108. &quot;<var>preparation-statements</var>&quot;)
  109. </pre></div>
  110. <p><var>insn-pattern</var> is a pattern that needs to be split and
  111. <var>condition</var> is the final condition to be tested, as in a
  112. <code>define_insn</code>. When an insn matching <var>insn-pattern</var> and
  113. satisfying <var>condition</var> is found, it is replaced in the insn list
  114. with the insns given by <var>new-insn-pattern-1</var>,
  115. <var>new-insn-pattern-2</var>, etc.
  116. </p>
  117. <p>The <var>preparation-statements</var> are similar to those statements that
  118. are specified for <code>define_expand</code> (see <a href="Expander-Definitions.html#Expander-Definitions">Expander Definitions</a>)
  119. and are executed before the new RTL is generated to prepare for the
  120. generated code or emit some insns whose pattern is not fixed. Unlike
  121. those in <code>define_expand</code>, however, these statements must not
  122. generate any new pseudo-registers. Once reload has completed, they also
  123. must not allocate any space in the stack frame.
  124. </p>
  125. <p>There are two special macros defined for use in the preparation statements:
  126. <code>DONE</code> and <code>FAIL</code>. Use them with a following semicolon,
  127. as a statement.
  128. </p>
  129. <dl compact="compact">
  130. <dd>
  131. <a name="index-DONE-1"></a>
  132. </dd>
  133. <dt><code>DONE</code></dt>
  134. <dd><p>Use the <code>DONE</code> macro to end RTL generation for the splitter. The
  135. only RTL insns generated as replacement for the matched input insn will
  136. be those already emitted by explicit calls to <code>emit_insn</code> within
  137. the preparation statements; the replacement pattern is not used.
  138. </p>
  139. <a name="index-FAIL-1"></a>
  140. </dd>
  141. <dt><code>FAIL</code></dt>
  142. <dd><p>Make the <code>define_split</code> fail on this occasion. When a <code>define_split</code>
  143. fails, it means that the splitter was not truly available for the inputs
  144. it was given, and the input insn will not be split.
  145. </p></dd>
  146. </dl>
  147. <p>If the preparation falls through (invokes neither <code>DONE</code> nor
  148. <code>FAIL</code>), then the <code>define_split</code> uses the replacement
  149. template.
  150. </p>
  151. <p>Patterns are matched against <var>insn-pattern</var> in two different
  152. circumstances. If an insn needs to be split for delay slot scheduling
  153. or insn scheduling, the insn is already known to be valid, which means
  154. that it must have been matched by some <code>define_insn</code> and, if
  155. <code>reload_completed</code> is nonzero, is known to satisfy the constraints
  156. of that <code>define_insn</code>. In that case, the new insn patterns must
  157. also be insns that are matched by some <code>define_insn</code> and, if
  158. <code>reload_completed</code> is nonzero, must also satisfy the constraints
  159. of those definitions.
  160. </p>
  161. <p>As an example of this usage of <code>define_split</code>, consider the following
  162. example from <samp>a29k.md</samp>, which splits a <code>sign_extend</code> from
  163. <code>HImode</code> to <code>SImode</code> into a pair of shift insns:
  164. </p>
  165. <div class="smallexample">
  166. <pre class="smallexample">(define_split
  167. [(set (match_operand:SI 0 &quot;gen_reg_operand&quot; &quot;&quot;)
  168. (sign_extend:SI (match_operand:HI 1 &quot;gen_reg_operand&quot; &quot;&quot;)))]
  169. &quot;&quot;
  170. [(set (match_dup 0)
  171. (ashift:SI (match_dup 1)
  172. (const_int 16)))
  173. (set (match_dup 0)
  174. (ashiftrt:SI (match_dup 0)
  175. (const_int 16)))]
  176. &quot;
  177. { operands[1] = gen_lowpart (SImode, operands[1]); }&quot;)
  178. </pre></div>
  179. <p>When the combiner phase tries to split an insn pattern, it is always the
  180. case that the pattern is <em>not</em> matched by any <code>define_insn</code>.
  181. The combiner pass first tries to split a single <code>set</code> expression
  182. and then the same <code>set</code> expression inside a <code>parallel</code>, but
  183. followed by a <code>clobber</code> of a pseudo-reg to use as a scratch
  184. register. In these cases, the combiner expects exactly one or two new insn
  185. patterns to be generated. It will verify that these patterns match some
  186. <code>define_insn</code> definitions, so you need not do this test in the
  187. <code>define_split</code> (of course, there is no point in writing a
  188. <code>define_split</code> that will never produce insns that match).
  189. </p>
  190. <p>Here is an example of this use of <code>define_split</code>, taken from
  191. <samp>rs6000.md</samp>:
  192. </p>
  193. <div class="smallexample">
  194. <pre class="smallexample">(define_split
  195. [(set (match_operand:SI 0 &quot;gen_reg_operand&quot; &quot;&quot;)
  196. (plus:SI (match_operand:SI 1 &quot;gen_reg_operand&quot; &quot;&quot;)
  197. (match_operand:SI 2 &quot;non_add_cint_operand&quot; &quot;&quot;)))]
  198. &quot;&quot;
  199. [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
  200. (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
  201. &quot;
  202. {
  203. int low = INTVAL (operands[2]) &amp; 0xffff;
  204. int high = (unsigned) INTVAL (operands[2]) &gt;&gt; 16;
  205. if (low &amp; 0x8000)
  206. high++, low |= 0xffff0000;
  207. operands[3] = GEN_INT (high &lt;&lt; 16);
  208. operands[4] = GEN_INT (low);
  209. }&quot;)
  210. </pre></div>
  211. <p>Here the predicate <code>non_add_cint_operand</code> matches any
  212. <code>const_int</code> that is <em>not</em> a valid operand of a single add
  213. insn. The add with the smaller displacement is written so that it
  214. can be substituted into the address of a subsequent operation.
  215. </p>
  216. <p>An example that uses a scratch register, from the same file, generates
  217. an equality comparison of a register and a large constant:
  218. </p>
  219. <div class="smallexample">
  220. <pre class="smallexample">(define_split
  221. [(set (match_operand:CC 0 &quot;cc_reg_operand&quot; &quot;&quot;)
  222. (compare:CC (match_operand:SI 1 &quot;gen_reg_operand&quot; &quot;&quot;)
  223. (match_operand:SI 2 &quot;non_short_cint_operand&quot; &quot;&quot;)))
  224. (clobber (match_operand:SI 3 &quot;gen_reg_operand&quot; &quot;&quot;))]
  225. &quot;find_single_use (operands[0], insn, 0)
  226. &amp;&amp; (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
  227. || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)&quot;
  228. [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
  229. (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
  230. &quot;
  231. {
  232. /* <span class="roman">Get the constant we are comparing against, C, and see what it
  233. looks like sign-extended to 16 bits. Then see what constant
  234. could be XOR&rsquo;ed with C to get the sign-extended value.</span> */
  235. int c = INTVAL (operands[2]);
  236. int sextc = (c &lt;&lt; 16) &gt;&gt; 16;
  237. int xorv = c ^ sextc;
  238. operands[4] = GEN_INT (xorv);
  239. operands[5] = GEN_INT (sextc);
  240. }&quot;)
  241. </pre></div>
  242. <p>To avoid confusion, don&rsquo;t write a single <code>define_split</code> that
  243. accepts some insns that match some <code>define_insn</code> as well as some
  244. insns that don&rsquo;t. Instead, write two separate <code>define_split</code>
  245. definitions, one for the insns that are valid and one for the insns that
  246. are not valid.
  247. </p>
  248. <p>The splitter is allowed to split jump instructions into sequence of
  249. jumps or create new jumps in while splitting non-jump instructions. As
  250. the control flow graph and branch prediction information needs to be updated,
  251. several restriction apply.
  252. </p>
  253. <p>Splitting of jump instruction into sequence that over by another jump
  254. instruction is always valid, as compiler expect identical behavior of new
  255. jump. When new sequence contains multiple jump instructions or new labels,
  256. more assistance is needed. Splitter is required to create only unconditional
  257. jumps, or simple conditional jump instructions. Additionally it must attach a
  258. <code>REG_BR_PROB</code> note to each conditional jump. A global variable
  259. <code>split_branch_probability</code> holds the probability of the original branch in case
  260. it was a simple conditional jump, -1 otherwise. To simplify
  261. recomputing of edge frequencies, the new sequence is required to have only
  262. forward jumps to the newly created labels.
  263. </p>
  264. <a name="index-define_005finsn_005fand_005fsplit"></a>
  265. <p>For the common case where the pattern of a define_split exactly matches the
  266. pattern of a define_insn, use <code>define_insn_and_split</code>. It looks like
  267. this:
  268. </p>
  269. <div class="smallexample">
  270. <pre class="smallexample">(define_insn_and_split
  271. [<var>insn-pattern</var>]
  272. &quot;<var>condition</var>&quot;
  273. &quot;<var>output-template</var>&quot;
  274. &quot;<var>split-condition</var>&quot;
  275. [<var>new-insn-pattern-1</var>
  276. <var>new-insn-pattern-2</var>
  277. &hellip;]
  278. &quot;<var>preparation-statements</var>&quot;
  279. [<var>insn-attributes</var>])
  280. </pre></div>
  281. <p><var>insn-pattern</var>, <var>condition</var>, <var>output-template</var>, and
  282. <var>insn-attributes</var> are used as in <code>define_insn</code>. The
  283. <var>new-insn-pattern</var> vector and the <var>preparation-statements</var> are used as
  284. in a <code>define_split</code>. The <var>split-condition</var> is also used as in
  285. <code>define_split</code>, with the additional behavior that if the condition starts
  286. with &lsquo;<samp>&amp;&amp;</samp>&rsquo;, the condition used for the split will be the constructed as a
  287. logical &ldquo;and&rdquo; of the split condition with the insn condition. For example,
  288. from i386.md:
  289. </p>
  290. <div class="smallexample">
  291. <pre class="smallexample">(define_insn_and_split &quot;zero_extendhisi2_and&quot;
  292. [(set (match_operand:SI 0 &quot;register_operand&quot; &quot;=r&quot;)
  293. (zero_extend:SI (match_operand:HI 1 &quot;register_operand&quot; &quot;0&quot;)))
  294. (clobber (reg:CC 17))]
  295. &quot;TARGET_ZERO_EXTEND_WITH_AND &amp;&amp; !optimize_size&quot;
  296. &quot;#&quot;
  297. &quot;&amp;&amp; reload_completed&quot;
  298. [(parallel [(set (match_dup 0)
  299. (and:SI (match_dup 0) (const_int 65535)))
  300. (clobber (reg:CC 17))])]
  301. &quot;&quot;
  302. [(set_attr &quot;type&quot; &quot;alu1&quot;)])
  303. </pre></div>
  304. <p>In this case, the actual split condition will be
  305. &lsquo;<samp>TARGET_ZERO_EXTEND_WITH_AND &amp;&amp; !optimize_size &amp;&amp; reload_completed</samp>&rsquo;.
  306. </p>
  307. <p>The <code>define_insn_and_split</code> construction provides exactly the same
  308. functionality as two separate <code>define_insn</code> and <code>define_split</code>
  309. patterns. It exists for compactness, and as a maintenance tool to prevent
  310. having to ensure the two patterns&rsquo; templates match.
  311. </p>
  312. <a name="index-define_005finsn_005fand_005frewrite"></a>
  313. <p>It is sometimes useful to have a <code>define_insn_and_split</code>
  314. that replaces specific operands of an instruction but leaves the
  315. rest of the instruction pattern unchanged. You can do this directly
  316. with a <code>define_insn_and_split</code>, but it requires a
  317. <var>new-insn-pattern-1</var> that repeats most of the original <var>insn-pattern</var>.
  318. There is also the complication that an implicit <code>parallel</code> in
  319. <var>insn-pattern</var> must become an explicit <code>parallel</code> in
  320. <var>new-insn-pattern-1</var>, which is easy to overlook.
  321. A simpler alternative is to use <code>define_insn_and_rewrite</code>, which
  322. is a form of <code>define_insn_and_split</code> that automatically generates
  323. <var>new-insn-pattern-1</var> by replacing each <code>match_operand</code>
  324. in <var>insn-pattern</var> with a corresponding <code>match_dup</code>, and each
  325. <code>match_operator</code> in the pattern with a corresponding <code>match_op_dup</code>.
  326. The arguments are otherwise identical to <code>define_insn_and_split</code>:
  327. </p>
  328. <div class="smallexample">
  329. <pre class="smallexample">(define_insn_and_rewrite
  330. [<var>insn-pattern</var>]
  331. &quot;<var>condition</var>&quot;
  332. &quot;<var>output-template</var>&quot;
  333. &quot;<var>split-condition</var>&quot;
  334. &quot;<var>preparation-statements</var>&quot;
  335. [<var>insn-attributes</var>])
  336. </pre></div>
  337. <p>The <code>match_dup</code>s and <code>match_op_dup</code>s in the new
  338. instruction pattern use any new operand values that the
  339. <var>preparation-statements</var> store in the <code>operands</code> array,
  340. as for a normal <code>define_insn_and_split</code>. <var>preparation-statements</var>
  341. can also emit additional instructions before the new instruction.
  342. They can even emit an entirely different sequence of instructions and
  343. use <code>DONE</code> to avoid emitting a new form of the original
  344. instruction.
  345. </p>
  346. <p>The split in a <code>define_insn_and_rewrite</code> is only intended
  347. to apply to existing instructions that match <var>insn-pattern</var>.
  348. <var>split-condition</var> must therefore start with <code>&amp;&amp;</code>,
  349. so that the split condition applies on top of <var>condition</var>.
  350. </p>
  351. <p>Here is an example from the AArch64 SVE port, in which operand 1 is
  352. known to be equivalent to an all-true constant and isn&rsquo;t used by the
  353. output template:
  354. </p>
  355. <div class="smallexample">
  356. <pre class="smallexample">(define_insn_and_rewrite &quot;*while_ult&lt;GPI:mode&gt;&lt;PRED_ALL:mode&gt;_cc&quot;
  357. [(set (reg:CC CC_REGNUM)
  358. (compare:CC
  359. (unspec:SI [(match_operand:PRED_ALL 1)
  360. (unspec:PRED_ALL
  361. [(match_operand:GPI 2 &quot;aarch64_reg_or_zero&quot; &quot;rZ&quot;)
  362. (match_operand:GPI 3 &quot;aarch64_reg_or_zero&quot; &quot;rZ&quot;)]
  363. UNSPEC_WHILE_LO)]
  364. UNSPEC_PTEST_PTRUE)
  365. (const_int 0)))
  366. (set (match_operand:PRED_ALL 0 &quot;register_operand&quot; &quot;=Upa&quot;)
  367. (unspec:PRED_ALL [(match_dup 2)
  368. (match_dup 3)]
  369. UNSPEC_WHILE_LO))]
  370. &quot;TARGET_SVE&quot;
  371. &quot;whilelo\t%0.&lt;PRED_ALL:Vetype&gt;, %&lt;w&gt;2, %&lt;w&gt;3&quot;
  372. ;; Force the compiler to drop the unused predicate operand, so that we
  373. ;; don't have an unnecessary PTRUE.
  374. &quot;&amp;&amp; !CONSTANT_P (operands[1])&quot;
  375. {
  376. operands[1] = CONSTM1_RTX (&lt;MODE&gt;mode);
  377. }
  378. )
  379. </pre></div>
  380. <p>The splitter in this case simply replaces operand 1 with the constant
  381. value that it is known to have. The equivalent <code>define_insn_and_split</code>
  382. would be:
  383. </p>
  384. <div class="smallexample">
  385. <pre class="smallexample">(define_insn_and_split &quot;*while_ult&lt;GPI:mode&gt;&lt;PRED_ALL:mode&gt;_cc&quot;
  386. [(set (reg:CC CC_REGNUM)
  387. (compare:CC
  388. (unspec:SI [(match_operand:PRED_ALL 1)
  389. (unspec:PRED_ALL
  390. [(match_operand:GPI 2 &quot;aarch64_reg_or_zero&quot; &quot;rZ&quot;)
  391. (match_operand:GPI 3 &quot;aarch64_reg_or_zero&quot; &quot;rZ&quot;)]
  392. UNSPEC_WHILE_LO)]
  393. UNSPEC_PTEST_PTRUE)
  394. (const_int 0)))
  395. (set (match_operand:PRED_ALL 0 &quot;register_operand&quot; &quot;=Upa&quot;)
  396. (unspec:PRED_ALL [(match_dup 2)
  397. (match_dup 3)]
  398. UNSPEC_WHILE_LO))]
  399. &quot;TARGET_SVE&quot;
  400. &quot;whilelo\t%0.&lt;PRED_ALL:Vetype&gt;, %&lt;w&gt;2, %&lt;w&gt;3&quot;
  401. ;; Force the compiler to drop the unused predicate operand, so that we
  402. ;; don't have an unnecessary PTRUE.
  403. &quot;&amp;&amp; !CONSTANT_P (operands[1])&quot;
  404. [(parallel
  405. [(set (reg:CC CC_REGNUM)
  406. (compare:CC
  407. (unspec:SI [(match_dup 1)
  408. (unspec:PRED_ALL [(match_dup 2)
  409. (match_dup 3)]
  410. UNSPEC_WHILE_LO)]
  411. UNSPEC_PTEST_PTRUE)
  412. (const_int 0)))
  413. (set (match_dup 0)
  414. (unspec:PRED_ALL [(match_dup 2)
  415. (match_dup 3)]
  416. UNSPEC_WHILE_LO))])]
  417. {
  418. operands[1] = CONSTM1_RTX (&lt;MODE&gt;mode);
  419. }
  420. )
  421. </pre></div>
  422. <hr>
  423. <div class="header">
  424. <p>
  425. Next: <a href="Including-Patterns.html#Including-Patterns" accesskey="n" rel="next">Including Patterns</a>, Previous: <a href="Expander-Definitions.html#Expander-Definitions" accesskey="p" rel="prev">Expander Definitions</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>
  426. </div>
  427. </body>
  428. </html>