<li><a href="#functionstructure">Functions</a></li>
<li><a href="#paramattrs">Parameter Attributes</a></li>
<li><a href="#moduleasm">Module-Level Inline Assembly</a></li>
+ <li><a href="#datalayout">Data Layout</a></li>
</ol>
</li>
<li><a href="#typesystem">Type System</a>
<li><a href="#t_pointer">Pointer Type</a></li>
<li><a href="#t_struct">Structure Type</a></li>
<li><a href="#t_pstruct">Packed Structure Type</a></li>
- <li><a href="#t_packed">Packed Type</a></li>
+ <li><a href="#t_vector">Vector Type</a></li>
<li><a href="#t_opaque">Opaque Type</a></li>
</ol>
</li>
</li>
<li><a href="#bitwiseops">Bitwise Binary Operations</a>
<ol>
- <li><a href="#i_and">'<tt>and</tt>' Instruction</a></li>
- <li><a href="#i_or">'<tt>or</tt>' Instruction</a></li>
- <li><a href="#i_xor">'<tt>xor</tt>' Instruction</a></li>
<li><a href="#i_shl">'<tt>shl</tt>' Instruction</a></li>
<li><a href="#i_lshr">'<tt>lshr</tt>' Instruction</a></li>
<li><a href="#i_ashr">'<tt>ashr</tt>' Instruction</a></li>
+ <li><a href="#i_and">'<tt>and</tt>' Instruction</a></li>
+ <li><a href="#i_or">'<tt>or</tt>' Instruction</a></li>
+ <li><a href="#i_xor">'<tt>xor</tt>' Instruction</a></li>
</ol>
</li>
<li><a href="#vectorops">Vector Operations</a>
</ol>
</li>
<li><a href="#int_debugger">Debugger intrinsics</a></li>
+ <li><a href="#int_eh">Exception Handling intrinsics</a></li>
</ol>
</li>
</ol>
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>"</tt> character can be used
+ with quotes. In this way, anything except a <tt>"</tt> character can be used
in a name.</li>
<li>Unnamed values are represented as an unsigned numeric value with a '%'
an internal global value may cause the internal to be renamed as necessary to
avoid collisions. Because the symbol is internal to the module, all
references can be updated. This corresponds to the notion of the
- '<tt>static</tt>' keyword in C, or the idea of "anonymous namespaces" in C++.
+ '<tt>static</tt>' keyword in C.
</dd>
<dt><tt><b><a name="linkage_linkonce">linkonce</a></b></tt>: </dt>
- <dd>"<tt>linkonce</tt>" linkage is similar to <tt>internal</tt> linkage, with
- the twist that linking together two modules defining the same
- <tt>linkonce</tt> globals will cause one of the globals to be discarded. This
- is typically used to implement inline functions. Unreferenced
- <tt>linkonce</tt> globals are allowed to be discarded.
+ <dd>Globals with "<tt>linkonce</tt>" linkage are merged with other globals of
+ the same name when linkage occurs. This is typically used to implement
+ inline functions, templates, or other code which must be generated in each
+ translation unit that uses it. Unreferenced <tt>linkonce</tt> globals are
+ allowed to be discarded.
</dd>
<dt><tt><b><a name="linkage_weak">weak</a></b></tt>: </dt>
<dd>"<tt>weak</tt>" linkage is exactly the same as <tt>linkonce</tt> linkage,
except that unreferenced <tt>weak</tt> globals may not be discarded. This is
- used to implement constructs in C such as "<tt>i32 X;</tt>" at global scope.
+ used for globals that may be emitted in multiple translation units, but that
+ are not guaranteed to be emitted into every translation unit that uses them.
+ One example of this are common globals in C, such as "<tt>int X;</tt>" at
+ global scope.
</dd>
<dt><tt><b><a name="linkage_appending">appending</a></b></tt>: </dt>
"sections" with identical names when .o files are linked.
</dd>
+ <dt><tt><b><a name="linkage_externweak">extern_weak</a></b></tt>: </dt>
+ <dd>The semantics of this linkage follow the ELF model: the symbol is weak
+ until linked, if not linked, the symbol becomes null instead of being an
+ undefined reference.
+ </dd>
+</dl>
+
<dt><tt><b><a name="linkage_external">externally visible</a></b></tt>:</dt>
<dd>If none of the above identifiers are used, the global is externally
external symbol references.
</dd>
- <dt><tt><b><a name="linkage_externweak">extern_weak</a></b></tt>: </dt>
-
- <dd>"<tt>extern_weak</tt>" TBD
- </dd>
-
<p>
The next two types of linkage are targeted for Microsoft Windows platform
only. They are designed to support importing (exporting) symbols from (to)
DLLs.
</p>
+ <dl>
<dt><tt><b><a name="linkage_dllimport">dllimport</a></b></tt>: </dt>
<dd>"<tt>dllimport</tt>" linkage causes the compiler to reference a function
</dl>
-<p><a name="linkage_external">For example, since the "<tt>.LC0</tt>"
+<p><a name="linkage_external"></a>For example, since the "<tt>.LC0</tt>"
variable is defined to be internal, if another module defined a "<tt>.LC0</tt>"
variable and was linked with this one, one of the two would be renamed,
preventing a collision. Since "<tt>main</tt>" and "<tt>puts</tt>" are
outside of the current module.</p>
<p>It is illegal for a function <i>declaration</i>
to have any linkage type other than "externally visible", <tt>dllimport</tt>,
-or <tt>extern_weak</tt>.</a></p>
+or <tt>extern_weak</tt>.</p>
</div>
prototype and implemented declaration of the function (as does normal C).
</dd>
- <dt><b>"<tt>csretcc</tt>" - The C struct return calling convention</b>:</dt>
-
- <dd>This calling convention matches the target C calling conventions, except
- that functions with this convention are required to take a pointer as their
- first argument, and the return type of the function must be void. This is
- used for C functions that return aggregates by-value. In this case, the
- function has been transformed to take a pointer to the struct as the first
- argument to the function. For targets where the ABI specifies specific
- behavior for structure-return calls, the calling convention can be used to
- distinguish between struct return functions and other functions that take a
- pointer to a struct as the first argument.
- </dd>
-
<dt><b>"<tt>fastcc</tt>" - The fast calling convention</b>:</dt>
<dd>This calling convention attempts to make calls as fast as possible
</div>
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+ <a name="visibility">Visibility Styles</a>
+</div>
+
+<div class="doc_text">
+
+<p>
+All Global Variables and Functions have one of the following visibility styles:
+</p>
+
+<dl>
+ <dt><b>"<tt>default</tt>" - Default style</b>:</dt>
+
+ <dd>On ELF, default visibility means that the declaration is visible to other
+ modules and, in shared libraries, means that the declared entity may be
+ overridden. On Darwin, default visibility means that the declaration is
+ visible to other modules. Default visibility corresponds to "external
+ linkage" in the language.
+ </dd>
+
+ <dt><b>"<tt>hidden</tt>" - Hidden style</b>:</dt>
+
+ <dd>Two declarations of an object with hidden visibility refer to the same
+ object if they are in the same shared object. Usually, hidden visibility
+ indicates that the symbol will not be placed into the dynamic symbol table,
+ so no other module (executable or shared library) can reference it
+ directly.
+ </dd>
+
+</dl>
+
+</div>
+
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="globalvars">Global Variables</a>
global is forced to have at least that much alignment. All alignments must be
a power of 2.</p>
+<p>For example, the following defines a global with an initializer, section,
+ and alignment:</p>
+
+<pre>
+ %G = constant float 1.0, section "foo", align 4
+</pre>
+
</div>
<p>LLVM function definitions consist of the "<tt>define</tt>" keyord,
an optional <a href="#linkage">linkage type</a>, an optional
+<a href="#visibility">visibility style</a>, an optional
<a href="#callingconv">calling convention</a>, a return type, an optional
<a href="#paramattrs">parameter attribute</a> for the return type, a function
name, a (possibly empty) argument list (each with optional
-<a href="#paramattrs">parameter attributes</a>), an optional section, an
-optional alignment, an opening curly brace, a list of basic blocks, and a
-closing curly brace. LLVM function declarations
-consist of the "<tt>declare</tt>" keyword, an optional <a
- href="#callingconv">calling convention</a>, a return type, an optional
+<a href="#paramattrs">parameter attributes</a>), an optional section, an
+optional alignment, an opening curly brace, a list of basic blocks, and a
+closing curly brace.
+
+LLVM function declarations consist of the "<tt>declare</tt>" keyword, an
+optional <a href="#linkage">linkage type</a>, an optional
+<a href="#visibility">visibility style</a>, an optional
+<a href="#callingconv">calling convention</a>, a return type, an optional
<a href="#paramattrs">parameter attribute</a> for the return type, a function
name, a possibly empty list of arguments, and an optional alignment.</p>
type so two functions types that differ only by the parameter attributes
are different function types.</p>
- <p>Parameter attributes consist of an at sign (@) followed by either a single
- keyword or a comma separate list of keywords enclosed in parentheses. For
- example:<pre>
- %someFunc = i16 @zext (i8 @(sext) %someParam)
- %someFunc = i16 @zext (i8 @zext %someParam)</pre>
- Note that the two function types above are unique because the parameter
- has a different attribute (@sext in the first one, @zext in the second).</p>
-
- <p>Currently, only the following parameter attributes are defined:
+ <p>Parameter attributes are simple keywords that follow the type specified. If
+ multiple parameter attributes are needed, they are space separated. For
+ example:</p><pre>
+ %someFunc = i16 (i8 sext %someParam) zext
+ %someFunc = i16 (i8 zext %someParam) zext</pre>
+ <p>Note that the two function types above are unique because the parameter has
+ a different attribute (sext in the first one, zext in the second). Also note
+ that the attribute for the function result (zext) comes immediately after the
+ argument list.</p>
+
+ <p>Currently, only the following parameter attributes are defined:</p>
<dl>
- <dt><tt>@zext</tt></dt>
+ <dt><tt>zext</tt></dt>
<dd>This indicates that the parameter should be zero extended just before
a call to this function.</dd>
- <dt><tt>@sext</tt></dt>
+ <dt><tt>sext</tt></dt>
<dd>This indicates that the parameter should be sign extended just before
a call to this function.</dd>
- </dl></p>
+ <dt><tt>inreg</tt></dt>
+ <dd>This indicates that the parameter should be placed in register (if
+ possible) during assembling function call. Support for this attribute is
+ target-specific</dd>
+ <dt><tt>sret</tt></dt>
+ <dd>This indicates that the parameter specifies the address of a structure
+ that is the return value of the function in the source program.</dd>
+ <dt><tt>noreturn</tt></dt>
+ <dd>This function attribute indicates that the function never returns. This
+ indicates to LLVM that every call to this function should be treated as if
+ an <tt>unreachable</tt> instruction immediately followed the call.</dd>
+ <dt><tt>nounwind</tt></dt>
+ <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>
+ </dl>
- <p>The current motivation for parameter attributes is to enable the sign and
- zero extend information necessary for the C calling convention to be passed
- from the front end to LLVM. The <tt>@zext</tt> and <tt>@sext</tt> attributes
- are used by the code generator to perform the required extension. However,
- parameter attributes are an orthogonal feature to calling conventions and
- may be used for other purposes in the future.</p>
</div>
<!-- ======================================================================= -->
</p>
</div>
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+ <a name="datalayout">Data Layout</a>
+</div>
+
+<div class="doc_text">
+<p>A module may specify a target specific data layout string that specifies how
+data is to be laid out in memory. The syntax for the data layout is simply:<br/>
+<pre> target datalayout = "<i>layout specification</i>"
+</pre>
+The <i>layout specification</i> consists of a list of specifications separated
+by the minus sign character ('-'). Each specification starts with a letter
+and may include other information after the letter to define some aspect of the
+data layout. The specifications accepted are as follows: </p>
+<dl>
+ <dt><tt>E</tt></dt>
+ <dd>Specifies that the target lays out data in big-endian form. That is, the
+ bits with the most significance have the lowest address location.</dd>
+ <dt><tt>e</tt></dt>
+ <dd>Specifies that hte target lays out data in little-endian form. That is,
+ the bits with the least significance have the lowest address location.</dd>
+ <dt><tt>p:<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
+ <dd>This specifies the <i>size</i> of a pointer and its <i>abi</i> and
+ <i>preferred</i> alignments. All sizes are in bits. Specifying the <i>pref</i>
+ alignment is optional. If omitted, the preceding <tt>:</tt> should be omitted
+ too.</dd>
+ <dt><tt>i<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
+ <dd>This specifies the alignment for an integer type of a given bit
+ <i>size</i>. The value of <i>size</i> must be in the range [1,2^23).</dd>
+ <dt><tt>v<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
+ <dd>This specifies the alignment for a vector type of a given bit
+ <i>size</i>.</dd>
+ <dt><tt>f<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
+ <dd>This specifies the alignment for a floating point type of a given bit
+ <i>size</i>. The value of <i>size</i> must be either 32 (float) or 64
+ (double).</dd>
+ <dt><tt>a<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
+ <dd>This specifies the alignment for an aggregate type of a given bit
+ <i>size</i>.</dd>
+</dl>
+<p>When constructing the data layout for a given target, LLVM starts with a
+default set of specifications which are then (possibly) overriden by the
+specifications in the <tt>datalayout</tt> keyword. The default specifications
+are given in this list:</p>
+<ul>
+ <li><tt>E</tt> - big endian</li>
+ <li><tt>p:32:64:64</tt> - 32-bit pointers with 64-bit alignment</li>
+ <li><tt>i1:8:8</tt> - i1 is 8-bit (byte) aligned</li>
+ <li><tt>i8:8:8</tt> - i8 is 8-bit (byte) aligned</li>
+ <li><tt>i16:16:16</tt> - i16 is 16-bit aligned</li>
+ <li><tt>i32:32:32</tt> - i32 is 32-bit aligned</li>
+ <li><tt>i64:32:64</tt> - i64 has abi alignment of 32-bits but preferred
+ alignment of 64-bits</li>
+ <li><tt>f32:32:32</tt> - float is 32-bit aligned</li>
+ <li><tt>f64:64:64</tt> - double is 64-bit aligned</li>
+ <li><tt>v64:64:64</tt> - 64-bit vector is 64-bit aligned</li>
+ <li><tt>v128:128:128</tt> - 128-bit vector is 128-bit aligned</li>
+ <li><tt>a0:0:1</tt> - aggregates are 8-bit aligned</li>
+</ul>
+<p>When llvm is determining the alignment for a given type, it uses the
+following rules:
+<ol>
+ <li>If the type sought is an exact match for one of the specifications, that
+ specification is used.</li>
+ <li>If no match is found, and the type sought is an integer type, then the
+ smallest integer type that is larger than the bitwidth of the sought type is
+ used. If none of the specifications are larger than the bitwidth then the the
+ largest integer type is used. For example, given the default specifications
+ above, the i7 type will use the alignment of i8 (next largest) while both
+ i65 and i256 will use the alignment of i64 (largest specified).</li>
+ <li>If no match is found, and the type sought is a vector type, then the
+ largest vector type that is smaller than the sought vector type will be used
+ as a fall back. This happens because <128 x double> can be implemented in
+ terms of 64 <2 x double>, for example.</li>
+</ol>
+</div>
<!-- *********************************************************************** -->
<div class="doc_section"> <a name="typesystem">Type System</a> </div>
<tbody>
<tr><th>Type</th><th>Description</th></tr>
<tr><td><tt>void</tt></td><td>No value</td></tr>
- <tr><td><tt>i8</tt></td><td>Signless 8-bit value</td></tr>
- <tr><td><tt>i32</tt></td><td>Signless 32-bit value</td></tr>
+ <tr><td><tt>i8</tt></td><td>8-bit value</td></tr>
+ <tr><td><tt>i32</tt></td><td>32-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>
<tbody>
<tr><th>Type</th><th>Description</th></tr>
<tr><td><tt>i1</tt></td><td>True or False value</td></tr>
- <tr><td><tt>i16</tt></td><td>Signless 16-bit value</td></tr>
- <tr><td><tt>i64</tt></td><td>Signless 64-bit value</td></tr>
+ <tr><td><tt>i16</tt></td><td>16-bit value</td></tr>
+ <tr><td><tt>i64</tt></td><td>64-bit value</td></tr>
<tr><td><tt>double</tt></td><td>64-bit floating point value</td></tr>
</tbody>
</table>
<tr><th>Classification</th><th>Types</th></tr>
<tr>
<td><a name="t_integer">integer</a></td>
- <td><tt>i8, i16, i32, i64</tt></td>
- </tr>
- <tr>
- <td><a name="t_integral">integral</a></td>
- <td><tt>i1, i8, i16, i32, i64</tt>
- </td>
+ <td><tt>i1, i8, i16, i32, i64</tt></td>
</tr>
<tr>
<td><a name="t_floating">floating point</a></td>
<tr>
<td><a name="t_firstclass">first class</a></td>
<td><tt>i1, i8, i16, i32, i64, float, double, <br/>
- <a href="#t_pointer">pointer</a>,<a href="#t_packed">packed</a></tt>
+ <a href="#t_pointer">pointer</a>,<a href="#t_vector">vector</a></tt>
</td>
</tr>
</tbody>
<td class="left">function taking an <tt>i32</tt>, returning an <tt>i32</tt>
</td>
</tr><tr class="layout">
- <td class="left"><tt>float (i16 @sext, i32 *) *
+ <td class="left"><tt>float (i16 sext, i32 *) *
</tt></td>
<td class="left"><a href="#t_pointer">Pointer</a> to a function that takes
an <tt>i16</tt> that should be sign extended and a
</div>
<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"> <a name="t_packed">Packed Type</a> </div>
+<div class="doc_subsubsection"> <a name="t_vector">Vector Type</a> </div>
<div class="doc_text">
<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
+<p>A vector type is a simple derived type that represents a vector
+of elements. Vector types are used when multiple primitive data
are operated in parallel using a single instruction (SIMD).
-A packed type requires a size (number of
+A vector type requires a size (number of
elements) and an underlying primitive data type. Vectors must have a power
-of two length (1, 2, 4, 8, 16 ...). Packed types are
+of two length (1, 2, 4, 8, 16 ...). Vector types are
considered <a href="#t_firstclass">first class</a>.</p>
<h5>Syntax:</h5>
</pre>
<p>The number of elements is a constant integer value; elementtype may
-be any integral or floating point type.</p>
+be any integer or floating point type.</p>
<h5>Examples:</h5>
<tt><2 x i64></tt><br/>
</td>
<td class="left">
- Packed vector of 4 32-bit integer values.<br/>
- Packed vector of 8 floating-point values.<br/>
- Packed vector of 2 64-bit integer values.<br/>
+ Vector of 4 32-bit integer values.<br/>
+ Vector of 8 floating-point values.<br/>
+ Vector of 2 64-bit integer values.<br/>
</td>
</tr>
</table>
types of elements must match those specified by the type.
</dd>
- <dt><b>Packed constants</b></dt>
+ <dt><b>Vector constants</b></dt>
- <dd>Packed constants are represented with notation similar to packed type
+ <dd>Vector constants are represented with notation similar to vector type
definitions (a comma separated list of elements, surrounded by
less-than/greater-than's (<tt><></tt>)). For example: "<tt>< i32 42,
- i32 11, i32 74, i32 100 ></tt>". Packed constants must have <a
- href="#t_packed">packed type</a>, and the number and types of elements must
+ i32 11, i32 74, i32 100 ></tt>". VEctor constants must have <a
+ href="#t_vector">vector type</a>, and the number and types of elements must
match those specified by the type.
</dd>
<dl>
<dt><b><tt>trunc ( CST to TYPE )</tt></b></dt>
<dd>Truncate a constant to another type. The bit size of CST must be larger
- than the bit size of TYPE. Both types must be integral.</dd>
+ than the bit size of TYPE. Both types must be integers.</dd>
<dt><b><tt>zext ( CST to TYPE )</tt></b></dt>
<dd>Zero extend a constant to another type. The bit size of CST must be
- smaller or equal to the bit size of TYPE. Both types must be integral.</dd>
+ smaller or equal to the bit size of TYPE. Both types must be integers.</dd>
<dt><b><tt>sext ( CST to TYPE )</tt></b></dt>
<dd>Sign extend a constant to another type. The bit size of CST must be
- smaller or equal to the bit size of TYPE. Both types must be integral.</dd>
+ smaller or equal to the bit size of TYPE. Both types must be integers.</dd>
<dt><b><tt>fptrunc ( CST to TYPE )</tt></b></dt>
<dd>Truncate a floating point constant to another floating point type. The
identical (same number of bits). The conversion is done as if the CST value
was stored to memory and read back as TYPE. In other words, no bits change
with this operator, just the type. This can be used for conversion of
- packed types to any other type, as long as they have the same bit width. For
+ vector types to any other type, as long as they have the same bit width. For
pointers it is only valid to cast to another pointer type.
</dd>
<h5>Arguments:</h5>
<p>The conditional branch form of the '<tt>br</tt>' instruction takes a
single '<tt>i1</tt>' value and two '<tt>label</tt>' values. The
-unconditional form of the '<tt>br</tt>' instruction takes a single '<tt>label</tt>'
-value as a target.</p>
+unconditional form of the '<tt>br</tt>' instruction takes a single
+'<tt>label</tt>' value as a target.</p>
<h5>Semantics:</h5>
<p>Upon execution of a conditional '<tt>br</tt>' instruction, the '<tt>i1</tt>'
argument is evaluated. If the value is <tt>true</tt>, control flows
<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 operands might represent
-multiple data, as is the case with the <a href="#t_packed">packed</a> data type.
+multiple data, as is the case with the <a href="#t_vector">vector</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>
<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.
- This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+ This instruction can also take <a href="#t_vector">vector</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
<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.
-This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+This instruction can also take <a href="#t_vector">vector</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
<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.
-This instruction can also take <a href="#t_packed">packed</a> versions of the values.
+This instruction can also take <a href="#t_vector">vector</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
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>udiv</tt>' instruction must be
<a href="#t_integer">integer</a> values. Both arguments must have identical
-types. This instruction can also take <a href="#t_packed">packed</a> versions
+types. This instruction can also take <a href="#t_vector">vector</a> versions
of the values in which case the elements must be integers.</p>
<h5>Semantics:</h5>
<p>The value produced is the unsigned integer quotient of the two operands. This
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>sdiv</tt>' instruction must be
<a href="#t_integer">integer</a> values. Both arguments must have identical
-types. This instruction can also take <a href="#t_packed">packed</a> versions
+types. This instruction can also take <a href="#t_vector">vector</a> versions
of the values in which case the elements must be integers.</p>
<h5>Semantics:</h5>
<p>The value produced is the signed integer quotient of the two operands. This
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>div</tt>' instruction must be
<a href="#t_floating">floating point</a> values. Both arguments must have
-identical types. This instruction can also take <a href="#t_packed">packed</a>
+identical types. This instruction can also take <a href="#t_vector">vector</a>
versions of the values in which case the elements must be floating point.</p>
<h5>Semantics:</h5>
<p>The value produced is the floating point quotient of the two operands.</p>
types.</p>
<h5>Semantics:</h5>
<p>This instruction 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
-result has the same sign as the dividend) of a value. For more
-information about the difference, see <a
+has the same sign as the dividend, <tt>var1</tt>), not the <i>modulo</i>
+operator (where the result has the same sign as the divisor, <tt>var2</tt>) of
+a value. For more information about the difference, see <a
href="http://mathforum.org/dr.math/problems/anne.4.28.99.html">The
-Math Forum</a>.</p>
+Math Forum</a>. For a table of how this is implemented in various languages,
+please see <a href="http://mathforum.org/dr.math/problems/anne.4.28.99.html">
+Wikipedia: modulo operation</a>.</p>
<h5>Example:</h5>
<pre> <result> = srem i32 4, %var <i>; yields {i32}:result = 4 % %var</i>
</pre>
and produce a single value. The resulting value of the bitwise binary
operators is always the same type as its first operand.</p>
</div>
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"> <a name="i_shl">'<tt>shl</tt>'
+Instruction</a> </div>
+<div class="doc_text">
+<h5>Syntax:</h5>
+<pre> <result> = shl <ty> <var1>, <var2> <i>; yields {ty}:result</i>
+</pre>
+<h5>Overview:</h5>
+<p>The '<tt>shl</tt>' instruction returns the first operand shifted to
+the left a specified number of bits.</p>
+<h5>Arguments:</h5>
+<p>Both arguments to the '<tt>shl</tt>' instruction must be the same <a
+ href="#t_integer">integer</a> type.</p>
+<h5>Semantics:</h5>
+<p>The value produced is <tt>var1</tt> * 2<sup><tt>var2</tt></sup>.</p>
+<h5>Example:</h5><pre>
+ <result> = shl i32 4, %var <i>; yields {i32}: 4 << %var</i>
+ <result> = shl i32 4, 2 <i>; yields {i32}: 16</i>
+ <result> = shl i32 1, 10 <i>; yields {i32}: 1024</i>
+</pre>
+</div>
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"> <a name="i_lshr">'<tt>lshr</tt>'
+Instruction</a> </div>
+<div class="doc_text">
+<h5>Syntax:</h5>
+<pre> <result> = lshr <ty> <var1>, <var2> <i>; yields {ty}:result</i>
+</pre>
+
+<h5>Overview:</h5>
+<p>The '<tt>lshr</tt>' instruction (logical shift right) returns the first
+operand shifted to the right a specified number of bits.</p>
+
+<h5>Arguments:</h5>
+<p>Both arguments to the '<tt>lshr</tt>' instruction must be the same
+<a href="#t_integer">integer</a> type.</p>
+
+<h5>Semantics:</h5>
+<p>This instruction always performs a logical shift right operation. The most
+significant bits of the result will be filled with zero bits after the
+shift.</p>
+
+<h5>Example:</h5>
+<pre>
+ <result> = lshr i32 4, 1 <i>; yields {i32}:result = 2</i>
+ <result> = lshr i32 4, 2 <i>; yields {i32}:result = 1</i>
+ <result> = lshr i8 4, 3 <i>; yields {i8}:result = 0</i>
+ <result> = lshr i8 -2, 1 <i>; yields {i8}:result = 0x7FFFFFFF </i>
+</pre>
+</div>
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"> <a name="i_ashr">'<tt>ashr</tt>'
+Instruction</a> </div>
+<div class="doc_text">
+
+<h5>Syntax:</h5>
+<pre> <result> = ashr <ty> <var1>, <var2> <i>; yields {ty}:result</i>
+</pre>
+
+<h5>Overview:</h5>
+<p>The '<tt>ashr</tt>' instruction (arithmetic shift right) returns the first
+operand shifted to the right a specified number of bits.</p>
+
+<h5>Arguments:</h5>
+<p>Both arguments to the '<tt>ashr</tt>' instruction must be the same
+<a href="#t_integer">integer</a> type.</p>
+
+<h5>Semantics:</h5>
+<p>This instruction always performs an arithmetic shift right operation,
+The most significant bits of the result will be filled with the sign bit
+of <tt>var1</tt>.</p>
+
+<h5>Example:</h5>
+<pre>
+ <result> = ashr i32 4, 1 <i>; yields {i32}:result = 2</i>
+ <result> = ashr i32 4, 2 <i>; yields {i32}:result = 1</i>
+ <result> = ashr i8 4, 3 <i>; yields {i8}:result = 0</i>
+ <result> = ashr i8 -2, 1 <i>; yields {i8}:result = -1</i>
+</pre>
+</div>
+
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection"> <a name="i_and">'<tt>and</tt>'
Instruction</a> </div>
its two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>and</tt>' instruction must be <a
- href="#t_integral">integral</a> values. Both arguments must have
+ href="#t_integer">integer</a> values. Both arguments must have
identical types.</p>
<h5>Semantics:</h5>
<p>The truth table used for the '<tt>and</tt>' instruction is:</p>
or of its two operands.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>or</tt>' instruction must be <a
- href="#t_integral">integral</a> values. Both arguments must have
+ href="#t_integer">integer</a> values. Both arguments must have
identical types.</p>
<h5>Semantics:</h5>
<p>The truth table used for the '<tt>or</tt>' instruction is:</p>
"one's complement" operation, which is the "~" operator in C.</p>
<h5>Arguments:</h5>
<p>The two arguments to the '<tt>xor</tt>' instruction must be <a
- href="#t_integral">integral</a> values. Both arguments must have
+ href="#t_integer">integer</a> values. Both arguments must have
identical types.</p>
<h5>Semantics:</h5>
<p>The truth table used for the '<tt>xor</tt>' instruction is:</p>
<result> = xor i32 %V, -1 <i>; yields {i32}:result = ~%V</i>
</pre>
</div>
-<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"> <a name="i_shl">'<tt>shl</tt>'
-Instruction</a> </div>
-<div class="doc_text">
-<h5>Syntax:</h5>
-<pre> <result> = shl <ty> <var1>, i8 <var2> <i>; yields {ty}:result</i>
-</pre>
-<h5>Overview:</h5>
-<p>The '<tt>shl</tt>' instruction returns the first operand shifted to
-the left a specified number of bits.</p>
-<h5>Arguments:</h5>
-<p>The first argument to the '<tt>shl</tt>' instruction must be an <a
- href="#t_integer">integer</a> type. The second argument must be an '<tt>i8</tt>'
-type.</p>
-<h5>Semantics:</h5>
-<p>The value produced is <tt>var1</tt> * 2<sup><tt>var2</tt></sup>.</p>
-<h5>Example:</h5>
-<pre> <result> = shl i32 4, i8 %var <i>; yields {i32}:result = 4 << %var</i>
- <result> = shl i32 4, i8 2 <i>; yields {i32}:result = 16</i>
- <result> = shl i32 1, i8 10 <i>; yields {i32}:result = 1024</i>
-</pre>
-</div>
-<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"> <a name="i_lshr">'<tt>lshr</tt>'
-Instruction</a> </div>
-<div class="doc_text">
-<h5>Syntax:</h5>
-<pre> <result> = lshr <ty> <var1>, i8 <var2> <i>; yields {ty}:result</i>
-</pre>
-
-<h5>Overview:</h5>
-<p>The '<tt>lshr</tt>' instruction (logical shift right) returns the first
-operand shifted to the right a specified number of bits.</p>
-
-<h5>Arguments:</h5>
-<p>The first argument to the '<tt>lshr</tt>' instruction must be an <a
- href="#t_integer">integer</a> type. The second argument must be an '<tt>i8</tt>' type.</p>
-
-<h5>Semantics:</h5>
-<p>This instruction always performs a logical shift right operation. The
-<tt>var2</tt> most significant bits will be filled with zero bits after the
-shift.</p>
-
-<h5>Example:</h5>
-<pre>
- <result> = lshr i32 4, i8 1 <i>; yields {i32}:result = 2</i>
- <result> = lshr i32 4, i8 2 <i>; yields {i32}:result = 1</i>
- <result> = lshr i8 4, i8 3 <i>; yields {i8 }:result = 0</i>
- <result> = lshr i8 -2, i8 1 <i>; yields {i8 }:result = 0x7FFFFFFF </i>
-</pre>
-</div>
-
-<!-- ======================================================================= -->
-<div class="doc_subsubsection"> <a name="i_ashr">'<tt>ashr</tt>'
-Instruction</a> </div>
-<div class="doc_text">
-
-<h5>Syntax:</h5>
-<pre> <result> = ashr <ty> <var1>, i8 <var2> <i>; yields {ty}:result</i>
-</pre>
-
-<h5>Overview:</h5>
-<p>The '<tt>ashr</tt>' instruction (arithmetic shift right) returns the first
-operand shifted to the right a specified number of bits.</p>
-
-<h5>Arguments:</h5>
-<p>The first argument to the '<tt>ashr</tt>' instruction must be an
-<a href="#t_integer">integer</a> type. The second argument must be an
-'<tt>i8</tt>' type.</p>
-
-<h5>Semantics:</h5>
-<p>This instruction always performs an arithmetic shift right operation,
-regardless of whether the arguments are signed or not. The <tt>var2</tt> most
-significant bits will be filled with the sign bit of <tt>var1</tt>.</p>
-
-<h5>Example:</h5>
-<pre>
- <result> = ashr i32 4, i8 1 <i>; yields {i32}:result = 2</i>
- <result> = ashr i32 4, i8 2 <i>; yields {i32}:result = 1</i>
- <result> = ashr i8 4, i8 3 <i>; yields {i8}:result = 0</i>
- <result> = ashr i8 -2, i8 1 <i>; yields {i8 }:result = -1</i>
-</pre>
-</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<p>
The '<tt>extractelement</tt>' instruction extracts a single scalar
-element from a packed vector at a specified index.
+element from a vector at a specified index.
</p>
<p>
The first operand of an '<tt>extractelement</tt>' instruction is a
-value of <a href="#t_packed">packed</a> type. The second operand is
+value of <a href="#t_vector">vector</a> type. The second operand is
an index indicating the position from which to extract the element.
The index may be a variable.</p>
<p>
The '<tt>insertelement</tt>' instruction inserts a scalar
-element into a packed vector at a specified index.
+element into a vector at a specified index.
</p>
<p>
The first operand of an '<tt>insertelement</tt>' instruction is a
-value of <a href="#t_packed">packed</a> type. The second operand is a
+value of <a href="#t_vector">vector</a> type. The second operand is a
scalar value whose type must equal the element type of the first
operand. The third operand is an index indicating the position at
which to insert the value. The index may be a variable.</p>
<h5>Semantics:</h5>
<p>
-The result is a packed vector of the same type as <tt>val</tt>. Its
+The result is a vector of the same type as <tt>val</tt>. Its
element values are those of <tt>val</tt> except at position
<tt>idx</tt>, where it gets the value <tt>elt</tt>. If <tt>idx</tt>
exceeds the length of <tt>val</tt>, the results are undefined.
<p>
The '<tt>trunc</tt>' instruction takes a <tt>value</tt> to trunc, which must
be an <a href="#t_integer">integer</a> type, and a type that specifies the size
-and type of the result, which must be an <a href="#t_integral">integral</a>
+and type of the result, which must be an <a href="#t_integer">integer</a>
type. The bit size of <tt>value</tt> must be larger than the bit size of
<tt>ty2</tt>. Equal sized types are not allowed.</p>
<h5>Arguments:</h5>
<p>The '<tt>zext</tt>' instruction takes a value to cast, which must be of
-<a href="#t_integral">integral</a> type, and a type to cast it to, which must
-also be of <a href="#t_integral">integral</a> type. The bit size of the
+<a href="#t_integer">integer</a> type, and a type to cast it to, which must
+also be of <a href="#t_integer">integer</a> type. The bit size of the
<tt>value</tt> must be smaller than the bit size of the destination type,
<tt>ty2</tt>.</p>
<h5>Arguments:</h5>
<p>
The '<tt>sext</tt>' instruction takes a value to cast, which must be of
-<a href="#t_integral">integral</a> type, and a type to cast it to, which must
-also be of <a href="#t_integral">integral</a> type. The bit size of the
+<a href="#t_integer">integer</a> type, and a type to cast it to, which must
+also be of <a href="#t_integer">integer</a> type. The bit size of the
<tt>value</tt> must be smaller than the bit size of the destination type,
<tt>ty2</tt>.</p>
<!-- _______________________________________________________________________ -->
<div class="doc_subsubsection">
- <a name="i_fp2uint">'<tt>fptoui .. to</tt>' Instruction</a>
+ <a name="i_fptoui">'<tt>fptoui .. to</tt>' Instruction</a>
</div>
<div class="doc_text">
<h5>Arguments:</h5>
<p>The '<tt>fp2uint</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_integral">integral</a> type.</p>
+must be an <a href="#t_integer">integer</a> type.</p>
<h5>Semantics:</h5>
<p> The '<tt>fp2uint</tt>' instruction converts its
<h5>Arguments:</h5>
<p> The '<tt>fptosi</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 also be an <a href="#t_integral">integral</a> type.</p>
+must also be an <a href="#t_integer">integer</a> type.</p>
<h5>Semantics:</h5>
<p>The '<tt>fptosi</tt>' instruction converts its
<h5>Arguments:</h5>
<p>The '<tt>uitofp</tt>' instruction takes a value to cast, which must be an
-<a href="#t_integral">integral</a> value, and a type to cast it to, which must
+<a href="#t_integer">integer</a> value, and a type to cast it to, which must
be a <a href="#t_floating">floating point</a> type.</p>
<h5>Semantics:</h5>
<h5>Arguments:</h5>
<p>The '<tt>sitofp</tt>' instruction takes a value to cast, which must be an
-<a href="#t_integral">integral</a> value, and a type to cast it to, which must be
+<a href="#t_integer">integer</a> value, and a type to cast it to, which must be
a <a href="#t_floating">floating point</a> type.</p>
<h5>Semantics:</h5>
<h5>Arguments:</h5>
<p>The '<tt>inttoptr</tt>' instruction takes an <a href="i_integer">integer</a>
value to cast, and a type to cast it to, which must be a
-<a href="#t_pointer">pointer</a> type. </tt>
+<a href="#t_pointer">pointer</a> type.
<h5>Semantics:</h5>
<p>The '<tt>inttoptr</tt>' instruction converts <tt>value</tt> to type
<li><tt>slt</tt>: signed less than</li>
<li><tt>sle</tt>: signed less or equal</li>
</ol>
-<p>The remaining two arguments must be <a href="#t_integral">integral</a> or
+<p>The remaining two arguments must be <a href="#t_integer">integer</a> or
<a href="#t_pointer">pointer</a> typed. They must also be identical types.</p>
<h5>Semantics:</h5>
<p>The '<tt>icmp</tt>' compares <tt>var1</tt> and <tt>var2</tt> according to
<tt>true</tt> if <tt>var1</tt> is less than <tt>var2</tt>.</li>
<li><tt>sle</tt>: interprets the operands as signed values and yields
<tt>true</tt> if <tt>var1</tt> is less than or equal to <tt>var2</tt>.</li>
- </li>
</ol>
<p>If the operands are <a href="#t_pointer">pointer</a> typed, the pointer
values are treated as integers and then compared.</p>
-<p>If the operands are <a href="#t_packed">packed</a> typed, the elements of
-the vector are compared in turn and the predicate must hold for all
-elements.</p>
<h5>Example:</h5>
<pre> <result> = icmp eq i32 4, 5 <i>; yields: result=false</i>
<li><tt>uno</tt>: yields <tt>true</tt> if either operand is a QNAN.</li>
<li><tt>true</tt>: always yields <tt>true</tt>, regardless of operands.</li>
</ol>
-<p>If the operands are <a href="#t_packed">packed</a> typed, the elements of
-the vector are compared in turn and the predicate must hold for all elements.
-</p>
<h5>Example:</h5>
<pre> <result> = fcmp oeq float 4.0, 5.0 <i>; yields: result=false</i>
used.</p>
<pre>
-define i32 %test(i32 %X, ...) {
+define i32 @test(i32 %X, ...) {
; Initialize variable argument processing
%ap = alloca i8 *
%ap2 = bitcast i8** %ap to i8*
- call void %<a href="#i_va_start">llvm.va_start</a>(i8* %ap2)
+ call void @llvm.va_start(i8* %ap2)
; Read a single integer argument
%tmp = va_arg i8 ** %ap, i32
; Demonstrate usage of llvm.va_copy and llvm.va_end
%aq = alloca i8 *
%aq2 = bitcast i8** %aq to i8*
- call void %<a href="#i_va_copy">llvm.va_copy</a>(i8 *%aq2, i8* %ap2)
- call void %<a href="#i_va_end">llvm.va_end</a>(i8* %aq2)
+ call void @llvm.va_copy(i8 *%aq2, i8* %ap2)
+ call void @llvm.va_end(i8* %aq2)
; Stop processing of arguments.
- call void %<a href="#i_va_end">llvm.va_end</a>(i8* %ap2)
+ call void @llvm.va_end(i8* %ap2)
ret i32 %tmp
}
+
+declare void @llvm.va_start(i8*)
+declare void @llvm.va_copy(i8*, i8*)
+declare void @llvm.va_end(i8*)
</pre>
</div>
<div class="doc_text">
<h5>Syntax:</h5>
-<pre> declare void %llvm.va_end(i8* <arglist>)<br></pre>
+<pre> declare void @llvm.va_end(i8* <arglist>)<br></pre>
<h5>Overview:</h5>
<p>The '<tt>llvm.va_end</tt>' intrinsic destroys <tt><arglist></tt>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.va_copy(i8* <destarglist>, i8* <srcarglist>)
+ declare void @llvm.va_copy(i8* <destarglist>, i8* <srcarglist>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.gcroot(<ty>** %ptrloc, <ty2>* %metadata)
+ declare void @llvm.gcroot(<ty>** %ptrloc, <ty2>* %metadata)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 * %llvm.gcread(i8 * %ObjPtr, i8 ** %Ptr)
+ declare i8 * @llvm.gcread(i8 * %ObjPtr, i8 ** %Ptr)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.gcwrite(i8 * %P1, i8 * %Obj, i8 ** %P2)
+ declare void @llvm.gcwrite(i8 * %P1, i8 * %Obj, i8 ** %P2)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 *%llvm.returnaddress(i32 <level>)
+ declare i8 *@llvm.returnaddress(i32 <level>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 *%llvm.frameaddress(i32 <level>)
+ declare i8 *@llvm.frameaddress(i32 <level>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 *%llvm.stacksave()
+ declare i8 *@llvm.stacksave()
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.stackrestore(i8 * %ptr)
+ declare void @llvm.stackrestore(i8 * %ptr)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.prefetch(i8 * <address>,
+ declare void @llvm.prefetch(i8 * <address>,
i32 <rw>, i32 <locality>)
</pre>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.pcmarker( i32 <id> )
+ declare void @llvm.pcmarker( i32 <id> )
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i64 %llvm.readcyclecounter( )
+ declare i64 @llvm.readcyclecounter( )
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.memcpy.i32(i8 * <dest>, i8 * <src>,
+ declare void @llvm.memcpy.i32(i8 * <dest>, i8 * <src>,
i32 <len>, i32 <align>)
- declare void %llvm.memcpy.i64(i8 * <dest>, i8 * <src>,
+ declare void @llvm.memcpy.i64(i8 * <dest>, i8 * <src>,
i64 <len>, i32 <align>)
</pre>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.memmove.i32(i8 * <dest>, i8 * <src>,
+ declare void @llvm.memmove.i32(i8 * <dest>, i8 * <src>,
i32 <len>, i32 <align>)
- declare void %llvm.memmove.i64(i8 * <dest>, i8 * <src>,
+ declare void @llvm.memmove.i64(i8 * <dest>, i8 * <src>,
i64 <len>, i32 <align>)
</pre>
<h5>Syntax:</h5>
<pre>
- declare void %llvm.memset.i32(i8 * <dest>, i8 <val>,
+ declare void @llvm.memset.i32(i8 * <dest>, i8 <val>,
i32 <len>, i32 <align>)
- declare void %llvm.memset.i64(i8 * <dest>, i8 <val>,
+ declare void @llvm.memset.i64(i8 * <dest>, i8 <val>,
i64 <len>, i32 <align>)
</pre>
<h5>Syntax:</h5>
<pre>
- declare float %llvm.sqrt.f32(float %Val)
- declare double %llvm.sqrt.f64(double %Val)
+ declare float @llvm.sqrt.f32(float %Val)
+ declare double @llvm.sqrt.f64(double %Val)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare float %llvm.powi.f32(float %Val, i32 %power)
- declare double %llvm.powi.f64(double %Val, i32 %power)
+ declare float @llvm.powi.f32(float %Val, i32 %power)
+ declare double @llvm.powi.f64(double %Val, i32 %power)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i16 %llvm.bswap.i16(i16 <id>)
- declare i32 %llvm.bswap.i32(i32 <id>)
- declare i64 %llvm.bswap.i64(i64 <id>)
+ declare i16 @llvm.bswap.i16(i16 <id>)
+ declare i32 @llvm.bswap.i32(i32 <id>)
+ declare i64 @llvm.bswap.i64(i64 <id>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 %llvm.ctpop.i8 (i8 <src>)
- declare i16 %llvm.ctpop.i16(i16 <src>)
- declare i32 %llvm.ctpop.i32(i32 <src>)
- declare i64 %llvm.ctpop.i64(i64 <src>)
+ declare i8 @llvm.ctpop.i8 (i8 <src>)
+ declare i16 @llvm.ctpop.i16(i16 <src>)
+ declare i32 @llvm.ctpop.i32(i32 <src>)
+ declare i64 @llvm.ctpop.i64(i64 <src>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 %llvm.ctlz.i8 (i8 <src>)
- declare i16 %llvm.ctlz.i16(i16 <src>)
- declare i32 %llvm.ctlz.i32(i32 <src>)
- declare i64 %llvm.ctlz.i64(i64 <src>)
+ declare i8 @llvm.ctlz.i8 (i8 <src>)
+ declare i16 @llvm.ctlz.i16(i16 <src>)
+ declare i32 @llvm.ctlz.i32(i32 <src>)
+ declare i64 @llvm.ctlz.i64(i64 <src>)
</pre>
<h5>Overview:</h5>
<h5>Syntax:</h5>
<pre>
- declare i8 %llvm.cttz.i8 (i8 <src>)
- declare i16 %llvm.cttz.i16(i16 <src>)
- declare i32 %llvm.cttz.i32(i32 <src>)
- declare i64 %llvm.cttz.i64(i64 <src>)
+ declare i8 @llvm.cttz.i8 (i8 <src>)
+ declare i16 @llvm.cttz.i16(i16 <src>)
+ declare i32 @llvm.cttz.i32(i32 <src>)
+ declare i64 @llvm.cttz.i64(i64 <src>)
</pre>
<h5>Overview:</h5>
</div>
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+ <a name="int_eh">Exception Handling Intrinsics</a>
+</div>
+
+<div class="doc_text">
+<p> The LLVM exception handling intrinsics (which all start with
+<tt>llvm.eh.</tt> prefix), are described in the <a
+href="ExceptionHandling.html#format_common_intrinsics">LLVM Exception
+Handling</a> document. </p>
+</div>
+
+
<!-- *********************************************************************** -->
<hr>
<address>