Merged in RELEASE_14 changes.
[oota-llvm.git] / docs / LangRef.html
index 729dcdf118f0d6a5df7d218f37d49b8646114eb7..e4e2d44afbe22c0706b911b6e8a364db6c3ac898 100644 (file)
@@ -3,6 +3,10 @@
 <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="#abstract">Abstract</a></li>
   <li><a href="#introduction">Introduction</a></li>
   <li><a href="#identifiers">Identifiers</a></li>
+  <li><a href="#highlevel">High Level Structure</a>
+    <ol>
+      <li><a href="#modulestructure">Module Structure</a></li>
+      <li><a href="#linkage">Linkage Types</a></li>
+      <li><a href="#globalvars">Global Variables</a></li>
+      <li><a href="#functionstructure">Function Structure</a></li>
+    </ol>
+  </li>
   <li><a href="#typesystem">Type System</a>
     <ol>
       <li><a href="#t_primitive">Primitive Types</a>   
           <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>
-  <li><a href="#highlevel">High Level Structure</a>
+  <li><a href="#constants">Constants</a>
     <ol>
-      <li><a href="#modulestructure">Module Structure</a></li>
-      <li><a href="#globalvars">Global Variables</a></li>
-      <li><a href="#functionstructure">Function Structure</a></li>
+      <li><a href="#simpleconstants">Simple Constants</a>
+      <li><a href="#aggregateconstants">Aggregate Constants</a>
+      <li><a href="#globalconstants">Global Variable and Function Addresses</a>
+      <li><a href="#undefvalues">Undefined Values</a>
+      <li><a href="#constantexprs">Constant Expressions</a>
     </ol>
   </li>
   <li><a href="#instref">Instruction Reference</a>
@@ -47,6 +61,7 @@
           <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>
@@ -213,71 +228,256 @@ the parser.</p>
 purposes:</p>
 
 <ol>
-  <li>Numeric constants are represented as you would expect: 12, -3
-123.421,   etc.  Floating point constants have an optional hexadecimal
-notation.</li>
-  <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>'.
-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   in a name.</li>
-  <li>Unnamed values are represented as an unsigned numeric value with
-a '%'   prefix.  For example, %12, %2, %44.</li>
+  <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>'.
+  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
+  in a name.</li>
+
+  <li>Unnamed values are represented as an unsigned numeric value with a '%'
+  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 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 variable without having to avoid symbol table
-conflicts.</p>
+
+<p>LLVM requires that values start with a '%' sign 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
+variable without having to avoid symbol table conflicts.</p>
+
 <p>Reserved words in LLVM are very similar to reserved words in other
 languages. There are keywords for different opcodes ('<tt><a
- href="#i_add">add</a></tt>', '<tt><a href="#i_cast">cast</a></tt>', '<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_uint">uint</a></tt>',
-etc...), and others.  These reserved words cannot conflict with
-variable names, because none of them start with a '%' character.</p>
-<p>Here is an example of LLVM code to multiply the integer variable '<tt>%X</tt>'
-by 8:</p>
+href="#i_add">add</a></tt>', '<tt><a href="#i_cast">cast</a></tt>', '<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_uint">uint</a></tt>', etc...),
+and others.  These reserved words cannot conflict with variable names, because
+none of them start with a '%' character.</p>
+
+<p>Here is an example of LLVM code to multiply the integer variable
+'<tt>%X</tt>' by 8:</p>
+
 <p>The easy way:</p>
-<pre>  %result = <a href="#i_mul">mul</a> uint %X, 8<br></pre>
+
+<pre>
+  %result = <a href="#i_mul">mul</a> uint %X, 8
+</pre>
+
 <p>After strength reduction:</p>
-<pre>  %result = <a href="#i_shl">shl</a> uint %X, ubyte 3<br></pre>
+
+<pre>
+  %result = <a href="#i_shl">shl</a> uint %X, ubyte 3
+</pre>
+
 <p>And the hard way:</p>
-<pre>  <a href="#i_add">add</a> uint %X, %X           <i>; yields {uint}:%0</i>
-  <a
- href="#i_add">add</a> uint %0, %0           <i>; yields {uint}:%1</i>
-  %result = <a
- href="#i_add">add</a> uint %1, %1<br></pre>
+
+<pre>
+  <a href="#i_add">add</a> uint %X, %X           <i>; yields {uint}:%0</i>
+  <a href="#i_add">add</a> uint %0, %0           <i>; yields {uint}:%1</i>
+  %result = <a href="#i_add">add</a> uint %1, %1
+</pre>
+
 <p>This last way of multiplying <tt>%X</tt> by 8 illustrates several
 important lexical features of LLVM:</p>
