rearrange some info about the instruction encoding
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24204 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/docs/BytecodeFormat.html b/docs/BytecodeFormat.html
index 67ed8ba..5c22530 100644
--- a/docs/BytecodeFormat.html
+++ b/docs/BytecodeFormat.html
@@ -39,8 +39,8 @@
<li><a href="#constantpool">Global Constant Pool</a></li>
<li><a href="#functiondefs">Function Definition</a></li>
<li><a href="#compactiontable">Compaction Table</a></li>
- <li><a href="#instructionlist">Instruction List</a></li>
- <li><a href="#opcodes">Instruction Opcodes</a></li>
+ <li><a href="#instructionlist">Instructions List</a></li>
+ <li><a href="#instructions">Instructions</a></li>
<li><a href="#symtab">Symbol Table</a></li>
</ol>
</li>
@@ -1363,186 +1363,23 @@
</tbody>
</table>
</div>
+
<!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection"><a name="instruction">Instructions</a></div>
+<div class="doc_subsection"><a name="instructions">Instructions</a></div>
+
<div class="doc_text">
-<p>For brevity, instructions are written in one of four formats,
-depending on the number of operands to the instruction. Each
-instruction begins with a <a href="#uint32_vbr">uint32_vbr</a> that
-encodes the type of the instruction as well as other things. The tables
-that follow describe the format of this first part of each instruction.</p>
-<p><b>Instruction Format 0</b></p>
-<p>This format is used for a few instructions that can't easily be
-shortened because they have large numbers of operands (e.g. PHI Node or
-getelementptr). Each of the opcode, type, and operand fields is found in
-successive fields.</p>
-<table>
- <tbody>
- <tr>
- <th><b>Type</b></th>
- <th class="td_left"><b>Field Description</b></th>
- </tr>
- <tr>
- <td><a href="#uint32_vbr">uint32_vbr</a></td>
- <td class="td_left">Specifies the opcode of the instruction. Note
-that for compatibility with the other instruction formats, the opcode
-is shifted left by 2 bits. Bits 0 and 1 must have value zero for this
-format.</td>
- </tr>
- <tr>
- <td><a href="#uint24_vbr">uint24_vbr</a></td>
- <td class="td_left">Provides the type slot number of the result type of
- the instruction.</td>
- </tr>
- <tr>
- <td><a href="#uint32_vbr">uint32_vbr</a></td>
- <td class="td_left">The number of operands that follow.</td>
- </tr>
- <tr>
- <td><a href="#uint32_vbr">uint32_vbr</a>+</td>
- <td class="td_left">The slot number of the value(s) for the operand(s).
- <sup>1</sup></td>
- </tr>
- </tbody>
-</table>
-Notes:
-<ol>
- <li>Note that if the instruction is a getelementptr and the type of
-the operand is a sequential type (array or pointer) then the slot
-number is shifted up two bits and the low order bits will encode the
-type of index used, as follows: 0=uint, 1=int, 2=ulong, 3=long.</li>
-</ol>
-<p><b>Instruction Format 1</b></p>
-<p>This format encodes the opcode, type and a single operand into a
-single <a href="#uint32_vbr">uint32_vbr</a> as follows:</p>
-<table>
- <tbody>
- <tr>
- <th><b>Bits</b></th>
- <th><b>Type</b></th>
- <th class="td_left"><b>Field Description</b></th>
- </tr>
- <tr>
- <td>0-1</td>
- <td>constant "1"</td>
- <td class="td_left">These two bits must be the value 1 which identifies
- this as an instruction of format 1.</td>
- </tr>
- <tr>
- <td>2-7</td>
- <td><a href="#opcode">opcode</a></td>
- <td class="td_left">Specifies the opcode of the instruction. Note that
- the maximum opcode value is 63.</td>
- </tr>
- <tr>
- <td>8-19</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the type for this
- instruction. Maximum slot number is 2<sup>12</sup>-1=4095.</td>
- </tr>
- <tr>
- <td>20-31</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the
- first operand. Maximum slot number is 2<sup>12</sup>-1=4095. Note that
- the value 2<sup>12</sup>-1 denotes zero operands.</td>
- </tr>
- </tbody>
-</table>
-<p><b>Instruction Format 2</b></p>
-<p>This format encodes the opcode, type and two operands into a single <a
- href="#uint32_vbr">uint32_vbr</a> as follows:</p>
-<table>
- <tbody>
- <tr>
- <th><b>Bits</b></th>
- <th><b>Type</b></th>
- <th class="td_left"><b>Field Description</b></th>
- </tr>
- <tr>
- <td>0-1</td>
- <td>constant "2"</td>
- <td class="td_left">These two bits must be the value 2 which identifies
- this as an instruction of format 2.</td>
- </tr>
- <tr>
- <td>2-7</td>
- <td><a href="#opcodes">opcode</a></td>
- <td class="td_left">Specifies the opcode of the instruction. Note that
- the maximum opcode value is 63.</td>
- </tr>
- <tr>
- <td>8-15</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the type for this
- instruction. Maximum slot number is 2<sup>8</sup>-1=255.</td>
- </tr>
- <tr>
- <td>16-23</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the first
- operand. Maximum slot number is 2<sup>8</sup>-1=255.</td>
- </tr>
- <tr>
- <td>24-31</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the second
- operand. Maximum slot number is 2<sup>8</sup>-1=255.</td>
- </tr>
- </tbody>
-</table>
-<p><b>Instruction Format 3</b></p>
-<p>This format encodes the opcode, type and three operands into a
-single <a href="#uint32_vbr">uint32_vbr</a> as follows:</p>
-<table>
- <tbody>
- <tr>
- <th><b>Bits</b></th>
- <th><b>Type</b></th>
- <th class="td_left"><b>Field Description</b></th>
- </tr>
- <tr>
- <td>0-1</td>
- <td>constant "3"</td>
- <td class="td_left">These two bits must be the value 3 which identifies
- this as an instruction of format 3.</td>
- </tr>
- <tr>
- <td>2-7</td>
- <td><a href="#opcodes">opcode</a></td>
- <td class="td_left">Specifies the opcode of the instruction. Note that
- the maximum opcode value is 63.</td>
- </tr>
- <tr>
- <td>8-13</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the type for this
- instruction. Maximum slot number is 2<sup>6</sup>-1=63.</td>
- </tr>
- <tr>
- <td>14-19</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the first
- operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
- </tr>
- <tr>
- <td>20-25</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the second
- operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
- </tr>
- <tr>
- <td>26-31</td>
- <td><a href="#unsigned">unsigned</a></td>
- <td class="td_left">Specifies the slot number of the value for the third
- operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
- </tr>
- </tbody>
-</table>
+<p>Instructions are written out one at a time as distinct units. Each
+instruction
+record contains at least an <a href="#opcodes">opcode</a> and a type field,
+and may contain a list of operands (whose interpretation depends on the opcode).
+Based on the number of operands, the
+<a href="#instencode">instruction is encoded</a> in a
+dense format that tries to encoded each instruction into 32-bits if
+possible. </p>
</div>
<!-- _______________________________________________________________________ -->
-<div class="doc_subsection"><a name="opcodes">Instruction Opcodes</a></div>
+<div class="doc_subsubsection"><a name="opcodes">Instruction Opcodes</a></div>
<div class="doc_text">
<p>Instructions encode an opcode that identifies the kind of instruction.
Opcodes are an enumerated integer value. The specific values used depend on
@@ -1614,10 +1451,9 @@
<tr><td>Store+Volatile</td><td>63</td><td>3</td><td>1.3</td></tr>
</tbody>
</table>
-</div>
<p><b><a name="pi_note">* Note: </a></b>
-These aren't really opcodes from an LLVM language prespeective. They encode
+These aren't really opcodes from an LLVM language perspective. They encode
information into other opcodes without reserving space for that information.
For example, opcode=63 is a Volatile Store. The opcode for this
instruction is 25 (Store) but we encode it as 63 to indicate that is a Volatile
@@ -1639,6 +1475,188 @@
<dt>TailCall</dt>
<dd>This indicates that the Call has the 'tail' modifier.</dd>
</dl>
+</div>
+
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"><a name="instencode">Instruction
+Encoding</a></div>
+
+<div class="doc_text">
+<p>For brevity, instructions are written in one of four formats,
+depending on the number of operands to the instruction. Each
+instruction begins with a <a href="#uint32_vbr">uint32_vbr</a> that
+encodes the type of the instruction as well as other things. The tables
+that follow describe the format of this first part of each instruction.</p>
+<p><b>Instruction Format 0</b></p>
+<p>This format is used for a few instructions that can't easily be
+shortened because they have large numbers of operands (e.g. PHI Node or
+getelementptr). Each of the opcode, type, and operand fields is found in
+successive fields.</p>
+<table>
+ <tbody>
+ <tr>
+ <th><b>Type</b></th>
+ <th class="td_left"><b>Field Description</b></th>
+ </tr>
+ <tr>
+ <td><a href="#uint32_vbr">uint32_vbr</a></td>
+ <td class="td_left">Specifies the opcode of the instruction. Note
+that for compatibility with the other instruction formats, the opcode
+is shifted left by 2 bits. Bits 0 and 1 must have value zero for this
+format.</td>
+ </tr>
+ <tr>
+ <td><a href="#uint24_vbr">uint24_vbr</a></td>
+ <td class="td_left">Provides the type slot number of the result type of
+ the instruction.</td>
+ </tr>
+ <tr>
+ <td><a href="#uint32_vbr">uint32_vbr</a></td>
+ <td class="td_left">The number of operands that follow.</td>
+ </tr>
+ <tr>
+ <td><a href="#uint32_vbr">uint32_vbr</a>+</td>
+ <td class="td_left">The slot number of the value(s) for the operand(s).
+ <sup>1</sup></td>
+ </tr>
+ </tbody>
+</table>
+Notes:
+<ol>
+ <li>Note that if the instruction is a getelementptr and the type of
+the operand is a sequential type (array or pointer) then the slot
+number is shifted up two bits and the low order bits will encode the
+type of index used, as follows: 0=uint, 1=int, 2=ulong, 3=long.</li>
+</ol>
+<p><b>Instruction Format 1</b></p>
+<p>This format encodes the opcode, type and a single operand into a
+single <a href="#uint32_vbr">uint32_vbr</a> as follows:</p>
+<table>
+ <tbody>
+ <tr>
+ <th><b>Bits</b></th>
+ <th><b>Type</b></th>
+ <th class="td_left"><b>Field Description</b></th>
+ </tr>
+ <tr>
+ <td>0-1</td>
+ <td>constant "1"</td>
+ <td class="td_left">These two bits must be the value 1 which identifies
+ this as an instruction of format 1.</td>
+ </tr>
+ <tr>
+ <td>2-7</td>
+ <td><a href="#instructions">opcode</a></td>
+ <td class="td_left">Specifies the opcode of the instruction. Note that
+ the maximum opcode value is 63.</td>
+ </tr>
+ <tr>
+ <td>8-19</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the type for this
+ instruction. Maximum slot number is 2<sup>12</sup>-1=4095.</td>
+ </tr>
+ <tr>
+ <td>20-31</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the
+ first operand. Maximum slot number is 2<sup>12</sup>-1=4095. Note that
+ the value 2<sup>12</sup>-1 denotes zero operands.</td>
+ </tr>
+ </tbody>
+</table>
+<p><b>Instruction Format 2</b></p>
+<p>This format encodes the opcode, type and two operands into a single <a
+ href="#uint32_vbr">uint32_vbr</a> as follows:</p>
+<table>
+ <tbody>
+ <tr>
+ <th><b>Bits</b></th>
+ <th><b>Type</b></th>
+ <th class="td_left"><b>Field Description</b></th>
+ </tr>
+ <tr>
+ <td>0-1</td>
+ <td>constant "2"</td>
+ <td class="td_left">These two bits must be the value 2 which identifies
+ this as an instruction of format 2.</td>
+ </tr>
+ <tr>
+ <td>2-7</td>
+ <td><a href="#instructions">opcode</a></td>
+ <td class="td_left">Specifies the opcode of the instruction. Note that
+ the maximum opcode value is 63.</td>
+ </tr>
+ <tr>
+ <td>8-15</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the type for this
+ instruction. Maximum slot number is 2<sup>8</sup>-1=255.</td>
+ </tr>
+ <tr>
+ <td>16-23</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the first
+ operand. Maximum slot number is 2<sup>8</sup>-1=255.</td>
+ </tr>
+ <tr>
+ <td>24-31</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the second
+ operand. Maximum slot number is 2<sup>8</sup>-1=255.</td>
+ </tr>
+ </tbody>
+</table>
+<p><b>Instruction Format 3</b></p>
+<p>This format encodes the opcode, type and three operands into a
+single <a href="#uint32_vbr">uint32_vbr</a> as follows:</p>
+<table>
+ <tbody>
+ <tr>
+ <th><b>Bits</b></th>
+ <th><b>Type</b></th>
+ <th class="td_left"><b>Field Description</b></th>
+ </tr>
+ <tr>
+ <td>0-1</td>
+ <td>constant "3"</td>
+ <td class="td_left">These two bits must be the value 3 which identifies
+ this as an instruction of format 3.</td>
+ </tr>
+ <tr>
+ <td>2-7</td>
+ <td><a href="#instructions">opcode</a></td>
+ <td class="td_left">Specifies the opcode of the instruction. Note that
+ the maximum opcode value is 63.</td>
+ </tr>
+ <tr>
+ <td>8-13</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the type for this
+ instruction. Maximum slot number is 2<sup>6</sup>-1=63.</td>
+ </tr>
+ <tr>
+ <td>14-19</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the first
+ operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
+ </tr>
+ <tr>
+ <td>20-25</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the second
+ operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
+ </tr>
+ <tr>
+ <td>26-31</td>
+ <td><a href="#unsigned">unsigned</a></td>
+ <td class="td_left">Specifies the slot number of the value for the third
+ operand. Maximum slot number is 2<sup>6</sup>-1=63.</td>
+ </tr>
+ </tbody>
+</table>
+</div>
<!-- _______________________________________________________________________ -->
<div class="doc_subsection"><a name="symtab">Symbol Table</a> </div>