<html>
<head>
<title>LLVM Assembly Language Reference Manual</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="author" content="Chris Lattner">
+ <meta name="description"
+ content="LLVM Assembly Language Reference Manual.">
<link rel="stylesheet" href="llvm.css" type="text/css">
</head>
<li><a href="#t_function">Function Type</a></li>
<li><a href="#t_pointer">Pointer Type</a></li>
<li><a href="#t_struct">Structure Type</a></li>
-<!-- <li><a href="#t_packed" >Packed Type</a> -->
+ <li><a href="#t_packed">Packed Type</a></li>
</ol>
</li>
</ol>
<li><a href="#i_switch">'<tt>switch</tt>' Instruction</a></li>
<li><a href="#i_invoke">'<tt>invoke</tt>' Instruction</a></li>
<li><a href="#i_unwind">'<tt>unwind</tt>' Instruction</a></li>
+ <li><a href="#i_unreachable">'<tt>unreachable</tt>' Instruction</a></li>
</ol>
</li>
<li><a href="#binaryops">Binary Operations</a>
<p>The primitive types are the fundamental building blocks of the LLVM
system. The current set of primitive types are as follows:</p>
-<table border="0" style="align: center">
- <tbody>
- <tr>
- <td>
- <table border="1" cellspacing="0" cellpadding="4" style="align: center">
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <table>
<tbody>
- <tr>
- <td><tt>void</tt></td>
- <td>No value</td>
- </tr>
- <tr>
- <td><tt>ubyte</tt></td>
- <td>Unsigned 8 bit value</td>
- </tr>
- <tr>
- <td><tt>ushort</tt></td>
- <td>Unsigned 16 bit value</td>
- </tr>
- <tr>
- <td><tt>uint</tt></td>
- <td>Unsigned 32 bit value</td>
- </tr>
- <tr>
- <td><tt>ulong</tt></td>
- <td>Unsigned 64 bit value</td>
- </tr>
- <tr>
- <td><tt>float</tt></td>
- <td>32 bit floating point value</td>
- </tr>
- <tr>
- <td><tt>label</tt></td>
- <td>Branch destination</td>
- </tr>
+ <tr><th>Type</th><th>Description</th></tr>
+ <tr><td><tt>void</tt></td><td>No value</td></tr>
+ <tr><td><tt>ubyte</tt></td><td>Unsigned 8 bit value</td></tr>
+ <tr><td><tt>ushort</tt></td><td>Unsigned 16 bit value</td></tr>
+ <tr><td><tt>uint</tt></td><td>Unsigned 32 bit value</td></tr>
+ <tr><td><tt>ulong</tt></td><td>Unsigned 64 bit value</td></tr>
+ <tr><td><tt>float</tt></td><td>32 bit floating point value</td></tr>
+ <tr><td><tt>label</tt></td><td>Branch destination</td></tr>
</tbody>
</table>
- </td>
- <td valign="top">
- <table border="1" cellspacing="0" cellpadding="4">
+ </td>
+ <td class="right">
+ <table>
<tbody>
- <tr>
- <td><tt>bool</tt></td>
- <td>True or False value</td>
- </tr>
- <tr>
- <td><tt>sbyte</tt></td>
- <td>Signed 8 bit value</td>
- </tr>
- <tr>
- <td><tt>short</tt></td>
- <td>Signed 16 bit value</td>
- </tr>
- <tr>
- <td><tt>int</tt></td>
- <td>Signed 32 bit value</td>
- </tr>
- <tr>
- <td><tt>long</tt></td>
- <td>Signed 64 bit value</td>
- </tr>
- <tr>
- <td><tt>double</tt></td>
- <td>64 bit floating point value</td>
- </tr>
+ <tr><th>Type</th><th>Description</th></tr>
+ <tr><td><tt>bool</tt></td><td>True or False value</td></tr>
+ <tr><td><tt>sbyte</tt></td><td>Signed 8 bit value</td></tr>
+ <tr><td><tt>short</tt></td><td>Signed 16 bit value</td></tr>
+ <tr><td><tt>int</tt></td><td>Signed 32 bit value</td></tr>
+ <tr><td><tt>long</tt></td><td>Signed 64 bit value</td></tr>
+ <tr><td><tt>double</tt></td><td>64 bit floating point value</td></tr>
</tbody>
</table>
- </td>
- </tr>
- </tbody>
+ </td>
+ </tr>
</table>
-
</div>
+
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection"> <a name="t_classifications">Type
Classifications</a> </div>
<table border="1" cellspacing="0" cellpadding="4">
<tbody>
+ <tr><th>Classification</th><th>Types</th></tr>
<tr>
<td><a name="t_signed">signed</a></td>
<td><tt>sbyte, short, int, long, float, double</tt></td>
</tr>
<tr>
<td><a name="t_integral">integral</a></td>
- <td><tt>bool, ubyte, sbyte, ushort, short, uint, int, ulong, long</tt></td>
+ <td><tt>bool, ubyte, sbyte, ushort, short, uint, int, ulong, long</tt>
+ </td>
</tr>
<tr>
<td><a name="t_floating">floating point</a></td>
</tr>
<tr>
<td><a name="t_firstclass">first class</a></td>
- <td><tt>bool, ubyte, sbyte, ushort, short,<br>
-uint, int, ulong, long, float, double, <a href="#t_pointer">pointer</a></tt></td>
+ <td><tt>bool, ubyte, sbyte, ushort, short, uint, int, ulong, long,<br>
+ float, double, <a href="#t_pointer">pointer</a>,
+ <a href="#t_packed">packed</a></tt></td>
</tr>
</tbody>
</table>
<p>The number of elements is a constant integer value, elementtype may
be any type with a size.</p>
<h5>Examples:</h5>
-<p> <tt>[40 x int ]</tt>: Array of 40 integer values.<br>
-<tt>[41 x int ]</tt>: Array of 41 integer values.<br>
-<tt>[40 x uint]</tt>: Array of 40 unsigned integer values.</p>
-<p> </p>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt>[40 x int ]</tt><br/>
+ <tt>[41 x int ]</tt><br/>
+ <tt>[40 x uint]</tt><br/>
+ </td>
+ <td class="left">
+ Array of 40 integer values.<br/>
+ Array of 41 integer values.<br/>
+ Array of 40 unsigned integer values.<br/>
+ </td>
+ </tr>
+</table>
<p>Here are some examples of multidimensional arrays:</p>
-
-<table border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td><tt>[3 x [4 x int]]</tt></td>
- <td>: 3x4 array integer values.</td>
- </tr>
- <tr>
- <td><tt>[12 x [10 x float]]</tt></td>
- <td>: 12x10 array of single precision floating point values.</td>
- </tr>
- <tr>
- <td><tt>[2 x [3 x [4 x uint]]]</tt></td>
- <td>: 2x3x4 array of unsigned integer values.</td>
- </tr>
- </tbody>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt>[3 x [4 x int]]</tt><br/>
+ <tt>[12 x [10 x float]]</tt><br/>
+ <tt>[2 x [3 x [4 x uint]]]</tt><br/>
+ </td>
+ <td class="left">
+ 3x4 array integer values.<br/>
+ 12x10 array of single precision floating point values.<br/>
+ 2x3x4 array of unsigned integer values.<br/>
+ </td>
+ </tr>
</table>
-
</div>
+
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection"> <a name="t_function">Function Type</a> </div>
<div class="doc_text">
</p>
<h5>Syntax:</h5>
<pre> <returntype> (<parameter list>)<br></pre>
-<p>Where '<tt><parameter list></tt>' is a comma-separated list of
-type specifiers. Optionally, the parameter list may include a type <tt>...</tt>,
+<p>Where '<tt><parameter list></tt>' is a comma-separated list of type
+specifiers. Optionally, the parameter list may include a type <tt>...</tt>,
which indicates that the function takes a variable number of arguments.
Variable argument functions can access their arguments with the <a
href="#int_varargs">variable argument handling intrinsic</a> functions.</p>
<h5>Examples:</h5>
-
-<table border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td><tt>int (int)</tt></td>
- <td>: function taking an <tt>int</tt>, returning an <tt>int</tt></td>
- </tr>
- <tr>
- <td><tt>float (int, int *) *</tt></td>
- <td>: <a href="#t_pointer">Pointer</a> to a function that takes
-an <tt>int</tt> and a <a href="#t_pointer">pointer</a> to <tt>int</tt>,
-returning <tt>float</tt>.</td>
- </tr>
- <tr>
- <td><tt>int (sbyte *, ...)</tt></td>
- <td>: A vararg function that takes at least one <a
- href="#t_pointer">pointer</a> to <tt>sbyte</tt> (signed char in C),
-which returns an integer. This is the signature for <tt>printf</tt>
-in LLVM.</td>
- </tr>
- </tbody>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt>int (int)</tt> <br/>
+ <tt>float (int, int *) *</tt><br/>
+ <tt>int (sbyte *, ...)</tt><br/>
+ </td>
+ <td class="left">
+ function taking an <tt>int</tt>, returning an <tt>int</tt><br/>
+ <a href="#t_pointer">Pointer</a> to a function that takes an
+ <tt>int</tt> and a <a href="#t_pointer">pointer</a> to <tt>int</tt>,
+ returning <tt>float</tt>.<br/>
+ A vararg function that takes at least one <a href="#t_pointer">pointer</a>
+ to <tt>sbyte</tt> (signed char in C), which returns an integer. This is
+ the signature for <tt>printf</tt> in LLVM.<br/>
+ </td>
+ </tr>
</table>
</div>
<h5>Syntax:</h5>
<pre> { <type list> }<br></pre>
<h5>Examples:</h5>
-
-<table border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td><tt>{ int, int, int }</tt></td>
- <td>: a triple of three <tt>int</tt> values</td>
- </tr>
- <tr>
- <td><tt>{ float, int (int) * }</tt></td>
- <td>: A pair, where the first element is a <tt>float</tt> and the
-second element is a <a href="#t_pointer">pointer</a> to a <a
- href="#t_function">function</a> that takes an <tt>int</tt>, returning
-an <tt>int</tt>.</td>
- </tr>
- </tbody>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt>{ int, int, int }</tt><br/>
+ <tt>{ float, int (int) * }</tt><br/>
+ </td>
+ <td class="left">
+ a triple of three <tt>int</tt> values<br/>
+ A pair, where the first element is a <tt>float</tt> and the second element
+ is a <a href="#t_pointer">pointer</a> to a <a href="#t_function">function</a>
+ that takes an <tt>int</tt>, returning an <tt>int</tt>.<br/>
+ </td>
+ </tr>
</table>
-
</div>
+
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection"> <a name="t_pointer">Pointer Type</a> </div>
<div class="doc_text">
<h5>Syntax:</h5>
<pre> <type> *<br></pre>
<h5>Examples:</h5>
-
-<table border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td><tt>[4x int]*</tt></td>
- <td>: <a href="#t_pointer">pointer</a> to <a href="#t_array">array</a>
-of four <tt>int</tt> values</td>
- </tr>
- <tr>
- <td><tt>int (int *) *</tt></td>
- <td>: A <a href="#t_pointer">pointer</a> to a <a
- href="#t_function">function</a> that takes an <tt>int</tt>, returning
-an <tt>int</tt>.</td>
- </tr>
- </tbody>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt>[4x int]*</tt><br/>
+ <tt>int (int *) *</tt><br/>
+ </td>
+ <td class="left">
+ A <a href="#t_pointer">pointer</a> to <a href="#t_array">array</a> of
+ four <tt>int</tt> values<br/>
+ A <a href="#t_pointer">pointer</a> to a <a
+ href="#t_function">function</a> that takes an <tt>int</tt>, returning an
+ <tt>int</tt>.<br/>
+ </td>
+ </tr>
</table>
-
-</div>
-<!-- _______________________________________________________________________ --><!--
-<div class="doc_subsubsection">
- <a name="t_packed">Packed Type</a>
</div>
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"> <a name="t_packed">Packed Type</a> </div>
<div class="doc_text">
-
-Mention/decide that packed types work with saturation or not. Maybe have a packed+saturated type in addition to just a packed type.<p>
-
-Packed types should be 'nonsaturated' because standard data types are not saturated. Maybe have a saturated packed type?<p>
-
+<h5>Overview:</h5>
+<p>A packed type is a simple derived type that represents a vector
+of elements. Packed types are used when multiple primitive data
+are operated in parallel using a single instruction (SIMD).
+A packed type requires a size (number of
+elements) and an underlying primitive data type. Packed types are
+considered <a href="#t_firstclass">first class</a>.</p>
+<h5>Syntax:</h5>
+<pre> < <# elements> x <elementtype> ><br></pre>
+<p>The number of elements is a constant integer value, elementtype may
+be any integral or floating point type.</p>
+<h5>Examples:</h5>
+<table class="layout">
+ <tr class="layout">
+ <td class="left">
+ <tt><4 x int></tt><br/>
+ <tt><8 x float></tt><br/>
+ <tt><2 x uint></tt><br/>
+ </td>
+ <td class="left">
+ Packed vector of 4 integer values.<br/>
+ Packed vector of 8 floating-point values.<br/>
+ Packed vector of 2 unsigned integer values.<br/>
+ </td>
+ </tr>
+</table>
</div>
---><!-- *********************************************************************** -->
+<!-- *********************************************************************** -->
<div class="doc_section"> <a name="highlevel">High Level Structure</a> </div>
-<!-- *********************************************************************** --><!-- ======================================================================= -->
-<div class="doc_subsection"> <a name="modulestructure">Module Structure</a> </div>
+<!-- *********************************************************************** -->
+<!-- ======================================================================= -->
+<div class="doc_subsection"> <a name="modulestructure">Module Structure</a>
+</div>
<div class="doc_text">
<p>LLVM programs are composed of "Module"s, each of which is a
translation unit of the input programs. Each module consists of
<p>There are five different terminator instructions: the '<a
href="#i_ret"><tt>ret</tt></a>' instruction, the '<a href="#i_br"><tt>br</tt></a>'
instruction, the '<a href="#i_switch"><tt>switch</tt></a>' instruction,
-the '<a href="#i_invoke"><tt>invoke</tt></a>' instruction, and the '<a
- href="#i_unwind"><tt>unwind</tt></a>' instruction.</p>
+the '<a href="#i_invoke"><tt>invoke</tt></a>' instruction, the '<a
+ href="#i_unwind"><tt>unwind</tt></a>' instruction, and the '<a
+ href="#i_unreachable"><tt>unreachable</tt></a>' instruction.</p>
</div>
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection"> <a name="i_ret">'<tt>ret</tt>'
<pre> %retval = invoke int %Test(int 15)<br> to label %Continue<br> except label %TestCleanup <i>; {int}:retval set</i>
</pre>
</div>
+
+
<!-- _______________________________________________________________________ -->
+
<div class="doc_subsubsection"> <a name="i_unwind">'<tt>unwind</tt>'
Instruction</a> </div>
+
+<div class="doc_text">
+
+<h5>Syntax:</h5>
+<pre>
+ unwind
+</pre>
+
+<h5>Overview:</h5>
+
+<p>The '<tt>unwind</tt>' instruction unwinds the stack, continuing control flow
+at the first callee in the dynamic call stack which used an <a
+href="#i_invoke"><tt>invoke</tt></a> instruction to perform the call. This is
+primarily used to implement exception handling.</p>
+
+<h5>Semantics:</h5>
+
+<p>The '<tt>unwind</tt>' intrinsic causes execution of the current function to
+immediately halt. The dynamic call stack is then searched for the first <a
+href="#i_invoke"><tt>invoke</tt></a> instruction on the call stack. Once found,
+execution continues at the "exceptional" destination block specified by the
+<tt>invoke</tt> instruction. If there is no <tt>invoke</tt> instruction in the
+dynamic call chain, undefined behavior results.</p>
+</div>
+
+<!-- _______________________________________________________________________ -->
+
+<div class="doc_subsubsection"> <a name="i_unreachable">'<tt>unreachable</tt>'
+Instruction</a> </div>
+
<div class="doc_text">
+
<h5>Syntax:</h5>
-<pre> unwind<br></pre>
+<pre>
+ unreachable
+</pre>
+
<h5>Overview:</h5>
-<p>The '<tt>unwind</tt>' instruction unwinds the stack, continuing
-control flow at the first callee in the dynamic call stack which used
-an <a href="#i_invoke"><tt>invoke</tt></a> instruction to perform the
-call. This is primarily used to implement exception handling.</p>
+
+<p>The '<tt>unreachable</tt>' instruction has no defined semantics. This
+instruction is used to inform the optimizer that a particular portion of the
+code is not reachable. This can be used to indicate that the code after a
+no-return function cannot be reached, and other facts.</p>
+
<h5>Semantics:</h5>
-<p>The '<tt>unwind</tt>' intrinsic causes execution of the current
-function to immediately halt. The dynamic call stack is then searched
-for the first <a href="#i_invoke"><tt>invoke</tt></a> instruction on
-the call stack. Once found, execution continues at the "exceptional"
-destination block specified by the <tt>invoke</tt> instruction. If
-there is no <tt>invoke</tt> instruction in the dynamic call chain,
-undefined behavior results.</p>
+
+<p>The '<tt>unreachable</tt>' instruction has no defined semantics.</p>
</div>
+
+
+
<!-- ======================================================================= -->
<div class="doc_subsection"> <a name="binaryops">Binary Operations</a> </div>
<div class="doc_text">
<p>Binary operators are used to do most of the computation in a
program. They require two operands, execute an operation on them, and
-produce a single value. The result value of a binary operator is not
+produce a single value. Although, that single value might represent
+multiple data, as is the case with the <a href="#t_packed">packed</a> data type.
+The result value of a binary operator is not
necessarily the same type as its operands.</p>
<p>There are several different binary operators:</p>
</div>
<p>The '<tt>add</tt>' instruction returns the sum of its two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>add</tt>' instruction must be either <a
- href="#t_integer">integer</a> or <a href="#t_floating">floating point</a>
-values. Both arguments must have identical types.</p>
+ href="#t_integer">integer</a> or <a href="#t_floating">floating point</a> values.
+ This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+Both arguments must have identical types.</p>
<h5>Semantics:</h5>
<p>The value produced is the integer or floating point sum of the two
operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>sub</tt>' instruction must be either <a
href="#t_integer">integer</a> or <a href="#t_floating">floating point</a>
-values. Both arguments must have identical types.</p>
+values.
+This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+Both arguments must have identical types.</p>
<h5>Semantics:</h5>
<p>The value produced is the integer or floating point difference of
the two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>mul</tt>' instruction must be either <a
href="#t_integer">integer</a> or <a href="#t_floating">floating point</a>
-values. Both arguments must have identical types.</p>
+values.
+This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+Both arguments must have identical types.</p>
<h5>Semantics:</h5>
<p>The value produced is the integer or floating point product of the
two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>div</tt>' instruction must be either <a
href="#t_integer">integer</a> or <a href="#t_floating">floating point</a>
-values. Both arguments must have identical types.</p>
+values.
+This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+Both arguments must have identical types.</p>
<h5>Semantics:</h5>
<p>The value produced is the integer or floating point quotient of the
two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>rem</tt>' instruction must be either <a
href="#t_integer">integer</a> or <a href="#t_floating">floating point</a>
-values. Both arguments must have identical types.</p>
+values.
+This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+Both arguments must have identical types.</p>
<h5>Semantics:</h5>
<p>This returns the <i>remainder</i> of a division (where the result
has the same sign as the divisor), not the <i>modulus</i> (where the
%RT = type { sbyte, [10 x [20 x int]], sbyte }
%ST = type { int, double, %RT }
- int* "foo"(%ST* %s) {
- %reg = getelementptr %ST* %s, int 1, uint 2, uint 1, int 5, int 13<br>
+ implementation
+
+ int* %foo(%ST* %s) {
+ entry:
+ %reg = getelementptr %ST* %s, int 1, uint 2, uint 1, int 5, int 13
ret int* %reg
}
</pre>
<h5>Example:</h5>
<pre> %retval = call int %test(int %argc)<br> call int(sbyte*, ...) *%printf(sbyte* %msg, int 12, sbyte 42);<br></pre>
</div>
+
<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"> <a name="i_vanext">'<tt>vanext</tt>'
-Instruction</a> </div>
+<div class="doc_subsubsection">
+ <a name="i_vanext">'<tt>vanext</tt>' Instruction</a>
+</div>
+
<div class="doc_text">
+
<h5>Syntax:</h5>
-<pre> <resultarglist> = vanext <va_list> <arglist>, <argty><br></pre>
+
+<pre>
+ <resultarglist> = vanext <va_list> <arglist>, <argty>
+</pre>
+
<h5>Overview:</h5>
+
<p>The '<tt>vanext</tt>' instruction is used to access arguments passed
through the "variable argument" area of a function call. It is used to
implement the <tt>va_arg</tt> macro in C.</p>
+
<h5>Arguments:</h5>
-<p>This instruction takes a <tt>valist</tt> value and the type of the
-argument. It returns another <tt>valist</tt>.</p>
+
+<p>This instruction takes a <tt>va_list</tt> value and the type of the
+argument. It returns another <tt>va_list</tt>. The actual type of
+<tt>va_list</tt> may be defined differently for different targets. Most targets
+use a <tt>va_list</tt> type of <tt>sbyte*</tt> or some other pointer type.</p>
+
<h5>Semantics:</h5>
-<p>The '<tt>vanext</tt>' instruction advances the specified <tt>valist</tt>
+
+<p>The '<tt>vanext</tt>' instruction advances the specified <tt>va_list</tt>
past an argument of the specified type. In conjunction with the <a
href="#i_vaarg"><tt>vaarg</tt></a> instruction, it is used to implement
the <tt>va_arg</tt> macro available in C. For more information, see
the variable argument handling <a href="#int_varargs">Intrinsic
Functions</a>.</p>
+
<p>It is legal for this instruction to be called in a function which
does not take a variable number of arguments, for example, the <tt>vfprintf</tt>
function.</p>
+
<p><tt>vanext</tt> is an LLVM instruction instead of an <a
- href="#intrinsics">intrinsic function</a> because it takes an type as
-an argument.</p>
+href="#intrinsics">intrinsic function</a> because it takes a type as an
+argument. The type refers to the current argument in the <tt>va_list</tt>, it
+tells the compiler how far on the stack it needs to advance to find the next
+argument</p>
+
<h5>Example:</h5>
+
<p>See the <a href="#int_varargs">variable argument processing</a>
section.</p>
+
</div>
+
<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"> <a name="i_vaarg">'<tt>vaarg</tt>'
-Instruction</a> </div>
+<div class="doc_subsubsection">
+ <a name="i_vaarg">'<tt>vaarg</tt>' Instruction</a>
+</div>
+
<div class="doc_text">
+
<h5>Syntax:</h5>
-<pre> <resultval> = vaarg <va_list> <arglist>, <argty><br></pre>
+
+<pre>
+ <resultval> = vaarg <va_list> <arglist>, <argty>
+</pre>
+
<h5>Overview:</h5>
-<p>The '<tt>vaarg</tt>' instruction is used to access arguments passed
-through the "variable argument" area of a function call. It is used to
-implement the <tt>va_arg</tt> macro in C.</p>
+
+<p>The '<tt>vaarg</tt>' instruction is used to access arguments passed through
+the "variable argument" area of a function call. It is used to implement the
+<tt>va_arg</tt> macro in C.</p>
+
<h5>Arguments:</h5>
-<p>This instruction takes a <tt>valist</tt> value and the type of the
-argument. It returns a value of the specified argument type.</p>
+
+<p>This instruction takes a <tt>va_list</tt> value and the type of the
+argument. It returns a value of the specified argument type. Again, the actual
+type of <tt>va_list</tt> is target specific.</p>
+
<h5>Semantics:</h5>
-<p>The '<tt>vaarg</tt>' instruction loads an argument of the specified
-type from the specified <tt>va_list</tt>. In conjunction with the <a
- href="#i_vanext"><tt>vanext</tt></a> instruction, it is used to
-implement the <tt>va_arg</tt> macro available in C. For more
-information, see the variable argument handling <a href="#int_varargs">Intrinsic
-Functions</a>.</p>
-<p>It is legal for this instruction to be called in a function which
-does not take a variable number of arguments, for example, the <tt>vfprintf</tt>
+
+<p>The '<tt>vaarg</tt>' instruction loads an argument of the specified type from
+the specified <tt>va_list</tt>. In conjunction with the <a
+href="#i_vanext"><tt>vanext</tt></a> instruction, it is used to implement the
+<tt>va_arg</tt> macro available in C. For more information, see the variable
+argument handling <a href="#int_varargs">Intrinsic Functions</a>.</p>
+
+<p>It is legal for this instruction to be called in a function which does not
+take a variable number of arguments, for example, the <tt>vfprintf</tt>
function.</p>
+
<p><tt>vaarg</tt> is an LLVM instruction instead of an <a
- href="#intrinsics">intrinsic function</a> because it takes an type as
-an argument.</p>
+href="#intrinsics">intrinsic function</a> because it takes an type as an
+argument.</p>
+
<h5>Example:</h5>
-<p>See the <a href="#int_varargs">variable argument processing</a>
-section.</p>
+
+<p>See the <a href="#int_varargs">variable argument processing</a> section.</p>
+
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<h5>Syntax:</h5>
-<pre> call va_list ()* %llvm.va_start()<br></pre>
+<pre> call <va_list> ()* %llvm.va_start()<br></pre>
<h5>Overview:</h5>
<p>The '<tt>llvm.va_start</tt>' intrinsic returns a new <tt><arglist></tt>
for subsequent use by the variable argument intrinsics.</p>
<div class="doc_text">
<h5>Syntax:</h5>
-<pre> call void (va_list)* %llvm.va_end(va_list <arglist>)<br></pre>
+<pre> call void (<va_list>)* %llvm.va_end(<va_list> <arglist>)<br></pre>
<h5>Overview:</h5>
<p>The '<tt>llvm.va_end</tt>' intrinsic destroys <tt><arglist></tt>
which has been initialized previously with <tt><a href="#i_va_start">llvm.va_start</a></tt>
<h5>Syntax:</h5>
<pre>
- call va_list (va_list)* %llvm.va_copy(va_list <destarglist>)
+ call <va_list> (<va_list>)* %llvm.va_copy(<va_list> <destarglist>)
</pre>
<h5>Overview:</h5>