+
 <ol>
-  <li>Comments are delimited with a '<tt>;</tt>' and go until the end
-of   line.</li>
-  <li>Unnamed temporaries are created when the result of a computation
-is not   assigned to a named value.</li>
+
+  <li>Comments are delimited with a '<tt>;</tt>' and go until the end of
+  line.</li>
+
+  <li>Unnamed temporaries are created when the result of a computation is not
+  assigned to a named value.</li>
+
   <li>Unnamed temporaries are numbered sequentially</li>
+
 </ol>
-<p>...and it also show a convention that we follow in this document. 
-When demonstrating instructions, we will follow an instruction with a
-comment that defines the type and name of value produced.  Comments are
-shown in italic text.</p>
-<p>The one non-intuitive notation for constants is the optional
-hexidecimal form of floating point constants.  For example, the form '<tt>double
-0x432ff973cafa8000</tt>' is equivalent to (but harder to read than) '<tt>double
-4.5e+15</tt>' which is also supported by the parser.  The only time
-hexadecimal floating point constants are useful (and the only time that
-they are generated by the disassembler) is when an FP constant has to
-be emitted that is not representable as a decimal floating point number
-exactly.  For example, NaN's, infinities, and other special cases are
-represented in their IEEE hexadecimal format so that assembly and
-disassembly do not cause any bits to change in the constants.</p>
+
+<p>...and it also show a convention that we follow in this document.  When
+demonstrating instructions, we will follow an instruction with a comment that
+defines the type and name of value produced.  Comments are shown in italic
+text.</p>
+
 </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_text">
+
+<p>LLVM programs are composed of "Module"s, each of which is a
+translation unit of the input programs.  Each module consists of
+functions, global variables, and symbol table entries.  Modules may be
+combined together with the LLVM linker, which merges function (and
+global variable) definitions, resolves forward declarations, and merges
+symbol table entries. Here is an example of the "hello world" module:</p>
+
+<pre><i>; Declare the string constant as a global constant...</i>
+<a href="#identifiers">%.LC0</a> = <a href="#linkage_internal">internal</a> <a
+ href="#globalvars">constant</a> <a href="#t_array">[13 x sbyte]</a> c"hello world\0A\00"          <i>; [13 x sbyte]*</i>
+
+<i>; External declaration of the puts function</i>
+<a href="#functionstructure">declare</a> int %puts(sbyte*)                                            <i>; int(sbyte*)* </i>
+
+<i>; Definition of main function</i>
+int %main() {                                                        <i>; int()* </i>
+        <i>; Convert [13x sbyte]* to sbyte *...</i>
+        %cast210 = <a
+ href="#i_getelementptr">getelementptr</a> [13 x sbyte]* %.LC0, long 0, long 0 <i>; sbyte*</i>
+
+        <i>; Call puts function to write out the string to stdout...</i>
+        <a
+ href="#i_call">call</a> int %puts(sbyte* %cast210)                              <i>; int</i>
+        <a
+ href="#i_ret">ret</a> int 0<br>}<br></pre>
+
+<p>This example is made up of a <a href="#globalvars">global variable</a>
+named "<tt>.LC0</tt>", an external declaration of the "<tt>puts</tt>"
+function, and a <a href="#functionstructure">function definition</a>
+for "<tt>main</tt>".</p>
+
+<p>In general, a module is made up of a list of global values,
+where both functions and global variables are global values.  Global values are
+represented by a pointer to a memory location (in this case, a pointer to an
+array of char, and a pointer to a function), and have one of the following <a
+href="#linkage">linkage types</a>.</p>
+
+</div>
+
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="linkage">Linkage Types</a>
+</div>
+
+<div class="doc_text">
+
+<p>
+All Global Variables and Functions have one of the following types of linkage:
+</p>
+
+<dl>
+
+  <dt><tt><b><a name="linkage_internal">internal</a></b></tt> </dt>
+
+  <dd>Global values with internal linkage are only directly accessible by
+  objects in the current module.  In particular, linking code into a module with
+  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++.
+  </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>
+
+  <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>int X;</tt>" at global scope.
+  </dd>
+
+  <dt><tt><b><a name="linkage_appending">appending</a></b></tt>: </dt>
+
+  <dd>"<tt>appending</tt>" linkage may only be applied to global variables of
+  pointer to array type.  When two global variables with appending linkage are
+  linked together, the two global arrays are appended together.  This is the
+  LLVM, typesafe, equivalent of having the system linker append together
+  "sections" with identical names when .o files are linked.
+  </dd>
+
+  <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
+  visible, meaning that it participates in linkage and can be used to resolve
+  external symbol references.
+  </dd>
+</dl>
+
+<p><a name="linkage_external">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
+external (i.e., lacking any linkage declarations), they are accessible
+outside of the current module.  It is illegal for a function <i>declaration</i>
+to have any linkage type other than "externally visible".</a></p>
+
+</div>
+
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="globalvars">Global Variables</a>
+</div>
+
+<div class="doc_text">
+
+<p>Global variables define regions of memory allocated at compilation
+time instead of run-time.  Global variables may optionally be
+initialized.  A variable may be defined as a global "constant", which
+indicates that the contents of the variable will never be modified
+(enabling better optimization, allowing the global data to be placed in the
+read-only section of an executable, etc).</p>
+
+<p>As SSA values, global variables define pointer values that are in
+scope (i.e. they dominate) all basic blocks in the program.  Global
+variables always define a pointer to their "content" type because they
+describe a region of memory, and all memory objects in LLVM are
+accessed through pointers.</p>
+
+</div>
+
+
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="functionstructure">Functions</a>
+</div>
+
+<div class="doc_text">
+
+<p>LLVM function definitions are composed of a (possibly empty) argument list,
+an opening curly brace, a list of basic blocks, and a closing curly brace.  LLVM
+function declarations are defined with the "<tt>declare</tt>" keyword, a
+function name, and a function signature.</p>
+
+<p>A function definition contains a list of basic blocks, forming the CFG for
+the function.  Each basic block may optionally start with a label (giving the
+basic block a symbol table entry), contains a list of instructions, and ends
+with a <a href="#terminators">terminator</a> instruction (such as a branch or
+function return).</p>
+
+<p>The first basic block in program is special in two ways: it is immediately
+executed on entrance to the function, and it is not allowed to have predecessor
+basic blocks (i.e. there can not be any branches to the entry block of a
+function).  Because the block can have no predecessors, it also cannot have any
+<a href="#i_phi">PHI nodes</a>.</p>
+
+<p>LLVM functions are identified by their name and type signature.  Hence, two
+functions with the same name but different parameter lists or return values are
+considered different functions, and LLVM will resolves references to each
+appropriately.</p>
+
+</div>
+
+
+
 <!-- *********************************************************************** -->
 <div class="doc_section"> <a name="typesystem">Type System</a> </div>
 <!-- *********************************************************************** -->
