Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(663)

Side by Side Diff: native_client_sdk/src/doc/reference/pnacl-bitcode-manual.rst

Issue 725333002: Initial draft of PNaCl bitcode files. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix additional changes suggested by Jim. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 ===============================
2 Contents Of PNaCl Bitcode Files
3 ===============================
4
5 .. contents::
6 :local:
7 :backlinks: none
8 :depth: 3
9
10
11 Introduction
12 ============
13
14 This document is a reference manual for the contents of PNaCl bitcode files. We
15 define bitcode files via three layers. The first layer is presented using
16 assembly language *PNaClAsm*, and defines the textual form of the bitcode
17 file. The textual form is then lowered to a sequence of :ref:`PNaCl
18 records<link_for_pnacl_records>`. The final layer applies abbreviations that
19 convert each PNaCl record into a corresponding sequence of bits.
20
21 .. image:: /images/PNaClBitcodeFlow.png
22
23 PNaClAsm uses a *static single assignment* (SSA) based representation that
24 requires generated results to have a single (assignment) source.
25
26 PNaClAsm focuses on the semantic content of the file, not the bit-encoding of
27 that content. However, it does provide annotations that allow one to specify how
28 the :ref:`abbreviations<link_for_abbreviations_section>` are used to convert
29 PNaCl records into the sequence of bits.
30
31 Each construct in PNaClAsm defines a corresponding :ref:`PNaCl
32 record<link_for_pnacl_records>`. A PNaCl bitcode file is simply a sequence of
33 PNaCl records. The goal of PNaClAsm is to make records easier to read, and not
34 to define a high-level user programming language.
35
36 PNaCl records are an abstract encoding of structured data, similar to XML. Like
37 XML, A PNaCl record has a notion of a tag (i.e. the first element in a record,
38 called a *code*). PNaCl records can be nested. Nesting is defined by a
39 corresponding :ref:`enter<link_for_enter_block_record_section>` and
40 :ref:`exit<link_for_exit_block_record_section>` block record.
41
42 These block records must be used like balanced parentheses to define the block
43 structure that is imposed on top of records. Each exit record must be preceded
44 by a corresponding enter record. Blocks can be nested by nesting enter/exit
45 records appropriately.
46
47 The *PNaCl bitcode writer* takes the sequence of records, defined by a PNaClAsm
48 program, and converts each record into a (variable-length) sequence of bits. The
49 output of each bit sequence is appended together. The resulting generated
50 sequence of bits is the contents of the PNaCl bitcode file.
51
52 For every kind of record, there is a method for converting records into bit
53 sequences. These methods correspond to a notion of
54 :ref:`abbreviations<link_for_abbreviations_section>`. Each abbreviation defines
55 a specific bit sequence conversion to be applied.
56
57 Abbreviations can be user-defined, but there are also predefined defaults. All
58 user-specified abbreviations are included in the generated bitcode
59 file. Predefined defaults are not.
60
61 Each abbreviation defines how a record is converted to a bit sequence. The
62 :ref:`PNaCl translator<link_for_pnacl_translator>` uses these abbreviations
63 to convert the bit sequence back to the corresponding sequence of PNaCl records.
64 As a result, all records have an abbreviation (user or default) associated with
65 them.
66
67 Conceptually, abbreviations are used to define how to pack the contents of
68 records into bit sequences. The main reason for defining abbreviations is to
69 save space. The default abbreviations are simplistic and are intended to handle
70 all possible records. The default abbreviations do not really worry about being
71 efficient, in terms of the number of bits generated.
72
73 By separating the concepts of PNaCl records and abbreviations, the notion of
74 data compression is cleanly separated from semantic content. This allows
75 different use cases to decide how much effort should be spent on compressing
76 records.
77
78 For a JIT compiler that produces bitcode, little (if any) compression should be
79 applied. In fact, the API to the JIT may just be the records themselves. The
80 goal of a JIT is to perform the final translation to machine code as quickly as
81 possible.
82
83 On the other hand, when delivering across the web, one may want to compress the
84 sequence of bits considerably, to reduce costs in delivering web pages. Note
85 that :ref:`pnacl-compress<pnacl_compress>` is provided as part of the SDK to do
86 this job.
87
88 Data Model
89 ==========
90
91 The data model for PNaCl bitcode is fixed at little-endian ILP32: pointers are
92 32 bits in size. 64-bit integer types are also supported natively via the i64
93 type (for example, a front-end can generate these from the C/C++ type ``long
94 long``).
95
96 Integers are assumed to be modeled using two's complement. Floating point
97 support is fixed at :ref:`IEEE 754<c_cpp_floating_point>` 32-bit and 64-bit
98 values (float and double, respectively).
99
100 PNaCl Blocks
101 ============
102
103 Blocks are used to organize records in the bitcode file. The kinds of blocks
104 defined in PNaClAsm are:
105
106 Module block
107 A top-level block defining the program. The :ref:`module
108 block<link_for_module_block>` defines global information used by the program,
109 followed by function blocks defining the implementation of functions within
110 the program. All other blocks (listed below) must appear within a module
111 block.
112
113 Types block
114 The :ref:`types block<link_for_types_block_section>` defines the set of types
115 used by the program. All types used in the program must be defined in the
116 types block. These types consist of primitive types as well as high level
117 constructs such as vectors and function signatures.
118
119 Globals block
120 The :ref:`globals block<link_for_globals_block_section>` defines the set of
121 global addresses of global variables and constants used by the program. It
122 also defines how each global (associated with the global address) is
123 initialized.
124
125 Valuesymtab block
126 The :ref:`valuesymtab block<link_for_valuesymtab_block_section>` defines
127 textual names for external function addresses.
128
129 Function block
130 Each function (implemented) in a program has its own :ref:`function
131 block<link_for_function_blocks_section>` that defines the implementation of
132 the corresponding function.
133
134 Constants block
135 Each implemented function that uses constants in its instructions defines a
136 :ref:`constants block<link_for_constants_block_section>`. Constants blocks
137 appear within the corresponding function block of the implemented function.
138
139 Abbreviations block
140 Defines global abbreviations that are used to compress PNaCl records. The
141 :ref:`abbreviations block<link_for_abbreviations_block_section>` is segmented
142 into multiple sections, one section for each kind of block. This block appears
143 at the beginning of the module block.
144
145 This section is only intended as a high-level discussion of blocks. Later
146 sections will dive more deeply into the constraints on how blocks must be laid
147 out. This section only presents the overall concepts of what kinds of data are
148 stored in each of the blocks.
149
150 A PNaCl program consists of a :ref:`header
151 record<link_for_header_record_section>` and a :ref:`module
152 block<link_for_module_block>`. The header record defines a sequence of bytes
153 uniquely identifying the file as a bitcode file. The module block defines the
154 program to run.
155
156 Each block, within a bitcode file, defines values. These values are associated
157 with IDs. Each type of block defines different kinds of IDs. The
158 :ref:`module<link_for_module_block>`,
159 :ref:`types<link_for_types_block_section>`,
160 :ref:`globals<link_for_globals_block_section>`, and
161 :ref:`abbreviations<link_for_abbreviations_block_section>` blocks define global
162 identifiers, and only a single instance can appear. The
163 :ref:`function<link_for_function_blocks_section>` and
164 :ref:`constant<link_for_constants_block_section>` blocks define local
165 identifiers, and can have multiple instances (one for each implemented
166 function).
167
168 The only records in the module block that define values, are :ref:`function
169 address<link_for_function_address_section>` records. Each function address
170 record defines a different function address, and the :ref:`type
171 signature<link_for_function_type>` associated with that function address.
172
173 Each :ref:`function block<link_for_function_blocks_section>` defines the
174 implementation of a single function. Each function block defines the
175 intermediate representation of the function, consisting of basic blocks and
176 instructions. If constants are used within instructions, they are defined in a
177 :ref:`constants block<link_for_constants_block_section>`, nested within the
178 corresponding function block.
179
180 All function blocks are associated with a corresponding function address. This
181 association is positional rather than explicit. That is, the Nth function block
182 in a module block corresponds to the Nth
183 :ref:`defining<link_for_function_address_section>` (rather than declared)
184 function address record in the module block.
185
186 Hence, within a function block, there is no explicit reference to the function
187 address the block defines. For readability, PNaClAsm uses the corresponding
188 function signature, associated with the corresponding function address record,
189 even though that data does not appear in the corresponding records.
190
191 .. _link_for_pnacl_records:
192
193 PNaCl Records
194 =============
195
196 A PNaCl record is a non-empty sequence of unsigned, 64-bit, integers. A record
197 is identified by the record *code*, which is the first element in the
198 sequence. Record codes are unique within a specific kind of block, but are not
199 necessarily unique across different kinds of blocks. The record code acts as the
200 variant discriminator (i.e. tag) within a block, to identify what kind of record
201 it is.
202
203 Record codes that are local to a specific kind of block are small values
204 (starting from zero). In an ideal world, they would be a consecutive sequence of
205 integers, starting at zero. However, the reality is that PNaCl records evolved
206 over time (and actually started as `LLVM records
207 <http://llvm.org/docs/BitCodeFormat.html>`_). For backward compatibility,
208 obsolete numbers have not been reused, leaving gaps in the actual record code
209 values used.
210
211 Global record codes are record codes that have the same meaning in multiple
212 kinds of blocks. To separate global record codes from local record codes, large
213 values are used. Currently there are four :ref:`global record
214 codes<link_for_global_record_codes>`. To make these cases clear, and to leave
215 ample room for future growth in PNaClAsm, these special records have record
216 codes close to the value 2\ :sup:`16`\ . Note: Well-formed PNaCl bitcode files
217 do not have record codes >= 2\ :sup:`16`\ .
218
219 A PNaCl record is denoted as follows: ::
220
221 a: <v0, v1, ... , vN>
222
223 The value ``v0`` is the record code. The remaining values, ``v1`` through
224 ``vN``, are parameters that fill in additional information needed by the
225 construct it represents. All records must have a record code. Hence, empty PNaCl
226 records are not allowed. ``a`` is the index to the abbreviation used to convert
227 the record to a bit sequence.
228
229 While most records (for a given record code) have the same length, it
Jim Stichnoth 2014/11/19 21:12:01 Reformat with fill-column=80
Karl 2014/11/20 17:05:33 Done.
230 is not true of all record codes. Some record codes can have arbitrary
231 length. In particular, function type signatures, call instructions,
232 phi instructions, switch instructions, and global variable
233 initialization records all have variable length. The expected length
234 is predefined and part of the PNaClAsm language. See the corresponding
235 construct (associated with the record) to determine the expected
236 length.
237
238 The *PNaCl bitstream writer*, which converts records to bit sequences, does
239 this by writing out the abbreviation index used to encode the record, followed
240 by the contents of the record. The details of this are left to the section on
241 :ref:`abbreviations<link_for_abbreviations_section>`. However, at the record
242 level, one important aspect of this appears in :ref:`block
243 enter<link_for_enter_block_record_section>` records. These records must define
244 how many bits are required to hold abbreviation indices associated with records
245 of that block.
246
247 .. _link_for_default_abbreviations:
248
249 Default Abbreviations
250 =====================
251
252 There are 4 predefined (default) abbreviation indices, used as the default
253 abbreviations for PNaCl records. They are:
254
255 0
256 Abbreviation index for the abbreviation used to bit-encode an exit block
257 record.
258
259 1
260 Abbreviation index for the abbreviation used to bit-encode an enter block
261 record.
262
263 2
264 Abbreviation index for the abbreviation used to bit-encode a user-defined
265 abbreviation. Note: User-defined abbreviations are also encoded as records,
266 and hence need an abbreviation index to bit-encode them.
267
268 3
269 Abbreviation index for the default abbreviation to bit-encode all other
270 records in the bitcode file.
271
272 A block may, in addition, define a list of block specific, user-defined,
273 abbreviations (of length ``U``). The number of bits ``B`` specified for an enter
274 record must be sufficiently large such that::
275
276 2**B >= U + 4
277
278 In addition, the upper limit for ``B`` is ``16``.
279
280 PNaClAsm requires specifying the number of bits needed to read abbreviations as
281 part of the enter block record. This allows the PNaCl bitcode reader/writer to
282 use the specified number of bits to encode abbreviation indices.
283
284 PNaCl Identifiers
285 =================
286
287 A program is defined by a :ref:`module block<link_for_module_block>`. Blocks can
288 be nested within other blocks, including the module block. Each block defines a
289 sequence of records.
290
291 Most of the records, within a block, also define unique values. Each unique
292 value is given a corresponding unique identifier (i.e. *ID*). In PNaClAsm, each
293 kind of block defines its own kind of identifiers. The names of these
294 identifiers are defined by concatenating a prefix character (``'@'`` or
295 ``'%'``), the kind of block (a single character), and a suffix index. The suffix
296 index is defined by the positional location of the defined value within the
297 records of the corresponding block. The indices are all zero based, meaning that
298 the first defined value (within a block) is defined using index 0.
299
300 Identifiers are categorized into two types, *local* and *global*. Local
301 identifiers are identifiers that are associated with the implementation of a
302 single function. In that sense, they are local to the block they appear in.
303
304 All other identifiers are global, and can appear in multiple blocks. This split
305 is intentional. Global identifiers are used by multiple functions, and therefore
306 must be known in all function implementations. Local identifiers only apply to a
307 single function, and can be reused between functions. The :ref:`PNaCl
308 translator<link_for_pnacl_translator>` uses this separation to parallelize the
309 compilation of functions.
310
311 Note that local abbreviation identifiers are unique to the block they appear
312 in. Global abbreviation identifiers are only unique to the block type they are
313 defined for. Different block types can reuse global abbreviation identifiers.
314
315 Global identifiers use the prefix character ``'@'`` while local identifiers use
316 the prefix character ``'%'``.
317
318 Note that by using positional location to define identifiers (within a block),
319 the values defined in PNaCl bitcode files need not be explicitly included in the
320 bitcode file. Rather, they are inferred by the (ordered) position of the record
321 in the block. This is also intentional. It is used to reduce the amount of data
322 that must be (explicitly) passed to the :ref:`PNaCl
323 translator<link_for_pnacl_translator>`, when downloaded into Chrome.
324
325 In general, most of the records within blocks are assumed to be topologically
326 sorted, putting value definitions before their uses. This implies that records
327 do not need to encode data if they can deduce the corresponding information from
328 their uses.
329
330 The most common use of this is that many instructions use the type of their
331 operands to determine the type of the instruction. Again, this is
332 intentional. It allows less information to be stored.
333
334 However, for function blocks (which define instructions), a topological sort may
335 not exist. Loop carried value dependencies simply do not allow topologically
336 sorting. To deal with this, function blocks have a notion of (instruction value)
337 :ref:`forward type
338 declarations<link_for_forward_type_declaration_section>`. These declarations
339 must appear before any of the uses of that value, if the (instruction) value is
340 defined later in the function than its first use.
341
342 The kinds of identifiers used in PNaClAsm are:
343
344 @a
345 Global abbreviation identifier.
346
347 %a
348 Local abbreviation identifier.
349
350 %b
351 Function basic block identifier.
352
353 %c
354 Function constant identifier.
355
356 @f
357 Global function address identifier.
358
359 @g
360 Global variable/constant address identifier.
361
362 %p
363 Function parameter identifier.
364
365 @t
366 Global type identifier.
367
368 %v
369 Value generated by an instruction in a function block.
370
371
372 Conventions For Describing Records
373 ==================================
374
375 PNaClAsm is the textual representation of :ref:`PNaCl
376 records<link_for_pnacl_records>`. Each PNaCl record is described by a
377 corresponding PNaClAsm construct. These constructs are described using syntax
378 rules, and semantics on how they are converted to records. Along with the rules,
379 is a notion of :ref:`global state<link_for_global_state_section>`. The global
380 state is updated by syntax rules. The purpose of the global state is to track
381 positional dependencies between records.
382
383 For each PNaCl construct, we define multiple sections. The **Syntax**
384 section defines a syntax rule for the construct. The **Record** section
385 defines the corresponding record associated with the syntax rule. The
386 **Semantics** section describes the semantics associated with the record, in
387 terms of data within the global state and the corresponding syntax. It also
388 includes other high-level semantics, when appropriate.
389
390 The **Constraints** section (if present) defines any constraints associated
391 with the construct, including the global state. The **Updates** section (if
392 present) defines how the global state is updated when the construct is
393 processed. The **Examples** section gives one or more examples of using the
394 corresponding PNaClAsm construct.
395
396 Some semantics sections use functions to compute values. The meaning of
397 functions can be found in :ref:`support
398 functions<link_for_support_functions_section>`.
399
400 The syntax rule may include the
401 :ref:`abbreviation<link_for_abbreviations_section>` to use, when converting to a
402 bit-sequence. These abbreviations, if allowed, are at the end of the construct,
403 and enclosed in ``<`` and ``>`` brackets. These abbreviations are optional in
404 the syntax, and can be omitted. If they are used, the abbreviation brackets are
405 part of the actual syntax of the construct. If the abbreviation is omitted, the
406 default abbreviation index is used. To make it clear that abbreviations are
407 optional, syntax rules separate abbreviations using plenty of whitespace.
408
409 Within a syntax rule, lower case characters are literal values. Sequences of
410 upper case alphanumeric characters are named values. If we mix lower and upper
411 case letters within a name appearing in a syntax rule, the lower case letters
412 are literal while the upper case sequence of alphanumeric characters denote rule
413 specific values. The valid values for each of these names will be defined in
414 the corresponding semantics and constraints subsections.
415
416 For example, consider the following syntax rule::
417
418 %vN = add T O1, O2; <A>
419
420 This rule defines a PNaClAsm add instruction. This construct defines an
421 instruction that adds two values (``O1`` and ``O2``) to generate instruction
422 value ``%vN``. The types of the arguments, and the result, are all of type
423 ``T``. If abbreviation ID ``A`` is present, the record is encoded using that
424 abbreviation. Otherwise the corresponding :ref:`default abbreviation
425 index<link_for_default_abbreviations>` is used.
426
427 To be concrete, the syntactic rule above defines the structure of the following
428 PNaClAsm examples::
429
430 %v10 = add i32 %v1, %v2; <@a5>
431 %v11 = add i32 %v10, %v3;
432
433 In addition to specifying the syntax, each syntax rule can also also specify the
434 contents of the corresponding record in the corresponding record subsection. In
435 simple cases, the elements of the corresponding record are predefined (literal)
436 constants. Otherwise the record element is an identifier from another subsection
437 associated with the construct.
438
439 Factorial Example
440 =================
441
442 This section provides a simple example of a PNaCl bitcode file. Its contents
443 describe a bitcode file that only defines a function to compute the factorial
444 value of a number.
445
446 In C, the factorial function can be defined as::
447
448 int fact(int n) {
449 if (n == 1) return 1;
450 return n * fact(n-1);
451 }
452
453 Compiling this into a PNaCl bitcode file, and dumping out its contents with
454 utility :ref:`pnacl-bcdis<pnacl-bcdis>`, the corresponding output is::
455
456 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, 88, 69)
457 | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2
458 | 0> |
459 16:0|1: <65535, 8, 2> |module { // BlockID = 8
460 24:0| 3: <1, 1> | version 1;
461 26:4| 1: <65535, 0, 2> | abbreviations { // BlockID = 0
462 36:0| 0: <65534> | }
463 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
464 48:0| 3: <1, 4> | count 4;
465 50:4| 3: <7, 32> | @t0 = i32;
466 53:6| 3: <2> | @t1 = void;
467 55:4| 3: <21, 0, 0, 0> | @t2 = i32 (i32);
468 59:4| 3: <7, 1> | @t3 = i1;
469 62:0| 0: <65534> | }
470 64:0| 3: <8, 2, 0, 0, 0> | define external i32 @f0(i32);
471 68:6| 1: <65535, 19, 2> | globals { // BlockID = 19
472 76:0| 3: <5, 0> | count 0;
473 78:4| 0: <65534> | }
474 80:0| 1: <65535, 14, 2> | valuesymtab { // BlockID = 14
475 88:0| 3: <1, 0, 102, 97, 99, | @f0 : "fact";
476 | 116> |
477 96:4| 0: <65534> | }
478 100:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {
479 | | // BlockID = 12
480 108:0| 3: <1, 3> | blocks 3;
481 110:4| 1: <65535, 11, 2> | constants { // BlockID = 11
482 120:0| 3: <1, 0> | i32:
483 122:4| 3: <4, 2> | %c0 = i32 1;
484 125:0| 0: <65534> | }
485 | | %b0:
486 128:0| 3: <28, 2, 1, 32> | %v0 = icmp eq i32 %p0, %c0;
487 132:6| 3: <11, 1, 2, 1> | br i1 %v0, label %b1, label %b2;
488 | | %b1:
489 136:6| 3: <10, 2> | ret i32 %c0;
490 | | %b2:
491 139:2| 3: <2, 3, 2, 1> | %v1 = sub i32 %p0, %c0;
492 143:2| 3: <34, 0, 5, 1> | %v2 = call i32 @f0(i32 %v1);
493 148:0| 3: <2, 5, 1, 2> | %v3 = mul i32 %p0, %v2;
494 152:0| 3: <10, 1> | ret i32 %v3;
495 154:4| 0: <65534> | }
496 156:0|0: <65534> |}
497
498 Note that there are three columns in this output. The first column contains the
499 bit positions of the records within the bitcode file. The second column contains
500 the sequence of records within the bitcode file. The third column contains the
501 corresponding PNaClAsm program.
502
503 Bit positions are defined by a pair ``B:N``. ``B`` is the number of bytes, while
504 ``N`` is the bit offset within the ``B``-th byte. Hence, the bit position (in
505 bits) is::
506
507 B*8 + N
508
509 Hence, the first record is at bit offset ``0`` (``0*8+0``). The second record is
510 at bit offset ``128`` (``16*8+0``). The third record is at bit offset ``192``
511 (``24*8+0``). The fourth record is at bit offset ``212`` (``26*8+4``).
512
513 The :ref:`header record<link_for_header_record_section>` is a sequence of 16
514 bytes, defining the contents of the first 16 bytes of the bitcode file. These
515 bytes never change, and are expected for all version 2, PNaCl bitcode files. The
516 first four bytes define the magic number of the file, i.e. 'PEXE'. All PEXE
517 bitcode files begin with these four bytes.
518
519 All but the header record has an abbreviation index associated with it. Since no
520 user-defined abbreviations are provided, all records were converted to
521 bit sequences using default abbreviations.
522
523 The types block (starting at bit address ``40:0``), defines 4 types: ``i1``,
524 ``i32``, ``void``, and function signature ``i32 (i32)``.
525
526 Bit address ``64:0`` declares the factorial function address ``@f0``, and its
527 corresponding type signature. Bit address ``88:0`` associates the name ``fact``
528 with function address ``@f0``.
529
530 Bit address ``100:0`` defines the function block that implements function
531 ``fact``. The entry point is ``%b0`` (at bit address ``128:0``). It uses the
532 32-bit integer constant ``1`` (defined at bit addresses ``122:4``). Bit address
533 ``128:0`` defines an equality comparison of the argument ``%p0`` with ``1``
534 (constant ``%c0``). Bit address ``132:6`` defines a conditional branch. If the
535 result of the previous comparison (``%v0``) is true, the program will branch to
536 block ``%b1``. Otherwise it will branch to block ``%b2``.
537
538 Bit address ``136:6`` returns constant ``1`` (``%c0``) when the input parameter
539 is 1. Instructions between bit address ``139:2`` and ``154:4`` compute and
540 return ``n * fact(n-1)``.
541
542 Road Map
543 ========
544
545 At this point, this document transitions from basic concepts to the details
546 of how records should be formatted. This section defines the road map to
547 the remaining sections in this document.
548
549 Many records have implicit information associated with them, and must be
550 maintained across records. :ref:`Global state<link_for_global_state_section>`
551 describes how this implicit information is modeled. In addition, there are
552 various :ref:`support functions<link_for_support_functions_section>` that are
553 used to define the semantics of records, and how they update the global state.
554
555 There are just a handful of global records (records that either don't appear in
556 any block, or can appear in all blocks). :ref:`Global
557 records<link_for_global_record_codes>` describes these records. This includes
558 the block delimiter records :ref:`enter<link_for_enter_block_record_section>`
559 and :ref:`exit<link_for_exit_block_record_section>` that define block
560 boundaries.
561
562 PNaClAsm is a strongly typed language, and most block values are typed.
563 :ref:`types<link_for_types_block_section>` describes the set of legal types, and
564 how to define types.
565
566 Global variables and their initializers are presented in the :ref:`globals
567 block<link_for_globals_block_section>`. :ref:`Function
568 addresses<link_for_function_address_section>` are part of the :ref:`module
569 block<link_for_module_block>`, but must be defined before any global variables.
570
571 Names to be associated with global variables and function addresses, are defined
572 in the :ref:`valuesymtab block<link_for_valuesymtab_block_section>`, and must
573 appear after the :ref:`globals block<link_for_globals_block_section>`, but
574 before any :ref:`function definition<link_for_function_blocks_section>`.
575
576 The :ref:`module block<link_for_module_block>` is the top-most block, and all
577 other blocks must appear within the module block. The module block defines the
578 executable in the bitcode file.
579
580 Constants used within a :ref:`function
581 definition<link_for_function_blocks_section>` must be defined using a
582 :ref:`constants block<link_for_constants_block_section>`. Each function
583 definition is defined by a :ref:`function
584 block<link_for_function_blocks_section>` and constant blocks can only appear
585 within function blocks. Constants defined within a constant block can only be
586 used in the enclosing function block.
587
588 Function definitions are defined by a sequence of instructions. There are
589 several types of instructions.
590
591 A :ref:`terminator instruction<link_for_terminator_instruction_section>` is the
592 last instruction in a :ref:`basic block<link_for_function_blocks_section>`, and
593 is a branch, return, or unreachable instruction.
594
595 There are :ref:`integer<link_for_integer_binary_instructions>` and
596 :ref:`floating point<link_for_floating_point_binary_instructions>` binary
597 operations. Integer binary instructions include both arithmetic and logical
598 operations. Floating point instructions define arithmetic operations.
599
600 There are also :ref:`memory
601 access<link_for_memory_creation_and_access_instructions>` instructions that
602 allow one to load and store values. That section also includes how to define
603 local variables using the :ref:`alloca
604 instruction<link_for_alloca_instruction>`.
605
606 One can also convert integer and floating point values using :ref:`conversion
607 instructions<link_for_conversion_instructions>`.
608
609 :ref:`Comparison instructions<link_for_compare_instructions>`
610 allow you to compare values.
611
612 :ref:`Vector instructions<link_for_vector_instructions>` allow you to build and
613 update vectors. Corresponding :ref:`intrinsic
614 functions<link_for_intrinsic_functions_section>`, as well as
615 :ref:`integer<link_for_integer_binary_instructions>` and :ref:`floating
616 point<link_for_floating_point_binary_instructions>` binary instructions allow
617 you to apply operations to vectors.
618
619 In addition, :ref:`other instructions<link_for_other_pnaclasm_instructions>` are
620 available. This includes function and procedure calls.
621
622 There are also :ref:`memory
623 alignment<link_for_memory_blocks_and_alignment_section>` issues that should be
624 considered for global and local variables, as well as load and store
625 instructions.
626
627 Finally, how to pack records is described in the
628 :ref:`abbreviations<link_for_abbreviations_section>` section.
629
630 .. _link_for_global_state_section:
631
632 Global State
633 ============
634
635 This section describes the global state associated with PNaClAsm. It is used to
636 define contextual data that is carried between records.
637
638 In particular, PNaClAsm is a strongly typed language, and hence, we must track
639 the type associated with values. Subsection :ref:`link_to_typing_functions`
640 describes the functions used to maintain typing information associated with
641 values.
642
643 Values are implicitly ordered within a block, and the indices associated with
644 the values do not appear in records. Rather, ID counters are used to figure out
645 what corresponding ID name is associated with a value generating record.
646 Subsection :ref:`link_to_ID_Counters` defines counters maintained in the global
647 state.
648
649 In several blocks, one of the first records in the block defines how many values
650 are defined in in the block. The main purpose of these counts is to communicate
651 to the :ref:`PNaCl translator<link_for_pnacl_translator>` space requirements, or
652 a limit so that it can detect bad references to values. Subsection
653 :ref:`link_for_Size_Variables` defines variables that hold size definitions in
654 the corresponding records.
655
656 Finally, the function and constants block contain implicit context between
657 records in those blocks. Subsection :ref:`link_to_Other_Variables` defines the
658 variables that contain this implicit context.
659
660 .. _link_to_typing_functions:
661
662 Typing Functions
663 ----------------
664
665 Associated with most identifiers is a type. This type defines what type the
666 corresponding value has. It is defined by the (initially empty) map::
667
668 TypeOf: ID -> Type
669
670 For each type in the :ref:`types block<link_for_types_block_section>`, a
671 corresponding inverse map::
672
673 TypeID: Type -> ID
674
675 is maintained to convert syntactic types to the corresponding type ID.
676
677 Note: This document assumes that map ``TypeID`` is automatically maintained
678 during updates to map ``TypeOf`` (when given a type ``ID``). Hence, *Updates*
679 subsections will not contain assignments to this map.
680
681 Associated with each function identifier is its :ref:`type
682 signature<link_for_function_type>`. This is different than the type of the
683 function identifier, since function identifiers represent the function address
684 which is a pointer (and pointers are always implemented as a 32-bit integer
685 following the ILP32 data model).
686
687 Function type signatures are maintained using::
688
689 TypeOfFcn: ID -> Type
690
691 In addition, if a function address has an implementing block, there is a
692 corresponding implementation associated with the function address. To indicate
693 which function addresses have implementations, we use the set::
694
695 DefiningFcnIDs: set(ID)
696
697 .. _link_to_ID_Counters:
698
699 ID Counters
700 -----------
701
702 Each block defines one or more kinds of values. Value indices are generated
703 sequentially, starting at zero. To capture this, the following counters are
704 defined:
705
706 NumTypes
707 The number of types defined so far (in the :ref:`types
708 block<link_for_types_block_section>`).
709
710 NumFuncAddresses
711 The number of function addresses defined so far (in the :ref:`module
712 block<link_for_module_block>`).
713
714 NumGlobalAddresses
715 The number of global variable/constant addresses defined so far (in the
716 :ref:`globals block<link_for_globals_block_section>`).
717
718 NumParams
719 The number of parameters defined for a function. Note: Unlike other counters,
720 this value is set once, at the beginning of the corresponding :ref:`function
721 block<link_for_function_blocks_section>`, based on the type signature
722 associated with the function.
723
724 NumFcnConsts
725 The number of constants defined in a function so far (in the corresponding
726 nested :ref:`constants block<link_for_constants_block_section>`).
727
728 NumBasicBlocks
729 The number of basic blocks defined so far (within a :ref:`function
730 block<link_for_function_blocks_section>`).
731
732 NumValuedInsts
733 The number of instructions, generating values, defined so far (within a
734 :ref:`function block<link_for_function_blocks_section>`).
735
736 .. _link_for_Size_Variables:
737
738 Size Variables
739 --------------
740
741 A number of blocks define expected sizes of constructs. These sizes are recorded
742 in the following size variables:
743
744 ExpectedBasicBlocks
745 The expected :ref:`number of basic blocks<link_for_basic_blocks_count>` within
746 a function implementation.
747
748 ExpectedTypes
749 The expected :ref:`number of types<link_for_types_count_record>` defined in
750 the types block.
751
752 ExpectedGlobals
753 The expected :ref:`number of global variable/constant
754 addresses<link_for_globals_count_record>` in the globals block.
755
756 ExpectedInitializers
757 The expected :ref:`number of initializers<link_for_compound_initializer>` for
758 a global variable/constant address in the globals block.
759
760 It is assumed that the corresponding :ref:`ID counters<link_to_ID_counters>` are
761 always smaller than the corresponding size variables (except
762 ExpectedInitializers). That is::
763
764 NumBasicBlocks < ExpectedBasicBlocks
765 NumTypes < ExpectedTypes
766 NumGlobalAddresses < ExpectedGlobals
767
768 .. _link_to_Other_Variables:
769
770 Other Variables
771 ---------------
772
773 EnclosingFcnID
774 The function ID of the function block being processed.
775
776 ConstantsSetType
777 Holds the type associated with the last :ref:`set type
778 record<link_for_constants_set_type_record>` in the constants block. Note: at
779 the beginning of each constants block, this variable is set to type void.
780
781 .. _link_for_global_record_codes:
782
783 Global Records
784 ==============
785
786 Global records are records that can appear in any block. These records have
787 the same meaning in multiple kinds of blocks.
788
789 There are four global PNaCl records, each having its own record code. These
790 global records are:
791
792 Header
793 The :ref:`header record<link_for_header_record_section>` is the first record
794 of a PNaCl bitcode file, and identifies the file's magic number, as well as
795 the bitcode version it uses. The record defines the sequence of bytes that
796 make up the header and uniquely identifies the file as a PNaCl bitcode file.
797
798 Enter
799 An :ref:`enter record<link_for_enter_block_record_section>` defines the
800 beginning of a block. Since blocks can be nested, one can appear inside other
801 blocks, as well as at the top level.
802
803 Exit
804 An :ref:`exit record<link_for_exit_block_record_section>` defines the end of a
805 block. Hence, it must appear in every block, to end the block.
806
807 Abbreviation
808 An :ref:`abbreviation record<link_for_abbreviation_record>` defines a
809 user-defined abbreviation to be applied to records within blocks.
810 Abbreviation records appearing in the abbreviations block define global
811 abbreviations. All other abbreviations are local to the block they appear in,
812 and can only be used in that block.
813
814 All global records can't have user-defined abbreviations associated with
815 them. The :ref:`default abbreviation<link_for_default_abbreviations>` is always
816 used.
817
818 .. _link_for_header_record_section:
819
820 Header Record
821 -------------
822
823 The header record must be the first record in the file. It is the only record in
824 the bitcode file that doesn't have a corresponding construct in PNaClAsm. In
825 addition, no abbreviation index is associated with it.
826
827 **Syntax**:
828
829 There is no syntax for header records in PNaClAsm.
830
831 **Record**::
832
833 <65532, 80, 69, 88, 69, 1, 0, 8, 0, 17, 0, 4, 0, 2, 0, 0, 0>
834
835 **Semantics**:
836
837 The header record defines the initial sequence of bytes that must appear at the
838 beginning of all (PNaCl bitcode version 2) files. That sequence is the list of
839 bytes inside the record (excluding the record code). As such, it uniquely
840 identifies all PNaCl bitcode files.
841
842 **Examples**::
843
844 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, 88, 69)
845 | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2
846 | 0> |
847
848 .. _link_for_enter_block_record_section:
849
850 Enter Block Record
851 ------------------
852
853 Block records can be top-level, as well as nested in other blocks. Blocks must
854 begin with an *enter* record, and end with an
855 :ref:`exit<link_for_exit_block_record_section>` record.
856
857 **Syntax**::
858
859 N { <B>
860
861 **Record**::
862
863 1: <65535, ID, B>
864
865 **Semantics**:
866
867 Enter block records define the beginning of a block. ``B``, if present, is the
868 number of bits needed to represent all possible abbreviation indices used within
869 the block. If omitted, ``B=2`` is assumed.
870
871 The block ``ID`` value is dependent on the name ``N``. Valid names and
872 corresponding ``BlockID`` values are defined as follows:
873
874 ============= ========
875 N Block ID
876 ============= ========
877 abbreviations 0
878 constants 11
879 function 12
880 globals 19
881 module 8
882 types 17
883 valuesymtab 14
884 ============= ========
885
886 Note: For readability, PNaClAsm defines a more readable form of a function block
887 enter record. See :ref:`function blocks<link_for_function_blocks_section>` for
888 more details.
889
890 **Examples**::
891
892 16:0|1: <65535, 8, 2> |module { // BlockID = 8
893 24:0| 3: <1, 1> | version 1;
894 26:4| 1: <65535, 0, 2> | abbreviations { // BlockID = 0
895 36:0| 0: <65534> | }
896 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
897 48:0| 3: <1, 2> | count 2;
898 50:4| 3: <2> | @t0 = void;
899 52:2| 3: <21, 0, 0> | @t1 = void ();
900 55:4| 0: <65534> | }
901 56:0| 3: <8, 1, 0, 1, 0> | declare external void @f0();
902 60:6| 1: <65535, 19, 2> | globals { // BlockID = 19
903 68:0| 3: <5, 0> | count 0;
904 70:4| 0: <65534> | }
905 72:0|0: <65534> |}
906
907 .. _link_for_exit_block_record_section:
908
909 Exit Block Record
910 -----------------
911
912 Block records can be top-level, as well as nested, records. Blocks must begin
913 with an :ref:`enter<link_for_enter_block_record_section>` record, and end with
914 an *exit* record.
915
916 **Syntax**::
917
918 }
919
920 **Record**::
921
922 0: <65534>
923
924 **Semantics**:
925
926 All exit records are identical, no matter what block they are ending. An exit
927 record defines the end of the block.
928
929 **Examples**::
930
931 16:0|1: <65535, 8, 2> |module { // BlockID = 8
932 24:0| 3: <1, 1> | version 1;
933 26:4| 1: <65535, 0, 2> | abbreviations { // BlockID = 0
934 36:0| 0: <65534> | }
935 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
936 48:0| 3: <1, 2> | count 2;
937 50:4| 3: <2> | @t0 = void;
938 52:2| 3: <21, 0, 0> | @t1 = void ();
939 55:4| 0: <65534> | }
940 56:0| 3: <8, 1, 0, 1, 0> | declare external void @f0();
941 60:6| 1: <65535, 19, 2> | globals { // BlockID = 19
942 68:0| 3: <5, 0> | count 0;
943 70:4| 0: <65534> | }
944 72:0|0: <65534> |}
945
946 .. _link_for_abbreviation_record:
947
948 Abbreviation Record
949 -------------------
950
951 Abbreviation records define abbreviations. See
952 :ref:`abbreviations<link_for_abbreviations_section>` for details on how
953 abbreviations should be written. This section only presents the mechanical
954 details for converting an abbreviation into a PNaCl record.
955
956 **Syntax**::
957
958 A = abbrev <E1, ... , EM>;
959
960 **Record**::
961
962 2: <65533, M, EE1, ... , EEM>
963
964 **Semantics**:
965
966 Defines an abbreviation ``A`` as the sequence of encodings ``E1`` through
967 ``EM``. If the abbreviation appears within the :ref:`abbreviations
968 block<link_for_abbreviations_block_section>`, ``A`` must be a global
969 abbreviation. Otherwise, ``A`` must be a local abbreviation.
970
971 Abbreviations within a block (or a section within the abbreviations block), must
972 be enumerated in order, starting at index ``0``.
973
974 Valid encodings ``Ei``, and the corresponding sequence of (unsigned) integers
975 ``EEi``, ( for ``1 <= i <= M``) are defined by the following table:
976
977 ========= ======= ==================================================
978 Ei EEi Form
979 ========= ======= ==================================================
980 C 1, C Literal C in corresponding position in record.
981 fixed(N) 0, 1, N Encode value as a fixed sequence of N bits.
982 vbr(N) 0, 2, N Encode value using a variable bit rate of N.
983 char6 0, 4 Encode value as 6-bit char containing
984 characters [a-zA-Z0-9._].
985 array 0, 3 Allow zero or more of the succeeding abbreviation.
986 ========= ======= ==================================================
987
988 Note that 'array' can only appear as the second to last element ``Em``.
989 Notationally, ``Array(EM)`` is used in place of ``array`` and ``EM``, the last
990 two entries in an abbreviation.
991
992 **Examples**::
993
994 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, 88, 69)
995 | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2
996 | 0> |
997 16:0|1: <65535, 8, 2> |module { // BlockID = 8
998 24:0| 3: <1, 1> | version 1;
999 26:4| 1: <65535, 0, 2> | abbreviations { // BlockID = 0
1000 36:0| 1: <1, 14> | valuesymtab:
1001 38:4| 2: <65533, 4, 0, 1, 3, 0,| @a0 = abbrev <fixed(3), vbr(8),
1002 | 2, 8, 0, 3, 0, 1, 8> | array(fixed(8))>;
1003 43:2| 2: <65533, 4, 1, 1, 0, 2,| @a1 = abbrev <1, vbr(8),
1004 | 8, 0, 3, 0, 1, 7> | array(fixed(7))>;
1005 48:0| 2: <65533, 4, 1, 1, 0, 2,| @a2 = abbrev <1, vbr(8),
1006 | 8, 0, 3, 0, 4> | array(char6)>;
1007 52:1| 2: <65533, 4, 1, 2, 0, 2,| @a3 = abbrev <2, vbr(8),
1008 | 8, 0, 3, 0, 4> | array(char6)>;
1009 56:2| 1: <1, 11> | constants:
1010 58:6| 2: <65533, 2, 1, 1, 0, 1,| @a0 = abbrev <1, fixed(2)>;
1011 | 2> |
1012 61:7| 2: <65533, 2, 1, 4, 0, 2,| @a1 = abbrev <4, vbr(8)>;
1013 | 8> |
1014 65:0| 2: <65533, 2, 1, 4, 1, 0>| @a2 = abbrev <4, 0>;
1015 68:1| 2: <65533, 2, 1, 6, 0, 2,| @a3 = abbrev <6, vbr(8)>;
1016 | 8> |
1017 71:2| 1: <1, 12> | function:
1018 73:6| 2: <65533, 4, 1, 20, 0, | @a0 = abbrev <20, vbr(6), vbr(4),
1019 | 2, 6, 0, 2, 4, 0, 2, | vbr(4)>;
1020 | 4> |
1021 79:1| 2: <65533, 4, 1, 2, 0, 2,| @a1 = abbrev <2, vbr(6), vbr(6),
1022 | 6, 0, 2, 6, 0, 1, 4> | fixed(4)>;
1023 84:4| 2: <65533, 4, 1, 3, 0, 2,| @a2 = abbrev <3, vbr(6),
1024 | 6, 0, 1, 2, 0, 1, 4> | fixed(2), fixed(4)>;
1025 89:7| 2: <65533, 1, 1, 10> | @a3 = abbrev <10>;
1026 91:7| 2: <65533, 2, 1, 10, 0, | @a4 = abbrev <10, vbr(6)>;
1027 | 2, 6> |
1028 95:0| 2: <65533, 1, 1, 15> | @a5 = abbrev <15>;
1029 97:0| 2: <65533, 3, 1, 43, 0, | @a6 = abbrev <43, vbr(6),
1030 | 2, 6, 0, 1, 2> | fixed(2)>;
1031 101:2| 2: <65533, 4, 1, 24, 0, | @a7 = abbrev <24, vbr(6), vbr(6),
1032 | 2, 6, 0, 2, 6, 0, 2, | vbr(4)>;
1033 | 4> |
1034 106:5| 1: <1, 19> | globals:
1035 109:1| 2: <65533, 3, 1, 0, 0, 2,| @a0 = abbrev <0, vbr(6),
1036 | 6, 0, 1, 1> | fixed(1)>;
1037 113:3| 2: <65533, 2, 1, 1, 0, 2,| @a1 = abbrev <1, vbr(8)>;
1038 | 8> |
1039 116:4| 2: <65533, 2, 1, 2, 0, 2,| @a2 = abbrev <2, vbr(8)>;
1040 | 8> |
1041 119:5| 2: <65533, 3, 1, 3, 0, 3,| @a3 = abbrev <3, array(fixed(8))>
1042 | 0, 1, 8> | ;
1043 123:2| 2: <65533, 2, 1, 4, 0, 2,| @a4 = abbrev <4, vbr(6)>;
1044 | 6> |
1045 126:3| 2: <65533, 3, 1, 4, 0, 2,| @a5 = abbrev <4, vbr(6), vbr(6)>;
1046 | 6, 0, 2, 6> |
1047 130:5| 0: <65534> | }
1048 132:0| 1: <65535, 17, 3> | types { // BlockID = 17
1049 140:0| 2: <65533, 4, 1, 21, 0, | %a0 = abbrev <21, fixed(1),
1050 | 1, 1, 0, 3, 0, 1, 2> | array(fixed(2))>;
1051 144:7| 3: <1, 3> | count 3;
1052 147:4| 3: <7, 32> | @t0 = i32;
1053 150:7| 4: <21, 0, 0, 0, 0> | @t1 = i32 (i32, i32); <%a0>
1054 152:7| 3: <2> | @t2 = void;
1055 154:6| 0: <65534> | }
1056 156:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32, i32);
1057 160:6| 1: <65535, 19, 4> | globals { // BlockID = 19
1058 168:0| 3: <5, 0> | count 0;
1059 170:6| 0: <65534> | }
1060 172:0| 1: <65535, 14, 3> | valuesymtab { // BlockID = 14
1061 180:0| 6: <1, 0, 102> | @f0 : "f"; <@a2>
1062 182:7| 0: <65534> | }
1063 184:0| 1: <65535, 12, 4> | function i32 @f0(i32 %p0, i32 %p1) {
1064 | | // BlockID = 12
1065 192:0| 3: <1, 1> | blocks 1;
1066 | | %b0:
1067 194:6| 5: <2, 2, 1, 0> | %v0 = add i32 %p0, %p1; <@a1>
1068 197:2| 5: <2, 3, 1, 0> | %v1 = add i32 %p0, %v0; <@a1>
1069 199:6| 8: <10, 1> | ret i32 %v1; <@a4>
1070 201:0| 0: <65534> | }
1071 204:0|0: <65534> |}
1072
1073 Note that the example above shows the standard abbreviations used by
1074 *pnacl-finalize*.
1075
1076 .. _link_for_types_block_section:
1077
1078 Types Block
1079 ===========
1080
1081 The types block defines all types used in a program. It must appear in the
1082 :ref:`module block<link_for_module_block>`, before any :ref:`function
1083 address<link_for_function_address_section>` records, the :ref:`globals
1084 block<link_for_globals_block_section>`, the :ref:`valuesymtab
1085 block<link_for_valuesymtab_block_section>`, and any :ref:`function
1086 blocks<link_for_function_blocks_section>`.
1087
1088 All types used in a program must be defined in the types block. Many PNaClAsm
1089 constructs allow one to use explicit type names, rather than the type
1090 identifiers defined by this block. However, they are internally converted to the
1091 corresponding type identifier in the types block. Hence, the requirement that
1092 the types block must appear early in the module block.
1093
1094 Each record in the types block defines a type used by the program. Types can be
1095 broken into the following groups:
1096
1097 Primitive value types
1098 Defines the set of base types for values. This includes various sizes of
1099 integer and floating point types.
1100
1101 Void type
1102 A primitive type that doesn't represent any value and has no size.
1103
1104 Function types
1105 The type signatures of functions.
1106
1107 Vector type
1108 Defines vectors of primitive types.
1109
1110 In addition, any type that is not defined using another type is a primitive
1111 type. All other types (i.e. function and vector) are composite types.
1112
1113 Types must be defined in a topological order, causing primitive types to appear
1114 before the composite types that use them. Each type must be unique. There are no
1115 additional restrictions on the order that types can be defined in a types block.
1116
1117 The following subsections introduce each valid PNaClAsm type, and the
1118 corresponding PNaClAsm construct that defines the type. Types not defined in the
1119 types block, can't be used in a PNaCl program.
1120
1121 The first record of a types block must be a :ref:`count
1122 record<link_for_types_count_record>`, defining how many types are defined by the
1123 types block. All remaining records defines a type. The following subsections
1124 defines valid records within a types block. The order of type records is
1125 important. The position of each defining record implicitly defines the type ID
1126 that will be used to denote that type, within other PNaCl records of the bitcode
1127 file.
1128
1129 To make this more concrete, consider the following example types block::
1130
1131 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1132 48:0| 3: <1, 4> | count 4;
1133 50:4| 3: <7, 32> | @t0 = i32;
1134 53:6| 3: <3> | @t1 = float;
1135 55:4| 3: <2> | @t2 = void;
1136 57:2| 3: <21, 0, 2, 0, 1> | @t3 = void (i32, float);
1137 62:0| 0: <65534> | }
1138
1139 This example defines a types block that defines four type IDs:
1140
1141 @t0
1142 A 32-bit integer type.
1143 @t1
1144 A 32-bit floating point type.
1145 @t2
1146 The void type.
1147 @t3
1148 A function, taking 32-bit integer and float point arguments that returns
1149 void.
1150
1151 .. _link_for_types_count_record:
1152
1153 Count Record
1154 ------------
1155
1156 The *count record* defines how many types are defined in the types
1157 block. Following the types count record are records that define types used by
1158 the PNaCl program.
1159
1160 **Syntax**::
1161
1162 count N; <A>
1163
1164 **Record**::
1165
1166 AA: <1, N>
1167
1168 **Semantics**:
1169
1170 This construct defines the number of types used by the PNaCl program. ``N`` is
1171 the number of types defined in the types block. It is an error to define more
1172 (or fewer) types than value ``N``, within the enclosing types block.
1173
1174 **Constraints**::
1175
1176 AA == AbbrevIndex(A) &
1177 0 == NumTypes
1178
1179 **Updates**::
1180
1181 ExpectedTypes = N;
1182
1183 **Examples**::
1184
1185 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1186 48:0| 3: <1, 4> | count 4;
1187 50:4| 3: <7, 32> | @t0 = i32;
1188 53:6| 3: <3> | @t1 = float;
1189 55:4| 3: <2> | @t2 = void;
1190 57:2| 3: <21, 0, 2, 0, 1> | @t3 = void (i32, float);
1191 62:0| 0: <65534> | }
1192
1193 Void Type
1194 ---------
1195
1196 The *void* type record defines the void type, which corresponds to the type that
1197 doesn't define any value, and has no size.
1198
1199 **Syntax**::
1200
1201 @tN = void; <A>
1202
1203 **Record**::
1204
1205 AA: <2>
1206
1207 **Semantics**:
1208
1209 The void type record defines the type that has no values and has no size.
1210
1211 **Constraints**::
1212
1213 AA == AbbrevIndex(A) &
1214 N == NumTypes
1215
1216 **Updates**::
1217
1218 ++NumTypes;
1219 TypeOf(@tN) = void;
1220
1221 **Examples**::
1222
1223 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1224 48:0| 3: <1, 4> | count 4;
1225 50:4| 3: <7, 32> | @t0 = i32;
1226 53:6| 3: <3> | @t1 = float;
1227 55:4| 3: <2> | @t2 = void;
1228 62:0| 0: <65534> | }
1229
1230 Integer Types
1231 -------------
1232
1233 PNaClAsm allows integer types for various bit sizes. Valid bit sizes are 1, 8,
1234 16, 32, and 64. Integers can be signed or unsigned, but the signed component of
1235 an integer is not specified by the type. Rather, individual instructions
1236 determine whether the value is assumed to be signed or unsigned.
1237
1238 It should be noted that in PNaClAsm, all pointers are implemented as 32-bit
1239 (unsigned) integers. There isn't a separate type for pointers. The only way to
1240 tell that a 32-bit integer is a pointer, is when it is used in an instruction
1241 that requires a pointer (such as load and store instructions).
1242
1243 **Syntax**::
1244
1245 @tN = iB; <A>
1246
1247 **Record**::
1248
1249 AA: <7, B>
1250
1251 **Semantics**:
1252
1253 An integer type record defines an integer type. ``B`` defines the number of bits
1254 of the integer type.
1255
1256 **Constraints**::
1257
1258 AA == AbbrevIndex(A) &
1259 N == NumTypes &
1260 B in {1, 8, 16, 32, 64}
1261
1262 **Updates**::
1263
1264 ++NumTypes;
1265 TypeOf(@tN) = iB;
1266
1267 **Examples**::
1268
1269 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1270 48:0| 3: <1, 7> | count 7;
1271 50:4| 3: <7, 64> | @t0 = i64;
1272 53:6| 3: <7, 1> | @t1 = i1;
1273 56:2| 3: <7, 8> | @t2 = i8;
1274 58:6| 3: <7, 16> | @t3 = i16;
1275 61:2| 3: <7, 32> | @t4 = i32;
1276 64:4| 3: <21, 0, 0, 1> | @t5 = i64 (i1);
1277 68:4| 3: <2> | @t6 = void;
1278 70:2| 0: <65534> | }
1279
1280 32-Bit Floating Point Type
1281 --------------------------
1282
1283 PNaClAsm allows computation on 32-bit floating point values. A floating point
1284 type record defines the 32-bit floating point type.
1285
1286 **Syntax**::
1287
1288 @tN = float; <A>
1289
1290 **Record**::
1291
1292 AA: <3>
1293
1294 **Semantics**:
1295
1296 A floating point type record defines the 32-bit floating point type.
1297
1298 **Constraints**::
1299
1300 AA == AbbrevIndex(A) &
1301 N == NumTypes
1302
1303 **Updates**::
1304
1305 ++NumTypes;
1306 TypeOf(@tN) = float;
1307
1308 **Examples**::
1309
1310 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1311 48:0| 3: <1, 4> | count 4;
1312 50:4| 3: <4> | @t0 = double;
1313 52:2| 3: <3> | @t1 = float;
1314 54:0| 3: <21, 0, 0, 1> | @t2 = double (float);
1315 58:0| 3: <2> | @t3 = void;
1316 59:6| 0: <65534> | }
1317
1318 64-bit Floating Point Type
1319 --------------------------
1320
1321 PNaClAsm allows computation on 64-bit floating point values. A 64-bit floating
1322 type record defines the 64-bit floating point type.
1323
1324 **Syntax**::
1325
1326 @tN = double; <A>
1327
1328 **Record**::
1329
1330 AA: <4>
1331
1332 **Semantics**:
1333
1334 A double type record defines the 64-bit floating point type.
1335
1336 **Constraints**::
1337
1338 AA == AbbrevIndex(A) &
1339 N == NumTypes
1340
1341 **Updates**::
1342
1343 ++NumTypes;
1344 TypeOf(@tN) = double;
1345
1346 **Examples**::
1347
1348 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1349 48:0| 3: <1, 4> | count 4;
1350 50:4| 3: <4> | @t0 = double;
1351 52:2| 3: <3> | @t1 = float;
1352 54:0| 3: <21, 0, 0, 1> | @t2 = double (float);
1353 58:0| 3: <2> | @t3 = void;
1354 59:6| 0: <65534> | }
1355
1356 Vector Types
1357 ------------
1358
1359 A vector type is a derived type that represents a vector of elements. Vector
1360 types are used when multiple primitive data values are operated in parallel
1361 using a single (SIMD) :ref:`vector instruction<link_for_vector_instructions>`. A
1362 vector type requires a size (number of elements) and an underlying primitive
1363 data type.
1364
1365 **Syntax**::
1366
1367 @tN = < E x T > <A>
1368
1369 **Record**::
1370
1371 AA: <12, E, TT>
1372
1373 **Semantics**:
1374
1375 The vector type defines a vector of elements. ``T`` is the type of each
1376 element. ``E`` is the number of elements in the vector.
1377
1378 Vector types can only be defined on ``i1``, ``i8``, ``i16``, ``i32``, and
1379 ``float``. All vector types, except those on ``i1``, must contain exactly 128
1380 bits. The valid element sizes are restricted as follows:
1381
1382 ====== ===================
1383 Type Valid element sizes
1384 ====== ===================
1385 i1 4, 8, 16
1386 i8 16
1387 i16 8
1388 i32 4
1389 float 4
1390 ====== ===================
1391
1392 **Constraints**::
1393
1394 AA == AbbrevIndex(A) &
1395 TT == AbsoluteIndex(TypeID(T)) &
1396 N == NumTypes
1397
1398 **Updates**::
1399
1400 ++NumTypes
1401 TypeOf(@tN) = <E x T>
1402
1403 **Examples**::
1404
1405 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1406 48:0| 3: <1, 14> | count 14;
1407 50:4| 3: <7, 32> | @t0 = i32;
1408 53:6| 3: <7, 1> | @t1 = i1;
1409 56:2| 3: <2> | @t2 = void;
1410 58:0| 3: <12, 4, 1> | @t3 = <4 x i1>;
1411 61:2| 3: <12, 8, 1> | @t4 = <8 x i1>;
1412 64:4| 3: <12, 16, 1> | @t5 = <16 x i1>;
1413 67:6| 3: <7, 8> | @t6 = i8;
1414 70:2| 3: <12, 16, 6> | @t7 = <16 x i8>;
1415 73:4| 3: <7, 16> | @t8 = i16;
1416 76:0| 3: <12, 8, 8> | @t9 = <8 x i16>;
1417 79:2| 3: <12, 4, 0> | @t10 = <4 x i32>;
1418 82:4| 3: <3> | @t11 = float;
1419 84:2| 3: <12, 4, 11> | @t12 = <4 x float>;
1420 87:4| 3: <21, 0, 2> | @t13 = void ();
1421 90:6| 0: <65534> | }
1422
1423 .. _link_for_function_type:
1424
1425 Function Type
1426 -------------
1427
1428 The *function* type can be thought of as a function signature. It consists of a
1429 return type, and a (possibly empty) list of formal parameter types.
1430
1431 **Syntax**::
1432
1433 %tN = RT (T1, ... , TM) <A>
1434
1435 **Record**::
1436
1437 AA: <21, 0, IRT, IT1, ... , ITM>
1438
1439 **Semantics**:
1440
1441 The function type defines the signature of a function. ``RT`` is the return type
1442 of the function, while types ``T1`` through ``TM`` are the types of the
1443 arguments. Indices to the corresponding type identifiers are stored in the
1444 corresponding record.
1445
1446 The return value must either be a primitive type, type ``void``, or a vector
1447 type. Parameter types can be a primitive or vector type.
1448
1449 For ordinary functions, the only valid integer types that can be used for a
1450 return or parameter type are ``i32`` and ``i64``. All other integer types are
1451 not allowed.
1452
1453 For :ref:`intrinsic functions<link_for_intrinsic_functions_section>`, all
1454 integer types are allowed for both return and parameter types.
1455
1456 **Constraints**::
1457
1458 AA == AbbrevIndex(A) &
1459 M >= 0 &
1460 IRT == AbsoluteIndex(TypeID(RT)) &
1461 IT1 == AbsoluteIndex(TypeID(T1)) &
1462 ...
1463 ITM == AbsoluteIndex(TypeID(TM)) &
1464 N == NumTypes
1465
1466 **Updates**::
1467
1468 ++NumTypes
1469 TypeOf(@tN) = RT (T1, ... , TM)
1470
1471 **Examples**::
1472
1473 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1474 48:0| 3: <1, 7> | count 7;
1475 50:4| 3: <7, 32> | @t0 = i32;
1476 53:6| 3: <3> | @t1 = float;
1477 55:4| 3: <4> | @t2 = double;
1478 57:2| 3: <21, 0, 2, 1> | @t3 = double (float);
1479 61:2| 3: <2> | @t4 = void;
1480 63:0| 3: <21, 0, 4> | @t5 = void ();
1481 66:2| 3: <21, 0, 0, 0, 1, 0, 2>| @t6 =
1482 | | i32 (i32, float, i32, double);
1483 72:4| 0: <65534> | }
1484
1485 .. _link_for_globals_block_section:
1486
1487 Globals Block
1488 =============
1489
1490 The globals block defines global addresses of variables and constants, used by
1491 the PNaCl program. It also defines the memory associated with the global
1492 addresses, and how to initialize each global variable/constant. It must appear
1493 in the :ref:`module block<link_for_module_block>`. It must appear after the
1494 :ref:`types block<link_for_types_block_section>`, as well as after all
1495 :ref:`function address<link_for_function_address_section>` records. But, it must
1496 also appear before the :ref:`valuesymtab
1497 block<link_for_valuesymtab_block_section>`, and any
1498 :ref:`function blocks<link_for_function_blocks_section>`.
1499
1500 The globals block begins with a :ref:`count
1501 record<link_for_globals_count_record>`, defining how many global addresses are
1502 defined by the PNaCl program. It is then followed by a sequence of records that
1503 defines each global address, and how each global address is initialized.
1504
1505 The standard sequence, for defining global addresses, begins with a global
1506 address record. It is then followed by a sequence of records defining how the
1507 global address is initialized. If the initializer is simple, a single record is
1508 used. Otherwise, the initializer is preceded with a :ref:`compound
1509 record<link_for_compound_initializer>`, specifying a number *N*, followed by
1510 sequence of *N* simple initializer records.
1511
1512 The size of the memory referenced by each global address is defined by its
1513 initializer records. All simple initializer records define a sequence of
1514 bytes. A compound initializer defines the sequence of bytes by concatenating the
1515 corresponding sequence of bytes for each of its simple initializer records.
1516
1517 For notational convenience, PNaClAsm begins a compound record with a "{", and
1518 inserts a "}" after the last initializer record associated with the compound
1519 record. This latter "}" does not correspond to any record. It is implicitly
1520 assumed by the size specified in the compound record, and is added only to
1521 improve readability.
1522
1523 Explicit alignment is specified for global addresses, and must be a power of
1524 2. See :ref:`memory blocks and
1525 alignment<link_for_memory_blocks_and_alignment_section>` for a more detailed
1526 discussion on how to define alignment.
1527
1528 For example, consider the following pnacl-bcdis output snippet::
1529
1530 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1531 60:0| 3: <5, 2> | count 2;
1532 62:4| 3: <0, 1, 1> | const @g0, align 1,
1533 65:6| 3: <2, 8> | zerofill 8;
1534 68:2| 3: <0, 1, 0> | var @g1, align 1,
1535 71:4| 3: <1, 2> | initializers 2 {
1536 74:0| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1537 78:6| 3: <2, 2> | zerofill 2;
1538 | | }
1539 81:2| 0: <65534> | }
1540
1541 This snippet defines the global constant ``@g0``, and the global variable
1542 ``@g1``. ``@g0`` is 8 bytes long, and initialized to zero. ``@g1`` is
1543 initialized with 6 bytes: ``1 2 3 4 0 0``.
1544
1545 .. _link_for_globals_count_record:
1546
1547 Count Record
1548 ------------
1549
1550 The count record defines the number of global addresses used by the PNaCl
1551 program.
1552
1553 **Syntax**::
1554
1555 count N; <A>
1556
1557 **Record**::
1558
1559 AA: <5, N>
1560
1561 **Semantics**:
1562
1563 This record must appear first in the globals block. The count record defines
1564 the number of global addresses used by the program.
1565
1566 **Constraints**::
1567
1568 AA == AbbrevIndex(A)
1569
1570 **Updates**::
1571
1572 ExpectedGlobals = N;
1573 ExpectedInitializers = 0;
1574
1575 **Examples**::
1576
1577 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1578 60:0| 3: <5, 2> | count 2;
1579 62:4| 3: <0, 1, 1> | const @g0, align 1,
1580 65:6| 3: <2, 8> | zerofill 8;
1581 68:2| 3: <0, 1, 0> | var @g1, align 1,
1582 71:4| 3: <1, 2> | initializers 2 {
1583 74:0| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1584 78:6| 3: <2, 2> | zerofill 2;
1585 | | }
1586 81:2| 0: <65534> | }
1587
1588 .. _link_for_global_variable_address:
1589
1590 Global Variable Addresses
1591 -------------------------
1592
1593 A global variable address record defines a global address to global data. The
1594 global variable address record must be immediately followed by initializer
1595 record(s) that define how the corresponding global variable is initialized.
1596
1597 **Syntax**::
1598
1599 var @gN, align V, <A>
1600
1601 **Record**::
1602
1603 AA: <0, VV, 0>
1604
1605 **Semantics**:
1606
1607 A global variable address record defines a global address for a global variable.
1608 ``V`` is the :ref:`memory
1609 alignment<link_for_memory_blocks_and_alignment_section>` for the global variable
1610 address, and is a power of 2.
1611
1612 It is assumed that the memory, referenced by the global variable address, can be
1613 both read and written to.
1614
1615 **Constraints**::
1616
1617 AA == AbbrevIndex(A) &
1618 N == NumGlobalAddresses &
1619 ExpectedInitializers == 0 &
1620 VV == Log2(V+1)
1621
1622 **Updates**::
1623
1624 ++NumGlobalAddresses;
1625 ExpectedInitializers = 1;
1626 TypeOf(@gN) = i32;
1627
1628 **Examples**::
1629
1630 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1631 60:0| 3: <5, 2> | count 2;
1632 62:4| 3: <0, 3, 0> | var @g0, align 4,
1633 65:6| 3: <2, 8> | zerofill 8;
1634 68:2| 3: <0, 1, 0> | var @g1, align 1,
1635 71:4| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1636 76:2| 0: <65534> | }
1637 80:0|0: <65534> |}
1638
1639 .. _link_for_global_constant_address:
1640
1641 Global Constant Addresses
1642 -------------------------
1643
1644 A global constant address record defines an address corresponding to a global
1645 constant that can't be modified by the program. The global constant address
1646 record must be immediately followed by initializer record(s) that define how
1647 the corresponding global constant is initialized.
1648
1649 **Syntax**::
1650
1651 const @gN, align V, <A>
1652
1653 **Record**::
1654
1655 AA: <0, VV, 1>
1656
1657 **Semantics**:
1658
1659 A global constant address record defines a global address for a global constant.
1660 ``V`` is the :ref:`memory
1661 alignment<link_for_memory_blocks_and_alignment_section>` for the global constant
1662 address, and is a power of 2.
1663
1664 It is assumed that the memory, referenced by the global constant address, is
1665 only read, and can't be written to.
1666
1667 Note that the only difference between a global variable address and a global
1668 constant address record is the third element of the record. If the value is
1669 zero, it defines a global variable address. If the value is one, it defines a
1670 global constant address.
1671
1672 **Constraints**::
1673
1674 AA == AbbrevIndex(A) &
1675 N == NumGlobalAddresses &
1676 ExpectedInitializers == 0 &
1677 VV == Log2(V+1)
1678
1679 **Updates**::
1680
1681 ++NumGlobalAddresses;
1682 ExpectedInitializers = 1;
1683 TypeOf(@gN) = i32;
1684
1685 **Examples**::
1686
1687 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1688 60:0| 3: <5, 2> | count 2;
1689 62:4| 3: <0, 3, 1> | const @g0, align 4,
1690 65:6| 3: <2, 8> | zerofill 8;
1691 68:2| 3: <0, 1, 1> | const @g1, align 1,
1692 71:4| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1693 76:2| 0: <65534> | }
1694
1695 Zerofill Initializer
1696 --------------------
1697
1698 The zerofill initializer record initializes a sequence of bytes, associated with
1699 a global address, with zeros.
1700
1701 **Syntax**::
1702
1703 zerofill N; <A>
1704
1705 **Record**::
1706
1707 AA: <2, N>
1708
1709 **Semantics**:
1710
1711 A zerofill initializer record initializes a sequence of bytes, associated with a
1712 global address, with zeros. The number of bytes initialized to zero is ``N``.
1713
1714 **Constraints**::
1715
1716 AA == AbbrevIndex(A) &
1717 ExpectedInitializers > 0
1718
1719 **Updates**::
1720
1721 --ExpectedInitializers;
1722
1723 **Examples**::
1724
1725 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1726 60:0| 3: <5, 2> | count 2;
1727 62:4| 3: <0, 3, 1> | const @g0, align 4,
1728 65:6| 3: <2, 8> | zerofill 8;
1729 68:2| 3: <0, 1, 0> | var @g1, align 1,
1730 71:4| 3: <2, 4> | zerofill 4;
1731 74:0| 0: <65534> | }
1732
1733 Data Initializer
1734 ----------------
1735
1736 Data records define a sequence of bytes. These bytes define the initial value of
1737 the contents of the corresponding memory.
1738
1739 **Syntax**::
1740
1741 { B1 , .... , BN } <A>
1742
1743 **Record**::
1744
1745 AA: <3, B1, ..., BN>
1746
1747 **Semantics**:
1748
1749 A data record defines a sequence of (unsigned) bytes ``B1`` through ``BN``, that
1750 initialize ``N`` bytes of memory.
1751
1752 **Constraints**::
1753
1754 AA == AbbrevIndex(A) &
1755 ExpectedInitializers > 0
1756
1757 **Updates**::
1758
1759 --ExpectedInitializers;
1760
1761 **Examples**::
1762
1763 56:0| 3: <8, 1, 0, 1, 0> | declare external void @f0();
1764 60:6| 1: <65535, 19, 2> | globals { // BlockID = 19
1765 68:0| 3: <5, 2> | count 2;
1766 70:4| 3: <0, 1, 1> | const @g0, align 1,
1767 73:6| 3: <3, 1, 2, 97, 36, 44, | { 1, 2, 97, 36, 44, 88,
1768 | 88, 44, 50> | 44, 50}
1769 86:0| 3: <0, 1, 1> | const @g1, align 1,
1770 89:2| 3: <1, 3> | initializers 3 {
1771 91:6| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1772 96:4| 3: <4, 0> | reloc @f0;
1773 99:0| 3: <3, 99, 66, 22, 12> | { 99, 66, 22, 12}
1774 | | }
1775 105:2| 0: <65534> | }
1776
1777 Relocation Initializer
1778 ----------------------
1779
1780 A relocation initializer record allows one to define the initial value of a
1781 global address with the value of another global address (i.e. either
1782 :ref:`function<link_for_function_address_section>`,
1783 :ref:`variable<link_for_global_variable_address>`, or
1784 :ref:`constant<link_for_global_constant_address>`). Since addresses are
1785 pointers, a relocation initializer record defines 4 bytes of memory.
1786
1787 **Syntax**::
1788
1789 reloc V; <A>
1790
1791 **Record**::
1792
1793 AA: <4, VV>
1794
1795 **Semantics**:
1796
1797 A relocation initializer record defines a 4-byte value containing the specified
1798 global address ``V``.
1799
1800 **Constraints**::
1801
1802 AA == AbbrevIndex(A) &
1803 VV == AbsoluteIndex(V) &
1804 VV >= NumFuncAddresses &
1805 VV < NumFuncAddresses + ExpectedGlobals &
1806 ExpectedInitializers > 0
1807
1808 **Updates**::
1809
1810 --ExpectedInitializers;
1811
1812 **Examples**::
1813
1814 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1815 48:0| 3: <1, 2> | count 2;
1816 50:4| 3: <2> | @t0 = void;
1817 52:2| 3: <21, 0, 0> | @t1 = void ();
1818 55:4| 0: <65534> | }
1819 56:0| 3: <8, 1, 0, 1, 0> | declare external void @f0();
1820 60:6| 1: <65535, 19, 2> | globals { // BlockID = 19
1821 68:0| 3: <5, 2> | count 2;
1822 70:4| 3: <0, 1, 0> | var @g0, align 1,
1823 73:6| 3: <1, 3> | initializers 3 {
1824 76:2| 3: <4, 0> | reloc @f0;
1825 78:6| 3: <4, 1> | reloc @g0;
1826 81:2| 3: <4, 2> | reloc @g1;
1827 | | }
1828 83:6| 3: <0, 3, 0> | var @g1, align 4,
1829 87:0| 3: <2, 4> | zerofill 4;
1830 89:4| 0: <65534> | }
1831
1832 This example defines global address ``@g0`` and ``@g1``. ``@g0`` defines 12
1833 bytes of memory, and is initialized with three addresses ``@f1``, ``@g0``, and
1834 ``@g1``. Note that all global addresses can be used in a relocation
1835 initialization record, even if it isn't defined yet.
1836
1837 Subfield Relocation Initializer
1838 -------------------------------
1839
1840 A subfield relocation initializer record allows one to define the initial value
1841 of a global address with the value of another (non-function) global address
1842 (i.e. either :ref:`variable<link_for_global_variable_address>` or
1843 :ref:`constant<link_for_global_constant_address>` address), plus a
1844 constant. Since addresses are pointers, a relocation initializer record defines
1845 4 bytes of memory.
1846
1847 **Syntax**::
1848
1849 reloc V + X; <A>
1850 reloc V - X; <A>
1851
1852 **Record**::
1853
1854 AA: <4, VV, XXX>
1855
1856 **Semantics**:
1857
1858 A subfield relocation initializer record defines a 4-byte value containing the
1859 specified global (non-function) address ``V``, modified by the unsigned offset
1860 ``X``. ``XX`` is the corresponding signed offset. In the first form, ``XX ==
1861 X``. In the second form, ``XX == -X``.
1862
1863 **Constraints**::
1864
1865 AA == AbbrevIndex(A)
1866 VV == AbsoluteIndex(V)
1867 VV >= NumFuncAddresses
1868 VV < NumFuncAddresses + ExpectedGlobals
1869 ExpectedInitializers > 0
1870 XXX == SignRotate(XX)
1871
1872 **Updates**::
1873
1874 --ExpectedInitializers;
1875
1876 **Examples**::
1877
1878 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1879 48:0| 3: <1, 0> | count 0;
1880 50:4| 0: <65534> | }
1881 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1882 60:0| 3: <5, 3> | count 3;
1883 62:4| 3: <0, 1, 0> | var @g0, align 1,
1884 65:6| 3: <1, 3> | initializers 3 {
1885 68:2| 3: <4, 0, 1> | reloc @g0 + 1;
1886 71:4| 3: <4, 1, 4294967295> | reloc @g1 - 1;
1887 79:2| 3: <4, 2, 4> | reloc @g2 + 4;
1888 | | }
1889 82:4| 3: <0, 3, 0> | var @g1, align 4,
1890 85:6| 3: <2, 4> | zerofill 4;
1891 88:2| 3: <0, 3, 0> | var @g2, align 4,
1892 91:4| 3: <2, 8> | zerofill 8;
1893 94:0| 0: <65534> | }
1894
1895 .. _link_for_compound_initializer:
1896
1897 Compound Initializer
1898 --------------------
1899
1900 The compound initializer record must immediately follow a global
1901 :ref:`variable<link_for_global_variable_address>` or
1902 :ref:`constant<link_for_global_constant_address>` address record. It defines how
1903 many simple initializer records are used to define the initializer. The size of
1904 the corresponding memory is the sum of the bytes needed for each of the
1905 succeeding initializers.
1906
1907 Note that a compound initializer can't be used as a simple initializer of
1908 another compound initializer (i.e. nested compound initializers are not
1909 allowed).
1910
1911 **Syntax**::
1912
1913 initializers N { <A>
1914 ...
1915 }
1916
1917 **Record**::
1918
1919 AA: <1, N>
1920
1921 **Semantics**:
1922
1923 Defines that the next `N` initializers should be associated with the global
1924 address of the previous record.
1925
1926 **Constraints**::
1927
1928 AA == AbbrevIndex(A) &
1929 ExpectedInitializers == 1
1930
1931 **Updates**::
1932
1933 ExpectedInitializers = N;
1934
1935 **Examples**::
1936
1937 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
1938 48:0| 3: <1, 0> | count 0;
1939 50:4| 0: <65534> | }
1940 52:0| 1: <65535, 19, 2> | globals { // BlockID = 19
1941 60:0| 3: <5, 2> | count 2;
1942 62:4| 3: <0, 0, 1> | const @g0, align 0,
1943 65:6| 3: <1, 2> | initializers 2 {
1944 68:2| 3: <2, 8> | zerofill 8;
1945 70:6| 3: <3, 3, 2, 1, 0> | { 3, 2, 1, 0}
1946 | | }
1947 75:4| 3: <0, 0, 0> | var @g1, align 0,
1948 78:6| 3: <1, 2> | initializers 2 {
1949 81:2| 3: <3, 1, 2, 3, 4> | { 1, 2, 3, 4}
1950 86:0| 3: <2, 2> | zerofill 2;
1951 | | }
1952 88:4| 0: <65534> | }
1953
1954 .. _link_for_valuesymtab_block_section:
1955
1956 Valuesymtab Block
1957 =================
1958
1959 The valuesymtab block does not define any values. Its only goal is to associate
1960 text names with external :ref:`function
1961 addresses<link_for_function_address_section>`. Each association is defined by a
1962 record in the valuesymtab block. Currently, only
1963 :ref:`intrinsic<link_for_intrinsic_functions_section>` function addresses and
1964 the (external) start function (``_start``) can be named. All named function
1965 addresses must be external. Each record in the valuesymtab block is a *entry*
1966 record, defining a single name association.
1967
1968 Entry Record
1969 ------------
1970
1971 The *entry* record defines a name for a function address.
1972
1973 **Syntax**::
1974
1975 V : "NAME"; <A>
1976
1977 **Record**::
1978
1979 AA: <1, B1, ... , BN>
1980
1981 **Semantics**:
1982
1983 The *entry* record defines a name ``NAME`` for function address ``V``. ``NAME``
1984 is a sequence of ASCII characters ``B1`` through ``BN``.
1985
1986 **Examples**::
1987
1988 72:0| 3: <8, 4, 0, 1, 0> | declare external
1989 | | void @f0(i32, i32, i32, i32, i1);
1990 76:6| 3: <8, 4, 0, 1, 0> | declare external
1991 | | void @f1(i32, i32, i32, i32, i1);
1992 81:4| 3: <8, 5, 0, 0, 0> | define external void @f2(i32);
1993 86:2| 1: <65535, 19, 2> | globals { // BlockID = 19
1994 92:0| 3: <5, 0> | count 0;
1995 94:4| 0: <65534> | }
1996 96:0| 1: <65535, 14, 2> | valuesymtab { // BlockID = 14
1997 104:0| 3: <1, 1, 108, 108, 118, | @f1 : "llvm.memmove.p0i8.p0i8.i32";
1998 | 109, 46, 109, 101, |
1999 | 109, 109, 111, 118, |
2000 | 101, 46, 112, 48, |
2001 | 105, 56, 46, 112, 48,|
2002 | 105, 56, 46, 105, 51,|
2003 | 50> |
2004 145:4| 3: <1, 2, 95, 115, 116, | @f2 : "_start";
2005 | 97, 114, 116> |
2006 157:0| 3: <1, 0, 108, 108, 118, | @f0 : "llvm.memcpy.p0i8.p0i8.i32";
2007 | 109, 46, 109, 101, |
2008 | 109, 99, 112, 121, |
2009 | 46, 112, 48, 105, 56,|
2010 | 46, 112, 48, 105, 56,|
2011 | 46, 105, 51, 50> |
2012 197:0| 0: <65534> | }
2013
2014 .. _link_for_module_block:
2015
2016 Module Block
2017 ============
2018
2019 The module block, like all blocks, is enclosed in a pair of
2020 :ref:`enter<link_for_enter_block_record_section>` /
2021 :ref:`exit<link_for_exit_block_record_section>` records, using block ID 8. A
2022 well-formed module block consists of the following records (in order):
2023
2024 A version record
2025 The :ref:`version record<link_for_version_record>` communicates which version
2026 of the PNaCl bitcode reader/writer should be used. Note that this is
2027 different than the PNaCl bitcode (ABI) version. The PNaCl bitcode (ABI)
2028 version defines what is expected in records, and is defined in the header
2029 record of the bitcode file. The version record defines the version of the
2030 PNaCl bitcode reader/writer to use to convert records into bit sequences.
2031
2032 Optional local abbreviations
2033 Defines a list of local :ref:`abbreviations<link_for_abbreviations_section>`
2034 to use for records within the module block.
2035
2036 An abbreviations block
2037 The :ref:`abbreviations block<link_for_abbreviations_block_section>` defines
2038 user-defined, global abbreviations that are used to convert PNaCl records to
2039 bit sequences in blocks following the abbreviations block.
2040
2041 A types block
2042 The :ref:`types block<link_for_types_block_section>` defines the set of all
2043 types used in the program.
2044
2045 A non-empty sequence of function address records
2046 Each record defines a :ref:`function
2047 address<link_for_function_address_section>` used by the program. Function
2048 addresses must either be external, or defined internally by the program. If
2049 they are defined by the program, there must be a :ref:`function
2050 block<link_for_function_blocks_section>` (appearing later in the module) that
2051 defines the sequence of instructions for each defined function.
2052
2053 A globals block defining the global variables.
2054 This :ref:`block<link_for_globals_block_section>` defines the set of
2055 global :ref:`variable<link_for_global_variable_address>` and
2056 :ref:`constant<link_for_global_constant_address>` addresses used by the
2057 program. In addition to the addresses, each global variable also defines how
2058 the corresponding global variable is initialized.
2059
2060 An optional value symbol table block.
2061 This :ref:`block<link_for_valuesymtab_block_section>`, if defined, provides
2062 textual names for :ref:`function
2063 addresses<link_for_function_address_section>` (previously defined in the
2064 module). Note that only names for intrinsic functions and the start function
2065 are specified.
2066
2067 A sequence of function blocks.
2068 Each :ref:`function block<link_for_Function_blocks_section>` defines the
2069 corresponding intermediate representation for each defined function. The
2070 order of function blocks is used to associate them with :ref:`function
2071 addresses<link_for_function_address_section>`. The order of the defined
2072 function blocks must follow the same order as the corresponding function
2073 addresses defined in the module block.
2074
2075 Descriptions of the :ref:`abbreviations<link_for_abbreviations_section>`,
2076 :ref:`types<link_for_types_block_section>`,
2077 :ref:`globals<link_for_globals_block_section>`, :ref:`value symbol
2078 table<link_for_valuesymtab_block_section>`, and
2079 :ref:`function<link_for_function_blocks_section>` blocks are not provided
2080 here. See the appropriate reference for more details. The following subsections
2081 describe each of the records that can appear in a module block.
2082
2083 .. _link_for_version_record:
2084
2085 Version Record
2086 --------------
2087
2088 The version record defines the implementation of the PNaCl bitstream
2089 reader/writer to use. That is, the implementation that converts PNaCl records to
2090 bit sequences, and converts them back to PNaCl records. Note that this is
2091 different than the PNaCl version of the bitcode file (encoded in the header
2092 record of the bitcode file). The PNaCl version defines the valid forms of PNaCl
2093 records. The version record is specific to the PNaCl version, and may have
2094 different values for different PNaCl versions.
2095
2096 Note that currently, only PNaCl bitcode version 2, and version record value 1 is
2097 defined.
2098
2099 **Syntax**::
2100
2101 version N; <A>
2102
2103 **Record**::
2104
2105 AA: <1, N>
2106
2107 **Semantics**:
2108
2109 The version record defines which PNaCl reader/writer rules should be
2110 followed. ``N`` is the version number. Currently ``N`` must be 1. Future
2111 versions of PNaCl may define additional legal values.
2112
2113 **Constraints**::
2114
2115 AA == AbbrevIndex(A)
2116
2117 *Examples*::
2118
2119 16:0|1: <65535, 8, 2> |module { // BlockID = 8
2120 24:0| 3: <1, 1> | version 1;
2121 26:4| 1: <65535, 0, 2> | abbreviations { // BlockID = 0
2122 36:0| 0: <65534> | }
2123
2124 .. _link_for_function_address_section:
2125
2126 Function Address
2127 ----------------
2128
2129 A function address record describes a function address. *Defined* function
2130 addresses define :ref:`implementations<link_for_function_blocks_section>` while
2131 *declared* function addresses do not.
2132
2133 Since a PNaCl program is assumed to be a complete (statically linked)
2134 executable, All functions should be *defined* and *internal*. The exception to
2135 this are :ref:`intrinsic functions<link_for_intrinsic_functions_section>`, which
2136 should only be *declared* and *external*, since intrinsic functions will be
2137 automatically converted to appropriate code by the :ref:`PNaCl
2138 translator<link_for_pnacl_translator>`.
2139
2140 The implementation of a *defined* function address is provided by a
2141 corresponding function block, appearing later in the module block. The
2142 association of a *defined* function address with the corresponding function
2143 block is based on position. The *Nth* defined function address record, in the
2144 module block, has its implementation in the *Nth* function block of that module
2145 block.
2146
2147 **Syntax**::
2148
2149 PN LN T0 @fN ( T1 , ... , TM ); <A>
2150
2151 **Record**::
2152
2153 AA: <8, T, C, P, L>
2154
2155 **Semantics**:
2156
2157 Describes the function address ``@fN``. ``PN`` is the name that specifies the
2158 prototype value ``P`` associated with the function. A function address is
2159 *defined* only if ``P == 0``. Otherwise, it is only *declared*. The type of the
2160 function is :ref:`function type<link_for_function_type>` ``@tT``. ``L`` is the
2161 linkage specification corresponding to name ``LN``. ``C`` is the calling
2162 convention used by the function.
2163
2164 Note that function signature must be defined by a function type in the types
2165 block. Hence, the return value must either be a primitive type, type ``void``,
2166 or a vector type.
2167
2168 For ordinary functions, integer parameter and types can only be ``i32`` and
2169 ``i64``. All other integer types are not allowed. For intrinsic functions, all
2170 integer types are allowed.
2171
2172 Valid prototype names ``PN``, and corresponding ``P`` values, are:
2173
2174 = =======
2175 P PN
2176 = =======
2177 1 declare
2178 0 define
2179 = =======
2180
2181 Valid linkage names ``LN``, and corresponding ``L`` values, are:
2182
2183 = ========
2184 L LN
2185 = ========
2186 3 internal
2187 0 external
2188 = ========
2189
2190 Currently, only one calling convention ``C`` is supported:
2191
2192 = ====================
2193 C Calling Convention
2194 = ====================
2195 0 C calling convention
2196 = ====================
2197
2198 **Constraints**::
2199
2200 AA = AbbrevIndex(A) &
2201 T = TypeID(TypeOf(T0 ( T1 , ... , TN ))) &
2202 N = NumFuncAddresses
2203
2204 **Updates**::
2205
2206 ++NumFuncAddresses;
2207 TypeOf(@fN) = TypeOf(TypeID(i32));
2208 TypeOfFcn(@fN) = TypeOf(@tT);
2209
2210 if PN == 0:
2211 DefiningFcnIDs += @FN;
2212 ++NumDefinedFunctionAddresses;
2213
2214 **Examples**::
2215
2216 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
2217 48:0| 3: <1, 7> | count 7;
2218 50:4| 3: <7, 32> | @t0 = i32;
2219 53:6| 3: <3> | @t1 = float;
2220 55:4| 3: <4> | @t2 = double;
2221 57:2| 3: <2> | @t3 = void;
2222 59:0| 3: <21, 0, 2, 1> | @t4 = double (float);
2223 63:0| 3: <21, 0, 0, 0, 1, 0, 2>| @t5 =
2224 | | i32 (i32, float, i32, double);
2225 69:2| 3: <21, 0, 3> | @t6 = void ();
2226 72:4| 0: <65534> | }
2227 76:0| 3: <8, 4, 0, 1, 0> | declare external double @f0(float);
2228 80:6| 3: <8, 5, 0, 1, 0> | declare external
2229 | | i32 @f1(i32, float, i32, double);
2230 85:4| 3: <8, 6, 0, 0, 0> | define external void @f2();
2231
2232 .. _link_for_constants_block_section:
2233
2234 Constants Blocks
2235 ================
2236
2237 Constants blocks define literal constants used within each function. Its intent
2238 is to define them once, before instructions. A constants block can only appear
2239 in a :ref:`function block<link_for_function_blocks_section>`, and must appear
2240 before any instructions in the function block.
2241
2242 Currently, only integer literals, floating point literals, and undefined vector
2243 constants can be defined.
2244
2245 To minimize type information put in a constants block, the type information is
2246 separated from the constants. This allows a sequence of constants to be given
2247 the same type. This is done by defining a :ref:`set type
2248 record<link_for_constants_set_type_record>`, followed by a sequence of literal
2249 constants. These literal constants all get converted to the type of the
2250 preceding set type record.
2251
2252 Note that constants that are used for switch case selectors should not be added
2253 to the constants block, since the switch instruction contains the constants used
2254 for case selectors. All other constants in the function block must be put into a
2255 constants block, so that instructions can use them.
2256
2257 To make this more concrete, consider the following example constants block::
2258
2259 106:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2260 116:0| 3: <1, 0> | i32:
2261 118:4| 3: <4, 2> | %c0 = i32 1;
2262 121:0| 3: <4, 4> | %c1 = i32 2;
2263 123:4| 3: <1, 2> | i8:
2264 126:0| 3: <4, 8> | %c2 = i8 4;
2265 128:4| 3: <4, 6> | %c3 = i8 3;
2266 131:0| 3: <1, 1> | float:
2267 133:4| 3: <6, 1065353216> | %c4 = float 1;
2268 139:6| 0: <65534> | }
2269
2270 .. _link_for_constants_set_type_record:
2271
2272 Set Type Record
2273 ---------------
2274
2275 The *set type* record defines the type to use for the (immediately) succeeding
2276 literals.
2277
2278 **Syntax**::
2279
2280 T: <A>
2281
2282 **Record**::
2283
2284 AA: <1, TT>
2285
2286 **Semantics**:
2287
2288 The *set type* record defines type ``T`` to be used to type the (immediately)
2289 succeeding literals. ``T`` must be a non-void primitive value type or a vector
2290 type.
2291
2292 **Constraints**::
2293
2294 TT == TypeID(T)
2295
2296 **Updates**::
2297
2298 ConstantsSetType = T;
2299
2300 **Examples**::
2301
2302 106:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2303 116:0| 3: <1, 0> | i32:
2304 118:4| 3: <4, 2> | %c0 = i32 1;
2305 121:0| 3: <4, 4> | %c1 = i32 2;
2306 123:4| 3: <1, 2> | i8:
2307 126:0| 3: <4, 8> | %c2 = i8 4;
2308 128:4| 3: <4, 6> | %c3 = i8 3;
2309 131:0| 3: <1, 1> | float:
2310 133:4| 3: <6, 1065353216> | %c4 = float 1;
2311 139:6| 0: <65534> | }
2312
2313 .. _link_for_undefined_literal:
2314
2315 Undefined Literal
2316 -----------------
2317
2318 The *undefined* literal record creates an undefined literal for the type *T*
2319 defined by the preceding *set type* record.
2320
2321 Note: See :ref:`insert element
2322 instruction<link_for_insert_element_instruction_section>` for an example of how
2323 you would use the undefined literal with vector types.
2324
2325 **Syntax**::
2326
2327 %cN = T undef; <50>
2328
2329 **Record**::
2330
2331 AA: <3>
2332
2333 **Semantics**:
2334
2335 The *undefined* literal record creates an undefined literal constant ``%cN`` for
2336 type ``T``. ``T`` must be the type defined by the preceding *set type* record,
2337 and be a primitive value type or a vector type.
2338
2339 **Constraints**::
2340
2341 N == NumFcnConsts &
2342 T == ConstantsSetType &
2343 IsPrimitive(T) or IsVector(T)
2344
2345 **Updates**::
2346
2347 ++NumFcnConsts;
2348 TypeOf(%cN) = T;
2349
2350 **Examples**::
2351
2352 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
2353 48:0| 3: <1, 5> | count 5;
2354 50:4| 3: <7, 32> | @t0 = i32;
2355 53:6| 3: <3> | @t1 = float;
2356 55:4| 3: <2> | @t2 = void;
2357 57:2| 3: <12, 4, 0> | @t3 = <4 x i32>;
2358 60:4| 3: <21, 0, 2> | @t4 = void ();
2359 63:6| 0: <65534> | }
2360 ...
2361 106:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2362 116:0| 3: <1, 0> | i32:
2363 118:4| 3: <3> | %c0 = i32 undef;
2364 120:2| 3: <4, 2> | %c1 = i32 1;
2365 122:6| 3: <1, 3> | <4 x i32>:
2366 125:2| 3: <3> | %c2 = <4 x i32> undef;
2367 127:0| 3: <1, 1> | float:
2368 129:4| 3: <3> | %c3 = float undef;
2369 131:2| 0: <65534> | }
2370
2371 .. _link_for_integer_literal:
2372
2373 Integer Literal
2374 ---------------
2375
2376 The *integer literal* record creates an integer literal for the integer type *T*
2377 defined by the preceding *set type* record.
2378
2379 **Syntax**::
2380
2381 %cN = T V; <A>
2382
2383 **Record**::
2384
2385 AA: <4, VV>
2386
2387 **Semantics**:
2388
2389 The *integer literal* record creates an integer literal constant ``%cN`` for
2390 type ``T``. ``T`` must be the type defined by the preceding *set type* record,
2391 and an integer type. The literal ``V`` can be signed, but must be definable by
2392 type ``T``.
2393
2394 **Constraints**::
2395
2396 N == NumFcnConsts &
2397 T == ConstantsSetType &
2398 VV == SignRotate(V) &
2399 IsInteger(T)
2400
2401 **Updates**::
2402
2403 TypeOf(%cN) = T;
2404
2405 **Examples**::
2406
2407 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
2408 48:0| 3: <1, 7> | count 7;
2409 50:4| 3: <7, 8> | @t0 = i8;
2410 53:0| 3: <7, 16> | @t1 = i16;
2411 55:4| 3: <7, 32> | @t2 = i32;
2412 58:6| 3: <7, 64> | @t3 = i64;
2413 62:0| 3: <7, 1> | @t4 = i1;
2414 64:4| 3: <2> | @t5 = void;
2415 66:2| 3: <21, 0, 5> | @t6 = void ();
2416 69:4| 0: <65534> | }
2417 ...
2418 114:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2419 124:0| 3: <1, 0> | i8:
2420 126:4| 3: <4, 2> | %c0 = i8 1;
2421 129:0| 3: <4, 4> | %c1 = i8 2;
2422 131:4| 3: <1, 1> | i16:
2423 134:0| 3: <4, 6> | %c2 = i16 3;
2424 136:4| 3: <4, 8> | %c3 = i16 4;
2425 139:0| 3: <1, 2> | i32:
2426 141:4| 3: <4, 10> | %c4 = i32 5;
2427 144:0| 3: <4, 12> | %c5 = i32 6;
2428 146:4| 3: <1, 3> | i64:
2429 149:0| 3: <4, 3> | %c6 = i64 -1;
2430 151:4| 3: <4, 5> | %c7 = i64 -2;
2431 154:0| 3: <1, 4> | i1:
2432 156:4| 3: <4, 3> | %c8 = i1 1;
2433 159:0| 3: <4, 0> | %c9 = i1 0;
2434 161:4| 0: <65534> | }
2435
2436 Floating Point Literal
2437 ----------------------
2438
2439 The *floating point literal* record creates a floating point literal for the
2440 floating point type *T* defined by the preceding *set type* record.
2441
2442 **Syntax**::
2443
2444 %cN = T V; <A>
2445
2446 **Record**::
2447
2448 AA: <6, VV>
2449
2450 **Semantics**:
2451
2452 The *floating point literal* record creates a floating point literal constant
2453 ``%cN`` for type ``T``. ``T`` must the type type defined by the preceding *set
2454 type* record, and be a floating point type. The literal ``V`` is the floating
2455 value to be defined. The value ``VV`` if the corresponding IEEE unsigned integer
2456 that defines value ``V``. That is, the literal ``VV`` must be a valid IEEE 754
2457 32-bit (unsigned integer) value if ``T`` is ``float``, and a valid IEEE 754
2458 64-bit (unsigned integer) value if ``T`` is ``double``.
2459
2460 **Constraints**::
2461
2462 N == NumFcnConsts
2463 T == ConstantsSetType
2464 IsFloat(T)
2465
2466 **Updates**::
2467
2468 TypeOf(%cN) = T;
2469
2470 **Examples**::
2471
2472 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
2473 48:0| 3: <1, 4> | count 4;
2474 50:4| 3: <3> | @t0 = float;
2475 52:2| 3: <4> | @t1 = double;
2476 54:0| 3: <2> | @t2 = void;
2477 55:6| 3: <21, 0, 2> | @t3 = void ();
2478 59:0| 0: <65534> | }
2479 ...
2480 102:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2481 112:0| 3: <1, 0> | float:
2482 114:4| 3: <6, 0> | %c0 = float 0;
2483 117:0| 3: <6, 1065353216> | %c1 = float 1;
2484 123:2| 3: <6, 1088421888> | %c2 = float 7;
2485 130:2| 3: <6, 1090519040> | %c3 = float 8;
2486 137:2| 3: <3> | %c4 = float undef;
2487 139:0| 3: <6, 2143289344> | %c5 = float nan;
2488 146:0| 3: <6, 2139095040> | %c6 = float inf;
2489 153:0| 3: <6, 4286578688> | %c7 = float -inf;
2490 160:0| 3: <1, 1> | double:
2491 162:4| 3: <6, | %c8 = double 1;
2492 | 4607182418800017408> |
2493 174:0| 3: <6, 0> | %c9 = double 0;
2494 176:4| 3: <6, | %c10 = double 5;
2495 | 4617315517961601024> |
2496 188:0| 3: <6, | %c11 = double 6;
2497 | 4618441417868443648> |
2498 199:4| 3: <6, | %c12 = double nan;
2499 | 9221120237041090560> |
2500 211:0| 3: <6, | %c13 = double inf;
2501 | 9218868437227405312> |
2502 222:4| 3: <6, | %c14 = double -inf;
2503 | 18442240474082181120>|
2504 234:0| 0: <65534> | }
2505
2506 .. _link_for_function_blocks_section:
2507
2508 Function Blocks
2509 ===============
2510
2511 A function block defines the implementation of a defined :ref:`function
2512 address<link_for_function_address_section>`. The function address it defines is
2513 based on the position of the corresponding defined function address. The Nth
2514 defined function address always corresponds to the Nth function block in the
2515 module block.
2516
2517 A function implementation contains a list of basic blocks, forming the control
2518 flow graph. Each *basic block* contains a list of instructions, and ends with a
2519 :ref:`terminator instruction<link_for_terminator_instruction_section>`
2520 (e.g. branch).
2521
2522 Basic blocks are not represented by records. Rather, context is implicit. The
2523 first basic block begins with the first instruction record in the function
2524 block. Block boundaries are determined by terminator instructions. The
2525 instruction that follows a terminator instruction begins a new basic block.
2526
2527 The first basic block in a function is special in two ways: it is immediately
2528 executed on entrance to the function, and it is not allowed to have predecessor
2529 basic blocks (i.e. there can't be any branches to the entry block of a
2530 function). Because the entry block has no predecessors, it also can't have any
2531 :ref:`phi<link_for_phi_instruction_section>` instructions.
2532
2533 The parameters are implied by the type of the corresponding function
2534 address. One parameter is defined for each argument of the function :ref:`type
2535 signature<link_for_function_type>` of the corresponding :ref:`function
2536 address<link_for_function_address_section>`.
2537
2538 The number of basic blocks is defined by the :ref:`count
2539 record<link_for_basic_blocks_count>`. Each :ref:`terminator
2540 instruction<link_for_terminator_instruction_section>` ends the current basic
2541 block, and the next instruction begins a new basic block. Basic blocks are
2542 numbered by the order they appear (starting with index 0). Basic block IDs have
2543 the form ``%bN``, where ``N`` corresponds to the position of the basic block
2544 within the function block.
2545
2546 Each instruction, within a function block, corresponds to a corresponding PNaCl
2547 record. The layout of a function block is the (basic block) count record,
2548 followed by a sequence of instruction records.
2549
2550 For readability, PNaClAsm introduces basic block IDs. These basic block IDs do
2551 not correspond to PNaCl records, since basic block boundaries are defined
2552 implicitly, after terminator instructions. They appear only for readability.
2553
2554 Operands of instructions are defined using an :ref:`absolute
2555 index<link_for_absolute_index_section>`. This absolute index implicitly encodes
2556 function addresses, global addresses, parameters, constants, and instructions
2557 that generate values. The encoding takes advantage of the implied ordering of
2558 these values in the bitcode file, defining a contiguous sequence of indices for
2559 each kind of identifier. That is, indices are ordered by putting function
2560 address identifiers first, followed by global address identifiers, followed by
2561 parameter identifiers, followed by constant identifiers, and lastly instruction
2562 value identifiers.
2563
2564 To save space in the encoded bitcode file, most operands are encoded using a
2565 :ref:`relative index<link_for_relative_index>` value, rather than
2566 :ref:`absolute<link_for_absolute_index_section>`. This
2567 is done because most instruction operands refer to values defined earlier in the
2568 (same) basic block. As a result, the relative distance (back) from the next
2569 value defining instruction is frequently a small number. Small numbers tend to
2570 require fewer bits when they are converted to bit sequences.
2571
2572 Note that instructions that can appear in a function block are defined in
2573 sections :ref:`link_for_terminator_instruction_section`,
2574 :ref:`link_for_integer_binary_instructions`,
2575 :ref:`link_for_floating_point_binary_instructions`,
2576 :ref:`link_for_memory_creation_and_access_instructions`,
2577 :ref:`link_for_conversion_instructions`, :ref:`link_for_compare_instructions`,
2578 :ref:`link_for_vector_instructions`, and
2579 :ref:`link_for_other_pnaclasm_instructions`.
2580
2581 The following subsections define the remaining records that can appear in a
2582 function block.
2583
2584 Function Enter
2585 --------------
2586
2587 PNaClAsm defines a function enter block construct. The corresponding record is
2588 simply an :ref:`enter block<link_for_enter_block_record_section>` record, with
2589 BlockID value ``12``. All context about the defining address is implicit by the
2590 position of the function block, and the corresponding defining :ref:`function
2591 address<link_for_function_address_section>`. To improve readability, PNaClAsm
2592 includes the function signature into the syntax rule.
2593
2594 **Syntax**::
2595
2596 function TR @fN ( T0 %p0, ... , TM %pM ) { <B>
2597
2598 **Record**::
2599
2600 1: <65535, 12, B>
2601
2602 **Semantics**:
2603
2604 ``B`` is the number of bits reserved for abbreviations in the block. If it is
2605 omitted, 2 is assumed. See :ref:`enter<link_for_enter_block_record_section>`
2606 block records for more details.
2607
2608 The value of ``N`` corresponds to the positional index of the corresponding
2609 defining function address this block is associated with. ``M`` is the number of
2610 defined parameters (minus one) in the function heading.
2611
2612 **Constraints**::
2613
2614 N == NumFcnImpls &
2615 @fN in DefiningFcnIDs &
2616 TypeOfFcn(@fN) == TypeOf(TypeID(TR (T0, ... , TM)))
2617
2618 **Updates**::
2619
2620 ++NumFcnImpls;
2621 EnclosingFcnID = @fN;
2622 NumBasicBlocks = 0;
2623 ExpectedBlocks = 0;
2624 NumParams = M;
2625 for I in [0..M]:
2626 TypeOf(%pI) = TypeOf(TypeID(TI));
2627
2628 **Examples**::
2629
2630 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
2631 48:0| 3: <1, 4> | count 4;
2632 50:4| 3: <7, 32> | @t0 = i32;
2633 53:6| 3: <2> | @t1 = void;
2634 55:4| 3: <21, 0, 1> | @t2 = void ();
2635 58:6| 3: <21, 0, 0, 0> | @t3 = i32 (i32);
2636 62:6| 0: <65534> | }
2637 ...
2638 104:0| 1: <65535, 12, 2> | function void @f0() {
2639 | | // BlockID = 12
2640 112:0| 3: <1, 1> | blocks 1;
2641 | | %b0:
2642 114:4| 3: <10> | ret void;
2643 116:2| 0: <65534> | }
2644 120:0| 1: <65535, 12, 2> | function i32 @f1(i32 %p0) {
2645 | | // BlockID = 12
2646 128:0| 3: <1, 1> | blocks 1;
2647 | | %b0:
2648 130:4| 3: <10, 1> | ret i32 %p0;
2649 133:0| 0: <65534> | }
2650
2651 .. _link_for_basic_blocks_count:
2652
2653 Count Record
2654 ------------
2655
2656 The count record, within a function block, defines the number of basic blocks
2657 used to define the function implementation. It must be the first record in the
2658 function block.
2659
2660 **Syntax**::
2661
2662 blocks: N; <A>
2663 %b0:
2664
2665 **Record**::
2666
2667 AA: <1, N>
2668
2669 **Semantics**:
2670
2671 The count record defines the number ``N`` of basic blocks in the implemented
2672 function.
2673
2674 **Constraints**::
2675
2676 AA == AbbrevIndex(A) &
2677 ExpectedBasicBlocks == N &
2678 NumBasicBlocks == 0
2679
2680 **Updates**::
2681
2682 104:0| 1: <65535, 12, 2> | function void @f0() {
2683 | | // BlockID = 12
2684 112:0| 3: <1, 1> | blocks 1;
2685 | | %b0:
2686 114:4| 3: <10> | ret void;
2687 116:2| 0: <65534> | }
2688 120:0| 1: <65535, 12, 2> | function i32 @f1(i32 %p0) {
2689 | | // BlockID = 12
2690 128:0| 3: <1, 1> | blocks 1;
2691 | | %b0:
2692 130:4| 3: <10, 1> | ret i32 %p0;
2693 133:0| 0: <65534> | }
2694
2695 .. _link_for_terminator_instruction_section:
2696
2697 Terminator Instructions
2698 =======================
2699
2700 Terminator instructions are instructions that appear in a :ref:`function
2701 block<link_for_function_blocks_section>`, and define the end of the current
2702 basic block. A terminator instruction indicates which block should be executed
2703 after the current block is finished. The function block is well formed only if
2704 the number of terminator instructions, in the function block, corresponds to the
2705 value defined by the corresponding function basic block :ref:`count
2706 record<link_for_basic_blocks_count>`.
2707
2708 Note that any branch instruction to label ``%bN``, where ``N >=
2709 ExpectedBasicBlocks``, is illegal. For ease of readability, this constraint
2710 hasn't been put on branch instructions. Rather it is only implied.
2711
2712 In addition, it must be the case that ``NumBasicBlocks < ExpectedBasicBlocks``,
2713 and will not be listed as a constraint. Further, if ``B = NumBasicBlocks + 1``
2714 is the number associated with the next basic block. Label `%bB:` only appears
2715 if::
2716
2717 B < ExpectedBasicBlocks
2718
2719 That is, the label is omitted only if this terminator instruction is the last
2720 instruction in the function block.
2721
2722 Return Void Instruction
2723 -----------------------
2724
2725 The return void instruction is used to return control from a function back to
2726 the caller, without returning any value.
2727
2728 **Syntax**::
2729
2730 ret void; <A>
2731 %bB:
2732
2733 **Record**::
2734
2735 AA: <10>
2736
2737 **Semantics**:
2738
2739 The return void instruction returns control to the calling function.
2740
2741 **Constraints**::
2742
2743 AA == AbbrevIndex(A) &
2744 B == NumBasicBlocks + 1 &
2745 ReturnType(TypeOf(EnclosingFcnID)) == void
2746
2747 **Updates**::
2748
2749 ++NumBasicBlocks;
2750
2751 **Examples**::
2752
2753 104:0| 1: <65535, 12, 2> | function void @f0() {
2754 | | // BlockID = 12
2755 112:0| 3: <1, 1> | blocks 1;
2756 | | %b0:
2757 114:4| 3: <10> | ret void;
2758 116:2| 0: <65534> | }
2759
2760 Return Value Instruction
2761 ------------------------
2762
2763 The return value instruction is used to return control from a function back to
2764 the caller, including a value. The value must correspond to the return type of
2765 the enclosing function.
2766
2767 **Syntax**::
2768
2769 ret T V; <A>
2770 %bB:
2771
2772 **Record**::
2773
2774 AA: <10, VV>
2775
2776 **Semantics**:
2777
2778 The return value instruction returns control to the calling function, returning
2779 the provided value.
2780
2781 ``V`` is the value to return. Type ``T`` must be of the type returned by the
2782 function. It must also be the type associated with value ``V``.
2783
2784 The return type ``T`` must either be a (non-void) primitive type, or a vector
2785 type. If the function block is implementing an ordinary function, and the return
2786 type is an integer type, it must be either ``i32`` or ``i64``.
2787
2788 **Constraints**::
2789
2790 AA == AbbrevIndex(A) &
2791 VV == RelativeIndex(V) &
2792 B == NumBasicBlocks + 1 &
2793 T == TypeOf(V) == ReturnType(TypeOf(EnclosingFcnID))
2794
2795 **Updates**::
2796
2797 ++NumBasicBlocks;
2798
2799 **Examples**::
2800
2801 120:0| 1: <65535, 12, 2> | function i32 @f1(i32 %p0) {
2802 | | // BlockID = 12
2803 128:0| 3: <1, 1> | blocks 1;
2804 | | %b0:
2805 130:4| 3: <10, 1> | ret i32 %p0;
2806
2807 Unconditional Branch Instruction
2808 --------------------------------
2809
2810 The unconditional branch instruction is used to cause control flow to transfer
2811 to a different basic block of the function.
2812
2813 **Syntax**::
2814
2815 br %bN; <A>
2816 %bB:
2817
2818 **Record**::
2819
2820 AA: <11, N>
2821
2822 **Semantics**:
2823
2824 The unconditional branch instruction causes control flow to transfer to basic
2825 block ``N``.
2826
2827 **Constraints**::
2828
2829 AA == AbbrevIndex(A) &
2830 B == NumBasicBlocks + 1 &
2831 0 < N &
2832 N < ExpectedBasicBlocks
2833
2834 **Updates**::
2835
2836 ++NumBasicBlocks;
2837
2838 **Examples**::
2839
2840 88:0| 1: <65535, 12, 2> | function void @f0() {
2841 | | // BlockID = 12
2842 96:0| 3: <1, 5> | blocks 5;
2843 | | %b0:
2844 98:4| 3: <11, 3> | br label %b3;
2845 | | %b1:
2846 101:0| 3: <11, 4> | br label %b4;
2847 | | %b2:
2848 103:4| 3: <11, 1> | br label %b1;
2849 | | %b3:
2850 106:0| 3: <11, 2> | br label %b2;
2851 | | %b4:
2852 108:4| 3: <10> | ret void;
2853 110:2| 0: <65534> | }
2854
2855 Conditional Branch Instruction
2856 ------------------------------
2857
2858 The conditional branch instruction is used to cause control flow to transfer to
2859 a different basic block of the function, based on a boolean test condition.
2860
2861 **Syntax**::
2862
2863 br i1 C, %bT, %bBF; <A>
2864 %bB:
2865
2866 **Record**::
2867
2868 AA: <11, T, F, CC>
2869
2870 **Semantics**:
2871
2872 Upon execution of a conditional branch instruction, the *i1* (boolean) argument
2873 ``C`` is evaluated. If the value is ``true``, control flows to basic block
2874 ``%bT``. Otherwise control flows to basic block ``%bF``.
2875
2876 **Constraints**::
2877
2878 AA == AbbrevIndex(A) &
2879 CC == RelativeIndex(C) &
2880 B == NumBasicBlocks + 1 &
2881 0 < T &
2882 B1 < ExpectedBasicBlocks &
2883 0 < F &
2884 B2 < ExpectedBasicBlocks &
2885 TypeOf(C) == i1
2886
2887 **Updates**::
2888
2889 ++NumBasicBlocks;
2890
2891 **Examples**::
2892
2893 92:0| 1: <65535, 12, 2> | function void @f0() {
2894 | | // BlockID = 12
2895 100:0| 3: <1, 5> | blocks 5;
2896 102:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2897 112:0| 3: <1, 1> | i1:
2898 114:4| 3: <4, 3> | %c0 = i1 1;
2899 117:0| 3: <4, 0> | %c1 = i1 0;
2900 119:4| 0: <65534> | }
2901 | | %b0:
2902 120:0| 3: <11, 3> | br label %b3;
2903 | | %b1:
2904 122:4| 3: <11, 2, 4, 2> | br i1 %c0, label %b2, label %b4;
2905 | | %b2:
2906 126:4| 3: <11, 3> | br label %b3;
2907 | | %b3:
2908 129:0| 3: <10> | ret void;
2909 | | %b4:
2910 130:6| 3: <11, 2, 3, 1> | br i1 %c1, label %b2, label %b3;
2911 134:6| 0: <65534> | }
2912
2913 Unreachable
2914 -----------
2915
2916 The unreachable instruction has no defined semantics. The instruction is used to
2917 inform the :ref:`PNaCl translator<link_for_pnacl_translator>` that control
2918 can't reach this instruction.
2919
2920 **Syntax**::
2921
2922 unreachable; <A>
2923 %bB:
2924
2925 **Record**::
2926
2927 AA: <15>
2928
2929 **Semantics**:
2930
2931 Directive to the :ref:`PNaCl translator<link_for_pnacl_translator>` that
2932 this instruction is unreachable.
2933
2934 **Constraints**::
2935
2936 AA == AbbrevIndex(A)
2937 B == NumBasicBlocks + 1 &
2938
2939 **Updates**::
2940
2941 ++NumBasicBlocks;
2942
2943 **Examples**::
2944
2945 108:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
2946 | | // BlockID = 12
2947 116:0| 3: <1, 5> | blocks 5;
2948 118:4| 1: <65535, 11, 2> | constants { // BlockID = 11
2949 128:0| 3: <1, 2> | i1:
2950 130:4| 3: <4, 3> | %c0 = i1 1;
2951 133:0| 3: <4, 0> | %c1 = i1 0;
2952 135:4| 0: <65534> | }
2953 | | %b0:
2954 136:0| 3: <11, 1, 2, 2> | br i1 %c0, label %b1, label %b2;
2955 | | %b1:
2956 140:0| 3: <11, 3, 4, 1> | br i1 %c1, label %b3, label %b4;
2957 | | %b2:
2958 144:0| 3: <15> | unreachable;
2959 | | %b3:
2960 145:6| 3: <15> | unreachable;
2961 | | %b4:
2962 147:4| 3: <10> | ret void;
2963 149:2| 0: <65534> | }
2964
2965 Switch Instruction
2966 ------------------
2967
2968 The *switch* instruction transfers control flow to one of several different
2969 places, based on a selector value. It is a generalization of the conditional
2970 branch instruction.
2971
2972 **Syntax**::
2973
2974 switch T V0 {
2975 default: br label %bB0;
2976 T V1: br label %bB1;
2977 ...
2978 T VN: br label %bBN;
2979 } <A>
2980 %bB:
2981
2982 **Record**::
2983
2984 AA: <12, TT, B0, N, (1, 1, VVI, BI | 1 <= i <= N)>
2985
2986 **Semantics**:
2987
2988 The switch instruction transfers control to a basic block in ``B0`` through
2989 ``BN``. Value ``V`` is used to conditionally select which block to branch
2990 to. ``T`` is the type of ``V`` and ``V1`` through ``VN``, and must be an integer
2991 type. Value ``V1`` through ``VN`` are integers to compare against ``V``. If
2992 selector ``V`` matches ``VI`` (for some ``I``, ``1 <= I <= N``), then the
2993 instruction branches to block ``BI``. If ``V`` is not in ``V1`` through ``VN``,
2994 the instruction branches to block ``B0``.
2995
2996 **Constraints**::
2997
2998 AA == AbbrevIndex(A) &
2999 B == NumBasicBlocks + 1 &
3000 TT == TypeID(T) &
3001 VI == SignRotate(VI) for all I, 1 <= I <= N &
3002
3003 **Updates**::
3004
3005 ++NumBasicBlocks;
3006
3007 **Examples**::
3008
3009 116:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
3010 | | // BlockID = 12
3011 124:0| 3: <1, 6> | blocks 6;
3012 | | %b0:
3013 126:4| 3: <12, 1, 1, 2, 4, 1, 1,| switch i32 %p0 {
3014 | 2, 3, 1, 1, 4, 3, 1, | default: br label %b2;
3015 | 1, 8, 4, 1, 1, 10, 4>| i32 1: br label %b3;
3016 | | i32 2: br label %b3;
3017 | | i32 4: br label %b4;
3018 | | i32 5: br label %b4;
3019 | | }
3020 | | %b1:
3021 143:2| 3: <11, 5> | br label %b5;
3022 | | %b2:
3023 145:6| 3: <11, 5> | br label %b5;
3024 | | %b3:
3025 148:2| 3: <11, 5> | br label %b5;
3026 | | %b4:
3027 150:6| 3: <11, 5> | br label %b5;
3028 | | %b5:
3029 153:2| 3: <10> | ret void;
3030 155:0| 0: <65534> | }
3031 156:0| 1: <65535, 12, 2> | function void @f1(i64 %p0) {
3032 | | // BlockID = 12
3033 164:0| 3: <1, 6> | blocks 6;
3034 | | %b0:
3035 166:4| 3: <12, 2, 1, 2, 4, 1, 1,| switch i64 %p0 {
3036 | 2, 3, 1, 1, 4, 3, 1, | default: br label %b2;
3037 | 1, 8, 4, 1, 1, | i64 1: br label %b3;
3038 | 39777555332, 4> | i64 2: br label %b3;
3039 | | i64 4: br label %b4;
3040 | | i64 19888777666: br label %b4;
3041 | | }
3042 | | %b1:
3043 188:4| 3: <11, 5> | br label %b5;
3044 | | %b2:
3045 191:0| 3: <11, 5> | br label %b5;
3046 | | %b3:
3047 193:4| 3: <11, 5> | br label %b5;
3048 | | %b4:
3049 196:0| 3: <11, 5> | br label %b5;
3050 | | %b5:
3051 198:4| 3: <10> | ret void;
3052 200:2| 0: <65534> | }
3053
3054 .. _link_for_integer_binary_instructions:
3055
3056 Integer Binary Instructions
3057 ===========================
3058
3059 Binary instructions are used to do most of the computation in a program. This
3060 section focuses on binary instructions that operator on integer values, or
3061 vectors of integer values.
3062
3063 All binary operations require two operands of the same type, execute an
3064 operation on them, and produce a value. The value may represent multiple values
3065 if the type is a vector type. The result value always has the same type as its
3066 operands.
3067
3068 Some integer binary operations can be applied to both signed and unsigned
3069 integers. Others, the sign is significant. In general, if the sign plays a role
3070 in the instruction, the sign information is encoded into the name of the
3071 instruction.
3072
3073 For most binary operations (except some of the logical operations), integer
3074 type i1 is disallowed.
3075
3076 Integer Add
3077 -----------
3078
3079 The integer add instruction returns the sum of its two arguments. Both arguments
3080 and the result must be of the same type. That type must be integer, or an
3081 integer vector type.
3082
3083 **Syntax**::
3084
3085 %vN = add T V1, V2; <A>
3086
3087 **Record**::
3088
3089 AA: <2, VV1, VV2, 0>
3090
3091 **Semantics**:
3092
3093 The integer add instruction returns the sum of its two arguments. Arguments
3094 ``V1`` and ``V2``, and the result ``%vN``, must be of type ``T``. ``T`` must be
3095 an integer type, or an integer vector type. ``N`` is defined by the record
3096 position, defining the corresponding value generated by the instruction.
3097
3098 The result returned is the mathematical result modulo 2\ :sup:`n`\ , where ``n``
3099 is the bit width of the integer result.
3100
3101 Because integers are assumed to use a two's complement representation,
3102 this instruction is appropriate for both signed and unsigned integers.
3103
3104 In the add instruction, integer type ``i1`` (and a vector of integer type
3105 ``i1``) is disallowed.
3106
3107 **Constraints**::
3108
3109 AA == AbbrevIndex(A) &
3110 VV1 == RelativeIndex(V1) &
3111 VV2 == RelativeIndex(V2) &
3112 T == TypeOf(V1) == TypeOf(V2) &
3113 IsInteger(UnderlyingType(T)) &
3114 UnderlyingType(T) != i1 &
3115 N == NumValuedInsts
3116
3117 **Updates**::
3118
3119 ++NumValuedInsts;
3120 TypeOf(%vN) = T
3121
3122 **Examples**::
3123
3124 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3125 | | // BlockID = 12
3126 104:0| 3: <1, 1> | blocks 1;
3127 | | %b0:
3128 106:4| 3: <2, 2, 1, 0> | %v0 = add i32 %p0, %p1;
3129 110:4| 3: <2, 3, 1, 0> | %v1 = add i32 %p0, %v0;
3130 114:4| 3: <10, 1> | ret i32 %v1;
3131 117:0| 0: <65534> | }
3132
3133 Integer Subtract
3134 ----------------
3135
3136 The integer subtract instruction returns the difference of its two arguments.
3137 Both arguments and the result must be of the same type. That type must be
3138 integer, or an integer vector type.
3139
3140 Note: Since there isn't a negate instruction, subtraction from constant zero
3141 should be used to negate values.
3142
3143 **Syntax**::
3144
3145 %vN = sub T V1, V2; <A>
3146
3147 **Record**::
3148
3149 AA: <2, VV1, VV2, 1>
3150
3151 **Semantics**:
3152
3153 The integer subtract returns the difference of its two arguments. Arguments
3154 ``V1`` and ``V2``, and the result ``%vN`` must be of type ``T``. ``T`` must be
3155 an integer type, or an integer vector type. ``N`` is defined by the record
3156 position, defining the corresponding value generated by the instruction.
3157
3158 The result returned is the mathematical result modulo 2\ :sup:`n`\ , where ``n``
3159 is the bit width of the integer result.
3160
3161 Because integers are assumed to use a two's complement representation,
3162 this instruction is appropriate for both signed and unsigned integers.
3163
3164 In the subtract instruction, integer type ``i1`` (and a vector of integer type
3165 ``i1``) is disallowed.
3166
3167 **Constraints**::
3168
3169 AA == AbbrevIndex(A) &
3170 VV1 == RelativeIndex(V1) &
3171 VV2 == RelativeIndex(V2) &
3172 T == TypeOf(V1) == TypeOf(V2) &
3173 IsInteger(UnderlyingType(T)) &
3174 UnderlyingType(T) != i1 &
3175 N == NumValuedInsts
3176
3177 **Updates**::
3178
3179 ++NumValuedInsts;
3180 TypeOf(%vN) = T
3181
3182 **Examples**::
3183
3184 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3185 | | // BlockID = 12
3186 104:0| 3: <1, 1> | blocks 1;
3187 | | %b0:
3188 106:4| 3: <2, 2, 1, 1> | %v0 = sub i32 %p0, %p1;
3189 110:4| 3: <2, 3, 1, 1> | %v1 = sub i32 %p0, %v0;
3190 114:4| 3: <10, 1> | ret i32 %v1;
3191 117:0| 0: <65534> | }
3192
3193 Integer Multiply
3194 ----------------
3195
3196 The integer multiply instruction returns the product of its two arguments. Both
3197 arguments and the result must be of the same type. That type must be integer,
3198 or an integer based vector type.
3199
3200 **Syntax**::
3201
3202 &vN = mul T V1, V2; <A>
3203
3204 **Record**::
3205
3206 AA: <2, VV1, VV2, 2>
3207
3208 **Semantics**:
3209
3210 The integer multiply instruction returns the product of its two
3211 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN``, must be of type
3212 ``T``. ``T`` must be an integer type, or an integer vector type. ``N`` is
3213 defined by the record position, defining the corresponding value generated by
3214 the instruction.
3215
3216 The result returned is the mathematical result modulo 2\ :sup:`n`\ , where ``n``
3217 is the bit width of the integer result.
3218
3219 Because integers are assumed to use a two's complement representation,
3220 this instruction is appropriate for both signed and unsigned integers.
3221
3222 In the subtract instruction, integer type ``i1`` (or a vector on integer type
3223 ``i1``) is disallowed.
3224
3225 **Constraints**::
3226
3227 AA == AbbrevIndex(A) &
3228 VV1 == RelativeIndex(V1) &
3229 VV2 == RelativeIndex(V2) &
3230 T == TypeOf(V1) == TypeOf(V2) &
3231 IsInteger(UnderlyingType(T)) &
3232 UnderlyingType(T) != i1 &
3233 N == NumValuedInsts
3234
3235 **Updates**::
3236
3237 ++NumValuedInsts;
3238 TypeOf(%vN) = T
3239
3240 **Examples**::
3241
3242 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3243 | | // BlockID = 12
3244 104:0| 3: <1, 1> | blocks 1;
3245 | | %b0:
3246 106:4| 3: <2, 2, 1, 2> | %v0 = mul i32 %p0, %p1;
3247 110:4| 3: <2, 1, 3, 2> | %v1 = mul i32 %v0, %p0;
3248 114:4| 3: <10, 1> | ret i32 %v1;
3249 117:0| 0: <65534> | }
3250
3251 Signed Integer Divide
3252 ---------------------
3253
3254 The signed integer divide instruction returns the quotient of its two arguments.
3255 Both arguments and the result must be of the same type. That type must be
3256 integer, or an integer vector type.
3257
3258 **Syntax**::
3259
3260 %vN = sdiv T V1, V2; <A>
3261
3262 **Record**::
3263
3264 AA: <2, VV1, VV2, 4>
3265
3266 **Semantics**:
3267
3268 The signed integer divide instruction returns the quotient of its two
3269 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN``, must be of type
3270 ``T``. ``T`` must be a integer type, or an integer vector type. ``N`` is defined
3271 by the record position, defining the corresponding value generated by the
3272 instruction.
3273
3274 Signed values are assumed. Note that signed and unsigned integer division are
3275 distinct operations. For unsigned integer division use the unsigned integer
3276 divide instruction (udiv).
3277
3278 In the signed integer divide instruction, integer type ``i1`` (and a vector of
3279 integer type ``i1``) is disallowed. Integer division by zero is guaranteed to
3280 trap.
3281
3282 Note that overflow can happen with this instruction when dividing the maximum
3283 negative integer by ``-1``. The behavior for this case is currently undefined.
3284
3285 **Constraints**::
3286
3287 AA == AbbrevIndex(A) &
3288 VV1 == RelativeIndex(V1) &
3289 VV2 == RelativeIndex(V2) &
3290 T == TypeOf(V1) == TypeOf(V2) &
3291 IsInteger(UnderlyingType(T)) &
3292 UnderlyingType(T) != i1 &
3293 N == NumValuedInsts
3294
3295 **Updates**::
3296
3297 ++NumValuedInsts;
3298 TypeOf(%vN) = T
3299
3300 **Examples**::
3301
3302 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3303 | | // BlockID = 12
3304 104:0| 3: <1, 1> | blocks 1;
3305 | | %b0:
3306 106:4| 3: <2, 2, 1, 4> | %v0 = sdiv i32 %p0, %p1;
3307 110:4| 3: <2, 1, 2, 4> | %v1 = sdiv i32 %v0, %p1;
3308 114:4| 3: <10, 1> | ret i32 %v1;
3309 117:0| 0: <65534> | }
3310
3311 Unsigned Integer Divide
3312 -----------------------
3313
3314 The unsigned integer divide instruction returns the quotient of its two
3315 arguments. Both the arguments and the result must be of the same type. That type
3316 must be integer, or an integer vector type.
3317
3318 **Syntax**::
3319
3320 %vN = udiv T V1, V2; <a>
3321
3322 **Record**::
3323
3324 AA: <2, A1, A2, 3>
3325
3326 **Semantics**:
3327
3328 The unsigned integer divide instruction returns the quotient of its two
3329 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN``, must be of type
3330 ``T``. ``T`` must be an integer type, or an integer vector type. ``N`` is
3331 defined by the record position, defining the corresponding value generated by
3332 the instruction.
3333
3334 Unsigned integer values are assumed. Note that signed and unsigned integer
3335 division are distinct operations. For signed integer division use the signed
3336 integer divide instruction (sdiv).
3337
3338 In the unsigned integer divide instruction, integer type ``i1`` (and a vector of
3339 integer type ``i1``) is disallowed. Division by zero is guaranteed to trap.
3340
3341 **Constraints**::
3342
3343 AA == AbbrevIndex(A) &
3344 VV1 == RelativeIndex(V1) &
3345 VV2 == RelativeIndex(V2) &
3346 T == TypeOf(V1) == TypeOf(V2) &
3347 IsInteger(UnderlyingType(T)) &
3348 UnderlyingType(T) != i1 &
3349 N == NumValuedInsts
3350
3351 **Updates**::
3352
3353 ++NumValuedInsts;
3354 TypeOf(%vN) = T
3355
3356 **Examples**::
3357
3358 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3359 | | // BlockID = 12
3360 104:0| 3: <1, 1> | blocks 1;
3361 | | %b0:
3362 106:4| 3: <2, 2, 1, 3> | %v0 = udiv i32 %p0, %p1;
3363 110:4| 3: <2, 1, 2, 3> | %v1 = udiv i32 %v0, %p1;
3364 114:4| 3: <10, 1> | ret i32 %v1;
3365 117:0| 0: <65534> | }
3366
3367 Signed Integer Remainder
3368 ------------------------
3369
3370 The signed integer remainder instruction returns the remainder of the quotient
3371 of its two arguments. Both arguments and the result must be of the same
3372 type. That type must be integer, or an integer based vector type.
3373
3374 **Syntax**::
3375
3376 %vN = srem T V1, V2; <A>
3377
3378 **Record**::
3379
3380 AA: <2, VV1, VV2, 6>
3381
3382 **Semantics**:
3383
3384 The signed integer remainder instruction returns the remainder of the quotient
3385 of its two arguments. Arguments ``V1`` and ``V2``, and the result ``%vN``, must
3386 be of type ``T``. ``T`` must be a integer type, or an integer vector type. ``N``
3387 is defined by the record position, defining the corresponding value generated by
3388 the instruction.
3389
3390 Signed values are assumed. Note that signed and unsigned integer division are
3391 distinct operations. For unsigned integer division use the unsigned integer
3392 remainder instruction (urem).
3393
3394 In the signed integer remainder instruction, integer type ``i1`` (and a vector
3395 of integer type ``i1``) is disallowed. Division by zero is guaranteed to trap.
3396
3397 Note that overflow can happen with this instruction when dividing the maximum
3398 negative integer by ``-1``. The behavior for this case is currently undefined.
3399
3400 **Constraints**::
3401
3402 AA == AbbrevIndex(A) &
3403 VV1 == RelativeIndex(V1) &
3404 VV2 == RelativeIndex(V2) &
3405 T == TypeOf(V1) == TypeOf(V2) &
3406 IsInteger(UnderlyingType(T)) &
3407 UnderlyingType(T) != i1 &
3408 N == NumValuedInsts
3409
3410 **Updates**::
3411
3412 ++NumValuedInsts;
3413 TypeOf(%vN) = T
3414
3415 **Examples**::
3416
3417 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3418 | | // BlockID = 12
3419 104:0| 3: <1, 1> | blocks 1;
3420 | | %b0:
3421 106:4| 3: <2, 2, 1, 6> | %v0 = srem i32 %p0, %p1;
3422 110:4| 3: <2, 1, 2, 6> | %v1 = srem i32 %v0, %p1;
3423 114:4| 3: <10, 1> | ret i32 %v1;
3424 117:0| 0: <65534> | }
3425
3426 Unsigned Integer Remainder Instruction
3427 --------------------------------------
3428
3429 The unsigned integer remainder instruction returns the remainder of the quotient
3430 of its two arguments. Both the arguments and the result must be of the same
3431 type. The type must be integer, or an integer vector type.
3432
3433 **Syntax**::
3434
3435 %vN = urem T V1, V2; <A>
3436
3437 **Record**::
3438
3439 AA: <2, A1, A2, 5>
3440
3441 **Semantics**:
3442
3443 The unsigned integer remainder instruction returns the remainder of the quotient
3444 of its two arguments. Arguments ``V1`` and ``V2``, and the result ``%vN``, must
3445 be of type ``T``. ``T`` must be an integer type, or an integer vector type.
3446 ``N`` is defined by the record position, defining the corresponding value
3447 generated by the instruction.
3448
3449 Unsigned values are assumed. Note that signed and unsigned integer division are
3450 distinct operations. For signed integer division use the remainder instruction
3451 (srem).
3452
3453 In the unsigned integer remainder instruction, integer type ``i1`` (and a vector
3454 of integer type ``i1``) is disallowed. Division by zero is guaranteed to trap.
3455
3456 **Constraints**::
3457
3458 AA == AbbrevIndex(A) &
3459 VV1 == RelativeIndex(V1) &
3460 VV2 == RelativeIndex(V2) &
3461 T == TypeOf(V1) == TypeOf(V2) &
3462 IsInteger(UnderlyingType(T)) &
3463 UnderlyingType(T) != i1 &
3464 N == NumValuedInsts
3465
3466 **Updates**::
3467
3468 ++NumValuedInsts;
3469 TypeOf(%vN) = T
3470
3471 **Examples**::
3472
3473 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3474 | | // BlockID = 12
3475 104:0| 3: <1, 1> | blocks 1;
3476 | | %b0:
3477 106:4| 3: <2, 2, 1, 5> | %v0 = urem i32 %p0, %p1;
3478 110:4| 3: <2, 1, 2, 5> | %v1 = urem i32 %v0, %p1;
3479 114:4| 3: <10, 1> | ret i32 %v1;
3480 117:0| 0: <65534> | }
3481
3482 Shift Left
3483 ----------
3484
3485 The (integer) shift left instruction returns the first operand, shifted to the
3486 left a specified number of bits with zero fill. The shifted value must be
3487 integer, or an integer vector type.
3488
3489 **Syntax**::
3490
3491 %vN = shl T V1, V2; <A>
3492
3493 **Record**::
3494
3495 AA: <2, VV1, VV2, 7>
3496
3497 **Semantics**:
3498
3499 This instruction performs a shift left operation. Arguments ``V1`` and ``V2``
3500 and the result ``%vN`` must be of type ``T``. ``T`` must be an integer, or a
3501 vector of integers. ``N`` is defined by the record position, defining the
3502 corresponding value generated by the instruction.
3503
3504 ``V2`` is assumed to be unsigned. The least significant bits of the result will
3505 be filled with zero bits after the shift. If ``V2`` is (statically or
3506 dynamically) negative or equal to or larger than the number of bits in
3507 ``V1``, the result is undefined. If the arguments are vectors, each vector
3508 element of ``V1`` is shifted by the corresponding shift amount in ``V2``.
3509
3510 In the shift left instruction, integer type ``i1`` (and a vector of integer type
3511 ``i1``) is disallowed.
3512
3513 **Constraints**::
3514
3515 AA == AbbrevIndex(A) &
3516 VV1 == RelativeIndex(V1) &
3517 VV2 == RelativeIndex(V2) &
3518 T == TypeOf(V1) == TypeOf(V2) &
3519 IsInteger(UnderlyingType(T)) &
3520 UnderlyingType(T) != i1 &
3521 N == NumValuedInsts
3522
3523 **Updates**::
3524
3525 ++NumValuedInsts;
3526 TypeOf(%vN) = T
3527
3528 **Examples**::
3529
3530 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3531 | | // BlockID = 12
3532 104:0| 3: <1, 1> | blocks 1;
3533 | | %b0:
3534 106:4| 3: <2, 2, 1, 7> | %v0 = shl i32 %p0, %p1;
3535 110:4| 3: <2, 1, 2, 7> | %v1 = shl i32 %v0, %p1;
3536 114:4| 3: <10, 1> | ret i32 %v1;
3537 117:0| 0: <65534> | }
3538
3539 Logical Shift Right
3540 -------------------
3541
3542 The logical shift right instruction returns the first operand, shifted to the
3543 right a specified number of bits with zero fill.
3544
3545 **Syntax**::
3546
3547 %vN = lshr T V1, V2; <A>
3548
3549 **Record**::
3550
3551 AA: <2, VV1, VV2, 8>
3552
3553 **Semantics**:
3554
3555 This instruction performs a logical shift right operation. Arguments ``V1`` and
3556 ``V2`` and the result ``%vN`` must be of type ``T``. ``T`` must be an integer,
3557 or a vector of integers. ``N`` is defined by the record position, defining the
3558 corresponding value generated by the instruction.
3559
3560 ``V2`` is assumed to be unsigned. The most significant bits of the result will
3561 be filled with zero bits after the shift. If ``V2`` is (statically or
3562 dynamically) negative or equal to or larger than the number of bits in ``V1``,
3563 the result is undefined. If the arguments are vectors, each vector element of
3564 ``V1`` is shifted by the corresponding shift amount in ``V2``.
3565
3566 In the logical shift right instruction, integer type ``i1`` (and a vector of
3567 integer type ``i1``) is disallowed.
3568
3569 **Constraints**::
3570
3571 AA == AbbrevIndex(A) &
3572 VV1 == RelativeIndex(V1) &
3573 VV2 == RelativeIndex(V2) &
3574 T == TypeOf(V1) == TypeOf(V2) &
3575 IsInteger(UnderlyingType(T)) &
3576 UnderlyingType(T) != i1 &
3577 N == NumValuedInsts
3578
3579 **Updates**::
3580
3581 ++NumValuedInsts;
3582 TypeOf(%vN) = T
3583
3584 **Examples**::
3585
3586 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3587 | | // BlockID = 12
3588 104:0| 3: <1, 1> | blocks 1;
3589 | | %b0:
3590 106:4| 3: <2, 2, 1, 8> | %v0 = lshr i32 %p0, %p1;
3591 110:4| 3: <2, 1, 2, 8> | %v1 = lshr i32 %v0, %p1;
3592 114:4| 3: <10, 1> | ret i32 %v1;
3593 117:0| 0: <65534> | }
3594
3595 Arithmetic Shift Right
3596 ----------------------
3597
3598 The arithmetic shift right instruction returns the first operand, shifted to the
3599 right a specified number of bits with sign extension.
3600
3601 **Syntax**::
3602
3603 %vN = ashr T V1, V2; <A>
3604
3605 **Record**::
3606
3607 AA: <2, VV1, VVA2, 9>
3608
3609 **Semantics**:
3610
3611 This instruction performs an arithmetic shift right operation. Arguments ``V1``
3612 and ``V2`` and and the result ``%vN`` must be of type ``T``. ``T`` must be an
3613 integer, or a vector of integers. ``N`` is defined by the record position,
3614 defining the corresponding value generated by the instruction.
3615
3616 ``V2`` is assumed to be unsigned. The most significant bits of the result will
3617 be filled with the sign bit of ``V1``. If ``V2`` is (statically or dynamically)
3618 negative or equal to or larger than the number of bits in ``V1``, the result is
3619 undefined. If the arguments are vectors, each vector element of ``V1`` is
3620 shifted by the corresponding shift amount in ``V2``.
3621
3622 In the arithmetic shift right instruction, integer type ``i1`` (and a vector of
3623 integral type ``i1``) is disallowed.
3624
3625 **Constraints**::
3626
3627 AA == AbbrevIndex(A) &
3628 VV1 == RelativeIndex(V1) &
3629 VV2 == RelativeIndex(V2) &
3630 T == TypeOf(V1) == TypeOf(V2) &
3631 IsInteger(UnderlyingType(T)) &
3632 UnderlyingType(T) != i1 &
3633 N == NumValuedInsts
3634
3635 **Updates**::
3636
3637 ++NumValuedInsts;
3638 TypeOf(%vN) = T
3639
3640 **Examples**::
3641
3642 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3643 | | // BlockID = 12
3644 104:0| 3: <1, 1> | blocks 1;
3645 | | %b0:
3646 106:4| 3: <2, 2, 1, 9> | %v0 = ashr i32 %p0, %p1;
3647 110:4| 3: <2, 1, 2, 9> | %v1 = ashr i32 %v0, %p1;
3648 114:4| 3: <10, 1> | ret i32 %v1;
3649 117:0| 0: <65534> | }
3650
3651 Logical And
3652 -----------
3653
3654 The *and* instruction returns the bitwise logical and of its two operands.
3655
3656 **Syntax**::
3657
3658 %vN = and T V1, V2; <A>
3659
3660 **Record**::
3661
3662 AA: <2, VV1, VV2, 10>
3663
3664 **Semantics**:
3665
3666 This instruction performs a bitwise logical and of its arguments. Arguments
3667 ``V1`` and ``V2``, and the result ``%vN`` must be of type ``T``. ``T`` must be
3668 an integer, or a vector of integers. ``N`` is defined by the record position,
3669 defining the corresponding value generated by the instruction. ``A`` is the
3670 (optional) abbreviation associated with the corresponding record.
3671
3672 The truth table used for the *and* instruction is:
3673
3674 ===== ===== ======
3675 Arg 1 Arg 2 Result
3676 ===== ===== ======
3677 0 0 0
3678 0 1 0
3679 1 0 0
3680 1 1 1
3681 ===== ===== ======
3682
3683 **Constraints**::
3684
3685 AA == AbbrevIndex(A) &
3686 VV1 == RelativeIndex(V1) &
3687 VV2 == RelativeIndex(V2) &
3688 T == TypeOf(V1) == TypeOf(V2) &
3689 IsInteger(UnderlyingType(T))) &
3690 N == NumValuedInsts
3691
3692 **Updates**::
3693
3694 ++NumValuedInsts;
3695 TypeOf(%vN) = T
3696
3697 **Examples**::
3698
3699 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3700 | | // BlockID = 12
3701 104:0| 3: <1, 1> | blocks 1;
3702 | | %b0:
3703 106:4| 3: <2, 2, 1, 10> | %v0 = and i32 %p0, %p1;
3704 110:4| 3: <2, 1, 2, 10> | %v1 = and i32 %v0, %p1;
3705 114:4| 3: <10, 1> | ret i32 %v1;
3706 117:0| 0: <65534> | }
3707
3708 Logical Or
3709 ----------
3710
3711 The *or* instruction returns the bitwise logical inclusive or of its
3712 two operands.
3713
3714 **Syntax**::
3715
3716 %vN = or T V1, V2; <A>
3717
3718 **Record**::
3719
3720 AA: <2, VV1, VV2, 11>
3721
3722 **Semantics**:
3723
3724 This instruction performs a bitwise logical inclusive or of its arguments.
3725 Arguments ``V1`` and ``V2``, and the result ``%vN`` must be of type ``T``. ``T``
3726 must be an integer, or a vector of integers. ``N`` is defined by the record
3727 position, defining the corresponding value generated by the instruction.
3728
3729 The truth table used for the *or* instruction is:
3730
3731 ===== ===== ======
3732 Arg 1 Arg 2 Result
3733 ===== ===== ======
3734 0 0 0
3735 0 1 1
3736 1 0 1
3737 1 1 1
3738 ===== ===== ======
3739
3740 **Constraints**::
3741
3742 AA == AbbrevIndex(A) &
3743 VV1 == RelativeIndex(V1) &
3744 VV2 == RelativeIndex(V2) &
3745 T == TypeOf(V1) == TypeOf(V2) &
3746 IsInteger(UnderlyingType(T))) &
3747 N == NumValuedInsts
3748
3749 **Updates**::
3750
3751 ++NumValuedInsts;
3752 TypeOf(%vN) = T
3753
3754 **Examples**::
3755
3756 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3757 | | // BlockID = 12
3758 104:0| 3: <1, 1> | blocks 1;
3759 | | %b0:
3760 106:4| 3: <2, 2, 1, 11> | %v0 = or i32 %p0, %p1;
3761 110:4| 3: <2, 1, 2, 11> | %v1 = or i32 %v0, %p1;
3762 114:4| 3: <10, 1> | ret i32 %v1;
3763 117:0| 0: <65534> | }
3764
3765 Logical Xor
3766 -----------
3767
3768 The *xor* instruction returns the bitwise logical exclusive or of its
3769 two operands.
3770
3771 **Syntax**::
3772
3773 %vN = xor T V1, V2; <A>
3774
3775 **Record**::
3776
3777 AA: <2, VV1, VV2, 12>
3778
3779 **Semantics**:
3780
3781 This instruction performs a bitwise logical exclusive or of its arguments.
3782 Arguments ``V1`` and ``V2``, and the result ``%vN`` must be of type ``T``. ``T``
3783 must be an integer, or a vector of integers. ``N`` is defined by the record
3784 position, defining the corresponding value generated by the instruction.
3785
3786 The truth table used for the *xor* instruction is:
3787
3788 ===== ===== ======
3789 Arg 1 Arg 2 Result
3790 ===== ===== ======
3791 0 0 0
3792 0 1 1
3793 1 0 1
3794 1 1 0
3795 ===== ===== ======
3796
3797 **Constraints**::
3798
3799 AA == AbbrevIndex(A) &
3800 A1 == RelativeIndex(V1) &
3801 A2 == RelativeIndex(V2) &
3802 T == TypeOf(V1) == TypeOf(V2) &
3803 IsInteger(UnderlyingType(T))) &
3804 N == NumValuedInsts
3805
3806 **Updates**::
3807
3808 ++NumValuedInsts;
3809 TypeOf(%vN) = T
3810
3811 **Examples**::
3812
3813 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
3814 | | // BlockID = 12
3815 104:0| 3: <1, 1> | blocks 1;
3816 | | %b0:
3817 106:4| 3: <2, 2, 1, 12> | %v0 = xor i32 %p0, %p1;
3818 110:4| 3: <2, 1, 2, 12> | %v1 = xor i32 %v0, %p1;
3819 114:4| 3: <10, 1> | ret i32 %v1;
3820 117:0| 0: <65534> | }
3821
3822 .. _link_for_floating_point_binary_instructions:
3823
3824 Floating Point Binary Instructions
3825 ==================================
3826
3827 Floating point binary instructions require two operands of the same type,
3828 execute an operation on them, and produce a value. The value may represent
3829 multiple values if the type is a vector type. The result value always has the
3830 same type as its operands.
3831
3832 Floating Point Add
3833 ------------------
3834
3835 The floating point add instruction returns the sum of its two arguments. Both
3836 arguments and the result must be of the same type. That type must be a floating
3837 point type, or a vector of a floating point type.
3838
3839 **Syntax**::
3840
3841 %vN = fadd T V1, V2; <A>
3842
3843 **Record**::
3844
3845 AA: <2, VV1, VV2, 0>
3846
3847 **Semantics**:
3848
3849 The floating point add instruction returns the sum of its two arguments.
3850 Arguments ``V1`` and ``V2`` and the result ``%vN`` must be of type ``T``. ``T``
3851 must be a floating point type, or a vector of a floating point type. ``N`` is
3852 defined by the record position, defining the corresponding value generated by
3853 the instruction.
3854
3855 **Constraints**::
3856
3857 AA == AbbrevIndex(A) &
3858 VV1 == RelativeIndex(V1) &
3859 VV2 == RelativeIndex(V2) &
3860 T == TypeOf(V1) == TypeOf(V2) &
3861 IsFloat(UnderlyingType(T)) &
3862 N == NumValuedInsts
3863
3864 **Updates**::
3865
3866 ++NumValuedInsts;
3867 TypeOf(%vN) = T
3868
3869 **Examples**::
3870
3871 92:0| 1: <65535, 12, 2> | function
3872 | | float @f0(float %p0, float %p1) {
3873 | | // BlockID = 12
3874 100:0| 3: <1, 1> | blocks 1;
3875 | | %b0:
3876 102:4| 3: <2, 2, 1, 0> | %v0 = fadd float %p0, %p1;
3877 106:4| 3: <2, 3, 1, 0> | %v1 = fadd float %p0, %v0;
3878 110:4| 3: <10, 1> | ret float %v1;
3879 113:0| 0: <65534> | }
3880
3881 Floating Point Subtract
3882 -----------------------
3883
3884 The floating point subtract instruction returns the difference of its two
3885 arguments. Both arguments and the result must be of the same type. That type
3886 must be a floating point type, or a vector of a floating point type.
3887
3888 **Syntax**::
3889
3890 %vN = fsub T V1, V2; <a>
3891
3892 **Record**::
3893
3894 AA: <2, VV1, VV2, 1>
3895
3896 **Semantics**:
3897
3898 The floating point subtract instruction returns the difference of its two
3899 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN`` must be of type
3900 ``T``. ``T`` must be a floating point type, or a vector of a floating point
3901 type. ``N`` is defined by the record position, defining the corresponding value
3902 generated by the instruction.
3903
3904 **Constraints**::
3905
3906 AA == AbbrevIndex(A) &
3907 VV1 == RelativeIndex(V1) &
3908 VV2 == RelativeIndex(V2) &
3909 T == TypeOf(V1) == TypeOf(V2) &
3910 IsFloat(UnderlyingType(T)) &
3911 N == NumValuedInsts
3912
3913 **Updates**::
3914
3915 ++NumValuedInsts;
3916 TypeOf(%vN) = T
3917
3918 **Examples**::
3919
3920 92:0| 1: <65535, 12, 2> | function
3921 | | float @f0(float %p0, float %p1) {
3922 | | // BlockID = 12
3923 100:0| 3: <1, 1> | blocks 1;
3924 | | %b0:
3925 102:4| 3: <2, 2, 1, 1> | %v0 = fsub float %p0, %p1;
3926 106:4| 3: <2, 3, 1, 1> | %v1 = fsub float %p0, %v0;
3927 110:4| 3: <10, 1> | ret float %v1;
3928 113:0| 0: <65534> | }
3929
3930 Floating Point Multiply
3931 -----------------------
3932
3933 The floating point multiply instruction returns the product of its two
3934 arguments. Both arguments and the result must be of the same type. That type
3935 must be a floating point type, or a vector of a floating point type.
3936
3937 **Syntax**::
3938
3939 &vN = fmul T V1, V2; <A>
3940
3941 **Record**::
3942
3943 AA: <2, VV1, VV2, 2>
3944
3945 **Semantics**:
3946
3947 The floating point multiply instruction returns the product of its two
3948 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN`` must be of type
3949 ``T``. ``T`` must be a floating point type, or a vector of a floating point
3950 type. ``N`` is defined by the record position, defining the corresponding value
3951 generated by the instruction.
3952
3953 **Constraints**::
3954
3955 AA == AbbrevIndex(A) &
3956 VV1 == RelativeIndex(V1) &
3957 VV2 == RelativeIndex(V2) &
3958 T == TypeOf(V1) == TypeOf(V2) &
3959 IsFloat(UnderlyingType(T)) &
3960 N == NumValuedInsts
3961
3962 **Updates**::
3963
3964 ++NumValuedInsts;
3965 TypeOf(%vN) = T
3966
3967 **Examples**::
3968
3969 92:0| 1: <65535, 12, 2> | function
3970 | | float @f0(float %p0, float %p1) {
3971 | | // BlockID = 12
3972 100:0| 3: <1, 1> | blocks 1;
3973 | | %b0:
3974 102:4| 3: <2, 2, 1, 2> | %v0 = fmul float %p0, %p1;
3975 106:4| 3: <2, 3, 1, 2> | %v1 = fmul float %p0, %v0;
3976 110:4| 3: <10, 1> | ret float %v1;
3977 113:0| 0: <65534> | }
3978
3979 Floating Point Divide
3980 ---------------------
3981
3982 The floating point divide instruction returns the quotient of its two
3983 arguments. Both arguments and the result must be of the same type. That type
3984 must be a floating point type, or a vector of a floating point type.
3985
3986 **Syntax**::
3987
3988 %vN = fdiv T V1, V2; <A>
3989
3990 **Record**::
3991
3992 AA: <2, V1, V2, 4>
3993
3994 **Semantics**:
3995
3996 The floating point divide instruction returns the quotient of its two
3997 arguments. Arguments ``V1`` and ``V2``, and the result ``%vN`` must be of type
3998 ``T``. ``T`` must be a floating point type, or a vector of a floating point
3999 type. ``N`` is defined by the record position, defining the corresponding value
4000 generated by the instruction.
4001
4002 **Constraints**::
4003
4004 AA == AbbrevIndex(A) &
4005 VV1 == RelativeIndex(V1) &
4006 VV22 == RelativeIndex(V2) &
4007 T == TypeOf(V1) == TypeOf(V2) &
4008 IsFloat(UnderlyingType(T)) &
4009 N == NumValuedInsts
4010
4011 **Updates**::
4012
4013 ++NumValuedInsts;
4014 TypeOf(%vN) = T;
4015
4016 **Examples**::
4017
4018 92:0| 1: <65535, 12, 2> | function
4019 | | double
4020 | | @f0(double %p0, double %p1) {
4021 | | // BlockID = 12
4022 100:0| 3: <1, 1> | blocks 1;
4023 | | %b0:
4024 102:4| 3: <2, 2, 1, 4> | %v0 = fdiv double %p0, %p1;
4025 106:4| 3: <2, 3, 1, 4> | %v1 = fdiv double %p0, %v0;
4026 110:4| 3: <10, 1> | ret double %v1;
4027 113:0| 0: <65534> | }
4028
4029 Floating Point Remainder
4030 ------------------------
4031
4032 The floating point remainder instruction returns the remainder of the quotient
4033 of its two arguments. Both arguments and the result must be of the same
4034 type. That type must be a floating point type, or a vector of a floating point
4035 type.
4036
4037 **Syntax**::
4038
4039 %vN = frem T V1, V2; <A>
4040
4041 **Record**::
4042
4043 AA: <2, VV1, VV2, 6>
4044
4045 **Semantics**:
4046
4047 The floating point remainder instruction returns the remainder of the quotient
4048 of its two arguments. Arguments ``V1`` and ``V2``, and the result ``%vN`` must
4049 be of type ``T``. ``T`` must be a floating point type, or a vector of a floating
4050 point type. ``N`` is defined by the record position, defining the corresponding
4051 value generated by the instruction.
4052
4053 **Constraints**::
4054
4055 AA == AbbrevIndex(A) &
4056 VV1 == RelativeIndex(V1) &
4057 VV2 == RelativeIndex(V2) &
4058 T == TypeOf(V1) == TypeOf(V2) &
4059 IsFloat(UnderlyingType(T)) &
4060 N == NumValuedInsts
4061
4062 **Updates**::
4063
4064 ++NumValuedInsts;
4065 TypeOf(%vN) = T
4066
4067 **Examples**::
4068
4069 92:0| 1: <65535, 12, 2> | function
4070 | | double
4071 | | @f0(double %p0, double %p1) {
4072 | | // BlockID = 12
4073 100:0| 3: <1, 1> | blocks 1;
4074 | | %b0:
4075 102:4| 3: <2, 2, 1, 6> | %v0 = frem double %p0, %p1;
4076 106:4| 3: <2, 3, 1, 6> | %v1 = frem double %p0, %v0;
4077 110:4| 3: <10, 1> | ret double %v1;
4078 113:0| 0: <65534> | }
4079
4080 .. _link_for_memory_creation_and_access_instructions:
4081
4082 Memory Creation and Access Instructions
4083 =======================================
4084
4085 A key design point of SSA-based representation is how it represents
4086 memory. In PNaCl bitcode files, no memory locations are in SSA
4087 form. This makes things very simple.
4088
4089 .. _link_for_alloca_instruction:
4090
4091 Alloca Instruction
4092 ------------------
4093
4094 The *alloca* instruction allocates memory on the stack frame of the
4095 currently executing function. This memory is automatically released
4096 when the function returns to its caller.
4097
4098 **Syntax**::
4099
4100 %vN = alloca i8, i32 S, align V; <A>
4101
4102 **Record**::
4103
4104 AA: <19, SS, VV>
4105
4106 **Semantics**:
4107
4108 The *alloca* instruction allocates memory on the stack frame of the currently
4109 executing function. The resulting value is a pointer to the allocated memory
4110 (i.e. of type i32). ``S`` is the number of bytes that are allocated on the
4111 stack. ``S`` must be of integer type i32. ``V`` is the alignment of the
4112 generated stack address.
4113
4114 Alignment must be a power of 2. See :ref:`memory blocks and
4115 alignment<link_for_memory_blocks_and_alignment_section>` for a more detailed
4116 discussion on how to define alignment.
4117
4118 **Constraints**::
4119
4120 AA == AbbrevIndex(A) &
4121 VV == Log2(V+1) &
4122 SS == RelativeIndex(S) &
4123 i32 == TypeOf(S) &
4124 N == NumValuedInsts
4125
4126 **Updates**::
4127
4128 ++NumValuedInsts;
4129 TypeOf(%vN) = i32;
4130
4131 **Examples**::
4132
4133 112:0| 1: <65535, 12, 2> | function void @f1() {
4134 | | // BlockID = 12
4135 120:0| 3: <1, 1> | blocks 1;
4136 122:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4137 132:0| 3: <1, 0> | i32:
4138 134:4| 3: <4, 4> | %c0 = i32 2;
4139 137:0| 3: <4, 8> | %c1 = i32 4;
4140 139:4| 3: <4, 16> | %c2 = i32 8;
4141 142:0| 0: <65534> | }
4142 | | %b0:
4143 144:0| 3: <19, 3, 1> | %v0 = alloca i8, i32 %c0, align 1;
4144 147:2| 3: <19, 3, 3> | %v1 = alloca i8, i32 %c1, align 4;
4145 150:4| 3: <19, 3, 4> | %v2 = alloca i8, i32 %c2, align 8;
4146 153:6| 3: <10> | ret void;
4147 155:4| 0: <65534> | }
4148
4149 Load Instruction
4150 ----------------
4151
4152 The *load* instruction is used to read from memory.
4153
4154 **Syntax**::
4155
4156 %vN = load T* P, align V; <A>
4157
4158 **Record**::
4159
4160 AA: <20, PP, VV, TT>
4161
4162 **Semantics**:
4163
4164 The load instruction is used to read from memory. ``P`` is the identifier of the
4165 memory address to read. The type of ``P`` must be an ``i32``. ``T`` is the type
4166 of value to read. ``V`` is the alignment of the memory address.
4167
4168 Type ``T`` must be a vector, integer, or floating point type. Both ``float`` and
4169 ``double`` types are allowed for floating point types. All integer types except
4170 i1 are allowed.
4171
4172 Alignment must be a power of 2. See :ref:`memory blocks and
4173 alignment<link_for_memory_blocks_and_alignment_section>` for a more detailed
4174 discussion on how to define alignment.
4175
4176 **Constraints**::
4177
4178 AA == AbbrevIndex(A) &
4179 i32 == TypeOf(P) &
4180 PP == RelativeIndex(P) &
4181 VV == Log2(V+1) &
4182 %tTT == TypeID(T) &
4183 N == NumValuedInsts
4184
4185 **Updates**::
4186
4187 ++NumValuedInsts;
4188 TypeOf(%vN) = T;
4189
4190 **Examples**::
4191
4192 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4193 48:0| 3: <1, 4> | count 4;
4194 50:4| 3: <7, 32> | @t0 = i32;
4195 53:6| 3: <2> | @t1 = void;
4196 55:4| 3: <4> | @t2 = double;
4197 57:2| 3: <21, 0, 1, 0> | @t3 = void (i32);
4198 61:2| 0: <65534> | }
4199 ...
4200 96:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
4201 | | // BlockID = 12
4202 104:0| 3: <1, 1> | blocks 1;
4203 | | %b0:
4204 106:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, align 1;
4205 110:4| 3: <20, 1, 4, 2> | %v1 = load double* %v0, align 8;
4206 114:4| 3: <10> | ret void;
4207 116:2| 0: <65534> | }
4208
4209 Store Instruction
4210 -----------------
4211
4212 The *store* instruction is used to write to memory.
4213
4214 **Syntax**::
4215
4216 store T S, T* P, align V; <A>
4217
4218 **Record**::
4219
4220 AA: <24, PP, SS, VV>
4221
4222 **Semantics**:
4223
4224 The store instruction is used to write to memory. ``P`` is the identifier of the
4225 memory address to write to. The type of ``P`` must be an i32 integer. ``T`` is
4226 the type of value to store. ``S`` is the value to store, and must be of type
4227 ``T``. ``V`` is the alignment of the memory address. ``A`` is the (optional)
4228 abbreviation index associated with the record.
4229
4230 Type ``T`` must be an integer or floating point type. Both ``float`` and
4231 ``double`` types are allowed for floating point types. All integer types except
4232 i1 are allowed.
4233
4234 Alignment must be a power of 2. See :ref:`memory blocks and
4235 alignment<link_for_memory_Blocks_and_alignment_section>` for a more detailed
4236 discussion on how to define alignment.
4237
4238 **Constraints**::
4239
4240 AA == AbbrevIndex(A) &
4241 i32 == TypeOf(P) &
4242 PP == RelativeIndex(P) &
4243 VV == Log2(V+1)
4244
4245 **Examples**::
4246
4247 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4248 48:0| 3: <1, 4> | count 4;
4249 50:4| 3: <7, 32> | @t0 = i32;
4250 53:6| 3: <2> | @t1 = void;
4251 55:4| 3: <4> | @t2 = double;
4252 57:2| 3: <21, 0, 1, 0, 0, 0, 2>| @t3 = void (i32, i32, i32, double);
4253 63:4| 0: <65534> | }
4254 ...
4255 96:0| 1: <65535, 12, 2> | function
4256 | | void
4257 | | @f0(i32 %p0, i32 %p1, i32 %p2,
4258 | | double %p3) {
4259 | | // BlockID = 12
4260 104:0| 3: <1, 1> | blocks 1;
4261 | | %b0:
4262 106:4| 3: <24, 4, 3, 1> | store i32 %p1, i32* %p0, align 1;
4263 110:4| 3: <24, 2, 1, 4> | store double %p3, double* %p2,
4264 | | align 8;
4265 114:4| 3: <10> | ret void;
4266 116:2| 0: <65534> | }
4267
4268 .. _link_for_conversion_instructions:
4269
4270 Conversion Instructions
4271 =======================
4272
4273 Conversion instructions all take a single operand and a type. The value is
4274 converted to the corresponding type.
4275
4276 Integer Truncating Instruction
4277 ------------------------------
4278
4279 The integer truncating instruction takes a value to truncate, and a type
4280 defining the truncated type. Both types must be integer types, or integer
4281 vectors with the same number of elements. The bit size of the value must be
4282 larger than the bit size of the destination type. Equal sized types are not
4283 allowed.
4284
4285 **Syntax**::
4286
4287 %vN = trunc T1 V to T2; <A>
4288
4289 **Record**::
4290
4291 AA: <3, VV, TT2, 0>
4292
4293 **Semantics**:
4294
4295 The integer truncating instruction takes a value ``V``, and truncates to type
4296 ``T2``. Both ``T1`` and ``T2`` must be integer types, or integer vectors with
4297 the same number of elements. ``T1`` has to be wider than ``T2``. If the value
4298 doesn't fit in in ``T2``, then the higher order bits are dropped.
4299
4300 **Constraints**::
4301
4302 AA == AbbrevIndex(A) &
4303 TypeOf(V) == T1 &
4304 VV == RelativeIndex(V) &
4305 %tTT2 == TypeID(T2) &
4306 BitSizeOf(UnderlyingType(T1)) > BitSizeOf(UnderlyingType(T2)) &
4307 UnderlyingCount(T1) == UnderlyingCount(T2) &
4308 IsInteger(UnderlyingType(T1)) &
4309 IsInteger(UnderlyingType(T2)) &
4310 N == NumValuedInsts
4311
4312 **Updates**::
4313
4314 ++NumValuedInsts;
4315 TypeOf(%vN) = T2;
4316
4317 **Examples**::
4318
4319 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4320 48:0| 3: <1, 5> | count 5;
4321 50:4| 3: <7, 32> | @t0 = i32;
4322 53:6| 3: <2> | @t1 = void;
4323 55:4| 3: <7, 16> | @t2 = i16;
4324 58:0| 3: <21, 0, 1, 0> | @t3 = void (i32);
4325 62:0| 3: <7, 8> | @t4 = i8;
4326 64:4| 0: <65534> | }
4327 ...
4328 100:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
4329 | | // BlockID = 12
4330 108:0| 3: <1, 1> | blocks 1;
4331 | | %b0:
4332 110:4| 3: <3, 1, 2, 0> | %v0 = trunc i32 %p0 to i16;
4333 114:4| 3: <3, 1, 4, 0> | %v1 = trunc i16 %v0 to i8;
4334 118:4| 3: <10> | ret void;
4335 120:2| 0: <65534> | }
4336
4337 Floating Point Truncating Instruction
4338 --------------------------------------
4339
4340 The floating point truncating instruction takes a value to truncate, and a type
4341 defining the truncated type. Both types must be floating point types, or
4342 floating point vectors with the same number of elements. The source must be
4343 ``double`` while the destination is ``float``. If the source is a vector, the
4344 destination must also be vector with the same size as the source.
4345
4346 **Syntax**::
4347
4348 %vN = fptrunc T1 V to T2; <A>
4349
4350 **Record**::
4351
4352 AA: <3, VV, TT2, 7>
4353
4354 **Semantics**
4355
4356 The floating point truncating instruction takes a value ``V``, and truncates to
4357 type ``T2``. Both ``T1`` and ``T2`` must be floating point types, or floating
4358 point vectors with the same number of elements. ``T1`` must be defined on
4359 ``double`` while ``T2`` is defined on ``float``. If the value can't fit within
4360 the destination type ``T2``, the results are undefined.
4361
4362 **Constraints**::
4363
4364 TypeOf(V) == T1 &
4365 double == UnderlyingType(T1) &
4366 float == UnderlyingType(T2) &
4367 VV == RelativeIndex(V) &
4368 %tTT2 == TypeID(T2) &
4369 BitSizeOf(UnderlyingType(T1)) > BitSizeOf(UnderlyingType(T2)) &
4370 UnderlyingCount(T1) == UnderlyingCount(T2) &
4371 IsFloat(UnderlyingType(T1)) &
4372 IsFloat(UnderlyingType(T2)) &
4373 N == NumValuedInsts
4374
4375 **Updates**::
4376
4377 ++NumValuedInsts;
4378 TypeOf(%vN) = T2;
4379
4380 **Examples**::
4381
4382 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4383 48:0| 3: <1, 4> | count 4;
4384 50:4| 3: <3> | @t0 = float;
4385 52:2| 3: <4> | @t1 = double;
4386 54:0| 3: <21, 0, 0, 1> | @t2 = float (double);
4387 58:0| 3: <2> | @t3 = void;
4388 59:6| 0: <65534> | }
4389 ...
4390 92:0| 1: <65535, 12, 2> | function float @f0(double %p0) {
4391 | | // BlockID = 12
4392 100:0| 3: <1, 1> | blocks 1;
4393 | | %b0:
4394 102:4| 3: <3, 1, 0, 7> | %v0 = fptrunc double %p0 to float;
4395 106:4| 3: <10, 1> | ret float %v0;
4396 109:0| 0: <65534> | }
4397
4398
4399 Zero Extending Instruction
4400 --------------------------
4401
4402 The zero extending instruction takes a value to extend, and a type to extend it
4403 to. Both types must be integer types, or integer vectors with the same number
4404 of elements. The bit size of the source type must be smaller than the bit size
4405 of the destination type. Equal sized types are not allowed.
4406
4407 **Syntax**::
4408
4409 %vN = zext T1 V to T2; <A>
4410
4411 **Record**::
4412
4413 AA: <3, VV, TT2, 1>
4414
4415
4416 **Semantics**:
4417
4418 The zero extending instruction takes a value ``V``, and expands it to type
4419 ``T2``. Both ``T1`` and ``T2`` must be integer types, or integer vectors with
4420 the same number of elements. ``T2`` must be wider than ``T1``.
4421
4422 The instruction fills the high order bits of the value with zero bits until it
4423 reaches the size of the destination type. When zero extending from i1, the
4424 result will always be either 0 or 1.
4425
4426 **Constraints**::
4427
4428 AA == AbbrevIndex(A) &
4429 TypeOf(V) == T1 &
4430 VV == RelativeIndex(V) &
4431 %tTT2 == TypeID(T2) &
4432 BitSizeOf(UnderlyingType(T1)) < BitSizeOf(UnderlyingType(T2)) &
4433 UnderlyingCount(T1) == UnderlyingCount(T2) &
4434 IsInteger(UnderlyingType(T1)) &
4435 IsInteger(UnderlyingType(T2)) &
4436 N == NumValuedInsts
4437
4438 **Updates**::
4439
4440 ++NumValuedInsts;
4441 TypeOf(%vN) = T2;
4442
4443 **Examples**::
4444
4445 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4446 48:0| 3: <1, 5> | count 5;
4447 50:4| 3: <7, 64> | @t0 = i64;
4448 53:6| 3: <7, 32> | @t1 = i32;
4449 57:0| 3: <21, 0, 0> | @t2 = i64 ();
4450 60:2| 3: <7, 8> | @t3 = i8;
4451 62:6| 3: <2> | @t4 = void;
4452 64:4| 0: <65534> | }
4453 ...
4454 100:0| 1: <65535, 12, 2> | function i64 @f0() { // BlockID = 12
4455 108:0| 3: <1, 1> | blocks 1;
4456 110:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4457 120:0| 3: <1, 3> | i8:
4458 122:4| 3: <4, 2> | %c0 = i8 1;
4459 125:0| 0: <65534> | }
4460 | | %b0:
4461 128:0| 3: <3, 1, 1, 1> | %v0 = zext i8 %c0 to i32;
4462 132:0| 3: <3, 1, 0, 1> | %v1 = zext i32 %v0 to i64;
4463 136:0| 3: <10, 1> | ret i64 %v1;
4464 138:4| 0: <65534> | }
4465
4466 Sign Extending Instruction
4467 --------------------------
4468
4469 The sign extending instruction takes a value to cast, and a type to extend it
4470 to. Both types must be integer types, or integral vectors with the same number
4471 of elements. The bit size of the source type must be smaller than the bit size
4472 of the destination type. Equal sized types are not allowed.
4473
4474 **Syntax**::
4475
4476 %vN = sext T1 V to T2; <A>
4477
4478 **Record**::
4479
4480 AA: <3, VV, TT2, 2>
4481
4482 **Semantics**:
4483
4484 The sign extending instruction takes a value ``V``, and expands it to type
4485 ``T2``. Both ``T1`` and ``T2`` must be integer types, or integer vectors with
4486 the same number of integers. ``T2`` has to be wider than ``T1``.
4487
4488 When sign extending, the instruction fills the high order bits of the value with
4489 the (current) high order bit of the value. When sign extending from i1, the
4490 extension always results in -1 or 0.
4491
4492 **Constraints**::
4493
4494 AA == AbbrevIndex(A) &
4495 TypeOf(V) == T1 &
4496 VV == RelativeIndex(V) &
4497 %tTT2 == TypeID(T2) &
4498 BitSizeOf(UnderlyingType(T1)) < BitSizeOf(UnderlyingType(T2)) &
4499 UnderlyingCount(T1) == UnderlyingCount(T2) &
4500 IsInteger(UnderlyingType(T1)) &
4501 IsInteger(UnderlyingType(T2)) &
4502 N == NumValuedInsts
4503
4504 **Updates**::
4505
4506 ++NumValuedInsts;
4507 TypeOf(%vN) = T2;
4508
4509 **Examples**::
4510
4511 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4512 48:0| 3: <1, 5> | count 5;
4513 50:4| 3: <7, 64> | @t0 = i64;
4514 53:6| 3: <7, 32> | @t1 = i32;
4515 57:0| 3: <21, 0, 0> | @t2 = i64 ();
4516 60:2| 3: <7, 8> | @t3 = i8;
4517 62:6| 3: <2> | @t4 = void;
4518 64:4| 0: <65534> | }
4519 ...
4520 100:0| 1: <65535, 12, 2> | function i64 @f0() { // BlockID = 12
4521 108:0| 3: <1, 1> | blocks 1;
4522 110:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4523 120:0| 3: <1, 3> | i8:
4524 122:4| 3: <4, 3> | %c0 = i8 -1;
4525 125:0| 0: <65534> | }
4526 | | %b0:
4527 128:0| 3: <3, 1, 1, 2> | %v0 = sext i8 %c0 to i32;
4528 132:0| 3: <3, 1, 0, 2> | %v1 = sext i32 %v0 to i64;
4529 136:0| 3: <10, 1> | ret i64 %v1;
4530 138:4| 0: <65534> | }
4531
4532 Floating Point Extending Instruction
4533 ------------------------------------
4534
4535 The floating point extending instruction takes a value to extend, and a type to
4536 extend it to. Both types must either be floating point types, or vectors of
4537 floating point types with the same number of elements. The source value must be
4538 ``float`` while the destination is ``double``. If the source is a vector, the
4539 destination must also be vector with the same size as the source.
4540
4541 **Syntax**::
4542
4543 %vN = fpext T1 V to T2; <A>
4544
4545 **Record**::
4546
4547 AA: <3, VV, TT2, 8>
4548
4549 **Semantics**:
4550
4551 The floating point extending instruction converts floating point values.
4552 ``V`` is the value to extend, and ``T2`` is the type to extend it
4553 to. Both ``T1`` and ``T2`` must be floating point types, or floating point
4554 vector types with the same number of floating point values. ``T1`` contains
4555 ``float`` while ``T2`` contains ``double``.
4556
4557 **Constraints**::
4558
4559 AA == AbbrevIndex(A) &
4560 TypeOf(V) == T1 &
4561 VV == RelativeIndex(V) &
4562 %tTT2 == TypeID(T2) &
4563 BitSizeOf(UnderlyingType(T1)) < BitSizeOf(UnderlyingType(T2)) &
4564 UnderlyingCount(T1) == UnderlyingCount(T2) &
4565 IsFloat(UnderlyingType(T1)) &
4566 IsFloat(UnderlyingType(T2)) &
4567 N == NumValuedInsts
4568
4569 **Updates**::
4570
4571 ++NumValuedInsts;
4572 TypeOf(%vN) = T2;
4573
4574 **Examples**::
4575
4576 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4577 48:0| 3: <1, 4> | count 4;
4578 50:4| 3: <4> | @t0 = double;
4579 52:2| 3: <3> | @t1 = float;
4580 54:0| 3: <21, 0, 0, 1> | @t2 = double (float);
4581 58:0| 3: <2> | @t3 = void;
4582 59:6| 0: <65534> | }
4583 ...
4584 92:0| 1: <65535, 12, 2> | function double @f0(float %p0) {
4585 | | // BlockID = 12
4586 100:0| 3: <1, 1> | blocks 1;
4587 | | %b0:
4588 102:4| 3: <3, 1, 0, 8> | %v0 = fpext float %p0 to double;
4589 106:4| 3: <10, 1> | ret double %v0;
4590 109:0| 0: <65534> | }
4591
4592 Floating Point to Unsigned Integer Instruction
4593 ----------------------------------------------
4594
4595 The floating point to unsigned integer instruction converts floating point
4596 values to unsigned integers.
4597
4598 **Syntax**::
4599
4600 %vN = fptoui T1 V to T2; <A>
4601
4602 **Record**::
4603
4604 AA: <3, VV, TT2, 3>
4605
4606 **Semantics**:
4607
4608 The floating point to unsigned integer instruction converts floating point
4609 value(s) in ``V`` to its unsigned integer equivalent of type ``T2``. ``T1`` must
4610 be a floating point type, or a floating point vector type. ``T2`` must be an
4611 integer type, or an integer vector type. If either type is a vector type, they
4612 both must have the same number of elements.
4613
4614 **Constraints**::
4615
4616 AA == AbbrevIndex(A) &
4617 TypeOf(V) == T1 &
4618 VV == RelativeIndex(V) &
4619 %tTT2 == TypeID(T2) &
4620 UnderlyingCount(T1) == UnderlyingCount(T2) &
4621 IsFloat(UnderlyingType(T1)) &
4622 IsInteger(UnderlyingType(T2)) &
4623 N == NumValuedInsts
4624
4625 **Updates**::
4626
4627 ++NumValuedInsts;
4628 TypeOf(%vN) = T2;
4629
4630 **Examples**::
4631
4632 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4633 48:0| 3: <1, 6> | count 6;
4634 50:4| 3: <3> | @t0 = float;
4635 52:2| 3: <4> | @t1 = double;
4636 54:0| 3: <2> | @t2 = void;
4637 55:6| 3: <21, 0, 2, 0, 1> | @t3 = void (float, double);
4638 60:4| 3: <7, 32> | @t4 = i32;
4639 63:6| 3: <7, 16> | @t5 = i16;
4640 66:2| 0: <65534> | }
4641 ...
4642 100:0| 1: <65535, 12, 2> | function
4643 | | void @f0(float %p0, double %p1) {
4644 | | // BlockID = 12
4645 108:0| 3: <1, 1> | blocks 1;
4646 | | %b0:
4647 110:4| 3: <3, 2, 4, 3> | %v0 = fptoui float %p0 to i32;
4648 114:4| 3: <3, 2, 5, 3> | %v1 = fptoui double %p1 to i16;
4649 118:4| 3: <10> | ret void;
4650 120:2| 0: <65534> | }
4651
4652 Floating Point to Signed Integer Instruction
4653 --------------------------------------------
4654
4655 The floating point to signed integer instruction converts floating point
4656 values to signed integers.
4657
4658 **Syntax**::
4659
4660 %vN = fptosi T1 V to T2; <A>
4661
4662 **Record**::
4663
4664 AA: <3, VV, TT2, 4>
4665
4666 **Semantics**:
4667
4668 The floating point to signed integer instruction converts floating point
4669 value(s) in ``V`` to its signed integer equivalent of type ``T2``. ``T1`` must
4670 be a floating point type, or a floating point vector type. ``T2`` must be an
4671 integer type, or an integer vector type. If either type is a vector type, they
4672 both must have the same number of elements.
4673
4674 **Constraints**::
4675
4676 AA == AbbrevIndex(A) &
4677 TypeOf(V) == T1 &
4678 VV == RelativeIndex(V) &
4679 %tTT2 = TypeID(T2) &
4680 UnderlyingCount(T1) = UnderlyingCount(T2) &
4681 IsFloat(UnderlyingType(T1)) &
4682 IsInteger(UnderlyingType(T2)) &
4683 N = NumValuedInsts
4684
4685 **Updates**::
4686
4687 ++NumValuedInsts;
4688 TypeOf(%vN) = T2;
4689
4690 **Examples**::
4691
4692 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4693 48:0| 3: <1, 6> | count 6;
4694 50:4| 3: <3> | @t0 = float;
4695 52:2| 3: <4> | @t1 = double;
4696 54:0| 3: <2> | @t2 = void;
4697 55:6| 3: <21, 0, 2, 0, 1> | @t3 = void (float, double);
4698 60:4| 3: <7, 8> | @t4 = i8;
4699 63:0| 3: <7, 16> | @t5 = i16;
4700 65:4| 0: <65534> | }
4701 ...
4702 100:0| 1: <65535, 12, 2> | function
4703 | | void @f0(float %p0, double %p1) {
4704 | | // BlockID = 12
4705 108:0| 3: <1, 1> | blocks 1;
4706 | | %b0:
4707 110:4| 3: <3, 2, 4, 4> | %v0 = fptosi float %p0 to i8;
4708 114:4| 3: <3, 2, 5, 4> | %v1 = fptosi double %p1 to i16;
4709 118:4| 3: <10> | ret void;
4710 120:2| 0: <65534> | }
4711
4712 Unsigned Integer to Floating Point Instruction
4713 ----------------------------------------------
4714
4715 The unsigned integer to floating point instruction converts unsigned integers to
4716 floating point values.
4717
4718 **Syntax**::
4719
4720 %vN = uitofp T1 V to T2; <A>
4721
4722 **Record**::
4723
4724 AA: <3, VV, TT2, 5>
4725
4726 **Semantics**:
4727
4728 The unsigned integer to floating point instruction converts unsigned integer(s)
4729 to its floating point equivalent of type ``T2``. ``T1`` must be an integer type,
4730 or a integer vector type. ``T2`` must be a floating point type, or a floating
4731 point vector type. If either type is a vector type, they both must have the same
4732 number of elements.
4733
4734 **Constraints**::
4735
4736 AA == AbbrevIndex(A) &
4737 TypeOf(V) == T1 &
4738 VV == RelativeIndex(V) &
4739 %tTT2 = TypeID(T2) &
4740 UnderlyingCount(T1) == UnderlyingCount(T2) &
4741 IsInteger(UnderlyingType(T1)) &
4742 IsFloat(UnderlyingType(T2)) &
4743 N == NumValuedInsts
4744
4745 **Updates**::
4746
4747 ++NumValuedInsts;
4748 TypeOf(%vN) == T2;
4749
4750 **Examples**::
4751
4752 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4753 48:0| 3: <1, 7> | count 7;
4754 50:4| 3: <7, 32> | @t0 = i32;
4755 53:6| 3: <7, 64> | @t1 = i64;
4756 57:0| 3: <2> | @t2 = void;
4757 58:6| 3: <3> | @t3 = float;
4758 60:4| 3: <21, 0, 2, 0, 1> | @t4 = void (i32, i64);
4759 65:2| 3: <7, 1> | @t5 = i1;
4760 67:6| 3: <4> | @t6 = double;
4761 69:4| 0: <65534> | }
4762 ...
4763 104:0| 1: <65535, 12, 2> | function void @f0(i32 %p0, i64 %p1) {
4764 | | // BlockID = 12
4765 112:0| 3: <1, 1> | blocks 1;
4766 114:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4767 124:0| 3: <1, 5> | i1:
4768 126:4| 3: <4, 3> | %c0 = i1 1;
4769 129:0| 0: <65534> | }
4770 | | %b0:
4771 132:0| 3: <3, 1, 6, 5> | %v0 = uitofp i1 %c0 to double;
4772 136:0| 3: <3, 4, 3, 5> | %v1 = uitofp i32 %p0 to float;
4773 140:0| 3: <3, 4, 3, 5> | %v2 = uitofp i64 %p1 to float;
4774 144:0| 3: <10> | ret void;
4775 145:6| 0: <65534> | }
4776
4777 Signed Integer to Floating Point Instruction
4778 --------------------------------------------
4779
4780 The signed integer to floating point instruction converts signed integers to
4781 floating point values.
4782
4783 **Syntax**::
4784
4785 %vN = sitofp T1 V to T2; <A>
4786
4787 **Record**::
4788
4789 AA: <3, VV, TT2, 6>
4790
4791 **Semantics**:
4792
4793 The signed integer to floating point instruction converts signed integer(s) to
4794 its floating point equivalent of type ``T2``. ``T1`` must be an integer type, or
4795 a integer vector type. ``T2`` must be a floating point type, or a floating point
4796 vector type. If either type is a vector type, they both must have the same
4797 number of elements.
4798
4799 **Constraints**::
4800
4801 AA == AbbrevIndex(A) &
4802 TypeOf(V) == T1 &
4803 VV == RelativeIndex(V) &
4804 %tTT2 = TypeID(T2) &
4805 UnderlyingCount(T1) == UnderlyingCount(T2) &
4806 IsInteger(UnderlyingType(T1)) &
4807 IsFloat(UnderlyingType(T2)) &
4808 N == NumValuedInsts
4809
4810 **Updates**::
4811
4812 ++NumValuedInsts;
4813 TypeOf(%vN) = T2;
4814
4815 **Examples**::
4816
4817 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4818 48:0| 3: <1, 7> | count 7;
4819 50:4| 3: <7, 32> | @t0 = i32;
4820 53:6| 3: <7, 64> | @t1 = i64;
4821 57:0| 3: <2> | @t2 = void;
4822 58:6| 3: <3> | @t3 = float;
4823 60:4| 3: <21, 0, 2, 0, 1> | @t4 = void (i32, i64);
4824 65:2| 3: <7, 8> | @t5 = i8;
4825 67:6| 3: <4> | @t6 = double;
4826 69:4| 0: <65534> | }
4827 ...
4828 104:0| 1: <65535, 12, 2> | function void @f0(i32 %p0, i64 %p1) {
4829 | | // BlockID = 12
4830 112:0| 3: <1, 1> | blocks 1;
4831 114:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4832 124:0| 3: <1, 5> | i8:
4833 126:4| 3: <4, 3> | %c0 = i8 -1;
4834 129:0| 0: <65534> | }
4835 | | %b0:
4836 132:0| 3: <3, 1, 6, 6> | %v0 = sitofp i8 %c0 to double;
4837 136:0| 3: <3, 4, 3, 6> | %v1 = sitofp i32 %p0 to float;
4838 140:0| 3: <3, 4, 3, 6> | %v2 = sitofp i64 %p1 to float;
4839 144:0| 3: <10> | ret void;
4840 145:6| 0: <65534> | }
4841
4842 Bitcast Instruction
4843 -------------------
4844
4845 The bitcast instruction converts the type of the value without changing the bit
4846 contents of the value. The bit size of the type of the value must be the same as
4847 the bit size of the cast type.
4848
4849 **Syntax**::
4850
4851 %vN = bitcast T1 V to T2; <A>
4852
4853 **Record**::
4854
4855 AA: <3, VV, TT2, 11>
4856
4857 **Semantics**:
4858
4859 The bitcast instruction converts the type of value ``V`` to type ``T2``. ``T1``
4860 and ``T2`` must be primitive types or vectors, and define the same number of
4861 bits.
4862
4863 **Constraints**::
4864
4865 AA == AbbrevIndex(A) &
4866 TypeOf(V) == T1 &
4867 VV = RelativeIndex(V) &
4868 %tTT2 = TypeID(T2) &
4869 BitSizeOf(T1) == BitSizeOf(T2) &
4870 N == NumValuedInsts
4871
4872 **Updates**::
4873
4874 ++NumValuedInsts;
4875 TypeOf(%vN) = T2;
4876
4877 **Examples**::
4878
4879 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4880 48:0| 3: <1, 6> | count 6;
4881 50:4| 3: <3> | @t0 = float;
4882 52:2| 3: <7, 64> | @t1 = i64;
4883 55:4| 3: <2> | @t2 = void;
4884 57:2| 3: <21, 0, 2, 0, 1> | @t3 = void (float, i64);
4885 62:0| 3: <7, 32> | @t4 = i32;
4886 65:2| 3: <4> | @t5 = double;
4887 67:0| 0: <65534> | }
4888 ...
4889 100:0| 1: <65535, 12, 2> | function void @f0(float %p0, i64 %p1)
4890 | | { // BlockID = 12
4891 108:0| 3: <1, 1> | blocks 1;
4892 | | %b0:
4893 110:4| 3: <3, 2, 4, 11> | %v0 = bitcast float %p0 to i32;
4894 114:4| 3: <3, 2, 5, 11> | %v1 = bitcast i64 %p1 to double;
4895 118:4| 3: <10> | ret void;
4896 120:2| 0: <65534> | }
4897
4898 .. _link_for_compare_instructions:
4899
4900 Comparison Instructions
4901 =======================
4902
4903 The comparison instructions compare values and generates a boolean (i1) result
4904 for each pair of compared values. There are different comparison operations for
4905 integer and floating point values.
4906
4907
4908 Integer Comparison Instructions
4909 -------------------------------
4910
4911 The integer comparison instruction compares integer values and returns a
4912 boolean (i1) result for each pair of compared values.
4913
4914 **Syntax**::
4915
4916 %vN = icmp C T V1, V2; <A>
4917
4918 **Record**::
4919
4920 AA: <9, VV1, VV2, CC>
4921
4922 **Semantics**:
4923
4924 The integer comparison instruction compares integer values and returns a boolean
4925 (i1) result for each pair of compared values in ``V1`` and ``V2``. ``V1`` and
4926 ``V2`` must be of type ``T``. ``T`` must be an integer type, or an integer
4927 vector type. Condition code ``C`` is the condition applied to all elements in
4928 ``V1`` and ``V2``. Each comparison always yields an i1. If ``T`` is a primitive
4929 type, the resulting type is i1. If ``T`` is a vector, then the resulting type is
4930 a vector of i1 with the same size as ``T``.
4931
4932 Legal test conditions are:
4933
4934 === == ==============================
4935 C CC Operator
4936 === == ==============================
4937 eq 32 equal
4938 ne 33 not equal
4939 ugt 34 unsigned greater than
4940 uge 35 unsigned greater than or equal
4941 ult 36 unsigned less than
4942 ule 37 unsigned less than or equal
4943 sgt 38 signed greater than
4944 sge 39 signed greater than or equal
4945 slt 40 signed less than
4946 sle 41 signed less than or equal
4947 === == ==============================
4948
4949 **Constraints**::
4950
4951 AA == AbbrevIndex(A) &
4952 IsInteger(UnderlyingType(T) &
4953 T == TypeOf(V1) == TypeOf(V2) &
4954 N == NumValuedInsts
4955
4956 **Updates**::
4957
4958 ++NumValuedInsts;
4959 if IsVector(T) then
4960 TypeOf(%vN) = <UnderlyingCount(T), i1>
4961 else
4962 TypeOf(%vN) = i1
4963 endif
4964
4965 **Examples**::
4966
4967 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
4968 48:0| 3: <1, 4> | count 4;
4969 50:4| 3: <7, 32> | @t0 = i32;
4970 53:6| 3: <7, 1> | @t1 = i1;
4971 56:2| 3: <2> | @t2 = void;
4972 58:0| 3: <21, 0, 2> | @t3 = void ();
4973 61:2| 0: <65534> | }
4974 ...
4975 108:0| 1: <65535, 12, 2> | function void @f0() {
4976 | | // BlockID = 12
4977 116:0| 3: <1, 1> | blocks 1;
4978 118:4| 1: <65535, 11, 2> | constants { // BlockID = 11
4979 128:0| 3: <1, 0> | i32:
4980 130:4| 3: <4, 0> | %c0 = i32 0;
4981 133:0| 3: <4, 2> | %c1 = i32 1;
4982 135:4| 0: <65534> | }
4983 | | %b0:
4984 136:0| 3: <28, 2, 1, 32> | %v0 = icmp eq i32 %c0, %c1;
4985 140:6| 3: <28, 3, 2, 33> | %v1 = icmp ne i32 %c0, %c1;
4986 145:4| 3: <28, 4, 3, 34> | %v2 = icmp ugt i32 %c0, %c1;
4987 150:2| 3: <28, 5, 4, 36> | %v3 = icmp ult i32 %c0, %c1;
4988 155:0| 3: <28, 6, 5, 37> | %v4 = icmp ule i32 %c0, %c1;
4989 159:6| 3: <28, 7, 6, 38> | %v5 = icmp sgt i32 %c0, %c1;
4990 164:4| 3: <28, 8, 7, 38> | %v6 = icmp sgt i32 %c0, %c1;
4991 169:2| 3: <28, 9, 8, 39> | %v7 = icmp sge i32 %c0, %c1;
4992 174:0| 3: <28, 10, 9, 40> | %v8 = icmp slt i32 %c0, %c1;
4993 178:6| 3: <28, 11, 10, 41> | %v9 = icmp sle i32 %c0, %c1;
4994 183:4| 3: <10> | ret void;
4995 185:2| 0: <65534> | }
4996
4997
4998 Floating Point Comparison Instructions
4999 --------------------------------------
5000
5001 The floating point comparison instruction compares floating point values and
5002 returns a boolean (i1) result for each pair of compared values.
5003
5004 **Syntax**::
5005
5006 %vN = fcmp C T V1, V2; <A>
5007
5008 **Record**::
5009
5010 AA: <9, VV1, VV2, CC>
5011
5012 **Semantics**:
5013
5014 The floating point comparison instruction compares floating point values and
5015 returns a boolean (i1) result for each pair of compared values in ``V1`` and
5016 ``V2``. ``V1`` and ``V2`` must be of type ``T``. ``T`` must be a floating point
5017 type, or a floating point vector type. Condition code ``C`` is the condition
5018 applied to all elements in ``V1`` and ``V2``. Each comparison always yields an
5019 i1. If ``T`` is a primitive type, the resulting type is i1. If ``T`` is a
5020 vector, then the resulting type is a vector of i1 with the same size as ``T``.
5021
5022 Legal test conditions are:
5023
5024 ===== == ==================================
5025 C CC Operator
5026 ===== == ==================================
5027 false 0 Always false
5028 oeq 1 Ordered and equal
5029 ogt 2 Ordered and greater than
5030 oge 3 Ordered and greater than or equal
5031 olt 4 Ordered and less than
5032 ole 5 Ordered and less than or equal
5033 one 6 Ordered and not equal
5034 ord 7 Ordered (no NaNs)
5035 uno 8 Unordered (either NaNs)
5036 ueq 9 Unordered or equal
5037 ugt 10 Unordered or greater than
5038 uge 11 Unordered or greater than or equal
5039 ult 12 Unordered or less than
5040 ule 13 Unordered or less than or equal
5041 une 14 Unordered or not equal
5042 true 15 Always true
5043 ===== == ==================================
5044
5045 **Constraints**::
5046
5047 AA == AbbrevIndex(A) &
5048 IsFloat(UnderlyingType(T) &
5049 T == TypeOf(V1) == TypeOf(V2) &
5050 N == NumValuedInsts
5051
5052 **Updates**::
5053
5054 ++NumValuedInsts;
5055 if IsVector(T) then
5056 TypeOf(%vN) = <UnderlyingCount(T), i1>
5057 else
5058 TypeOf(%vN) = i1
5059 endif
5060
5061 **Examples**::
5062
5063 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5064 48:0| 3: <1, 4> | count 4;
5065 50:4| 3: <3> | @t0 = float;
5066 52:2| 3: <7, 1> | @t1 = i1;
5067 54:6| 3: <2> | @t2 = void;
5068 56:4| 3: <21, 0, 2> | @t3 = void ();
5069 59:6| 0: <65534> | }
5070 ...
5071 108:0| 1: <65535, 12, 2> | function void @f0() {
5072 | | // BlockID = 12
5073 116:0| 3: <1, 1> | blocks 1;
5074 118:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5075 128:0| 3: <1, 0> | float:
5076 130:4| 3: <6, 0> | %c0 = float 0;
5077 133:0| 3: <6, 1065353216> | %c1 = float 1;
5078 139:2| 0: <65534> | }
5079 | | %b0:
5080 140:0| 3: <28, 2, 1, 0> | %v0 = fcmp false float %c0, %c1;
5081 144:0| 3: <28, 3, 2, 1> | %v1 = fcmp oeq float %c0, %c1;
5082 148:0| 3: <28, 4, 3, 2> | %v2 = fcmp ogt float %c0, %c1;
5083 152:0| 3: <28, 5, 4, 3> | %v3 = fcmp oge float %c0, %c1;
5084 156:0| 3: <28, 6, 5, 4> | %v4 = fcmp olt float %c0, %c1;
5085 160:0| 3: <28, 7, 6, 5> | %v5 = fcmp ole float %c0, %c1;
5086 164:0| 3: <28, 8, 7, 6> | %v6 = fcmp one float %c0, %c1;
5087 168:0| 3: <28, 9, 8, 7> | %v7 = fcmp ord float %c0, %c1;
5088 172:0| 3: <28, 10, 9, 9> | %v8 = fcmp ueq float %c0, %c1;
5089 176:0| 3: <28, 11, 10, 10> | %v9 = fcmp ugt float %c0, %c1;
5090 180:0| 3: <28, 12, 11, 11> | %v10 = fcmp uge float %c0, %c1;
5091 184:0| 3: <28, 13, 12, 12> | %v11 = fcmp ult float %c0, %c1;
5092 188:0| 3: <28, 14, 13, 13> | %v12 = fcmp ule float %c0, %c1;
5093 192:0| 3: <28, 15, 14, 14> | %v13 = fcmp une float %c0, %c1;
5094 196:0| 3: <28, 16, 15, 8> | %v14 = fcmp uno float %c0, %c1;
5095 200:0| 3: <28, 17, 16, 15> | %v15 = fcmp true float %c0, %c1;
5096 204:0| 3: <10> | ret void;
5097 205:6| 0: <65534> | }
5098 208:0|0: <65534> |}
5099
5100 .. _link_for_vector_instructions:
5101
5102 Vector Instructions
5103 ===================
5104
5105 PNaClAsm supports several instructions that process vectors. This includes the
5106 :ref:`integer<link_for_integer_binary_instructions>` and :ref:`floating
5107 point<link_for_floating_point_binary_instructions>` binary instructions as well
5108 as :ref:`compare<link_for_compare_instructions>` instructions. These
5109 instructions work with vectors and generate resulting (new) vectors. This
5110 section introduces the instructions to construct vectors and extract results.
5111
5112 .. _link_for_insert_element_instruction_section:
5113
5114 Insert Element Instruction
5115 --------------------------
5116
5117 The *insert element* instruction inserts a scalar value into a vector at a
5118 specified index. The *insert element* instruction takes an existing vector and
5119 puts a scalar value in one of the elements of the vector.
5120
5121 The *insert element* instruction can be used to construct a vector, one element
5122 at a time. At first glance, it may appear that one can't construct a vector,
5123 since the *insert element* instruction needs a vector to insert elements into.
5124
5125 The key to understanding vector construction is understand that one can create
5126 an :ref:`undefined<link_for_undefined_literal>` vector literal. Using that
5127 constant as a starting point, one can built up the wanted vector by a sequence
5128 of *insert element* instructions.
5129
5130 **Syntax**::
5131
5132 %vN = insertelement TV V, TE E, i32 I; <A>
5133
5134 **Record**::
5135
5136 AA: <7, VV, EE, II>
5137
5138 **Semantics**:
5139
5140 The *insert element* instruction inserts scalar value ``E`` into index ``I`` of
5141 vector ``V``. ``%vN`` holds the updated vector. Type ``TV`` is the type of
5142 vector. It is also the type of updated vector ``%vN``. Type ``TE`` is the type
5143 of scalar value ``E`` and must be the element type of vector ``V``. ``I`` must
5144 be an :ref:`i32 literal<link_for_integer_literal>`.
5145
5146 If ``I`` exceeds the length of ``V``, the result is undefined.
5147
5148 **Constraints**::
5149
5150 AA == AbbrevIndex(A) &
5151 IsVector(TV) &
5152 TypeOf(V) == TV &
5153 UnderlyingType(TV) == TE &
5154 TypeOf(I) == i32 &
5155 N == NumValuedInsts
5156
5157 **Updates**::
5158
5159 ++NumValuedInsts;
5160 TypeOf(%vN) = TV;
5161
5162 **Examples**::
5163
5164 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5165 48:0| 3: <1, 5> | count 5;
5166 50:4| 3: <7, 1> | @t0 = i1;
5167 53:0| 3: <12, 4, 0> | @t1 = <4 x i1>;
5168 56:2| 3: <7, 32> | @t2 = i32;
5169 59:4| 3: <2> | @t3 = void;
5170 61:2| 3: <21, 0, 3> | @t4 = void ();
5171 64:4| 0: <65534> | }
5172 ...
5173 116:0| 1: <65535, 12, 2> | function void @f0() {
5174 | | // BlockID = 12
5175 124:0| 3: <1, 1> | blocks 1;
5176 126:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5177 136:0| 3: <1, 0> | i1:
5178 138:4| 3: <4, 0> | %c0 = i1 0;
5179 141:0| 3: <4, 3> | %c1 = i1 1;
5180 143:4| 3: <1, 1> | <4 x i1>:
5181 146:0| 3: <3> | %c2 = <4 x i1> undef;
5182 147:6| 3: <1, 2> | i32:
5183 150:2| 3: <4, 0> | %c3 = i32 0;
5184 152:6| 3: <4, 2> | %c4 = i32 1;
5185 155:2| 3: <4, 4> | %c5 = i32 2;
5186 157:6| 3: <4, 6> | %c6 = i32 3;
5187 160:2| 0: <65534> | }
5188 | | %b0:
5189 164:0| 3: <7, 5, 7, 4> | %v0 = insertelement <4 x i1> %c2,
5190 | | i1 %c0, i32 %c3;
5191 168:0| 3: <7, 1, 7, 4> | %v1 = insertelement <4 x i1> %v0,
5192 | | i1 %c1, i32 %c4;
5193 172:0| 3: <7, 1, 9, 4> | %v2 = insertelement <4 x i1> %v1,
5194 | | i1 %c0, i32 %c5;
5195 176:0| 3: <7, 1, 9, 4> | %v3 = insertelement <4 x i1> %v2,
5196 | | i1 %c1, i32 %c6;
5197 180:0| 3: <10> | ret void;
5198 181:6| 0: <65534> | }
5199
5200 Extract Element Instruction
5201 ---------------------------
5202
5203 The *extract element* instruction extracts a single scalar value from a vector
5204 at a specified index.
5205
5206 **Syntax**::
5207
5208 %vN = extractelement TV V, i32 I; <A>
5209
5210 **Record**::
5211
5212 AA: <6, VV, II>
5213
5214 **Semantics**:
5215
5216 The *extract element* instruction extracts the scalar value at index ``I`` from
5217 vector ``V``. The extracted value is assigned to ``%vN``. Type ``TV`` is the
5218 type of vector ``V``. ``I`` must be an :ref:`i32
5219 literal<link_for_integer_literal>`. The type of ``vN`` must be the element type
5220 of vector ``V``.
5221
5222 If ``I`` exceeds the length of ``V``, the result is undefined.
5223
5224 **Constraints**::
5225
5226 AA == AbbrevIndex(A) &
5227 IsVector(TV) &
5228 TypeOf(V) == TV &
5229 TypeOf(I) == i32 &
5230 N == NumValuedInsts
5231
5232 **Updates**::
5233
5234 ++NumValuedInsts;
5235 TypeOf(%vN) = UnderlyingType(TV);
5236
5237 **Examples**::
5238
5239 96:0| 1: <65535, 12, 2> | function void @f0(<4 x i32> %p0) {
5240 | | // BlockID = 12
5241 104:0| 3: <1, 1> | blocks 1;
5242 106:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5243 116:0| 3: <1, 0> | i32:
5244 118:4| 3: <4, 0> | %c0 = i32 0;
5245 121:0| 0: <65534> | }
5246 | | %b0:
5247 124:0| 3: <6, 2, 1> | %v0 =
5248 | | extractelement <4 x i32> %p0,
5249 | | i32 %c0;
5250 127:2| 3: <10> | ret void;
5251 129:0| 0: <65534> | }
5252
5253 .. _link_for_other_pnaclasm_instructions:
5254
5255 Other Instructions
5256 ==================
5257
5258 This section defines miscellaneous instructions which defy better
5259 classification.
5260
5261 .. _link_for_forward_type_declaration_section:
5262
5263 Forward Type Declaration
5264 ------------------------
5265
5266 The forward type declaration exists to deal with the fact that all instruction
5267 values must have a type associated with them before they are used. For some
5268 simple functions one can easily topologically sort instructions so that
5269 instruction values are defined before they are used. However, if the
5270 implementation contains loops, the loop induced values can't be defined before
5271 they are used.
5272
5273 The solution is to forward declare the type of an instruction value. One could
5274 forward declare the types of all instructions at the beginning of the function
5275 block. However, this would make the corresponding file size considerably
5276 larger. Rather, one should only generate these forward type declarations
5277 sparingly and only when needed.
5278
5279 **Syntax**::
5280
5281 declare T %vN; <A>
5282
5283 **Record**::
5284
5285 AA: <43, N, TT>
5286
5287 **Semantics**:
5288
5289 The forward declare type declaration defines the type to be associated with a
5290 (not yet defined) instruction value ``%vN``. ``T`` is the type of the value
5291 generated by the ``Nth`` value generating instruction in the function block.
5292
5293 Note: It is an error to define the type of ``%vN`` with a different type than
5294 will be generated by the ``Nth`` value generating instruction in the function
5295 block.
5296
5297 Also note that this construct is a declaration and not considered an
5298 instruction, even though it appears in the list of instruction records. Hence,
5299 they may appear before and between :ref:`phi<link_for_phi_instruction_section>`
5300 instructions in a basic block.
5301
5302 **Constraints**::
5303
5304 AA = AbbrevIndex(A) &
5305 TT = TypeID(T)
5306
5307 **Updates**::
5308
5309 TypeOf(%vN) = T;
5310
5311 **Examples**::
5312
5313 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5314 48:0| 3: <1, 4> | count 4;
5315 50:4| 3: <7, 32> | @t0 = i32;
5316 53:6| 3: <2> | @t1 = void;
5317 55:4| 3: <7, 1> | @t2 = i1;
5318 58:0| 3: <21, 0, 1, 0> | @t3 = void (i32);
5319 62:0| 0: <65534> | }
5320 ...
5321 108:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
5322 | | // BlockID = 12
5323 116:0| 3: <1, 7> | blocks 7;
5324 118:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5325 128:0| 3: <1, 2> | i1:
5326 130:4| 3: <4, 3> | %c0 = i1 1;
5327 133:0| 0: <65534> | }
5328 | | %b0:
5329 136:0| 3: <11, 4> | br label %b4;
5330 | | %b1:
5331 138:4| 3: <43, 6, 0> | declare i32 %v3;
5332 142:4| 3: <2, 2, 4294967293, 0> | %v0 = add i32 %p0, %v3;
5333 151:0| 3: <11, 6> | br label %b6;
5334 | | %b2:
5335 153:4| 3: <43, 7, 0> | declare i32 %v4;
5336 157:4| 3: <2, 3, 4294967293, 0> | %v1 = add i32 %p0, %v4;
5337 166:0| 3: <11, 6> | br label %b6;
5338 | | %b3:
5339 168:4| 3: <2, 4, 4294967295, 0> | %v2 = add i32 %p0, %v3;
5340 177:0| 3: <11, 6> | br label %b6;
5341 | | %b4:
5342 179:4| 3: <2, 5, 5, 0> | %v3 = add i32 %p0, %p0;
5343 183:4| 3: <11, 1, 5, 5> | br i1 %c0, label %b1, label %b5;
5344 | | %b5:
5345 187:4| 3: <2, 1, 6, 0> | %v4 = add i32 %v3, %p0;
5346 191:4| 3: <11, 2, 3, 6> | br i1 %c0, label %b2, label %b3;
5347 | | %b6:
5348 195:4| 3: <10> | ret void;
5349 197:2| 0: <65534> | }
5350
5351 .. _link_for_phi_instruction_section:
5352
5353 Phi Instruction
5354 ---------------
5355
5356 The *phi* instruction is used to implement phi nodes in the SSA graph
5357 representing the function. Phi instructions can only appear at the beginning of
5358 a basic block. There must be no non-phi instructions (other than forward type
5359 declarations) between the start of the basic block and the *phi* instruction.
5360
5361 To clarify the origin of each incoming value, the incoming value is associated
5362 with the incoming edge from the corresponding predecessor block that the
5363 incoming value comes from.
5364
5365 **Syntax**::
5366
5367 %vN = phi T [V1, %bB1], ... , [VM, %bBM]; <A>
5368
5369 **Record**::
5370
5371 AA: <16, TT, VV1, B1, ..., VVM, BM>
5372
5373 **Semantics**:
5374
5375 The phi instruction is used to implement phi nodes in the SSA graph representing
5376 the function. ``%vN`` is the resulting value of the corresponding phi
5377 node. ``T`` is the type of the phi node. Values ``V1`` through ``VM`` are the
5378 reaching definitions for the phi node while ``%bB1`` through ``%bBM`` are the
5379 corresponding predecessor blocks. Each ``VI`` reaches via the incoming
5380 predecessor edge from block ``%bBI`` (for 1 <= I <= M). Type ``T`` must be the
5381 type associated with each ``VI``.
5382
5383 **Constraints**::
5384
5385 AA == AbbrevIndex(A) &
5386 M > 1 &
5387 TT == TypeID(T) &
5388 T = TypeOf(VI) for all I, 1 <= I <= M &
5389 BI < ExpectedBasicBlocks for all I, 1 <= I <= M &
5390 VVI = SignRotate(RelativeIndex(VI)) for all I, 1 <= I <= M &
5391 N == NumValuedInsts
5392
5393 **Updates**::
5394
5395 ++NumValuedInsts;
5396 TypeOf(%vN) = T;
5397
5398 **Examples**::
5399
5400 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5401 48:0| 3: <1, 4> | count 4;
5402 50:4| 3: <7, 32> | @t0 = i32;
5403 53:6| 3: <2> | @t1 = void;
5404 55:4| 3: <21, 0, 1> | @t2 = void ();
5405 58:6| 3: <7, 1> | @t3 = i1;
5406 61:2| 0: <65534> | }
5407 ...
5408 112:0| 1: <65535, 12, 2> | function void @f0() {
5409 | | // BlockID = 12
5410 120:0| 3: <1, 4> | blocks 4;
5411 122:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5412 132:0| 3: <1, 0> | i32:
5413 134:4| 3: <4, 2> | %c0 = i32 1;
5414 137:0| 3: <1, 3> | i1:
5415 139:4| 3: <4, 0> | %c1 = i1 0;
5416 142:0| 0: <65534> | }
5417 | | %b0:
5418 144:0| 3: <11, 1, 2, 1> | br i1 %c1, label %b1, label %b2;
5419 | | %b1:
5420 148:0| 3: <2, 2, 2, 0> | %v0 = add i32 %c0, %c0;
5421 152:0| 3: <2, 3, 3, 1> | %v1 = sub i32 %c0, %c0;
5422 156:0| 3: <11, 3> | br label %b3;
5423 | | %b2:
5424 158:4| 3: <2, 4, 4, 2> | %v2 = mul i32 %c0, %c0;
5425 162:4| 3: <2, 5, 5, 3> | %v3 = udiv i32 %c0, %c0;
5426 166:4| 3: <11, 3> | br label %b3;
5427 | | %b3:
5428 169:0| 3: <16, 0, 8, 1, 4, 2> | %v4 = phi i32 [%v0, %b1],
5429 | | [%v2, %b2];
5430 174:4| 3: <16, 0, 8, 1, 4, 2> | %v5 = phi i32 [%v1, %b1],
5431 | | [%v3, %b2];
5432 180:0| 3: <10> | ret void;
5433 181:6| 0: <65534> | }
5434
5435 Select Instruction
5436 ------------------
5437
5438 The *select* instruction is used to choose between pairs of values, based on a
5439 condition, without PNaClAsm-level branching.
5440
5441 **Syntax**::
5442
5443 %vN = select CT C, T V1, T V2; <A>
5444
5445 **Record**::
5446
5447 AA: <29, VV1, VV2, CC>
5448
5449 **Semantics**:
5450
5451 The *select* instruction chooses pairs of values ``V1`` and ``V2``, based on
5452 condition value ``C``. The type ``CT`` of value ``C`` must either be an i1, or
5453 a vector of type i1. The type of values ``V1`` and ``V2`` must be of type
5454 ``T``. Type ``T`` must either be a primitive type, or a vector of a primitive
5455 type.
5456
5457 Both ``CT`` and ``T`` must be primitive types, or both must be vector types of
5458 the same size. When the contents of ``C`` is 1, the corresponding value from
5459 ``V1`` will be chosen. Otherwise the corresponding value from ``V2`` will be
5460 chosen.
5461
5462 **Constraints**::
5463
5464 AA == AbbrevIndex(A) &
5465 CC == RelativeIndex(C) &
5466 VV1 == RelativeIndex(V1) &
5467 VV2 == RelativeIndex(V2) &
5468 T == TypeOf(V1) == TypeOf(V2) &
5469 UnderlyingType(CT) == i1 &
5470 IsInteger(UnderlyingType(T)) or IsFloat(UnderlyingType(T)) &
5471 UnderlyingCount(C) == UnderlyingCount(T) &
5472 N == NumValuedInsts
5473
5474 **Updates**::
5475
5476 ++NumValuedInsts;
5477 TypeOf(%vN) = T;
5478
5479 **Examples**::
5480
5481 96:0| 1: <65535, 12, 2> | function i32 @f0(i32 %p0, i32 %p1) {
5482 | | // BlockID = 12
5483 104:0| 3: <1, 1> | blocks 1;
5484 106:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5485 116:0| 3: <1, 2> | i1:
5486 118:4| 3: <4, 3> | %c0 = i1 1;
5487 121:0| 0: <65534> | }
5488 | | %b0:
5489 124:0| 3: <29, 3, 2, 1> | %v0 = select i1 %c0, i32 %p0,
5490 | | i32 %p1;
5491 128:0| 3: <10, 1> | ret i32 %v0;
5492 130:4| 0: <65534> | }
5493
5494
5495 Call Instructions
5496 -----------------
5497
5498 The *call* instruction does a function call. The call instruction is used to
5499 cause control flow to transfer to a specified routine, with its incoming
5500 arguments bound to the specified values. When a return instruction in the called
5501 function is reached, control flow continues with the instruction after the
5502 function call. If the call is to a function, the returned value is the value
5503 generated by the call instruction. Otherwise no result is defined by the call.
5504
5505 If the *tail* flag is associated with the call instruction, then the :ref:`PNaCl
5506 translator<link_for_pnacl_translator>` is free to perform tail call
5507 optimization. That is, the *tail* flag is a hint that may be ignored by the
5508 PNaCl translator.
5509
5510 There are two kinds of calls: *direct* and *indirect*. A *direct* call calls a
5511 defined :ref:`function address<link_for_function_address_section>` (i.e. a
5512 reference to a bitcode ID of the form ``%fF``). All other calls are *indirect*.
5513
5514 Direct Procedure Call
5515 ^^^^^^^^^^^^^^^^^^^^^
5516
5517 The direct procedure call calls a defined :ref:`function
5518 address<link_for_function_address_section>` whose :ref:`type
5519 signature<link_for_function_type>` returns type void.
5520
5521 **Syntax**::
5522
5523 TAIL call void @fF (T1 A1, ... , TN AN); <A>
5524
5525 **Record**::
5526
5527 AA: <34, CC, F, AA1, ... , AAN>
5528
5529 **Semantics**:
5530
5531 The direct procedure call calls a define function address ``%fF`` whose type
5532 signature return type is void. The arguments ``A1`` through ``AN`` are passed in
5533 the order specified. The type of argument ``AI`` must be type ``TI`` (for all I,
5534 1 <=I <= N). Flag ``TAIL`` is optional. If it is included, it must be the
5535 literal ``tail``.
5536
5537 The types of the arguments must match the corresponding types of the function
5538 signature associated with ``%fF``. The return type of ``%f`` must be void.
5539
5540 TAIL is encoded into calling convention value ``CC`` as follows:
5541
5542 ====== ==
5543 TAIL CC
5544 ====== ==
5545 "" 0
5546 "tail" 1
5547 ====== ==
5548
5549 **Constraints**::
5550
5551 AA == AbbrevIndex(A) &
5552 N >= 0 &
5553 TypeOfFcn(%fF) == void (T1, ... , TN) &
5554 TypeOf(AI) == TI for all I, 1 <= I <= N
5555
5556 **Updates**::
5557
5558 ++NumValuedInsts;
5559
5560 **Examples**::
5561
5562 72:0| 3: <8, 3, 0, 1, 0> | declare external
5563 | | void @f0(i32, i64, i32);
5564 ...
5565 116:0| 1: <65535, 12, 2> | function void @f1(i32 %p0) {
5566 | | // BlockID = 12
5567 124:0| 3: <1, 1> | blocks 1;
5568 126:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5569 136:0| 3: <1, 2> | i64:
5570 138:4| 3: <4, 2> | %c0 = i64 1;
5571 141:0| 0: <65534> | }
5572 | | %b0:
5573 144:0| 3: <34, 0, 4, 2, 1, 2> | call void
5574 | | @f0(i32 %p0, i64 %c0, i32 %p0);
5575 150:2| 3: <10> | ret void;
5576 152:0| 0: <65534> | }
5577
5578 Direct Function Call
5579 ^^^^^^^^^^^^^^^^^^^^
5580
5581 The direct function call calls a defined function address whose type signature
5582 returns a value.
5583
5584 **Syntax**::
5585
5586 %vN = TAIL call RT %fF (T1 A1, ... , TM AM); <A>
5587
5588
5589 **Record**::
5590
5591 AA: <34, CC, F, AA1, ... , AAM>
5592
5593 **Semantics**:
5594
5595 The direct function call calls a defined function address ``%fF`` whose type
5596 signature returned is not type void. The arguments ``A1`` through ``AM`` are
5597 passed in the order specified. The type of argument ``AI`` must be type ``TI``
5598 (for all I, 1 <= I <= N). Flag ``TAIL`` is optional. If it is included, it must
5599 be the literal ``tail``.
5600
5601 The types of the arguments must match the corresponding types of the function
5602 signature associated with ``%fF``. The return type must match ``RT``.
5603
5604 Each parameter type ``TI``, and return type ``RT``, must either be a primitive
5605 type, or a vector type. If the parameter type is an integer type, it must
5606 either be i32 or i64.
5607
5608 TAIL is encoded into calling convention value ``CC`` as follows:
5609
5610 ====== ==
5611 TAIL CC
5612 ====== ==
5613 "" 0
5614 "tail" 1
5615 ====== ==
5616
5617 **Constraints**::
5618
5619 AA == AbbrevIndex(A) &
5620 N >= 0 &
5621 TypeOfFcn(%fF) == RT (T1, ... , TN) &
5622 TypeOf(AI) == TI for all I, 1 <= I <= M &
5623 IsFcnArgType(TI) for all I, 1 <= I <= M &
5624 IsFcnArgType(RT) &
5625 N == NumValuedInsts
5626
5627 **Updates**::
5628
5629 ++NumValuedInsts;
5630 TypeOf(%vN) = RT;
5631
5632 **Examples**::
5633
5634 72:0| 3: <8, 2, 0, 1, 0> | declare external
5635 | | i32 @f0(i32, i64, i32);
5636 ...
5637 116:0| 1: <65535, 12, 2> | function i32 @f1(i32 %p0) {
5638 | | // BlockID = 12
5639 124:0| 3: <1, 1> | blocks 1;
5640 126:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5641 136:0| 3: <1, 1> | i64:
5642 138:4| 3: <4, 2> | %c0 = i64 1;
5643 141:0| 0: <65534> | }
5644 | | %b0:
5645 144:0| 3: <34, 0, 4, 2, 1, 2> | %v0 = call i32
5646 | | @f0(i32 %p0, i64 %c0, i32 %p0);
5647 150:2| 3: <34, 1, 4, 1> | %v1 = tail call i32 @f1(i32 %v0);
5648 155:0| 3: <10, 2> | ret i32 %v0;
5649 157:4| 0: <65534> | }
5650
5651 Indirect Procedure Call
5652 ^^^^^^^^^^^^^^^^^^^^^^^
5653
5654 The indirect procedure call calls a function using an indirect function address,
5655 and whose type signature is assumed to return type void. It is different from
5656 the direct procedure call because we can't use the type signature of the
5657 corresponding direct function address to type check the construct.
5658
5659 **Syntax**::
5660
5661 TAIL call void V (T1 A1, ... , TN AN); <A>
5662
5663 **Record**::
5664
5665 AA: <44, CC, TV, VV, AA1, ... , AAN>
5666
5667 **Semantics**:
5668
5669 The indirect call procedure calls a function using value ``V`` that is an
5670 indirect function address, and whose type signature is assumed to return type
5671 void. The arguments ``A1`` through ``AN`` are passed in the order
5672 specified. The type of argument ``AI`` must be type ``TI`` (for all I, 1 <= I <=
5673 N). Flag ``TAIL`` is optional. If it is included, it must be the literal
5674 ``tail``.
5675
5676 Each parameter type ``TI`` (1 <= I <= N) must either be a primitive type, or a
5677 vector type. If the parameter type is an integer type, it must either be i32
5678 or i64.
5679
5680 TAIL is encoded into calling convention value ``CC`` as follows:
5681
5682 ====== ==
5683 TAIL CC
5684 ====== ==
5685 "" 0
5686 "tail" 1
5687 ====== ==
5688
5689 The type signature of the called procedure is assumed to be::
5690
5691 void (T1, ... , TN)
5692
5693 It isn't necessary to define this type in the :ref:`types
5694 block<link_for_types_block_section>`, since the type is inferred rather than
5695 used.
5696
5697 **Constraints**::
5698
5699 AA == AbbrevIndex(A) &
5700 N >= 0 &
5701 TV = TypeID(void) &
5702 AbsoluteIndex(V) >= NumFuncAddresses &
5703 TypeOf(AI) == TI for all I, 1 <= I <= N &
5704 IsFcnArgType(TI) for all I, 1 <= I <= N
5705
5706 **Updates**::
5707
5708 ++NumValuedInsts;
5709
5710 **Examples**::
5711
5712 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5713 48:0| 3: <1, 3> | count 3;
5714 50:4| 3: <2> | @t0 = void;
5715 52:2| 3: <7, 32> | @t1 = i32;
5716 55:4| 3: <21, 0, 0, 1> | @t2 = void (i32);
5717 59:4| 0: <65534> | }
5718 ...
5719 92:0| 1: <65535, 12, 2> | function void @f0(i32 %p0) {
5720 | | // BlockID = 12
5721 100:0| 3: <1, 1> | blocks 1;
5722 102:4| 1: <65535, 11, 2> | constants { // BlockID = 11
5723 112:0| 3: <1, 1> | i32:
5724 114:4| 3: <4, 2> | %c0 = i32 1;
5725 117:0| 0: <65534> | }
5726 | | %b0:
5727 120:0| 3: <44, 0, 2, 0, 1> | call void %p0(i32 %c0);
5728 125:4| 3: <10> | ret void;
5729 127:2| 0: <65534> | }
5730
5731 Indirect Function Call
5732 ^^^^^^^^^^^^^^^^^^^^^^
5733
5734 The indirect function call calls a function using a value that is an indirect
5735 function address. It is different from the direct function call because we can't
5736 use the type signature of the corresponding literal function address to type
5737 check the construct.
5738
5739 **Syntax**::
5740
5741 %vN = TAIL call RT V (T1 A1, ... , TM AM); <A>
5742
5743 **Record**::
5744
5745 AA: <34, CC, RRT, VV, AA1, ... , AAM>
5746
5747 **Semantics**:
5748
5749 The indirect function call calls a function using a value ``V`` that is an
5750 indirect function address, and is assumed to return type ``RT``. The arguments
5751 ``A1`` through ``AM`` are passed in the order specified. The type of argument
5752 ``AI`` must be type ``TI`` (for all I, 1 <= I <= N). Flag ``TAIL`` is
5753 optional. If it is included, it must be the literal ``tail``.
5754
5755 Each parameter type ``TI`` (1 <= I <= M), and return type ``RT``, must either be
5756 a primitive type, or a vector type. If the parameter type is an integer type,
5757 it must either be i32 or i64.
5758
5759 TAIL is encoded into calling convention value ``CC`` as follows:
5760
5761 ====== ==
5762 TAIL CC
5763 ====== ==
5764 '' 0
5765 'tail' 1
5766 ====== ==
5767
5768 The type signature of the called function is assumed to be::
5769
5770 RT (T1, ... , TN)
5771
5772 It isn't necessary to define this type in the :ref:`types
5773 block<link_for_types_block_section>`, since the type is inferred rather than
5774 used.
5775
5776 **Constraints**::
5777
5778 AA == AbbrevIndex(A) &
5779 RRT = TypeID(RT) &
5780 VV = RelativeIndex(V) &
5781 M >= 0 &
5782 AbsoluteIndex(V) >= NumFcnAddresses &
5783 TypeOf(AI) == TI for all I, 1 <= I <= M &
5784 IsFcnArgType(TI) for all I, 1 <= I <= M &
5785 IsFcnArgType(RT) &
5786 N == NumValuedInsts
5787
5788 **Updates**::
5789
5790 ++NumValuedInsts;
5791 TypeOf(%vN) = RT;
5792
5793 **Examples**::
5794
5795 40:0| 1: <65535, 17, 2> | types { // BlockID = 17
5796 48:0| 3: <1, 6> | count 6;
5797 50:4| 3: <7, 32> | @t0 = i32;
5798 53:6| 3: <3> | @t1 = float;
5799 55:4| 3: <4> | @t2 = double;
5800 57:2| 3: <21, 0, 0, 0, 1, 2> | @t3 = i32 (i32, float, double);
5801 62:6| 3: <21, 0, 0, 1, 2> | @t4 = i32 (float, double);
5802 67:4| 3: <2> | @t5 = void;
5803 69:2| 0: <65534> | }
5804 ...
5805 104:0| 1: <65535, 12, 2> | function
5806 | | i32
5807 | | @f0(i32 %p0, float %p1,
5808 | | double %p2) {
5809 | | // BlockID = 12
5810 112:0| 3: <1, 1> | blocks 1;
5811 | | %b0:
5812 114:4| 3: <44, 0, 3, 0, 2, 1> | %v0 = call i32
5813 | | %p0(float %p1, double %p2);
5814 120:6| 3: <10, 1> | ret i32 %v0;
5815 123:2| 0: <65534> | }
5816
5817 .. _link_for_memory_blocks_and_alignment_section:
5818
5819 Memory Blocks and Alignment
5820 ===========================
5821
5822 In general, variable and heap allocated data are represented as byte addressable
5823 memory blocks. Alignment is always a power of 2, and defines an expectation on
5824 the memory address. That is, an alignment is met if the memory address is
5825 (evenly) divisible by the alignment. Note that alignment of 0 is never allowed.
5826
5827 Alignment plays a role at two points:
5828
5829 * When you create a local/global variable
5830
5831 * When you load/store data using a pointer.
5832
5833 PNaClAsm allows most types to be placed at any address, and therefore can
5834 have alignment of 1. However, many architectures can load more efficiently
5835 if the data has an alignment that is larger than 1. As such, choosing a larger
5836 alignment can make load/stores more efficient.
5837
5838 On loads and stores, the alignment in the instruction is used to communicate
5839 what assumptions the :ref:`PNaCl translator<link_for_pnacl_translator>` can
5840 make when choosing the appropriate machine instructions. If the alignment is 1,
5841 it can't assume anything about the memory address used by the instruction. When
5842 the alignment is greater than one, it can use that information to potentially
5843 chose a more efficient sequence of instructions to do the load/store.
5844
5845 When laying out data within a variable, one also considers alignment. The reason
5846 for this is that if you want an address to be aligned, within the bytes defining
5847 the variable, you must choose an alignment for the variable that guarantees that
5848 alignment.
5849
5850 In PNaClAsm, the valid load/store alignments are:
5851
5852 =========== ==============
5853 Type Alignment
5854 =========== ==============
5855 i1 1
5856 i8 1
5857 i16 1
5858 i32 1
5859 i64 1
5860 Float 1, 4
5861 Double 1, 8
5862 <4 x i1> not applicable
5863 <8 x i1> not applicable
5864 <16 x i1> not applicable
5865 <16 x i8> 1
5866 <8 x i16> 2
5867 <4 x i32> 4
5868 <4 x float> 4
5869 =========== ==============
5870
5871 Note that only vectors do not have an alignment value of 1. Hence, they can't be
5872 placed at an arbitrary memory address. Also, since vectors on ``i1`` can't be
5873 loaded/stored, the alignment is not applicable for these types.
5874
5875 .. _link_for_intrinsic_functions_section:
5876
5877 Intrinsic Functions
5878 ===================
5879
5880 Intrinsic functions are special in PNaClAsm. They are implemented as specially
5881 named (external) function calls. The purpose of these intrinsic functions is to
5882 extend the PNaClAsm instruction set with additional functionality that is
5883 architecture specific. Hence, they either can't be implemented within PNaClAsm,
5884 or a non-architecture specific implementation may be too slow on some
5885 architectures. In such cases, the :ref:`PNaCl
5886 translator<link_for_pnacl_translator>` must fill in the corresponding
5887 implementation, since only it knows the architecture it is compiling down to.
5888
5889 Examples of intrinsic function calls are for concurrent operations, atomic
5890 operations, bulk memory moves, thread pointer operations, and long jumps.
5891
5892 It should be noted that calls to intrinsic functions do not have the same
5893 calling type constraints as ordinary functions. That is, an intrinsic can use
5894 any integer type for arguments/results, unlike ordinary functions (which
5895 restrict integer types to ``i32`` and ``i64``).
5896
5897 See the :doc:`PNaCl bitcode reference manual<pnacl-bitcode-abi>` for the full
5898 set of intrinsic functions allowed. Note that in PNaClAsm, all pointer types to
5899 an (LLVM) intrinsic function is converted to type i32.
5900
5901 .. _link_for_support_functions_section:
5902
5903 Support Functions
5904 =================
5905
5906 Defines functions used to convert syntactic representation to values in the
5907 corresponding record.
5908
5909 SignRotate
5910 ----------
5911
5912 The SignRotate function encodes a signed integer in an easily compressible
5913 form. This is done by rotating the sign bit to the rightmost bit, rather than
5914 the leftmost bit. By doing this rotation, both small positive and negative
5915 integers are small (unsigned) integers. Therefore, all small integers can be
5916 encoded as a small (unsigned) integers.
5917
5918 The definition of SignRotate(N) is:
5919
5920 ======== ============= =========
5921 Argument Value Condition
5922 ======== ============= =========
5923 N abs(N)<<1 N >= 0
5924 N abs(N)<<1 + 1 N < 0
5925 ======== ============= =========
5926
5927 .. _link_for_absolute_index_section:
5928
5929 AbsoluteIndex
5930 -------------
5931
5932 Bitcode IDs of the forms ``@fN``, ``@gN``, ``%pN``, ``%cN``, and ``%vN``, are
5933 combined into a single index space. This can be done because of the ordering
5934 imposed by PNaClAsm. All function address bitcode IDs must be defined before any
5935 of the other forms of bitcode IDs. All global address bitcode IDs must be
5936 defined before any local bitcode IDs. Within a function block, the parameter
5937 bitcode IDs must be defined before constant IDs, and constant IDs must be
5938 defined before instruction value IDs.
5939
5940 Hence, within a function block, it is safe to refer to all of these
5941 bitcode IDs using a single *absolute* index. The absolute index for
5942 each kind of bitcode ID is computed as follows:
5943
5944 ========== ===================================================================
5945 Bitcode ID AbsoluteIndex
5946 ========== ===================================================================
5947 @tN N
5948 @fN N
5949 @gN N + NumFcnAddresses
5950 @pN N + NumFcnAddresses + NumGlobalAddresses
5951 @cN N + NumFcnAddresses + NumGlobalAddresses + NumParams
5952 @vN N + NumFcnAddresses + NumGlobalAddresses + NumParams + NumFcnConsts
5953 ========== ===================================================================
5954
5955 .. _link_for_relative_index:
5956
5957 RelativeIndex
5958 -------------
5959
5960 Relative indices are used to refer to values within instructions of a function.
5961 The relative index of an ID is always defined in terms of the index associated
5962 with the next value generating instruction. It is defined as follows::
5963
5964 RelativeIndex(J) = AbsoluteIndex(%vN) - AbsoluteIndex(J)
5965
5966 where::
5967
5968 N = NumValuedInsts
5969
5970 AbbrevIndex
5971 -----------
5972
5973 This function converts user-defined abbreviation indices to the corresponding
5974 internal abbreviation index saved in the bitcode file. It adds 4 to its
5975 argument, since there are 4 predefined internal abbreviation indices (0, 1, 2,
5976 and 3).
5977
5978 ========= ==============
5979 N AbbrevIndex(N)
5980 ========= ==============
5981 undefined 3
5982 %aA A + 4
5983 @aA A + 4
5984 ========= ==============
5985
5986 Log2
5987 ----
5988
5989 This is the 32-bit log2 value of its argument.
5990
5991 BitSizeOf
5992 ---------
5993
5994 Returns the number of bits needed to represent its argument (a type).
5995
5996 ======= ================
5997 T BitSizeOf
5998 ======= ================
5999 i1 1
6000 i8 8
6001 i16 16
6002 i32 32
6003 i64 64
6004 float 32
6005 double 64
6006 <N X T> N * BitSizeOf(T)
6007 ======= ================
6008
6009 UnderlyingType
6010 --------------
6011
6012 Returns the primitive type of the type construct. For primitive types, the
6013 *UnderlyingType* is itself. For vector types, the base type of the vector is the
6014 underlying type.
6015
6016 UnderlyingCount
6017 ---------------
6018
6019 Returns the size of the vector if given a vector, and 0 for primitive types.
6020 Note that this function is used to check if two vectors are of the same size.
6021 It is also used to test if two types are either primitive (i.e. UnderlyingCount
6022 returns 0 for both types) or are vectors of the same size (i.e. UnderlyingCount
6023 returns the same non-zero value).
6024
6025 IsInteger
6026 ---------
6027
6028 Returns true if the argument is in {i1, i8, i16, i32, i64}.
6029
6030 IsFloat
6031 -------
6032
6033 Returns true if the argument is in {``float``, ``double``}.
6034
6035 IsVector
6036 --------
6037
6038 Returns true if the argument is a vector type.
6039
6040 IsPrimitive
6041 -----------
6042
6043 Returns true if the argument is a primitive type. That is::
6044
6045 IsPrimitive(T) == IsInteger(T) or IsFloat(T)
6046
6047 IsFcnArgType
6048 ------------
6049
6050 Returns true if the argument is a primitive type or a vector type. Further,
6051 if it is an integer type, it must be i32 or i64. That is::
6052
6053 IsFcnArgType(T) = (IsInteger(T) and (i32 = BitSizeOf(T)
6054 or i64 == BitSizeOf(T)))
6055 or IsFloat(T) or IsVector(T)
6056
6057 .. _link_for_abbreviations_section:
6058
6059 Abbreviations
6060 =============
6061
6062 Abbreviations are used to convert PNaCl records to a sequence of bits. PNaCl
6063 uses the same strategy as `LLVM's bitcode file format
6064 <http://llvm.org/docs/BitCodeFormat.html>`_. See that document for more
6065 details.
6066
6067 It should be noted that we replace LLVM's header (called the *Bitcode Wrapper
6068 Format*) with the bytes of the :ref:`PNaCl record
6069 header<link_for_header_record_section>`. In addition, PNaCl bitcode files do
6070 not allow *blob* abbreviation.
6071
6072 .. _link_for_abbreviations_block_section:
6073
6074 Abbreviations Block
6075 -------------------
6076
6077 The abbreviations block is the first block in the module build. The
6078 block is divided into sections. Each section is a sequence of records. Each
6079 record in the sequence defines a user-defined abbreviation. Each section
6080 defines abbreviations that can be applied to all (succeeding) blocks of a
6081 particular kind. These abbreviations are denoted by the (global) ID of the form
6082 *@aN*.
6083
6084 In terms of `LLVM's bitcode file format
6085 <http://llvm.org/docs/BitCodeFormat.html>`_, the abbreviations block is called a
6086 *BLOCKINFO* block. Records *SETBID* and *DEFINE_ABBREV* are the only records
6087 allowed in PNaCl's abbreviation block (i.e. it doesn't allow *BLOCKNAME* and
6088 *SETRECORDNAME* records).
6089
6090 TODO
6091 ----
6092
6093 Extend this document to describe PNaCl's bitcode bit sequencer
6094 without requiring the reader to refer to `LLVM's bitcode file
6095 format <http://llvm.org/docs/BitCodeFormat.html>`_.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698