1<html lang="en"> 2<head> 3<title>Simple Constraints - Using the GNU Compiler Collection (GCC)</title> 4<meta http-equiv="Content-Type" content="text/html"> 5<meta name="description" content="Using the GNU Compiler Collection (GCC)"> 6<meta name="generator" content="makeinfo 4.13"> 7<link title="Top" rel="start" href="index.html#Top"> 8<link rel="up" href="Constraints.html#Constraints" title="Constraints"> 9<link rel="next" href="Multi_002dAlternative.html#Multi_002dAlternative" title="Multi-Alternative"> 10<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> 11<!-- 12Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 131998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 142010 Free Software Foundation, Inc. 15 16Permission is granted to copy, distribute and/or modify this document 17under the terms of the GNU Free Documentation License, Version 1.3 or 18any later version published by the Free Software Foundation; with the 19Invariant Sections being ``Funding Free Software'', the Front-Cover 20Texts being (a) (see below), and with the Back-Cover Texts being (b) 21(see below). A copy of the license is included in the section entitled 22``GNU Free Documentation License''. 23 24(a) The FSF's Front-Cover Text is: 25 26 A GNU Manual 27 28(b) The FSF's Back-Cover Text is: 29 30 You have freedom to copy and modify this GNU Manual, like GNU 31 software. Copies published by the Free Software Foundation raise 32 funds for GNU development.--> 33<meta http-equiv="Content-Style-Type" content="text/css"> 34<style type="text/css"><!-- 35 pre.display { font-family:inherit } 36 pre.format { font-family:inherit } 37 pre.smalldisplay { font-family:inherit; font-size:smaller } 38 pre.smallformat { font-family:inherit; font-size:smaller } 39 pre.smallexample { font-size:smaller } 40 pre.smalllisp { font-size:smaller } 41 span.sc { font-variant:small-caps } 42 span.roman { font-family:serif; font-weight:normal; } 43 span.sansserif { font-family:sans-serif; font-weight:normal; } 44--></style> 45<link rel="stylesheet" type="text/css" href="../cs.css"> 46</head> 47<body> 48<div class="node"> 49<a name="Simple-Constraints"></a> 50<p> 51Next: <a rel="next" accesskey="n" href="Multi_002dAlternative.html#Multi_002dAlternative">Multi-Alternative</a>, 52Up: <a rel="up" accesskey="u" href="Constraints.html#Constraints">Constraints</a> 53<hr> 54</div> 55 56<h4 class="subsection">6.42.1 Simple Constraints</h4> 57 58<p><a name="index-simple-constraints-2628"></a> 59The simplest kind of constraint is a string full of letters, each of 60which describes one kind of operand that is permitted. Here are 61the letters that are allowed: 62 63 <dl> 64<dt>whitespace<dd>Whitespace characters are ignored and can be inserted at any position 65except the first. This enables each alternative for different operands to 66be visually aligned in the machine description even if they have different 67number of constraints and modifiers. 68 69 <p><a name="index-g_t_0040samp_007bm_007d-in-constraint-2629"></a><a name="index-memory-references-in-constraints-2630"></a><br><dt>‘<samp><span class="samp">m</span></samp>’<dd>A memory operand is allowed, with any kind of address that the machine 70supports in general. 71Note that the letter used for the general memory constraint can be 72re-defined by a back end using the <code>TARGET_MEM_CONSTRAINT</code> macro. 73 74 <p><a name="index-offsettable-address-2631"></a><a name="index-g_t_0040samp_007bo_007d-in-constraint-2632"></a><br><dt>‘<samp><span class="samp">o</span></samp>’<dd>A memory operand is allowed, but only if the address is 75<dfn>offsettable</dfn>. This means that adding a small integer (actually, 76the width in bytes of the operand, as determined by its machine mode) 77may be added to the address and the result is also a valid memory 78address. 79 80 <p><a name="index-autoincrement_002fdecrement-addressing-2633"></a>For example, an address which is constant is offsettable; so is an 81address that is the sum of a register and a constant (as long as a 82slightly larger constant is also within the range of address-offsets 83supported by the machine); but an autoincrement or autodecrement 84address is not offsettable. More complicated indirect/indexed 85addresses may or may not be offsettable depending on the other 86addressing modes that the machine supports. 87 88 <p>Note that in an output operand which can be matched by another 89operand, the constraint letter ‘<samp><span class="samp">o</span></samp>’ is valid only when accompanied 90by both ‘<samp><span class="samp"><</span></samp>’ (if the target machine has predecrement addressing) 91and ‘<samp><span class="samp">></span></samp>’ (if the target machine has preincrement addressing). 92 93 <p><a name="index-g_t_0040samp_007bV_007d-in-constraint-2634"></a><br><dt>‘<samp><span class="samp">V</span></samp>’<dd>A memory operand that is not offsettable. In other words, anything that 94would fit the ‘<samp><span class="samp">m</span></samp>’ constraint but not the ‘<samp><span class="samp">o</span></samp>’ constraint. 95 96 <p><a name="index-g_t_0040samp_007b_003c_007d-in-constraint-2635"></a><br><dt>‘<samp><span class="samp"><</span></samp>’<dd>A memory operand with autodecrement addressing (either predecrement or 97postdecrement) is allowed. In inline <code>asm</code> this constraint is only 98allowed if the operand is used exactly once in an instruction that can 99handle the side-effects. Not using an operand with ‘<samp><span class="samp"><</span></samp>’ in constraint 100string in the inline <code>asm</code> pattern at all or using it in multiple 101instructions isn't valid, because the side-effects wouldn't be performed 102or would be performed more than once. Furthermore, on some targets 103the operand with ‘<samp><span class="samp"><</span></samp>’ in constraint string must be accompanied by 104special instruction suffixes like <code>%U0</code> instruction suffix on PowerPC 105or <code>%P0</code> on IA-64. 106 107 <p><a name="index-g_t_0040samp_007b_003e_007d-in-constraint-2636"></a><br><dt>‘<samp><span class="samp">></span></samp>’<dd>A memory operand with autoincrement addressing (either preincrement or 108postincrement) is allowed. In inline <code>asm</code> the same restrictions 109as for ‘<samp><span class="samp"><</span></samp>’ apply. 110 111 <p><a name="index-g_t_0040samp_007br_007d-in-constraint-2637"></a><a name="index-registers-in-constraints-2638"></a><br><dt>‘<samp><span class="samp">r</span></samp>’<dd>A register operand is allowed provided that it is in a general 112register. 113 114 <p><a name="index-constants-in-constraints-2639"></a><a name="index-g_t_0040samp_007bi_007d-in-constraint-2640"></a><br><dt>‘<samp><span class="samp">i</span></samp>’<dd>An immediate integer operand (one with constant value) is allowed. 115This includes symbolic constants whose values will be known only at 116assembly time or later. 117 118 <p><a name="index-g_t_0040samp_007bn_007d-in-constraint-2641"></a><br><dt>‘<samp><span class="samp">n</span></samp>’<dd>An immediate integer operand with a known numeric value is allowed. 119Many systems cannot support assembly-time constants for operands less 120than a word wide. Constraints for these operands should use ‘<samp><span class="samp">n</span></samp>’ 121rather than ‘<samp><span class="samp">i</span></samp>’. 122 123 <p><a name="index-g_t_0040samp_007bI_007d-in-constraint-2642"></a><br><dt>‘<samp><span class="samp">I</span></samp>’, ‘<samp><span class="samp">J</span></samp>’, ‘<samp><span class="samp">K</span></samp>’, <small class="dots">...</small> ‘<samp><span class="samp">P</span></samp>’<dd>Other letters in the range ‘<samp><span class="samp">I</span></samp>’ through ‘<samp><span class="samp">P</span></samp>’ may be defined in 124a machine-dependent fashion to permit immediate integer operands with 125explicit integer values in specified ranges. For example, on the 12668000, ‘<samp><span class="samp">I</span></samp>’ is defined to stand for the range of values 1 to 8. 127This is the range permitted as a shift count in the shift 128instructions. 129 130 <p><a name="index-g_t_0040samp_007bE_007d-in-constraint-2643"></a><br><dt>‘<samp><span class="samp">E</span></samp>’<dd>An immediate floating operand (expression code <code>const_double</code>) is 131allowed, but only if the target floating point format is the same as 132that of the host machine (on which the compiler is running). 133 134 <p><a name="index-g_t_0040samp_007bF_007d-in-constraint-2644"></a><br><dt>‘<samp><span class="samp">F</span></samp>’<dd>An immediate floating operand (expression code <code>const_double</code> or 135<code>const_vector</code>) is allowed. 136 137 <p><a name="index-g_t_0040samp_007bG_007d-in-constraint-2645"></a><a name="index-g_t_0040samp_007bH_007d-in-constraint-2646"></a><br><dt>‘<samp><span class="samp">G</span></samp>’, ‘<samp><span class="samp">H</span></samp>’<dd>‘<samp><span class="samp">G</span></samp>’ and ‘<samp><span class="samp">H</span></samp>’ may be defined in a machine-dependent fashion to 138permit immediate floating operands in particular ranges of values. 139 140 <p><a name="index-g_t_0040samp_007bs_007d-in-constraint-2647"></a><br><dt>‘<samp><span class="samp">s</span></samp>’<dd>An immediate integer operand whose value is not an explicit integer is 141allowed. 142 143 <p>This might appear strange; if an insn allows a constant operand with a 144value not known at compile time, it certainly must allow any known 145value. So why use ‘<samp><span class="samp">s</span></samp>’ instead of ‘<samp><span class="samp">i</span></samp>’? Sometimes it allows 146better code to be generated. 147 148 <p>For example, on the 68000 in a fullword instruction it is possible to 149use an immediate operand; but if the immediate value is between −128 150and 127, better code results from loading the value into a register and 151using the register. This is because the load into the register can be 152done with a ‘<samp><span class="samp">moveq</span></samp>’ instruction. We arrange for this to happen 153by defining the letter ‘<samp><span class="samp">K</span></samp>’ to mean “any integer outside the 154range −128 to 127”, and then specifying ‘<samp><span class="samp">Ks</span></samp>’ in the operand 155constraints. 156 157 <p><a name="index-g_t_0040samp_007bg_007d-in-constraint-2648"></a><br><dt>‘<samp><span class="samp">g</span></samp>’<dd>Any register, memory or immediate integer operand is allowed, except for 158registers that are not general registers. 159 160 <p><a name="index-g_t_0040samp_007bX_007d-in-constraint-2649"></a><br><dt>‘<samp><span class="samp">X</span></samp>’<dd>Any operand whatsoever is allowed. 161 162 <p><a name="index-g_t_0040samp_007b0_007d-in-constraint-2650"></a><a name="index-digits-in-constraint-2651"></a><br><dt>‘<samp><span class="samp">0</span></samp>’, ‘<samp><span class="samp">1</span></samp>’, ‘<samp><span class="samp">2</span></samp>’, <small class="dots">...</small> ‘<samp><span class="samp">9</span></samp>’<dd>An operand that matches the specified operand number is allowed. If a 163digit is used together with letters within the same alternative, the 164digit should come last. 165 166 <p>This number is allowed to be more than a single digit. If multiple 167digits are encountered consecutively, they are interpreted as a single 168decimal integer. There is scant chance for ambiguity, since to-date 169it has never been desirable that ‘<samp><span class="samp">10</span></samp>’ be interpreted as matching 170either operand 1 <em>or</em> operand 0. Should this be desired, one 171can use multiple alternatives instead. 172 173 <p><a name="index-matching-constraint-2652"></a><a name="index-constraint_002c-matching-2653"></a>This is called a <dfn>matching constraint</dfn> and what it really means is 174that the assembler has only a single operand that fills two roles 175which <code>asm</code> distinguishes. For example, an add instruction uses 176two input operands and an output operand, but on most CISC 177machines an add instruction really has only two operands, one of them an 178input-output operand: 179 180 <pre class="smallexample"> addl #35,r12 181</pre> 182 <p>Matching constraints are used in these circumstances. 183More precisely, the two operands that match must include one input-only 184operand and one output-only operand. Moreover, the digit must be a 185smaller number than the number of the operand that uses it in the 186constraint. 187 188 <p><a name="index-load-address-instruction-2654"></a><a name="index-push-address-instruction-2655"></a><a name="index-address-constraints-2656"></a><a name="index-g_t_0040samp_007bp_007d-in-constraint-2657"></a><br><dt>‘<samp><span class="samp">p</span></samp>’<dd>An operand that is a valid memory address is allowed. This is 189for “load address” and “push address” instructions. 190 191 <p><a name="index-address_005foperand-2658"></a>‘<samp><span class="samp">p</span></samp>’ in the constraint must be accompanied by <code>address_operand</code> 192as the predicate in the <code>match_operand</code>. This predicate interprets 193the mode specified in the <code>match_operand</code> as the mode of the memory 194reference for which the address would be valid. 195 196 <p><a name="index-other-register-constraints-2659"></a><a name="index-extensible-constraints-2660"></a><br><dt><var>other-letters</var><dd>Other letters can be defined in machine-dependent fashion to stand for 197particular classes of registers or other arbitrary operand types. 198‘<samp><span class="samp">d</span></samp>’, ‘<samp><span class="samp">a</span></samp>’ and ‘<samp><span class="samp">f</span></samp>’ are defined on the 68000/68020 to stand 199for data, address and floating point registers. 200</dl> 201 202 </body></html> 203 204