+
 <div class="doc_text">
+
 <p>The LLVM type system is one of the most important features of the
 intermediate representation.  Being typed enables a number of
 optimizations to be performed on the IR directly, without having to do
@@ -285,87 +485,48 @@ extra analyses on the side before the transformation.  A strong type
 system makes it easier to read the generated code and enables novel
 analyses and transformations that are not feasible to perform on normal
 three address code representations.</p>
-<!-- The written form for the type system was heavily influenced by the
-syntactic problems with types in the C language<sup><a
-href="#rw_stroustrup">1</a></sup>.<p> --> </div>
+
+</div>
+
 <!-- ======================================================================= -->
 <div class="doc_subsection"> <a name="t_primitive">Primitive Types</a> </div>
 <div class="doc_text">
 <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>
@@ -375,6 +536,7 @@ classifications:</p>
 
 <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>
@@ -389,7 +551,8 @@ classifications:</p>
     </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>
@@ -397,8 +560,9 @@ classifications:</p>
     </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>
@@ -409,50 +573,71 @@ produced by instructions, passed as arguments, or used as operands to
 instructions.  This means that all structures and arrays must be
 manipulated either by pointer or by component.</p>
 </div>
+
 <!-- ======================================================================= -->
 <div class="doc_subsection"> <a name="t_derived">Derived Types</a> </div>
+
 <div class="doc_text">
+
 <p>The real power in LLVM comes from the derived types in the system. 
 This is what allows a programmer to represent arrays, functions,
 pointers, and other useful types.  Note that these derived types may be
 recursive: For example, it is possible to have a two dimensional array.</p>
+
 </div>
+
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection"> <a name="t_array">Array Type</a> </div>
+
 <div class="doc_text">
+
 <h5>Overview:</h5>
+
 <p>The array type is a very simple derived type that arranges elements
 sequentially in memory.  The array type requires a size (number of
 elements) and an underlying data type.</p>
+
 <h5>Syntax:</h5>
