Try an indent level for better formatting.
[oota-llvm.git] / docs / LangRef.html
index a45aba896b3adaf8498e4f80faada4b23241222e..bf9464bc7db3497cc3045589918b622906280e62 100644 (file)
           <li><a href="#int_memory_barrier">'<tt>llvm.memory.barrier</tt>' Intrinsic</a></li>
         </ol>
       </li>
+      <li><a href="#int_trampoline">Trampoline Intrinsics</a>
+        <ol>
+          <li><a href="#int_it">'<tt>llvm.init.trampoline</tt>' Intrinsic</a></li>
+          <li><a href="#int_at">'<tt>llvm.adjust.trampoline</tt>' Intrinsic</a></li>
+        </ol>
+      </li>
       <li><a href="#int_general">General intrinsics</a>
         <ol>
           <li><a href="#int_var_annotation">
@@ -290,25 +296,27 @@ the parser.</p>
 
 <div class="doc_text">
 
-<p>LLVM uses three different forms of identifiers, for different
-purposes:</p>
+  <p>LLVM identifiers come in two basic types: global and local. Global
+  identifiers (functions, global variables) begin with the @ character. Local
+  identifiers (register names, types) begin with the % character. Additionally,
+  there are three different formats for identifiers, for different purposes:
 
 <ol>
-  <li>Named values are represented as a string of characters with a '%' prefix.
-  For example, %foo, %DivisionByZero, %a.really.long.identifier.  The actual
-  regular expression used is '<tt>%[a-zA-Z$._][a-zA-Z$._0-9]*</tt>'.
+  <li>Named values are represented as a string of characters with their prefix.
+  For example, %foo, @DivisionByZero, %a.really.long.identifier.  The actual
+  regular expression used is '<tt>[%@][a-zA-Z$._][a-zA-Z$._0-9]*</tt>'.
   Identifiers which require other characters in their names can be surrounded
-  with quotes.  In this way, anything except a <tt>&quot;</tt> character can be used
-  in a name.</li>
+  with quotes.  In this way, anything except a <tt>&quot;</tt> character can 
+  be used in a named value.</li>
 
-  <li>Unnamed values are represented as an unsigned numeric value with a '%'
-  prefix.  For example, %12, %2, %44.</li>
+  <li>Unnamed values are represented as an unsigned numeric value with their
+  prefix.  For example, %12, @2, %44.</li>
 
   <li>Constants, which are described in a <a href="#constants">section about
   constants</a>, below.</li>
 </ol>
 
-<p>LLVM requires that values start with a '%' sign for two reasons: Compilers
+<p>LLVM requires that values start with a prefix for two reasons: Compilers
 don't need to worry about name clashes with reserved words, and the set of
 reserved words may be expanded in the future without penalty.  Additionally,
 unnamed identifiers allow a compiler to quickly come up with a temporary
