il.txt (36581B)
1 =========================== 2 QBE Intermediate Language 3 =========================== 4 5 6 7 - Table of Contents 8 ------------------- 9 10 1. <@ Basic Concepts > 11 * <@ Input Files > 12 * <@ BNF Notation > 13 * <@ Sigils > 14 * <@ Spacing > 15 2. <@ Types > 16 * <@ Simple Types > 17 * <@ Subtyping > 18 3. <@ Constants > 19 4. <@ Linkage > 20 5. <@ Definitions > 21 * <@ Aggregate Types > 22 * <@ Data > 23 * <@ Functions > 24 6. <@ Control > 25 * <@ Blocks > 26 * <@ Jumps > 27 7. <@ Instructions > 28 * <@ Arithmetic and Bits > 29 * <@ Memory > 30 * <@ Comparisons > 31 * <@ Conversions > 32 * <@ Cast and Copy > 33 * <@ Call > 34 * <@ Variadic > 35 * <@ Phi > 36 8. <@ Instructions Index > 37 38 - 1. Basic Concepts 39 ------------------- 40 41 The intermediate language (IL) is a higher-level language 42 than the machine's assembly language. It smoothes most 43 of the irregularities of the underlying hardware and 44 allows an infinite number of temporaries to be used. 45 This higher abstraction level lets frontend programmers 46 focus on language design issues. 47 48 ~ Input Files 49 ~~~~~~~~~~~~~ 50 51 The intermediate language is provided to QBE as text. 52 Usually, one file is generated per each compilation unit from 53 the frontend input language. An IL file is a sequence of 54 <@ Definitions > for data, functions, and types. Once 55 processed by QBE, the resulting file can be assembled and 56 linked using a standard toolchain (e.g., GNU binutils). 57 58 Here is a complete "Hello World" IL file which defines a 59 function that prints to the screen. Since the string is 60 not a first class object (only the pointer is) it is 61 defined outside the function's body. Comments start with 62 a # character and finish with the end of the line. 63 64 # Define the string constant. 65 data $str = { b "hello world", b 0 } 66 67 export function w $main() { 68 @start 69 # Call the puts function with $str as argument. 70 %r =w call $puts(l $str) 71 ret 0 72 } 73 74 If you have read the LLVM language reference, you might 75 recognize the example above. In comparison, QBE makes a 76 much lighter use of types and the syntax is terser. 77 78 ~ BNF Notation 79 ~~~~~~~~~~~~~~ 80 81 The language syntax is vaporously described in the sections 82 below using BNF syntax. The different BNF constructs used 83 are listed below. 84 85 * Keywords are enclosed between quotes; 86 * `... | ...` expresses alternatives; 87 * `( ... )` groups syntax; 88 * `[ ... ]` marks the nested syntax as optional; 89 * `( ... ),` designates a comma-separated list of the 90 enclosed syntax; 91 * `...*` and `...+` are used for arbitrary and 92 at-least-once repetition respectively. 93 94 ~ Sigils 95 ~~~~~~~~ 96 97 The intermediate language makes heavy use of sigils, all 98 user-defined names are prefixed with a sigil. This is 99 to avoid keyword conflicts, and also to quickly spot the 100 scope and nature of identifiers. 101 102 * `:` is for user-defined <@ Aggregate Types> 103 * `$` is for globals (represented by a pointer) 104 * `%` is for function-scope temporaries 105 * `@` is for block labels 106 107 In this BNF syntax, we use `?IDENT` to designate an identifier 108 starting with the sigil `?`. 109 110 ~ Spacing 111 ~~~~~~~~~ 112 113 `bnf 114 NL := '\n'+ 115 116 Individual tokens in IL files must be separated by one or 117 more spacing characters. Both spaces and tabs are recognized 118 as spacing characters. In data and type definitions, newlines 119 may also be used as spaces to prevent overly long lines. When 120 exactly one of two consecutive tokens is a symbol (for example 121 `,` or `=` or `{`), spacing may be omitted. 122 123 - 2. Types 124 ---------- 125 126 ~ Simple Types 127 ~~~~~~~~~~~~~~ 128 129 `bnf 130 BASETY := 'w' | 'l' | 's' | 'd' # Base types 131 EXTTY := BASETY | 'b' | 'h' # Extended types 132 133 The IL makes minimal use of types. By design, the types 134 used are restricted to what is necessary for unambiguous 135 compilation to machine code and C interfacing. Unlike LLVM, 136 QBE is not using types as a means to safety; they are only 137 here for semantic purposes. 138 139 The four base types are `w` (word), `l` (long), `s` (single), 140 and `d` (double), they stand respectively for 32-bit and 141 64-bit integers, and 32-bit and 64-bit floating-point numbers. 142 There are no pointer types available; pointers are typed 143 by an integer type sufficiently wide to represent all memory 144 addresses (e.g., `l` on 64-bit architectures). Temporaries 145 in the IL can only have a base type. 146 147 Extended types contain base types plus `b` (byte) and `h` 148 (half word), respectively for 8-bit and 16-bit integers. 149 They are used in <@ Aggregate Types> and <@ Data> definitions. 150 151 For C interfacing, the IL also provides user-defined aggregate 152 types as well as signed and unsigned variants of the sub-word 153 extended types. Read more about these types in the 154 <@ Aggregate Types > and <@ Functions > sections. 155 156 ~ Subtyping 157 ~~~~~~~~~~~ 158 159 The IL has a minimal subtyping feature, for integer types only. 160 Any value of type `l` can be used in a `w` context. In that 161 case, only the 32 least significant bits of the word value 162 are used. 163 164 Make note that it is the opposite of the usual subtyping on 165 integers (in C, we can safely use an `int` where a `long` 166 is expected). A long value cannot be used in word context. 167 The rationale is that a word can be signed or unsigned, so 168 extending it to a long could be done in two ways, either 169 by zero-extension, or by sign-extension. 170 171 - 3. Constants 172 -------------- 173 174 `bnf 175 CONST := 176 ['-'] NUMBER # Decimal integer 177 | 's_' FP # Single-precision float 178 | 'd_' FP # Double-precision float 179 | $IDENT # Global symbol 180 181 DYNCONST := 182 CONST 183 | 'thread' $IDENT # Thread-local symbol 184 185 Constants come in two kinds: compile-time constants and 186 dynamic constants. Dynamic constants include compile-time 187 constants and other symbol variants that are only known at 188 program-load time or execution time. Consequently, dynamic 189 constants can only occur in function bodies. 190 191 The representation of integers is two's complement. 192 Floating-point numbers are represented using the 193 single-precision and double-precision formats of the 194 IEEE 754 standard. 195 196 Constants specify a sequence of bits and are untyped. 197 They are always parsed as 64-bit blobs. Depending on 198 the context surrounding a constant, only some of its 199 bits are used. For example, in the program below, the 200 two variables defined have the same value since the first 201 operand of the subtraction is a word (32-bit) context. 202 203 %x =w sub -1, 0 204 %y =w sub 4294967295, 0 205 206 Because specifying floating-point constants by their bits 207 makes the code less readable, syntactic sugar is provided 208 to express them. Standard scientific notation is prefixed 209 with `s_` and `d_` for single and double precision numbers 210 respectively. Once again, the following example defines twice 211 the same double-precision constant. 212 213 %x =d add d_0, d_-1 214 %y =d add d_0, -4616189618054758400 215 216 Global symbols can also be used directly as constants; 217 they will be resolved and turned into actual numeric 218 constants by the linker. 219 220 When the `thread` keyword prefixes a symbol name, the 221 symbol's numeric value is resolved at runtime in the 222 thread-local storage. 223 224 - 4. Linkage 225 ------------ 226 227 `bnf 228 LINKAGE := 229 'export' [NL] 230 | 'thread' [NL] 231 | 'section' SECNAME [NL] 232 | 'section' SECNAME SECFLAGS [NL] 233 234 SECNAME := '"' .... '"' 235 SECFLAGS := '"' .... '"' 236 237 Function and data definitions (see below) can specify 238 linkage information to be passed to the assembler and 239 eventually to the linker. 240 241 The `export` linkage flag marks the defined item as 242 visible outside the current file's scope. If absent, 243 the symbol can only be referred to locally. Functions 244 compiled by QBE and called from C need to be exported. 245 246 The `thread` linkage flag can only qualify data 247 definitions. It mandates that the object defined is 248 stored in thread-local storage. Each time a runtime 249 thread starts, the supporting platform runtime is in 250 charge of making a new copy of the object for the 251 fresh thread. Objects in thread-local storage must 252 be accessed using the `thread $IDENT` syntax, as 253 specified in the <@ Constants > section. 254 255 A `section` flag can be specified to tell the linker to 256 put the defined item in a certain section. The use of 257 the section flag is platform dependent and we refer the 258 user to the documentation of their assembler and linker 259 for relevant information. 260 261 section ".init_array" 262 data $.init.f = { l $f } 263 264 The section flag can be used to add function pointers to 265 a global initialization list, as depicted above. Note 266 that some platforms provide a BSS section that can be 267 used to minimize the footprint of uniformly zeroed data. 268 When this section is available, QBE will automatically 269 make use of it and no section flag is required. 270 271 The section and export linkage flags should each appear 272 at most once in a definition. If multiple occurrences 273 are present, QBE is free to use any. 274 275 - 5. Definitions 276 ---------------- 277 278 Definitions are the essential components of an IL file. 279 They can define three types of objects: aggregate types, 280 data, and functions. Aggregate types are never exported 281 and do not compile to any code. Data and function 282 definitions have file scope and are mutually recursive 283 (even across IL files). Their visibility can be controlled 284 using linkage flags. 285 286 ~ Aggregate Types 287 ~~~~~~~~~~~~~~~~~ 288 289 `bnf 290 TYPEDEF := 291 # Regular type 292 'type' :IDENT '=' ['align' NUMBER] 293 '{' 294 ( SUBTY [NUMBER] ), 295 '}' 296 | # Opaque type 297 'type' :IDENT '=' 'align' NUMBER '{' NUMBER '}' 298 299 SUBTY := EXTTY | :IDENT 300 301 Aggregate type definitions start with the `type` keyword. 302 They have file scope, but types must be defined before being 303 referenced. The inner structure of a type is expressed by a 304 comma-separated list of types enclosed in curly braces. 305 306 type :fourfloats = { s, s, d, d } 307 308 For ease of IL generation, a trailing comma is tolerated by 309 the parser. In case many items of the same type are 310 sequenced (like in a C array), the shorter array syntax 311 can be used. 312 313 type :abyteandmanywords = { b, w 100 } 314 315 By default, the alignment of an aggregate type is the 316 maximum alignment of its members. The alignment can be 317 explicitly specified by the programmer. 318 319 type :cryptovector = align 16 { w 4 } 320 321 Opaque types are used when the inner structure of an 322 aggregate cannot be specified; the alignment for opaque 323 types is mandatory. They are defined simply by enclosing 324 their size between curly braces. 325 326 type :opaque = align 16 { 32 } 327 328 ~ Data 329 ~~~~~~ 330 331 `bnf 332 DATADEF := 333 LINKAGE* 334 'data' $IDENT '=' ['align' NUMBER] 335 '{' 336 ( EXTTY DATAITEM+ 337 | 'z' NUMBER ), 338 '}' 339 340 DATAITEM := 341 $IDENT ['+' NUMBER] # Symbol and offset 342 | '"' ... '"' # String 343 | CONST # Constant 344 345 Data definitions express objects that will be emitted in the 346 compiled file. Their visibility and location in the compiled 347 artifact are controlled with linkage flags described in the 348 <@ Linkage > section. 349 350 They define a global identifier (starting with the sigil 351 `$`), that will contain a pointer to the object specified 352 by the definition. 353 354 Objects are described by a sequence of fields that start with 355 a type letter. This letter can either be an extended type, 356 or the `z` letter. If the letter used is an extended type, 357 the data item following specifies the bits to be stored in 358 the field. When several data items follow a letter, they 359 initialize multiple fields of the same size. 360 361 The members of a struct will be packed. This means that 362 padding has to be emitted by the frontend when necessary. 363 Alignment of the whole data objects can be manually specified, 364 and when no alignment is provided, the maximum alignment from 365 the platform is used. 366 367 When the `z` letter is used the number following indicates 368 the size of the field; the contents of the field are zero 369 initialized. It can be used to add padding between fields 370 or zero-initialize big arrays. 371 372 Here are various examples of data definitions. 373 374 # Three 32-bit values 1, 2, and 3 375 # followed by a 0 byte. 376 data $a = { w 1 2 3, b 0 } 377 378 # A thousand bytes 0 initialized. 379 data $b = { z 1000 } 380 381 # An object containing two 64-bit 382 # fields, one with all bits sets and the 383 # other containing a pointer to the 384 # object itself. 385 data $c = { l -1, l $c } 386 387 ~ Functions 388 ~~~~~~~~~~~ 389 390 `bnf 391 FUNCDEF := 392 LINKAGE* 393 'function' [ABITY] $IDENT '(' (PARAM), ')' [NL] 394 '{' NL 395 BLOCK+ 396 '}' 397 398 PARAM := 399 ABITY %IDENT # Regular parameter 400 | 'env' %IDENT # Environment parameter (first) 401 | '...' # Variadic marker (last) 402 403 SUBWTY := 'sb' | 'ub' | 'sh' | 'uh' # Sub-word types 404 ABITY := BASETY | SUBWTY | :IDENT 405 406 Function definitions contain the actual code to emit in 407 the compiled file. They define a global symbol that 408 contains a pointer to the function code. This pointer 409 can be used in `call` instructions or stored in memory. 410 411 The type given right before the function name is the 412 return type of the function. All return values of this 413 function must have this return type. If the return 414 type is missing, the function must not return any value. 415 416 The parameter list is a comma separated list of 417 temporary names prefixed by types. The types are used 418 to correctly implement C compatibility. When an argument 419 has an aggregate type, a pointer to the aggregate is passed 420 by the caller. In the example below, we have to use a load 421 instruction to get the value of the first (and only) 422 member of the struct. 423 424 type :one = { w } 425 426 function w $getone(:one %p) { 427 @start 428 %val =w loadw %p 429 ret %val 430 } 431 432 If a function accepts or returns values that are smaller 433 than a word, such as `signed char` or `unsigned short` in C, 434 one of the sub-word type must be used. The sub-word types 435 `sb`, `ub`, `sh`, and `uh` stand, respectively, for signed 436 and unsigned 8-bit values, and signed and unsigned 16-bit 437 values. Parameters associated with a sub-word type of bit 438 width N only have their N least significant bits set and 439 have base type `w`. For example, the function 440 441 function w $addbyte(w %a, sb %b) { 442 @start 443 %bw =w extsb %b 444 %val =w add %a, %bw 445 ret %val 446 } 447 448 needs to sign-extend its second argument before the 449 addition. Dually, return values with sub-word types do 450 not need to be sign or zero extended. 451 452 If the parameter list ends with `...`, the function is 453 a variadic function: it can accept a variable number of 454 arguments. To access the extra arguments provided by 455 the caller, use the `vastart` and `vaarg` instructions 456 described in the <@ Variadic > section. 457 458 Optionally, the parameter list can start with an 459 environment parameter `env %e`. This special parameter is 460 a 64-bit integer temporary (i.e., of type `l`). If the 461 function does not use its environment parameter, callers 462 can safely omit it. This parameter is invisible to a C 463 caller: for example, the function 464 465 export function w $add(env %e, w %a, w %b) { 466 @start 467 %c =w add %a, %b 468 ret %c 469 } 470 471 must be given the C prototype `int add(int, int)`. 472 The intended use of this feature is to pass the 473 environment pointer of closures while retaining a 474 very good compatibility with C. The <@ Call > section 475 explains how to pass an environment parameter. 476 477 Since global symbols are defined mutually recursive, 478 there is no need for function declarations: a function 479 can be referenced before its definition. 480 Similarly, functions from other modules can be used 481 without previous declaration. All the type information 482 necessary to compile a call is in the instruction itself. 483 484 The syntax and semantics for the body of functions 485 are described in the <@ Control > section. 486 487 - 6. Control 488 ------------ 489 490 The IL represents programs as textual transcriptions of 491 control flow graphs. The control flow is serialized as 492 a sequence of blocks of straight-line code which are 493 connected using jump instructions. 494 495 ~ Blocks 496 ~~~~~~~~ 497 498 `bnf 499 BLOCK := 500 @IDENT NL # Block label 501 ( PHI NL )* # Phi instructions 502 ( INST NL )* # Regular instructions 503 JUMP NL # Jump or return 504 505 All blocks have a name that is specified by a label at 506 their beginning. Then follows a sequence of instructions 507 that have "fall-through" flow. Finally one jump terminates 508 the block. The jump can either transfer control to another 509 block of the same function or return; jumps are described 510 further below. 511 512 The first block in a function must not be the target of 513 any jump in the program. If a jump to the function start 514 is needed, the frontend must insert an empty prelude block 515 at the beginning of the function. 516 517 When one block jumps to the next block in the IL file, 518 it is not necessary to write the jump instruction, it 519 will be automatically added by the parser. For example 520 the start block in the example below jumps directly 521 to the loop block. 522 523 function $loop() { 524 @start 525 @loop 526 %x =w phi @start 100, @loop %x1 527 %x1 =w sub %x, 1 528 jnz %x1, @loop, @end 529 @end 530 ret 531 } 532 533 ~ Jumps 534 ~~~~~~~ 535 536 `bnf 537 JUMP := 538 'jmp' @IDENT # Unconditional 539 | 'jnz' VAL, @IDENT, @IDENT # Conditional 540 | 'ret' [VAL] # Return 541 | 'hlt' # Termination 542 543 A jump instruction ends every block and transfers the 544 control to another program location. The target of 545 a jump must never be the first block in a function. 546 The three kinds of jumps available are described in 547 the following list. 548 549 1. Unconditional jump. 550 551 Simply jumps to another block of the same function. 552 553 2. Conditional jump. 554 555 When its word argument is non-zero, it jumps to its 556 first label argument; otherwise it jumps to the other 557 label. The argument must be of word type; because of 558 subtyping a long argument can be passed, but only its 559 least significant 32 bits will be compared to 0. 560 561 3. Function return. 562 563 Terminates the execution of the current function, 564 optionally returning a value to the caller. The value 565 returned must be of the type given in the function 566 prototype. If the function prototype does not specify 567 a return type, no return value can be used. 568 569 4. Program termination. 570 571 Terminates the execution of the program with a 572 target-dependent error. This instruction can be used 573 when it is expected that the execution never reaches 574 the end of the block it closes; for example, after 575 having called a function such as `exit()`. 576 577 - 7. Instructions 578 ----------------- 579 580 Instructions are the smallest piece of code in the IL, they 581 form the body of <@ Blocks >. The IL uses a three-address 582 code, which means that one instruction computes an operation 583 between two operands and assigns the result to a third one. 584 585 An instruction has both a name and a return type, this 586 return type is a base type that defines the size of the 587 instruction's result. The type of the arguments can be 588 unambiguously inferred using the instruction name and the 589 return type. For example, for all arithmetic instructions, 590 the type of the arguments is the same as the return type. 591 The two additions below are valid if `%y` is a word or a long 592 (because of <@ Subtyping >). 593 594 %x =w add 0, %y 595 %z =w add %x, %x 596 597 Some instructions, like comparisons and memory loads 598 have operand types that differ from their return types. 599 For instance, two floating points can be compared to give a 600 word result (0 if the comparison succeeds, 1 if it fails). 601 602 %c =w cgts %a, %b 603 604 In the example above, both operands have to have single type. 605 This is made explicit by the instruction suffix. 606 607 The types of instructions are described below using a short 608 type string. A type string specifies all the valid return 609 types an instruction can have, its arity, and the type of 610 its arguments depending on its return type. 611 612 Type strings begin with acceptable return types, then 613 follows, in parentheses, the possible types for the arguments. 614 If the N-th return type of the type string is used for an 615 instruction, the arguments must use the N-th type listed for 616 them in the type string. When an instruction does not have a 617 return type, the type string only contains the types of the 618 arguments. 619 620 The following abbreviations are used. 621 622 * `T` stands for `wlsd` 623 * `I` stands for `wl` 624 * `F` stands for `sd` 625 * `m` stands for the type of pointers on the target; on 626 64-bit architectures it is the same as `l` 627 628 For example, consider the type string `wl(F)`, it mentions 629 that the instruction has only one argument and that if the 630 return type used is long, the argument must be of type double. 631 632 ~ Arithmetic and Bits 633 ~~~~~~~~~~~~~~~~~~~~~ 634 635 * `add`, `sub`, `div`, `mul` -- `T(T,T)` 636 * `neg` -- `T(T)` 637 * `udiv`, `rem`, `urem` -- `I(I,I)` 638 * `or`, `xor`, `and` -- `I(I,I)` 639 * `sar`, `shr`, `shl` -- `I(I,ww)` 640 641 The base arithmetic instructions in the first bullet are 642 available for all types, integers and floating points. 643 644 When `div` is used with word or long return type, the 645 arguments are treated as signed. The unsigned integral 646 division is available as `udiv` instruction. When the 647 result of a division is not an integer, it is truncated 648 towards zero. 649 650 The signed and unsigned remainder operations are available 651 as `rem` and `urem`. The sign of the remainder is the same 652 as the one of the dividend. Its magnitude is smaller than 653 the divisor one. These two instructions and `udiv` are only 654 available with integer arguments and result. 655 656 Bitwise OR, AND, and XOR operations are available for both 657 integer types. Logical operations of typical programming 658 languages can be implemented using <@ Comparisons > and 659 <@ Jumps >. 660 661 Shift instructions `sar`, `shr`, and `shl`, shift right or 662 left their first operand by the amount from the second 663 operand. The shifting amount is taken modulo the size of 664 the result type. Shifting right can either preserve the 665 sign of the value (using `sar`), or fill the newly freed 666 bits with zeroes (using `shr`). Shifting left always 667 fills the freed bits with zeroes. 668 669 Remark that an arithmetic shift right (`sar`) is only 670 equivalent to a division by a power of two for non-negative 671 numbers. This is because the shift right "truncates" 672 towards minus infinity, while the division truncates 673 towards zero. 674 675 ~ Memory 676 ~~~~~~~~ 677 678 * Store instructions. 679 680 * `stored` -- `(d,m)` 681 * `stores` -- `(s,m)` 682 * `storel` -- `(l,m)` 683 * `storew` -- `(w,m)` 684 * `storeh` -- `(w,m)` 685 * `storeb` -- `(w,m)` 686 687 Store instructions exist to store a value of any base type 688 and any extended type. Since halfwords and bytes are not 689 first class in the IL, `storeh` and `storeb` take a word 690 as argument. Only the first 16 or 8 bits of this word will 691 be stored in memory at the address specified in the second 692 argument. 693 694 * Load instructions. 695 696 * `loadd` -- `d(m)` 697 * `loads` -- `s(m)` 698 * `loadl` -- `l(m)` 699 * `loadsw`, `loaduw` -- `I(mm)` 700 * `loadsh`, `loaduh` -- `I(mm)` 701 * `loadsb`, `loadub` -- `I(mm)` 702 703 For types smaller than long, two variants of the load 704 instruction are available: one will sign extend the loaded 705 value, while the other will zero extend it. Note that 706 all loads smaller than long can load to either a long or 707 a word. 708 709 The two instructions `loadsw` and `loaduw` have the same 710 effect when they are used to define a word temporary. 711 A `loadw` instruction is provided as syntactic sugar for 712 `loadsw` to make explicit that the extension mechanism 713 used is irrelevant. 714 715 * Blits. 716 717 * `blit` -- `(m,m,w)` 718 719 The blit instruction copies in-memory data from its 720 first address argument to its second address argument. 721 The third argument is the number of bytes to copy. The 722 source and destination spans are required to be either 723 non-overlapping, or fully overlapping (source address 724 identical to the destination address). The byte count 725 argument must be a nonnegative numeric constant; it 726 cannot be a temporary. 727 728 One blit instruction may generate a number of 729 instructions proportional to its byte count argument, 730 consequently, it is recommended to keep this argument 731 relatively small. If large copies are necessary, it is 732 preferable that frontends generate calls to a supporting 733 `memcpy` function. 734 735 * Stack allocation. 736 737 * `alloc4` -- `m(l)` 738 * `alloc8` -- `m(l)` 739 * `alloc16` -- `m(l)` 740 741 These instructions allocate a chunk of memory on the 742 stack. The number ending the instruction name is the 743 alignment required for the allocated slot. QBE will 744 make sure that the returned address is a multiple of 745 that alignment value. 746 747 Stack allocation instructions are used, for example, 748 when compiling the C local variables, because their 749 address can be taken. When compiling Fortran, 750 temporaries can be used directly instead, because 751 it is illegal to take the address of a variable. 752 753 The following example makes use of some of the memory 754 instructions. Pointers are stored in long temporaries. 755 756 %A0 =l alloc4 8 # stack allocate an array A of 2 words 757 %A1 =l add %A0, 4 758 storew 43, %A0 # A[0] <- 43 759 storew 255, %A1 # A[1] <- 255 760 %v1 =w loadw %A0 # %v1 <- A[0] as word 761 %v2 =w loadsb %A1 # %v2 <- A[1] as signed byte 762 %v3 =w add %v1, %v2 # %v3 is 42 here 763 764 ~ Comparisons 765 ~~~~~~~~~~~~~ 766 767 Comparison instructions return an integer value (either a word 768 or a long), and compare values of arbitrary types. The returned 769 value is 1 if the two operands satisfy the comparison 770 relation, or 0 otherwise. The names of comparisons respect 771 a standard naming scheme in three parts. 772 773 1. All comparisons start with the letter `c`. 774 775 2. Then comes a comparison type. The following 776 types are available for integer comparisons: 777 778 * `eq` for equality 779 * `ne` for inequality 780 * `sle` for signed lower or equal 781 * `slt` for signed lower 782 * `sge` for signed greater or equal 783 * `sgt` for signed greater 784 * `ule` for unsigned lower or equal 785 * `ult` for unsigned lower 786 * `uge` for unsigned greater or equal 787 * `ugt` for unsigned greater 788 789 Floating point comparisons use one of these types: 790 791 * `eq` for equality 792 * `ne` for inequality 793 * `le` for lower or equal 794 * `lt` for lower 795 * `ge` for greater or equal 796 * `gt` for greater 797 * `o` for ordered (no operand is a NaN) 798 * `uo` for unordered (at least one operand is a NaN) 799 800 Because floating point types always have a sign bit, 801 all the comparisons available are signed. 802 803 3. Finally, the instruction name is terminated with a 804 basic type suffix precising the type of the operands 805 to be compared. 806 807 For example, `cod` (`I(dd,dd)`) compares two double-precision 808 floating point numbers and returns 1 if the two floating points 809 are not NaNs, or 0 otherwise. The `csltw` (`I(ww,ww)`) 810 instruction compares two words representing signed numbers and 811 returns 1 when the first argument is smaller than the second one. 812 813 ~ Conversions 814 ~~~~~~~~~~~~~ 815 816 Conversion operations change the representation of a value, 817 possibly modifying it if the target type cannot hold the value 818 of the source type. Conversions can extend the precision of a 819 temporary (e.g., from signed 8-bit to 32-bit), or convert a 820 floating point into an integer and vice versa. 821 822 * `extsw`, `extuw` -- `l(w)` 823 * `extsh`, `extuh` -- `I(ww)` 824 * `extsb`, `extub` -- `I(ww)` 825 * `exts` -- `d(s)` 826 * `truncd` -- `s(d)` 827 * `stosi` -- `I(ss)` 828 * `stoui` -- `I(ss)` 829 * `dtosi` -- `I(dd)` 830 * `dtoui` -- `I(dd)` 831 * `swtof` -- `F(ww)` 832 * `uwtof` -- `F(ww)` 833 * `sltof` -- `F(ll)` 834 * `ultof` -- `F(ll)` 835 836 Extending the precision of a temporary is done using the 837 `ext` family of instructions. Because QBE types do not 838 specify the signedness (like in LLVM), extension instructions 839 exist to sign-extend and zero-extend a value. For example, 840 `extsb` takes a word argument and sign-extends the 8 841 least-significant bits to a full word or long, depending on 842 the return type. 843 844 The instructions `exts` (extend single) and `truncd` (truncate 845 double) are provided to change the precision of a floating 846 point value. When the double argument of `truncd` cannot 847 be represented as a single-precision floating point, it is 848 truncated towards zero. 849 850 Converting between signed integers and floating points is done 851 using `stosi` (single to signed integer), `stoui` (single to 852 unsigned integer, `dtosi` (double to signed integer), `dtoui` 853 (double to unsigned integer), `swtof` (signed word to float), 854 `uwtof` (unsigned word to float), `sltof` (signed long to 855 float) and `ultof` (unsigned long to float). 856 857 Because of <@ Subtyping >, there is no need to have an 858 instruction to lower the precision of an integer temporary. 859 860 ~ Cast and Copy 861 ~~~~~~~~~~~~~~~ 862 863 The `cast` and `copy` instructions return the bits of their 864 argument verbatim. However a `cast` will change an integer 865 into a floating point of the same width and vice versa. 866 867 * `cast` -- `wlsd(sdwl)` 868 * `copy` -- `T(T)` 869 870 Casts can be used to make bitwise operations on the 871 representation of floating point numbers. For example 872 the following program will compute the opposite of the 873 single-precision floating point number `%f` into `%rs`. 874 875 %b0 =w cast %f 876 %b1 =w xor 2147483648, %b0 # flip the msb 877 %rs =s cast %b1 878 879 ~ Call 880 ~~~~~~ 881 882 `bnf 883 CALL := [%IDENT '=' ABITY] 'call' VAL '(' (ARG), ')' 884 885 ARG := 886 ABITY VAL # Regular argument 887 | 'env' VAL # Environment argument (first) 888 | '...' # Variadic marker 889 890 SUBWTY := 'sb' | 'ub' | 'sh' | 'uh' # Sub-word types 891 ABITY := BASETY | SUBWTY | :IDENT 892 893 The call instruction is special in several ways. It is not 894 a three-address instruction and requires the type of all 895 its arguments to be given. Also, the return type can be 896 either a base type or an aggregate type. These specifics 897 are required to compile calls with C compatibility (i.e., 898 to respect the ABI). 899 900 When an aggregate type is used as argument type or return 901 type, the value respectively passed or returned needs to be 902 a pointer to a memory location holding the value. This is 903 because aggregate types are not first-class citizens of 904 the IL. 905 906 Sub-word types are used for arguments and return values 907 of width less than a word. Details on these types are 908 presented in the <@ Functions > section. Arguments with 909 sub-word types need not be sign or zero extended according 910 to their type. Calls with a sub-word return type define 911 a temporary of base type `w` with its most significant bits 912 unspecified. 913 914 Unless the called function does not return a value, a 915 return temporary must be specified, even if it is never 916 used afterwards. 917 918 An environment parameter can be passed as first argument 919 using the `env` keyword. The passed value must be a 64-bit 920 integer. If the called function does not expect an environment 921 parameter, it will be safely discarded. See the <@ Functions > 922 section for more information about environment parameters. 923 924 When the called function is variadic, there must be a `...` 925 marker separating the named and variadic arguments. 926 927 ~ Variadic 928 ~~~~~~~~~~ 929 930 The `vastart` and `vaarg` instructions provide a portable 931 way to access the extra parameters of a variadic function. 932 933 * `vastart` -- `(m)` 934 * `vaarg` -- `T(mmmm)` 935 936 The `vastart` instruction initializes a *variable argument 937 list* used to access the extra parameters of the enclosing 938 variadic function. It is safe to call it multiple times. 939 940 The `vaarg` instruction fetches the next argument from 941 a variable argument list. It is currently limited to 942 fetching arguments that have a base type. This instruction 943 is essentially effectful: calling it twice in a row will 944 return two consecutive arguments from the argument list. 945 946 Both instructions take a pointer to a variable argument 947 list as sole argument. The size and alignment of variable 948 argument lists depend on the target used. However, it 949 is possible to conservatively use the maximum size and 950 alignment required by all the targets. 951 952 type :valist = align 8 { 24 } # For amd64_sysv 953 type :valist = align 8 { 32 } # For arm64 954 type :valist = align 8 { 8 } # For rv64 955 956 The following example defines a variadic function adding 957 its first three arguments. 958 959 function s $add3(s %a, ...) { 960 @start 961 %ap =l alloc8 32 962 vastart %ap 963 %r =s call $vadd(s %a, l %ap) 964 ret %r 965 } 966 967 function s $vadd(s %a, l %ap) { 968 @start 969 %b =s vaarg %ap 970 %c =s vaarg %ap 971 %d =s add %a, %b 972 %e =s add %d, %c 973 ret %e 974 } 975 976 ~ Phi 977 ~~~~~ 978 979 `bnf 980 PHI := %IDENT '=' BASETY 'phi' ( @IDENT VAL ), 981 982 First and foremost, phi instructions are NOT necessary when 983 writing a frontend to QBE. One solution to avoid having to 984 deal with SSA form is to use stack allocated variables for 985 all source program variables and perform assignments and 986 lookups using <@ Memory > operations. This is what LLVM 987 users typically do. 988 989 Another solution is to simply emit code that is not in SSA 990 form! Contrary to LLVM, QBE is able to fixup programs not 991 in SSA form without requiring the boilerplate of loading 992 and storing in memory. For example, the following program 993 will be correctly compiled by QBE. 994 995 @start 996 %x =w copy 100 997 %s =w copy 0 998 @loop 999 %s =w add %s, %x 1000 %x =w sub %x, 1 1001 jnz %x, @loop, @end 1002 @end 1003 ret %s 1004 1005 Now, if you want to know what phi instructions are and how 1006 to use them in QBE, you can read the following. 1007 1008 Phi instructions are specific to SSA form. In SSA form 1009 values can only be assigned once, without phi instructions, 1010 this requirement is too strong to represent many programs. 1011 For example consider the following C program. 1012 1013 int f(int x) { 1014 int y; 1015 if (x) 1016 y = 1; 1017 else 1018 y = 2; 1019 return y; 1020 } 1021 1022 The variable `y` is assigned twice, the solution to 1023 translate it in SSA form is to insert a phi instruction. 1024 1025 @ifstmt 1026 jnz %x, @ift, @iff 1027 @ift 1028 jmp @retstmt 1029 @iff 1030 jmp @retstmt 1031 @retstmt 1032 %y =w phi @ift 1, @iff 2 1033 ret %y 1034 1035 Phi instructions return one of their arguments depending 1036 on where the control came from. In the example, `%y` is 1037 set to 1 if the `@ift` branch is taken, or it is set to 1038 2 otherwise. 1039 1040 An important remark about phi instructions is that QBE 1041 assumes that if a variable is defined by a phi it respects 1042 all the SSA invariants. So it is critical to not use phi 1043 instructions unless you know exactly what you are doing. 1044 1045 - 8. Instructions Index 1046 ----------------------- 1047 1048 * <@ Arithmetic and Bits >: 1049 1050 * `add` 1051 * `and` 1052 * `div` 1053 * `mul` 1054 * `neg` 1055 * `or` 1056 * `rem` 1057 * `sar` 1058 * `shl` 1059 * `shr` 1060 * `sub` 1061 * `udiv` 1062 * `urem` 1063 * `xor` 1064 1065 * <@ Memory >: 1066 1067 * `alloc16` 1068 * `alloc4` 1069 * `alloc8` 1070 * `blit` 1071 * `loadd` 1072 * `loadl` 1073 * `loads` 1074 * `loadsb` 1075 * `loadsh` 1076 * `loadsw` 1077 * `loadub` 1078 * `loaduh` 1079 * `loaduw` 1080 * `loadw` 1081 * `storeb` 1082 * `stored` 1083 * `storeh` 1084 * `storel` 1085 * `stores` 1086 * `storew` 1087 1088 * <@ Comparisons >: 1089 1090 * `ceqd` 1091 * `ceql` 1092 * `ceqs` 1093 * `ceqw` 1094 * `cged` 1095 * `cges` 1096 * `cgtd` 1097 * `cgts` 1098 * `cled` 1099 * `cles` 1100 * `cltd` 1101 * `clts` 1102 * `cned` 1103 * `cnel` 1104 * `cnes` 1105 * `cnew` 1106 * `cod` 1107 * `cos` 1108 * `csgel` 1109 * `csgew` 1110 * `csgtl` 1111 * `csgtw` 1112 * `cslel` 1113 * `cslew` 1114 * `csltl` 1115 * `csltw` 1116 * `cugel` 1117 * `cugew` 1118 * `cugtl` 1119 * `cugtw` 1120 * `culel` 1121 * `culew` 1122 * `cultl` 1123 * `cultw` 1124 * `cuod` 1125 * `cuos` 1126 1127 * <@ Conversions >: 1128 1129 * `dtosi` 1130 * `dtoui` 1131 * `exts` 1132 * `extsb` 1133 * `extsh` 1134 * `extsw` 1135 * `extub` 1136 * `extuh` 1137 * `extuw` 1138 * `sltof` 1139 * `ultof` 1140 * `stosi` 1141 * `stoui` 1142 * `swtof` 1143 * `uwtof` 1144 * `truncd` 1145 1146 * <@ Cast and Copy > : 1147 1148 * `cast` 1149 * `copy` 1150 1151 * <@ Call >: 1152 1153 * `call` 1154 1155 * <@ Variadic >: 1156 1157 * `vastart` 1158 * `vaarg` 1159 1160 * <@ Phi >: 1161 1162 * `phi` 1163 1164 * <@ Jumps >: 1165 1166 * `hlt` 1167 * `jmp` 1168 * `jnz` 1169 * `ret`