-<pre>  [&lt;# elements&gt; x &lt;elementtype&gt;]<br></pre>
+
+<pre>
+  [&lt;# elements&gt; x &lt;elementtype&gt;]
+</pre>
+
 <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">
@@ -467,33 +652,29 @@ The return type of a function type cannot be an aggregate type.
 </p>
 <h5>Syntax:</h5>
 <pre>  &lt;returntype&gt; (&lt;parameter list&gt;)<br></pre>
-<p>Where '<tt>&lt;parameter list&gt;</tt>' is a comma-separated list of
-type specifiers.  Optionally, the parameter list may include a type <tt>...</tt>,
+<p>Where '<tt>&lt;parameter list&gt;</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>
@@ -512,24 +693,22 @@ instruction.</p>
 <h5>Syntax:</h5>
 <pre>  { &lt;type list&gt; }<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">
@@ -539,208 +718,261 @@ reference to another object, which must live in memory.</p>
 <h5>Syntax:</h5>
 <pre>  &lt;type&gt; *<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">
+<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>  &lt; &lt;# elements&gt; x &lt;elementtype&gt; &gt;<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>&lt;4 x int&gt;</tt><br/>
+      <tt>&lt;8 x float&gt;</tt><br/>
+      <tt>&lt;2 x uint&gt;</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="constants">Constants</a> </div>
+<!-- *********************************************************************** -->
 
-Mention/decide that packed types work with saturation or not. Maybe have a packed+saturated type in addition to just a packed type.<p>
+<div class="doc_text">
 
-Packed types should be 'nonsaturated' because standard data types are not saturated.  Maybe have a saturated packed type?<p>
+<p>LLVM has several different basic types of constants.  This section describes
+them all and their syntax.</p>
 
 </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="simpleconstants">Simple Constants</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
-functions, global variables, and symbol table entries.  Modules may be
-combined together with the LLVM linker, which merges function (and
-global variable) definitions, resolves forward declarations, and merges
-symbol table entries. Here is an example of the "hello world" module:</p>
-<pre><i>; Declare the string constant as a global constant...</i>
-<a href="#identifiers">%.LC0</a> = <a href="#linkage_internal">internal</a> <a
- href="#globalvars">constant</a> <a href="#t_array">[13 x sbyte]</a> c"hello world\0A\00"          <i>; [13 x sbyte]*</i>
 
-<i>; External declaration of the puts function</i>
-<a href="#functionstructure">declare</a> int %puts(sbyte*)                                            <i>; int(sbyte*)* </i>
+<dl>
+  <dt><b>Boolean constants</b></dt>
 
-<i>; Definition of main function</i>
-int %main() {                                                        <i>; int()* </i>
-        <i>; Convert [13x sbyte]* to sbyte *...</i>
-        %cast210 = <a
- href="#i_getelementptr">getelementptr</a> [13 x sbyte]* %.LC0, long 0, long 0 <i>; sbyte*</i>
+  <dd>The two strings '<tt>true</tt>' and '<tt>false</tt>' are both valid
+  constants of the <tt><a href="#t_primitive">bool</a></tt> type.
+  </dd>
 
-        <i>; Call puts function to write out the string to stdout...</i>
-        <a
- href="#i_call">call</a> int %puts(sbyte* %cast210)                              <i>; int</i>
-        <a
- href="#i_ret">ret</a> int 0<br>}<br></pre>
-<p>This example is made up of a <a href="#globalvars">global variable</a>
-named "<tt>.LC0</tt>", an external declaration of the "<tt>puts</tt>"
-function, and a <a href="#functionstructure">function definition</a>
-for "<tt>main</tt>".</p>
-<a name="linkage"> In general, a module is made up of a list of global
-values, where both functions and global variables are global values. 
-Global values are represented by a pointer to a memory location (in
-this case, a pointer to an array of char, and a pointer to a function),
-and have one of the following linkage types:</a>
-<p> </p>
-<dl>
-  <dt><tt><b><a name="linkage_internal">internal</a></b></tt> </dt>
-  <dd>Global values with internal linkage are only directly accessible
-by objects in the current module.  In particular, linking code into a
-module with 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++.
-    <p> </p>
+  <dt><b>Integer constants</b></dt>
+
+  <dd>Standard integers (such as '4') are constants of the <a
+  href="#t_integer">integer</a> type.  Negative numbers may be used with signed
+  integer types.
   </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.
-    <p> </p>
+
+  <dt><b>Floating point constants</b></dt>
+
+  <dd>Floating point constants use standard decimal notation (e.g. 123.421),
+  exponential notation (e.g. 1.23421e+2), or a more precise hexadecimal
+  notation.  Floating point constants have an optional hexadecimal
+  notation (see below).  Floating point constants must have a <a
+  href="#t_floating">floating point</a> type. </dd>
+
+  <dt><b>Null pointer constants</b></dt>
+
+  <dd>The identifier '<tt>null</tt>' is recognized as a null pointer constant
+  and must be of <a href="#t_pointer">pointer type</a>.</dd>
+
+</dl>
+
+<p>The one non-intuitive notation for constants is the optional hexadecimal form
+of floating point constants.  For example, the form '<tt>double
+0x432ff973cafa8000</tt>' is equivalent to (but harder to read than) '<tt>double
+4.5e+15</tt>'.  The only time hexadecimal floating point constants are required
+(and the only time that they are generated by the disassembler) is when a 
+floating point constant must be emitted but it cannot be represented as a 
+decimal floating point number.  For example, NaN's, infinities, and other 
+special values are represented in their IEEE hexadecimal format so that 
+assembly and disassembly do not cause any bits to change in the constants.</p>
+
+</div>
+
+<!-- ======================================================================= -->
+<div class="doc_subsection"><a name="aggregateconstants">Aggregate Constants</a>
+</div>
+
+<div class="doc_text">
+
+<dl>
+  <dt><b>Structure constants</b></dt>
+
+  <dd>Structure constants are represented with notation similar to structure
+  type definitions (a comma separated list of elements, surrounded by braces
+  (<tt>{}</tt>)).  For example: "<tt>{ int 4, float 17.0 }</tt>".  Structure
+  constants must have <a href="#t_struct">structure type</a>, and the number and
+  types of elements must match those specified by the type.
   </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>int
-X;</tt>" at global scope.
-    <p> </p>
+
+  <dt><b>Array constants</b></dt>
+
+  <dd>Array constants are represented with notation similar to array type
+  definitions (a comma separated list of elements, surrounded by square brackets
+  (<tt>[]</tt>)).  For example: "<tt>[ int 42, int 11, int 74 ]</tt>".  Array
+  constants must have <a href="#t_array">array type</a>, and the number and
+  types of elements must match those specified by the type.
   </dd>
-  <dt><tt><b><a name="linkage_appending">appending</a></b></tt>: </dt>
-  <dd>"<tt>appending</tt>" linkage may only be applied to global
-variables of pointer to array type.  When two global variables with
-appending linkage are linked together, the two global arrays are
-appended together.  This is the LLVM, typesafe, equivalent of having
-the system linker append together "sections" with identical names when
-.o files are linked.
-    <p> </p>
+
+  <dt><b>Packed constants</b></dt>
+
+  <dd>Packed constants are represented with notation similar to packed type
+  definitions (a comma separated list of elements, surrounded by
+  less-than/greater-than's (<tt>&lt;&gt;</tt>)).  For example: "<tt>&lt; int 42,
+  int 11, int 74, int 100 &gt;</tt>".  Packed constants must have <a
+  href="#t_packed">packed type</a>, and the number and types of elements must
+  match those specified by the type.
   </dd>
-  <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 visible, meaning that it participates in linkage and can be
-used to resolve external symbol references.
-    <p> </p>
+
+  <dt><b>Zero initialization</b></dt>
+
+  <dd>The string '<tt>zeroinitializer</tt>' can be used to zero initialize a
+  value to zero of <em>any</em> type, including scalar and aggregate types.
+  This is often used to avoid having to print large zero initializers (e.g. for
+  large arrays), and is always exactly equivalent to using explicit zero
+  initializers.
   </dd>
 </dl>
-<p> </p>
-<p><a name="linkage_external">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
-external (i.e., lacking any linkage declarations), they are accessible
-outside of the current module.  It is illegal for a function <i>declaration</i>
-to have any linkage type other than "externally visible".</a></p>
+
 </div>
 
 <!-- ======================================================================= -->
 <div class="doc_subsection">
-  <a name="globalvars">Global Variables</a>
+  <a name="globalconstants">Global Variable and Function Addresses</a>
 </div>
 
 <div class="doc_text">
 
-<p>Global variables define regions of memory allocated at compilation
-time instead of run-time.  Global variables may optionally be
-initialized.  A variable may be defined as a global "constant", which
-indicates that the contents of the variable will never be modified
-(opening options for optimization).</p>
+<p>The addresses of <a href="#globalvars">global variables</a> and <a
+href="#functionstructure">functions</a> are always implicitly valid (link-time)
+constants.  These constants are explicitly referenced when the <a
+href="#identifiers">identifier for the global</a> is used and always have <a
+href="#t_pointer">pointer</a> type. For example, the following is a legal LLVM
+file:</p>
 
-<p>As SSA values, global variables define pointer values that are in
-scope (i.e. they dominate) for all basic blocks in the program.  Global
-variables always define a pointer to their "content" type because they
-describe a region of memory, and all memory objects in LLVM are
-accessed through pointers.</p>
+<pre>
+  %X = global int 17
+  %Y = global int 42
+  %Z = global [2 x int*] [ int* %X, int* %Y ]
+</pre>
 
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsection"><a name="undefvalues">Undefined Values</a></div>
+<div class="doc_text">
+  <p>The string '<tt>undef</tt>' is recognized as a type-less constant that has 
+  no specific value.  Undefined values may be of any type, and be used anywhere 
+  a constant is permitted.</p>
+
+  <p>Undefined values indicate to the compiler that the program is well defined
+  no matter what value is used, giving the compiler more freedom to optimize.
+  </p>
+</div>
 
 <!-- ======================================================================= -->
-<div class="doc_subsection">
-  <a name="functionstructure">Functions</a>
+<div class="doc_subsection"><a name="constantexprs">Constant Expressions</a>
 </div>
 
 <div class="doc_text">
 
-<p>LLVM function definitions are composed of a (possibly empty) argument list,
-an opening curly brace, a list of basic blocks, and a closing curly brace.  LLVM
-function declarations are defined with the "<tt>declare</tt>" keyword, a
-function name, and a function signature.</p>
+<p>Constant expressions are used to allow expressions involving other constants
+to be used as constants.  Constant expressions may be of any <a
+href="#t_firstclass">first class</a> type, and may involve any LLVM operation
+that does not have side effects (e.g. load and call are not supported).  The
+following is the syntax for constant expressions:</p>
 
-<p>A function definition contains a list of basic blocks, forming the CFG for
-the function.  Each basic block may optionally start with a label (giving the
-basic block a symbol table entry), contains a list of instructions, and ends
-with a <a href="#terminators">terminator</a> instruction (such as a branch or
-function return).</p>
+<dl>
+  <dt><b><tt>cast ( CST to TYPE )</tt></b></dt>
 
-<p>The first basic block in program is special in two ways: it is immediately
-executed on entrance to the function, and it is not allowed to have predecessor
-basic blocks (i.e. there can not be any branches to the entry block of a
-function).  Because the block can have no predecessors, it also cannot have any
-<a href="#i_phi">PHI nodes</a>.</p>
+  <dd>Cast a constant to another type.</dd>
 
-<p>LLVM functions are identified by their name and type signature.  Hence, two
-functions with the same name but different parameter lists or return values are
-considered different functions, and LLVM will resolves references to each
-appropriately.</p>
+  <dt><b><tt>getelementptr ( CSTPTR, IDX0, IDX1, ... )</tt></b></dt>
 
-</div>
+  <dd>Perform the <a href="#i_getelementptr">getelementptr operation</a> on
+  constants.  As with the <a href="#i_getelementptr">getelementptr</a>
+  instruction, the index list may have zero or more indexes, which are required
+  to make sense for the type of "CSTPTR".</dd>
 
+  <dt><b><tt>OPCODE ( LHS, RHS )</tt></b></dt>
+
+  <dd>Perform the specified operation of the LHS and RHS constants. OPCODE may 
+  be any of the <a href="#binaryops">binary</a> or <a href="#bitwiseops">bitwise
+  binary</a> operations.  The constraints on operands are the same as those for
+  the corresponding instruction (e.g. no bitwise operations on floating point
+  are allowed).</dd>
+</dl>
+</div>
 
 <!-- *********************************************************************** -->
 <div class="doc_section"> <a name="instref">Instruction Reference</a> </div>
 <!-- *********************************************************************** -->
+
 <div class="doc_text">
+
 <p>The LLVM instruction set consists of several different
 classifications of instructions: <a href="#terminators">terminator
 instructions</a>, <a href="#binaryops">binary instructions</a>, <a
  href="#memoryops">memory instructions</a>, and <a href="#otherops">other
 instructions</a>.</p>
+
 </div>
+
 <!-- ======================================================================= -->
 <div class="doc_subsection"> <a name="terminators">Terminator
 Instructions</a> </div>
+
 <div class="doc_text">
+
 <p>As mentioned <a href="#functionstructure">previously</a>, every
 basic block in a program ends with a "Terminator" instruction, which
 indicates which block should be executed after the current block is
 finished. These terminator instructions typically yield a '<tt>void</tt>'
 value: they produce control flow, not values (the one exception being
 the '<a href="#i_invoke"><tt>invoke</tt></a>' instruction).</p>
-<p>There are five different terminator instructions: the '<a
+<p>There are six 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>'
 Instruction</a> </div>
@@ -831,16 +1063,16 @@ table is not allowed to contain duplicate constant entries.</p>
 
 <p>The <tt>switch</tt> instruction specifies a table of values and
 destinations. When the '<tt>switch</tt>' instruction is executed, this
-table is searched for the given value.  If the value is found, the
-corresponding destination is branched to, otherwise the default value
-it transfered to.</p>
+table is searched for the given value.  If the value is found, control flow is
+transfered to the corresponding destination; otherwise, control flow is
+transfered to the default destination.</p>
 
 <h5>Implementation:</h5>
 
 <p>Depending on properties of the target machine and the particular
 <tt>switch</tt> instruction, this instruction may be code generated in different
-ways, for example as a series of chained conditional branches, or with a lookup
-table.</p>
+ways.  For example, it could be generated as a series of chained conditional
+branches or with a lookup table.</p>
 
 <h5>Example:</h5>
 
@@ -905,32 +1137,71 @@ support them.</p>
 <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<br></pre>
+<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>
+
+<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>
+
+<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>
+  unreachable
+</pre>
+
+<h5>Overview:</h5>
+
+<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>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.  The operands 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>
@@ -945,8 +1216,9 @@ Instruction</a> </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>
@@ -969,7 +1241,9 @@ instruction present in most other intermediate representations.</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>
@@ -991,7 +1265,9 @@ 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>
@@ -1014,7 +1290,9 @@ 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>
@@ -1035,7 +1313,9 @@ division of its 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
@@ -1097,7 +1377,7 @@ Operations</a> </div>
 <div class="doc_text">
 <p>Bitwise binary operators are used to do various forms of
 bit-twiddling in a program.  They are generally very efficient
-instructions, and can commonly be strength reduced from other
+instructions and can commonly be strength reduced from other
 instructions.  They require two operands, execute an operation on them,
 and produce a single value.  The resulting value of the bitwise binary
 operators is always the same type as its first operand.</p>
@@ -1322,7 +1602,7 @@ Operations</a></div>
 <p>A key design point of an SSA-based representation is how it
 represents memory.  In LLVM, no memory locations are in SSA form, which
 makes things very simple.  This section describes how to read, write,
-allocate and free memory in LLVM.</p>
+allocate, and free memory in LLVM.</p>
 </div>
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection"> <a name="i_malloc">'<tt>malloc</tt>'
@@ -1370,7 +1650,7 @@ memory heap, to be reallocated in the future.</p>
 that was allocated with the '<tt><a href="#i_malloc">malloc</a></tt>'
 instruction.</p>
 <h5>Semantics:</h5>
-<p>Access to the memory pointed to by the pointer is not longer defined
+<p>Access to the memory pointed to by the pointer is no longer defined
 after this instruction executes.</p>
 <h5>Example:</h5>
 <pre>  %array  = <a href="#i_malloc">malloc</a> [4 x ubyte]                    <i>; yields {[4 x ubyte]*}:array</i>
@@ -1390,7 +1670,7 @@ Instruction</a> </div>
 stack frame of the procedure that is live until the current function
 returns to its caller.</p>
 <h5>Arguments:</h5>
-<p>The the '<tt>alloca</tt>' instruction allocates <tt>sizeof(&lt;type&gt;)*NumElements</tt>
+<p>The '<tt>alloca</tt>' instruction allocates <tt>sizeof(&lt;type&gt;)*NumElements</tt>
 bytes of memory on the runtime stack, returning a pointer of the
 appropriate type to the program.  The second form of the instruction is
 a shorter version of the first that defaults to allocating one element.</p>
@@ -1511,8 +1791,11 @@ compiled to LLVM:</p>
   %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>
@@ -1733,65 +2016,104 @@ the <a href="#i_invoke">invoke</a> instruction.</p>
 <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>  &lt;resultarglist&gt; = vanext &lt;va_list&gt; &lt;arglist&gt;, &lt;argty&gt;<br></pre>
+
+<pre>
+  &lt;resultarglist&gt; = vanext &lt;va_list&gt; &lt;arglist&gt;, &lt;argty&gt;
+</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>  &lt;resultval&gt; = vaarg &lt;va_list&gt; &lt;arglist&gt;, &lt;argty&gt;<br></pre>
+
+<pre>
+  &lt;resultval&gt; = vaarg &lt;va_list&gt; &lt;arglist&gt;, &lt;argty&gt;
+</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>
 
 <!-- *********************************************************************** -->
@@ -1878,7 +2200,7 @@ int %test(int %X, ...) {
 
 <div class="doc_text">
 <h5>Syntax:</h5>
-<pre>  call va_list ()* %llvm.va_start()<br></pre>
+<pre>  call &lt;va_list&gt; ()* %llvm.va_start()<br></pre>
 <h5>Overview:</h5>
 <p>The '<tt>llvm.va_start</tt>' intrinsic returns a new <tt>&lt;arglist&gt;</tt>
 for subsequent use by the variable argument intrinsics.</p>
@@ -1900,7 +2222,7 @@ within the body of a variable argument function.</p>
 
 <div class="doc_text">
 <h5>Syntax:</h5>
-<pre>  call void (va_list)* %llvm.va_end(va_list &lt;arglist&gt;)<br></pre>
+<pre>  call void (&lt;va_list&gt;)* %llvm.va_end(&lt;va_list&gt; &lt;arglist&gt;)<br></pre>
 <h5>Overview:</h5>
 <p>The '<tt>llvm.va_end</tt>' intrinsic destroys <tt>&lt;arglist&gt;</tt>
 which has been initialized previously with <tt><a href="#i_va_start">llvm.va_start</a></tt>
@@ -1925,7 +2247,7 @@ with calls to <tt>llvm.va_end</tt>.</p>
 <h5>Syntax:</h5>
 
 <pre>
-  call va_list (va_list)* %llvm.va_copy(va_list &lt;destarglist&gt;)
+  call  &lt;va_list&gt; (&lt;va_list&gt;)* %llvm.va_copy(&lt;va_list&gt; &lt;destarglist&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -1981,7 +2303,7 @@ href="GarbageCollection.html">Accurate Garbage Collection with LLVM</a>.
 
 <h5>Overview:</h5>
 
-<p>The '<tt>llvm.gcroot</tt>' intrinsic declares the existance of a GC root to
+<p>The '<tt>llvm.gcroot</tt>' intrinsic declares the existence of a GC root to
 the code generator, and allows some metadata to be associated with it.</p>
 
 <h5>Arguments:</h5>
@@ -2228,7 +2550,9 @@ unsigned 16 bit value, and the return value must be 8, 16, or 32 bits.
 
 <h5>Syntax:</h5>
 <pre>
-  call void (&lt;integer type&gt;, &lt;integer type&gt;)* %llvm.writeport (&lt;integer type&gt; &lt;value&gt;, &lt;integer type&gt; &lt;address&gt;)
+  call void (&lt;integer type&gt;, &lt;integer type&gt;)*
+            %llvm.writeport (&lt;integer type&gt; &lt;value&gt;,
+                             &lt;integer type&gt; &lt;address&gt;)
 </pre>
 
 <h5>Overview:</h5>
@@ -2357,53 +2681,6 @@ ensures that accesses to memory mapped I/O registers occur in program order.
 
 </div>
 
-<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection">
-  <a name="i_interrupt_handler">'<tt>llvm.interrupt_handler</tt>' Intrinsic</a>
-</div>
-
-<div class="doc_text">
-
-<h5>Syntax:</h5>
-<pre>
-  call void (void)* %llvm.interrupt_handler (void)
-</pre>
-
-<h5>Overview:</h5>
-
-<p>
-The '<tt>llvm.interrupt_handler</tt>' intrinsic installs the specified function
-as an interrupt handler for the specified interrupt.
-</p>
-
-<h5>Arguments:</h5>
-
-<p>
-The first argument is the value to write to the memory mapped I/O location.
-The second argument is a pointer indicating the memory address to which the
-data should be written.
-</p>
-
-<h5>Semantics:</h5>
-
-<p>
-The '<tt>llvm.writeio</tt>' intrinsic writes <i>value</i> to the memory mapped
-I/O address specified by <i>pointer</i>.  The value must be a
-<a href="#t_firstclass">first class</a> type.  However, certain architectures
-may not support I/O on all first class types.  For example, 32 bit processors
-may only support I/O on data types that are 32 bits or less.
-</p>
-
-<p>
-This intrinsic enforces an in-order memory model for llvm.readio and
-llvm.writeio calls on machines that use dynamic scheduling.  Dynamically
-scheduled processors may execute loads and stores out of order, re-ordering at
-run time accesses to memory mapped I/O registers.  Using these intrinsics
-ensures that accesses to memory mapped I/O registers occur in program order.
-</p>
-
-</div>
-
 <!-- ======================================================================= -->
 <div class="doc_subsection">
   <a name="int_libc">Standard C Library Intrinsics</a>