@@ -321,7 +329,7 @@ languages. There are keywords for different opcodes
  '<tt><a href="#i_ret">ret</a></tt>', etc...), for primitive type names ('<tt><a
 href="#t_void">void</a></tt>', '<tt><a href="#t_primitive">i32</a></tt>', etc...),
 and others.  These reserved words cannot conflict with variable names, because
-none of them start with a '%' character.</p>
+none of them start with a prefix character ('%' or '@').</p>
 
 <p>Here is an example of LLVM code to multiply the integer variable
 '<tt>%X</tt>' by 8:</p>
@@ -805,6 +813,9 @@ a power of 2.</p>
     <dd>This function attribute indicates that the function type does not use
     the unwind instruction and does not allow stack unwinding to propagate
     through it.</dd>
+    <dt><tt>nest</tt></dt>
+    <dd>This indicates that the parameter can be excised using the
+    <a href="#int_trampoline">trampoline intrinsics</a>.</dd>
   </dl>
 
 </div>
@@ -1492,7 +1503,7 @@ following is the syntax for constant expressions:</p>
   <dd>Floating point extend a constant to another type. The size of CST must be 
   smaller or equal to the size of TYPE. Both types must be floating point.</dd>
 
-  <dt><b><tt>fp2uint ( CST to TYPE )</tt></b></dt>
+  <dt><b><tt>fptoui ( CST to TYPE )</tt></b></dt>
   <dd>Convert a floating point constant to the corresponding unsigned integer
   constant. TYPE must be an integer type. CST must be floating point. If the 
   value won't fit in the integer type, the results are undefined.</dd>
@@ -3089,21 +3100,21 @@ used to make a <i>no-op cast</i> because it always changes bits. Use
 
 <h5>Syntax:</h5>
 <pre>
-  &lt;result&gt; = fp2uint &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
+  &lt;result&gt; = fptoui &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
 </pre>
 
 <h5>Overview:</h5>
-<p>The '<tt>fp2uint</tt>' converts a floating point <tt>value</tt> to its
+<p>The '<tt>fptoui</tt>' converts a floating point <tt>value</tt> to its
 unsigned integer equivalent of type <tt>ty2</tt>.
 </p>
 
 <h5>Arguments:</h5>
-<p>The '<tt>fp2uint</tt>' instruction takes a value to cast, which must be a 
+<p>The '<tt>fptoui</tt>' instruction takes a value to cast, which must be a 
 <a href="#t_floating">floating point</a> value, and a type to cast it to, which
 must be an <a href="#t_integer">integer</a> type.</p>
 
 <h5>Semantics:</h5>
-<p> The '<tt>fp2uint</tt>' instruction converts its 
+<p> The '<tt>fptoui</tt>' instruction converts its 
 <a href="#t_floating">floating point</a> operand into the nearest (rounding
 towards zero) unsigned integer value. If the value cannot fit in <tt>ty2</tt>,
 the results are undefined.</p>
@@ -3114,9 +3125,9 @@ If the <tt>value</tt> was non-zero, the i1 result will be <tt>true</tt>.</p>
 
 <h5>Example:</h5>
 <pre>
-  %X = fp2uint double 123.0 to i32      <i>; yields i32:123</i>
-  %Y = fp2uint float 1.0E+300 to i1     <i>; yields i1:true</i>
-  %X = fp2uint float 1.04E+17 to i8     <i>; yields undefined:1</i>
+  %X = fptoui double 123.0 to i32      <i>; yields i32:123</i>
+  %Y = fptoui float 1.0E+300 to i1     <i>; yields i1:true</i>
+  %X = fptoui float 1.04E+17 to i8     <i>; yields undefined:1</i>
 </pre>
 </div>
 
@@ -3705,17 +3716,27 @@ of an intrinsic function.  Additionally, because intrinsic functions are part
 of the LLVM language, it is required if any are added that they be documented
 here.</p>
 
-<p>Some intrinsic functions can be overloaded, i.e., the intrinsic represents
-a family of functions that perform the same operation but on different data
-types. This is most frequent with the integer types. Since LLVM can represent
-over 8 million different integer types, there is a way to declare an intrinsic 
-that can be overloaded based on its arguments. Such an intrinsic will have the
-names of its argument types encoded into its function name, each
-preceded by a period. For example, the <tt>llvm.ctpop</tt> function can take an
-integer of any width. This leads to a family of functions such as 
-<tt>i32 @llvm.ctpop.i8(i8 %val)</tt> and <tt>i32 @llvm.ctpop.i29(i29 %val)</tt>.
-</p>
-
+<p>Some intrinsic functions can be overloaded, i.e., the intrinsic represents 
+a family of functions that perform the same operation but on different data 
+types. Because LLVM can represent over 8 million different integer types, 
+overloading is used commonly to allow an intrinsic function to operate on any 
+integer type. One or more of the argument types or the result type can be 
+overloaded to accept any integer type. Argument types may also be defined as 
+exactly matching a previous argument's type or the result type. This allows an 
+intrinsic function which accepts multiple arguments, but needs all of them to 
+be of the same type, to only be overloaded with respect to a single argument or 
+the result.</p>
+
+<p>Overloaded intrinsics will have the names of its overloaded argument types 
+encoded into its function name, each preceded by a period. Only those types 
+which are overloaded result in a name suffix. Arguments whose type is matched 
+against another type do not. For example, the <tt>llvm.ctpop</tt> function can 
+take an integer of any width and returns an integer of exactly the same integer 
+width. This leads to a family of functions such as
+<tt>i8 @llvm.ctpop.i8(i8 %val)</tt> and <tt>i29 @llvm.ctpop.i29(i29 %val)</tt>.
+Only one type, the return type, is overloaded, and only one type suffix is 
+required. Because the argument's type is matched against the return type, it 
+does not require its own name suffix.</p>
 
 <p>To learn how to add an intrinsic function, please see the 
 <a href="ExtendingLLVM.html">Extending LLVM Guide</a>.
@@ -4549,12 +4570,11 @@ These allow efficient code generation for some algorithms.
 
 <h5>Syntax:</h5>
 <p>This is an overloaded intrinsic function. You can use bswap on any integer
-type that is an even number of bytes (i.e. BitWidth % 16 == 0). Note the suffix
-that includes the type for the result and the operand.
+type that is an even number of bytes (i.e. BitWidth % 16 == 0).
 <pre>
-  declare i16 @llvm.bswap.i16.i16(i16 &lt;id&gt;)
-  declare i32 @llvm.bswap.i32.i32(i32 &lt;id&gt;)
-  declare i64 @llvm.bswap.i64.i64(i64 &lt;id&gt;)
+  declare i16 @llvm.bswap.i16(i16 &lt;id&gt;)
+  declare i32 @llvm.bswap.i32(i32 &lt;id&gt;)
+  declare i64 @llvm.bswap.i64(i64 &lt;id&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -4569,12 +4589,12 @@ byte order.
 <h5>Semantics:</h5>
 
 <p>
-The <tt>llvm.bswap.16.i16</tt> intrinsic returns an i16 value that has the high 
+The <tt>llvm.bswap.i16</tt> intrinsic returns an i16 value that has the high 
 and low byte of the input i16 swapped.  Similarly, the <tt>llvm.bswap.i32</tt> 
 intrinsic returns an i32 value that has the four bytes of the input i32 
 swapped, so that if the input bytes are numbered 0, 1, 2, 3 then the returned 
-i32 will have its bytes in 3, 2, 1, 0 order.  The <tt>llvm.bswap.i48.i48</tt>, 
-<tt>llvm.bswap.i64.i64</tt> and other intrinsics extend this concept to
+i32 will have its bytes in 3, 2, 1, 0 order.  The <tt>llvm.bswap.i48</tt>, 
+<tt>llvm.bswap.i64</tt> and other intrinsics extend this concept to
 additional even-byte lengths (6 bytes, 8 bytes and more, respectively).
 </p>
 
@@ -4591,11 +4611,11 @@ additional even-byte lengths (6 bytes, 8 bytes and more, respectively).
 <p>This is an overloaded intrinsic. You can use llvm.ctpop on any integer bit
 width. Not all targets support all bit widths however.
 <pre>
-  declare i32 @llvm.ctpop.i8 (i8  &lt;src&gt;)
-  declare i32 @llvm.ctpop.i16(i16 &lt;src&gt;)
+  declare i8 @llvm.ctpop.i8 (i8  &lt;src&gt;)
+  declare i16 @llvm.ctpop.i16(i16 &lt;src&gt;)
   declare i32 @llvm.ctpop.i32(i32 &lt;src&gt;)
-  declare i32 @llvm.ctpop.i64(i64 &lt;src&gt;)
-  declare i32 @llvm.ctpop.i256(i256 &lt;src&gt;)
+  declare i64 @llvm.ctpop.i64(i64 &lt;src&gt;)
+  declare i256 @llvm.ctpop.i256(i256 &lt;src&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -4630,11 +4650,11 @@ The '<tt>llvm.ctpop</tt>' intrinsic counts the 1's in a variable.
 <p>This is an overloaded intrinsic. You can use <tt>llvm.ctlz</tt> on any 
 integer bit width. Not all targets support all bit widths however.
 <pre>
-  declare i32 @llvm.ctlz.i8 (i8  &lt;src&gt;)
-  declare i32 @llvm.ctlz.i16(i16 &lt;src&gt;)
+  declare i8 @llvm.ctlz.i8 (i8  &lt;src&gt;)
+  declare i16 @llvm.ctlz.i16(i16 &lt;src&gt;)
   declare i32 @llvm.ctlz.i32(i32 &lt;src&gt;)
-  declare i32 @llvm.ctlz.i64(i64 &lt;src&gt;)
-  declare i32 @llvm.ctlz.i256(i256 &lt;src&gt;)
+  declare i64 @llvm.ctlz.i64(i64 &lt;src&gt;)
+  declare i256 @llvm.ctlz.i256(i256 &lt;src&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -4673,11 +4693,11 @@ of src. For example, <tt>llvm.ctlz(i32 2) = 30</tt>.
 <p>This is an overloaded intrinsic. You can use <tt>llvm.cttz</tt> on any 
 integer bit width. Not all targets support all bit widths however.
 <pre>
-  declare i32 @llvm.cttz.i8 (i8  &lt;src&gt;)
-  declare i32 @llvm.cttz.i16(i16 &lt;src&gt;)
+  declare i8 @llvm.cttz.i8 (i8  &lt;src&gt;)
+  declare i16 @llvm.cttz.i16(i16 &lt;src&gt;)
   declare i32 @llvm.cttz.i32(i32 &lt;src&gt;)
-  declare i32 @llvm.cttz.i64(i64 &lt;src&gt;)
-  declare i32 @llvm.cttz.i256(i256 &lt;src&gt;)
+  declare i64 @llvm.cttz.i64(i64 &lt;src&gt;)
+  declare i256 @llvm.cttz.i256(i256 &lt;src&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -4714,8 +4734,8 @@ of src.  For example, <tt>llvm.cttz(2) = 1</tt>.
 <p>This is an overloaded intrinsic. You can use <tt>llvm.part.select</tt> 
 on any integer bit width.
 <pre>
-  declare i17 @llvm.part.select.i17.i17 (i17 %val, i32 %loBit, i32 %hiBit)
-  declare i29 @llvm.part.select.i29.i29 (i29 %val, i32 %loBit, i32 %hiBit)
+  declare i17 @llvm.part.select.i17 (i17 %val, i32 %loBit, i32 %hiBit)
+  declare i29 @llvm.part.select.i29 (i29 %val, i32 %loBit, i32 %hiBit)
 </pre>
 
 <h5>Overview:</h5>
@@ -4761,8 +4781,8 @@ returned in the reverse order. So, for example, if <tt>X</tt> has the value
 <p>This is an overloaded intrinsic. You can use <tt>llvm.part.set</tt> 
 on any integer bit width.
 <pre>
-  declare i17 @llvm.part.set.i17.i17.i9 (i17 %val, i9 %repl, i32 %lo, i32 %hi)
-  declare i29 @llvm.part.set.i29.i29.i9 (i29 %val, i9 %repl, i32 %lo, i32 %hi)
+  declare i17 @llvm.part.set.i17.i9 (i17 %val, i9 %repl, i32 %lo, i32 %hi)
+  declare i29 @llvm.part.set.i29.i9 (i29 %val, i9 %repl, i32 %lo, i32 %hi)
 </pre>
 
 <h5>Overview:</h5>
@@ -4841,7 +4861,7 @@ Handling</a> document. </p>
   provides an interface to the hardware, not an interface to the programmer. It 
   is aimed at a low enough level to allow any programming models or APIs which 
   need atomic behaviors to map cleanly onto it. It is also modeled primarily on 
-  hardware behavior. Just as hardware provides a "unviresal IR" for source 
+  hardware behavior. Just as hardware provides a "universal IR" for source 
   languages, it also provides a starting point for developing a "universal" 
   atomic operation and synchronization IR.
 </p>
@@ -4873,8 +4893,8 @@ declare i64 @llvm.atomic.lcs.i64.i64p.i64.i64( i64* &lt;ptr&gt;, i64 &lt;cmp&gt;
 </pre>
 <h5>Overview:</h5>
 <p>
-  This loads a value in shared memory and compares it to a given value. If they 
-  are equal, it stores a new value into the shared memory.
+  This loads a value in memory and compares it to a given value. If they are 
+  equal, it stores a new value into the memory.
 </p>
 <h5>Arguments:</h5>
 <p>
@@ -4887,10 +4907,10 @@ declare i64 @llvm.atomic.lcs.i64.i64p.i64.i64( i64* &lt;ptr&gt;, i64 &lt;cmp&gt;
 <h5>Semantics:</h5>
 <p>
   This entire intrinsic must be executed atomically. It first loads the value 
-  in shared memory pointed to by <tt>ptr</tt> and compares it with the value 
-  <tt>cmp</tt>. If they are equal, <tt>val</tt> is stored into the shared 
-  memory. The loaded value is yielded in all cases. This provides the 
-  equivalent of an atomic compare-and-swap operation within the SSA framework.
+  in memory pointed to by <tt>ptr</tt> and compares it with the value 
+  <tt>cmp</tt>. If they are equal, <tt>val</tt> is stored into the memory. The 
+  loaded value is yielded in all cases. This provides the equivalent of an 
+  atomic compare-and-swap operation within the SSA framework.
 </p>
 <h5>Examples:</h5>
 <pre>
@@ -4928,9 +4948,9 @@ declare i64 @llvm.atomic.ls.i64.i64p.i64( i64* &lt;ptr&gt;, i64 &lt;val&gt; )
 </pre>
 <h5>Overview:</h5>
 <p>
-  This intrinsic loads the value stored in shared memory at <tt>ptr</tt> and 
-  yields the value from memory. It then stores the value in <tt>val</tt> in the 
-  shared memory at <tt>ptr</tt>.
+  This intrinsic loads the value stored in memory at <tt>ptr</tt> and yields 
+  the value from memory. It then stores the value in <tt>val</tt> in the memory 
+  at <tt>ptr</tt>.
 </p>
 <h5>Arguments:</h5>
 <p>
@@ -4982,7 +5002,7 @@ declare i64 @llvm.atomic.las.i64.i64p.i64( i64* &lt;ptr&gt;, i64 &lt;delta&gt; )
 </pre>
 <h5>Overview:</h5>
 <p>
-  This intrinsic adds <tt>delta</tt> to the value stored in shared memory at 
+  This intrinsic adds <tt>delta</tt> to the value stored in memory at 
   <tt>ptr</tt>. It yields the original value at <tt>ptr</tt>.
 </p>
 <h5>Arguments:</h5>
@@ -5029,8 +5049,8 @@ declare i64 @llvm.atomic.lss.i64.i64.i64( i64* &lt;ptr&gt;, i64 &lt;delta&gt; )
 </pre>
 <h5>Overview:</h5>
 <p>
-  This intrinsic subtracts <tt>delta</tt> from the value stored in shared 
-  memory at <tt>ptr</tt>. It yields the original value at <tt>ptr</tt>.
+  This intrinsic subtracts <tt>delta</tt> from the value stored in memory at 
+  <tt>ptr</tt>. It yields the original value at <tt>ptr</tt>.
 </p>
 <h5>Arguments:</h5>
 <p>
@@ -5121,6 +5141,105 @@ declare void @llvm.memory.barrier( i1 &lt;ll&gt;, i1 &lt;ls&gt;, i1 &lt;sl&gt;,
 </pre>
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="int_trampoline">Trampoline Intrinsics</a>
+</div>
+
+<div class="doc_text">
+<p>
+  These intrinsics make it possible to excise one parameter, marked with
+  the <tt>nest</tt> attribute, from a function.  The result is a callable
+  function pointer lacking the nest parameter - the caller does not need
+  to provide a value for it.  Instead, the value to use is stored in
+  advance in a "trampoline", a block of memory usually allocated
+  on the stack, which also contains code to splice the nest value into the
+  argument list.  This is used to implement the GCC nested function address
+  extension.
+</p>
+<p>
+  For example, if the function is
+  <tt>i32 f(i8* nest  %c, i32 %x, i32 %y)</tt> then the resulting function
+  pointer has signature <tt>i32 (i32, i32)*</tt>.  It can be created as follows:
+<pre>
+  %tramp1 = alloca [10 x i8], align 4 ; size and alignment only correct for X86
+  %tramp = getelementptr [10 x i8]* %tramp1, i32 0, i32 0
+  call void @llvm.init.trampoline( i8* %tramp, i8* bitcast (i32 (i8* nest , i32, i32)* @f to i8*), i8* %nval )
+  %adj = call i8* @llvm.adjust.trampoline( i8* %tramp )
+  %fp = bitcast i8* %adj to i32 (i32, i32)*
+</pre>
+  The call <tt>%val = call i32 %fp( i32 %x, i32 %y )</tt> is then equivalent to
+  <tt>%val = call i32 %f( i8* %nval, i32 %x, i32 %y )</tt>.
+</p>
+<p>
+  Trampolines are currently only supported on the X86 architecture.
+</p>
+</div>
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="int_it">'<tt>llvm.init.trampoline</tt>' Intrinsic</a>
+</div>
+<div class="doc_text">
+<h5>Syntax:</h5>
+<pre>
+declare void @llvm.init.trampoline(i8* &lt;tramp&gt;, i8* &lt;func&gt;, i8* &lt;nval&gt;)
+</pre>
+<h5>Overview:</h5>
+<p>
+  This initializes the memory pointed to by <tt>tramp</tt> as a trampoline.
+</p>
+<h5>Arguments:</h5>
+<p>
+  The <tt>llvm.init.trampoline</tt> intrinsic takes three arguments, all
+  pointers.  The <tt>tramp</tt> argument must point to a sufficiently large
+  and sufficiently aligned block of memory; this memory is written to by the
+  intrinsic.  Currently LLVM provides no help in determining just how big and
+  aligned the memory needs to be.  The <tt>func</tt> argument must hold a
+  function bitcast to an <tt>i8*</tt>.
+</p>
+<h5>Semantics:</h5>
+<p>
+  The block of memory pointed to by <tt>tramp</tt> is filled with target
+  dependent code, turning it into a function.
+  The new function's signature is the same as that of <tt>func</tt> with
+  any arguments marked with the <tt>nest</tt> attribute removed.  At most
+  one such <tt>nest</tt> argument is allowed, and it must be of pointer
+  type.  Calling the new function is equivalent to calling <tt>func</tt>
+  with the same argument list, but with <tt>nval</tt> used for the missing
+  <tt>nest</tt> argument.
+</p>
+</div>
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="int_at">'<tt>llvm.adjust.trampoline</tt>' Intrinsic</a>
+</div>
+<div class="doc_text">
+<h5>Syntax:</h5>
+<pre>
+declare i8* @llvm.adjust.trampoline(i8* &lt;tramp&gt;)
+</pre>
+<h5>Overview:</h5>
+<p>
+  This intrinsic returns a function pointer suitable for executing
+  the trampoline code pointed to by <tt>tramp</tt>.
+</p>
+<h5>Arguments:</h5>
+<p>
+  The <tt>llvm.adjust.trampoline</tt> takes one argument, a pointer to a
+  trampoline initialized by the
+  <a href="#int_it">'<tt>llvm.init.trampoline</tt>' intrinsic</a>.
+</p>
+<h5>Semantics:</h5>
+<p>
+  A function pointer that can be used to execute the trampoline code in
+  <tt>tramp</tt> is returned.  The returned value should be bitcast to an
+  <a href="#int_trampoline">appropriate function pointer type</a>
+  before being called.
+</p>
+</div>
+
 <!-- ======================================================================= -->
 <div class="doc_subsection">
   <a name="int_general">General Intrinsics</a>