1 @c Copyright (C) 2009-2014 Free Software Foundation, Inc. 2 @c This is part of the GAS manual. 3 @c For copying conditions, see the file as.texinfo. 4 @ifset GENERIC 5 @page 6 @node S/390-Dependent 7 @chapter IBM S/390 Dependent Features 8 @end ifset 9 @ifclear GENERIC 10 @node Machine Dependencies 11 @chapter IBM S/390 Dependent Features 12 @end ifclear 13 14 @cindex s390 support 15 16 The s390 version of @code{@value{AS}} supports two architectures modes 17 and seven chip levels. The architecture modes are the Enterprise System 18 Architecture (ESA) and the newer z/Architecture mode. The chip levels 19 are g5, g6, z900, z990, z9-109, z9-ec, z10, z196, and zEC12. 20 21 @menu 22 * s390 Options:: Command-line Options. 23 * s390 Characters:: Special Characters. 24 * s390 Syntax:: Assembler Instruction syntax. 25 * s390 Directives:: Assembler Directives. 26 * s390 Floating Point:: Floating Point. 27 @end menu 28 29 @node s390 Options 30 @section Options 31 @cindex options for s390 32 @cindex s390 options 33 34 The following table lists all available s390 specific options: 35 36 @table @code 37 @cindex @samp{-m31} option, s390 38 @cindex @samp{-m64} option, s390 39 @item -m31 | -m64 40 Select 31- or 64-bit ABI implying a word size of 32- or 64-bit. 41 42 These options are only available with the ELF object file format, and 43 require that the necessary BFD support has been included (on a 31-bit 44 platform you must add --enable-64-bit-bfd on the call to the configure 45 script to enable 64-bit usage and use s390x as target platform). 46 47 @cindex @samp{-mesa} option, s390 48 @cindex @samp{-mzarch} option, s390 49 @item -mesa | -mzarch 50 Select the architecture mode, either the Enterprise System Architecture 51 (esa) mode or the z/Architecture mode (zarch). 52 53 The 64-bit instructions are only available with the z/Architecture mode. 54 The combination of @samp{-m64} and @samp{-mesa} results in a warning 55 message. 56 57 @cindex @samp{-march=} option, s390 58 @item -march=@var{CPU} 59 This option specifies the target processor. The following processor names 60 are recognized: 61 @code{g5}, 62 @code{g6}, 63 @code{z900}, 64 @code{z990}, 65 @code{z9-109}, 66 @code{z9-ec}, 67 @code{z10} and 68 @code{z196}. 69 Assembling an instruction that is not supported on the target processor 70 results in an error message. Do not specify @code{g5} or @code{g6} 71 with @samp{-mzarch}. 72 73 @cindex @samp{-mregnames} option, s390 74 @item -mregnames 75 Allow symbolic names for registers. 76 77 @cindex @samp{-mno-regnames} option, s390 78 @item -mno-regnames 79 Do not allow symbolic names for registers. 80 81 @cindex @samp{-mwarn-areg-zero} option, s390 82 @item -mwarn-areg-zero 83 Warn whenever the operand for a base or index register has been specified 84 but evaluates to zero. This can indicate the misuse of general purpose 85 register 0 as an address register. 86 87 @end table 88 89 @node s390 Characters 90 @section Special Characters 91 @cindex line comment character, s390 92 @cindex s390 line comment character 93 94 @samp{#} is the line comment character. 95 96 If a @samp{#} appears as the first character of a line then the whole 97 line is treated as a comment, but in this case the line could also be 98 a logical line number directive (@pxref{Comments}) or a preprocessor 99 control command (@pxref{Preprocessing}). 100 101 @cindex line separator, s390 102 @cindex statement separator, s390 103 @cindex s390 line separator 104 The @samp{;} character can be used instead of a newline to separate 105 statements. 106 107 @node s390 Syntax 108 @section Instruction syntax 109 @cindex instruction syntax, s390 110 @cindex s390 instruction syntax 111 112 The assembler syntax closely follows the syntax outlined in 113 Enterprise Systems Architecture/390 Principles of Operation (SA22-7201) 114 and the z/Architecture Principles of Operation (SA22-7832). 115 116 Each instruction has two major parts, the instruction mnemonic 117 and the instruction operands. The instruction format varies. 118 119 @menu 120 * s390 Register:: Register Naming 121 * s390 Mnemonics:: Instruction Mnemonics 122 * s390 Operands:: Instruction Operands 123 * s390 Formats:: Instruction Formats 124 * s390 Aliases:: Instruction Aliases 125 * s390 Operand Modifier:: Instruction Operand Modifier 126 * s390 Instruction Marker:: Instruction Marker 127 * s390 Literal Pool Entries:: Literal Pool Entries 128 @end menu 129 130 @node s390 Register 131 @subsection Register naming 132 @cindex register naming, s390 133 @cindex s390 register naming 134 135 The @code{@value{AS}} recognizes a number of predefined symbols for the 136 various processor registers. A register specification in one of the 137 instruction formats is an unsigned integer between 0 and 15. The specific 138 instruction and the position of the register in the instruction format 139 denotes the type of the register. The register symbols are prefixed with 140 @samp{%}: 141 142 @display 143 @multitable {%rN} {the 16 general purpose registers, 0 <= N <= 15} 144 @item %rN @tab the 16 general purpose registers, 0 <= N <= 15 145 @item %fN @tab the 16 floating point registers, 0 <= N <= 15 146 @item %aN @tab the 16 access registers, 0 <= N <= 15 147 @item %cN @tab the 16 control registers, 0 <= N <= 15 148 @item %lit @tab an alias for the general purpose register %r13 149 @item %sp @tab an alias for the general purpose register %r15 150 @end multitable 151 @end display 152 153 @node s390 Mnemonics 154 @subsection Instruction Mnemonics 155 @cindex instruction mnemonics, s390 156 @cindex s390 instruction mnemonics 157 158 All instructions documented in the Principles of Operation are supported 159 with the mnemonic and order of operands as described. 160 The instruction mnemonic identifies the instruction format 161 (@ref{s390 Formats}) and the specific operation code for the instruction. 162 For example, the @samp{lr} mnemonic denotes the instruction format @samp{RR} 163 with the operation code @samp{0x18}. 164 165 The definition of the various mnemonics follows a scheme, where the first 166 character usually hint at the type of the instruction: 167 168 @display 169 @multitable {sla, sll} {if r is the last character the instruction operates on registers} 170 @item a @tab add instruction, for example @samp{al} for add logical 32-bit 171 @item b @tab branch instruction, for example @samp{bc} for branch on condition 172 @item c @tab compare or convert instruction, for example @samp{cr} for compare 173 register 32-bit 174 @item d @tab divide instruction, for example @samp{dlr} devide logical register 175 64-bit to 32-bit 176 @item i @tab insert instruction, for example @samp{ic} insert character 177 @item l @tab load instruction, for example @samp{ltr} load and test register 178 @item mv @tab move instruction, for example @samp{mvc} move character 179 @item m @tab multiply instruction, for example @samp{mh} multiply halfword 180 @item n @tab and instruction, for example @samp{ni} and immediate 181 @item o @tab or instruction, for example @samp{oc} or character 182 @item sla, sll @tab shift left single instruction 183 @item sra, srl @tab shift right single instruction 184 @item st @tab store instruction, for example @samp{stm} store multiple 185 @item s @tab subtract instruction, for example @samp{slr} subtract 186 logical 32-bit 187 @item t @tab test or translate instruction, of example @samp{tm} test under mask 188 @item x @tab exclusive or instruction, for example @samp{xc} exclusive or 189 character 190 @end multitable 191 @end display 192 193 Certain characters at the end of the mnemonic may describe a property 194 of the instruction: 195 196 @display 197 @multitable {c} {if r is the last character the instruction operates on registers} 198 @item c @tab the instruction uses a 8-bit character operand 199 @item f @tab the instruction extends a 32-bit operand to 64 bit 200 @item g @tab the operands are treated as 64-bit values 201 @item h @tab the operand uses a 16-bit halfword operand 202 @item i @tab the instruction uses an immediate operand 203 @item l @tab the instruction uses unsigned, logical operands 204 @item m @tab the instruction uses a mask or operates on multiple values 205 @item r @tab if r is the last character, the instruction operates on registers 206 @item y @tab the instruction uses 20-bit displacements 207 @end multitable 208 @end display 209 210 There are many exceptions to the scheme outlined in the above lists, in 211 particular for the priviledged instructions. For non-priviledged 212 instruction it works quite well, for example the instruction @samp{clgfr} 213 c: compare instruction, l: unsigned operands, g: 64-bit operands, 214 f: 32- to 64-bit extension, r: register operands. The instruction compares 215 an 64-bit value in a register with the zero extended 32-bit value from 216 a second register. 217 For a complete list of all mnemonics see appendix B in the Principles 218 of Operation. 219 220 @node s390 Operands 221 @subsection Instruction Operands 222 @cindex instruction operands, s390 223 @cindex s390 instruction operands 224 225 Instruction operands can be grouped into three classes, operands located 226 in registers, immediate operands, and operands in storage. 227 228 A register operand can be located in general, floating-point, access, 229 or control register. The register is identified by a four-bit field. 230 The field containing the register operand is called the R field. 231 232 Immediate operands are contained within the instruction and can have 233 8, 16 or 32 bits. The field containing the immediate operand is called 234 the I field. Dependent on the instruction the I field is either signed 235 or unsigned. 236 237 A storage operand consists of an address and a length. The address of a 238 storage operands can be specified in any of these ways: 239 240 @itemize 241 @item The content of a single general R 242 @item The sum of the content of a general register called the base 243 register B plus the content of a displacement field D 244 @item The sum of the contents of two general registers called the 245 index register X and the base register B plus the content of a 246 displacement field 247 @item The sum of the current instruction address and a 32-bit signed 248 immediate field multiplied by two. 249 @end itemize 250 251 The length of a storage operand can be: 252 253 @itemize 254 @item Implied by the instruction 255 @item Specified by a bitmask 256 @item Specified by a four-bit or eight-bit length field L 257 @item Specified by the content of a general register 258 @end itemize 259 260 The notation for storage operand addresses formed from multiple fields is 261 as follows: 262 263 @table @code 264 @item Dn(Bn) 265 the address for operand number n is formed from the content of general 266 register Bn called the base register and the displacement field Dn. 267 @item Dn(Xn,Bn) 268 the address for operand number n is formed from the content of general 269 register Xn called the index register, general register Bn called the 270 base register and the displacement field Dn. 271 @item Dn(Ln,Bn) 272 the address for operand number n is formed from the content of general 273 regiser Bn called the base register and the displacement field Dn. 274 The length of the operand n is specified by the field Ln. 275 @end table 276 277 The base registers Bn and the index registers Xn of a storage operand can 278 be skipped. If Bn and Xn are skipped, a zero will be stored to the operand 279 field. The notation changes as follows: 280 281 @display 282 @multitable @columnfractions 0.30 0.30 283 @headitem full notation @tab short notation 284 @item Dn(0,Bn) @tab Dn(Bn) 285 @item Dn(0,0) @tab Dn 286 @item Dn(0) @tab Dn 287 @item Dn(Ln,0) @tab Dn(Ln) 288 @end multitable 289 @end display 290 291 292 @node s390 Formats 293 @subsection Instruction Formats 294 @cindex instruction formats, s390 295 @cindex s390 instruction formats 296 297 The Principles of Operation manuals lists 26 instruction formats where 298 some of the formats have multiple variants. For the @samp{.insn} 299 pseudo directive the assembler recognizes some of the formats. 300 Typically, the most general variant of the instruction format is used 301 by the @samp{.insn} directive. 302 303 The following table lists the abbreviations used in the table of 304 instruction formats: 305 306 @display 307 @multitable {OpCode / OpCd} {Displacement lower 12 bits for operand x.} 308 @item OpCode / OpCd @tab Part of the op code. 309 @item Bx @tab Base register number for operand x. 310 @item Dx @tab Displacement for operand x. 311 @item DLx @tab Displacement lower 12 bits for operand x. 312 @item DHx @tab Displacement higher 8-bits for operand x. 313 @item Rx @tab Register number for operand x. 314 @item Xx @tab Index register number for operand x. 315 @item Ix @tab Signed immediate for operand x. 316 @item Ux @tab Unsigned immediate for operand x. 317 @end multitable 318 @end display 319 320 An instruction is two, four, or six bytes in length and must be aligned 321 on a 2 byte boundary. The first two bits of the instruction specify the 322 length of the instruction, 00 indicates a two byte instruction, 01 and 10 323 indicates a four byte instruction, and 11 indicates a six byte instruction. 324 325 The following table lists the s390 instruction formats that are available 326 with the @samp{.insn} pseudo directive: 327 328 @table @code 329 @item E format 330 @verbatim 331 +-------------+ 332 | OpCode | 333 +-------------+ 334 0 15 335 @end verbatim 336 337 @item RI format: <insn> R1,I2 338 @verbatim 339 +--------+----+----+------------------+ 340 | OpCode | R1 |OpCd| I2 | 341 +--------+----+----+------------------+ 342 0 8 12 16 31 343 @end verbatim 344 345 @item RIE format: <insn> R1,R3,I2 346 @verbatim 347 +--------+----+----+------------------+--------+--------+ 348 | OpCode | R1 | R3 | I2 |////////| OpCode | 349 +--------+----+----+------------------+--------+--------+ 350 0 8 12 16 32 40 47 351 @end verbatim 352 353 @item RIL format: <insn> R1,I2 354 @verbatim 355 +--------+----+----+------------------------------------+ 356 | OpCode | R1 |OpCd| I2 | 357 +--------+----+----+------------------------------------+ 358 0 8 12 16 47 359 @end verbatim 360 361 @item RILU format: <insn> R1,U2 362 @verbatim 363 +--------+----+----+------------------------------------+ 364 | OpCode | R1 |OpCd| U2 | 365 +--------+----+----+------------------------------------+ 366 0 8 12 16 47 367 @end verbatim 368 369 @item RIS format: <insn> R1,I2,M3,D4(B4) 370 @verbatim 371 +--------+----+----+----+-------------+--------+--------+ 372 | OpCode | R1 | M3 | B4 | D4 | I2 | Opcode | 373 +--------+----+----+----+-------------+--------+--------+ 374 0 8 12 16 20 32 36 47 375 @end verbatim 376 377 @item RR format: <insn> R1,R2 378 @verbatim 379 +--------+----+----+ 380 | OpCode | R1 | R2 | 381 +--------+----+----+ 382 0 8 12 15 383 @end verbatim 384 385 @item RRE format: <insn> R1,R2 386 @verbatim 387 +------------------+--------+----+----+ 388 | OpCode |////////| R1 | R2 | 389 +------------------+--------+----+----+ 390 0 16 24 28 31 391 @end verbatim 392 393 @item RRF format: <insn> R1,R2,R3,M4 394 @verbatim 395 +------------------+----+----+----+----+ 396 | OpCode | R3 | M4 | R1 | R2 | 397 +------------------+----+----+----+----+ 398 0 16 20 24 28 31 399 @end verbatim 400 401 @item RRS format: <insn> R1,R2,M3,D4(B4) 402 @verbatim 403 +--------+----+----+----+-------------+----+----+--------+ 404 | OpCode | R1 | R3 | B4 | D4 | M3 |////| OpCode | 405 +--------+----+----+----+-------------+----+----+--------+ 406 0 8 12 16 20 32 36 40 47 407 @end verbatim 408 409 @item RS format: <insn> R1,R3,D2(B2) 410 @verbatim 411 +--------+----+----+----+-------------+ 412 | OpCode | R1 | R3 | B2 | D2 | 413 +--------+----+----+----+-------------+ 414 0 8 12 16 20 31 415 @end verbatim 416 417 @item RSE format: <insn> R1,R3,D2(B2) 418 @verbatim 419 +--------+----+----+----+-------------+--------+--------+ 420 | OpCode | R1 | R3 | B2 | D2 |////////| OpCode | 421 +--------+----+----+----+-------------+--------+--------+ 422 0 8 12 16 20 32 40 47 423 @end verbatim 424 425 @item RSI format: <insn> R1,R3,I2 426 @verbatim 427 +--------+----+----+------------------------------------+ 428 | OpCode | R1 | R3 | I2 | 429 +--------+----+----+------------------------------------+ 430 0 8 12 16 47 431 @end verbatim 432 433 @item RSY format: <insn> R1,R3,D2(B2) 434 @verbatim 435 +--------+----+----+----+-------------+--------+--------+ 436 | OpCode | R1 | R3 | B2 | DL2 | DH2 | OpCode | 437 +--------+----+----+----+-------------+--------+--------+ 438 0 8 12 16 20 32 40 47 439 @end verbatim 440 441 @item RX format: <insn> R1,D2(X2,B2) 442 @verbatim 443 +--------+----+----+----+-------------+ 444 | OpCode | R1 | X2 | B2 | D2 | 445 +--------+----+----+----+-------------+ 446 0 8 12 16 20 31 447 @end verbatim 448 449 @item RXE format: <insn> R1,D2(X2,B2) 450 @verbatim 451 +--------+----+----+----+-------------+--------+--------+ 452 | OpCode | R1 | X2 | B2 | D2 |////////| OpCode | 453 +--------+----+----+----+-------------+--------+--------+ 454 0 8 12 16 20 32 40 47 455 @end verbatim 456 457 @item RXF format: <insn> R1,R3,D2(X2,B2) 458 @verbatim 459 +--------+----+----+----+-------------+----+---+--------+ 460 | OpCode | R3 | X2 | B2 | D2 | R1 |///| OpCode | 461 +--------+----+----+----+-------------+----+---+--------+ 462 0 8 12 16 20 32 36 40 47 463 @end verbatim 464 465 @item RXY format: <insn> R1,D2(X2,B2) 466 @verbatim 467 +--------+----+----+----+-------------+--------+--------+ 468 | OpCode | R1 | X2 | B2 | DL2 | DH2 | OpCode | 469 +--------+----+----+----+-------------+--------+--------+ 470 0 8 12 16 20 32 36 40 47 471 @end verbatim 472 473 @item S format: <insn> D2(B2) 474 @verbatim 475 +------------------+----+-------------+ 476 | OpCode | B2 | D2 | 477 +------------------+----+-------------+ 478 0 16 20 31 479 @end verbatim 480 481 @item SI format: <insn> D1(B1),I2 482 @verbatim 483 +--------+---------+----+-------------+ 484 | OpCode | I2 | B1 | D1 | 485 +--------+---------+----+-------------+ 486 0 8 16 20 31 487 @end verbatim 488 489 @item SIY format: <insn> D1(B1),U2 490 @verbatim 491 +--------+---------+----+-------------+--------+--------+ 492 | OpCode | I2 | B1 | DL1 | DH1 | OpCode | 493 +--------+---------+----+-------------+--------+--------+ 494 0 8 16 20 32 36 40 47 495 @end verbatim 496 497 @item SIL format: <insn> D1(B1),I2 498 @verbatim 499 +------------------+----+-------------+-----------------+ 500 | OpCode | B1 | D1 | I2 | 501 +------------------+----+-------------+-----------------+ 502 0 16 20 32 47 503 @end verbatim 504 505 @item SS format: <insn> D1(R1,B1),D2(B3),R3 506 @verbatim 507 +--------+----+----+----+-------------+----+------------+ 508 | OpCode | R1 | R3 | B1 | D1 | B2 | D2 | 509 +--------+----+----+----+-------------+----+------------+ 510 0 8 12 16 20 32 36 47 511 @end verbatim 512 513 @item SSE format: <insn> D1(B1),D2(B2) 514 @verbatim 515 +------------------+----+-------------+----+------------+ 516 | OpCode | B1 | D1 | B2 | D2 | 517 +------------------+----+-------------+----+------------+ 518 0 8 12 16 20 32 36 47 519 @end verbatim 520 521 @item SSF format: <insn> D1(B1),D2(B2),R3 522 @verbatim 523 +--------+----+----+----+-------------+----+------------+ 524 | OpCode | R3 |OpCd| B1 | D1 | B2 | D2 | 525 +--------+----+----+----+-------------+----+------------+ 526 0 8 12 16 20 32 36 47 527 @end verbatim 528 529 @end table 530 531 For the complete list of all instruction format variants see the 532 Principles of Operation manuals. 533 534 @node s390 Aliases 535 @subsection Instruction Aliases 536 @cindex instruction aliases, s390 537 @cindex s390 instruction aliases 538 539 A specific bit pattern can have multiple mnemonics, for example 540 the bit pattern @samp{0xa7000000} has the mnemonics @samp{tmh} and 541 @samp{tmlh}. In addition, there are a number of mnemonics recognized by 542 @code{@value{AS}} that are not present in the Principles of Operation. 543 These are the short forms of the branch instructions, where the condition 544 code mask operand is encoded in the mnemonic. This is relevant for the 545 branch instructions, the compare and branch instructions, and the 546 compare and trap instructions. 547 548 For the branch instructions there are 20 condition code strings that can 549 be used as part of the mnemonic in place of a mask operand in the instruction 550 format: 551 552 @display 553 @multitable @columnfractions .30 .30 554 @headitem instruction @tab short form 555 @item bcr M1,R2 @tab b<m>r R2 556 @item bc M1,D2(X2,B2) @tab b<m> D2(X2,B2) 557 @item brc M1,I2 @tab j<m> I2 558 @item brcl M1,I2 @tab jg<m> I2 559 @end multitable 560 @end display 561 562 In the mnemonic for a branch instruction the condition code string <m> 563 can be any of the following: 564 565 @display 566 @multitable {nle} {jump on not zero / if not zeros} 567 @item o @tab jump on overflow / if ones 568 @item h @tab jump on A high 569 @item p @tab jump on plus 570 @item nle @tab jump on not low or equal 571 @item l @tab jump on A low 572 @item m @tab jump on minus 573 @item nhe @tab jump on not high or equal 574 @item lh @tab jump on low or high 575 @item ne @tab jump on A not equal B 576 @item nz @tab jump on not zero / if not zeros 577 @item e @tab jump on A equal B 578 @item z @tab jump on zero / if zeroes 579 @item nlh @tab jump on not low or high 580 @item he @tab jump on high or equal 581 @item nl @tab jump on A not low 582 @item nm @tab jump on not minus / if not mixed 583 @item le @tab jump on low or equal 584 @item nh @tab jump on A not high 585 @item np @tab jump on not plus 586 @item no @tab jump on not overflow / if not ones 587 @end multitable 588 @end display 589 590 For the compare and branch, and compare and trap instructions there 591 are 12 condition code strings that can be used as part of the mnemonic in 592 place of a mask operand in the instruction format: 593 594 @display 595 @multitable @columnfractions .40 .40 596 @headitem instruction @tab short form 597 @item crb R1,R2,M3,D4(B4) @tab crb<m> R1,R2,D4(B4) 598 @item cgrb R1,R2,M3,D4(B4) @tab cgrb<m> R1,R2,D4(B4) 599 @item crj R1,R2,M3,I4 @tab crj<m> R1,R2,I4 600 @item cgrj R1,R2,M3,I4 @tab cgrj<m> R1,R2,I4 601 @item cib R1,I2,M3,D4(B4) @tab cib<m> R1,I2,D4(B4) 602 @item cgib R1,I2,M3,D4(B4) @tab cgib<m> R1,I2,D4(B4) 603 @item cij R1,I2,M3,I4 @tab cij<m> R1,I2,I4 604 @item cgij R1,I2,M3,I4 @tab cgij<m> R1,I2,I4 605 @item crt R1,R2,M3 @tab crt<m> R1,R2 606 @item cgrt R1,R2,M3 @tab cgrt<m> R1,R2 607 @item cit R1,I2,M3 @tab cit<m> R1,I2 608 @item cgit R1,I2,M3 @tab cgit<m> R1,I2 609 @item clrb R1,R2,M3,D4(B4) @tab clrb<m> R1,R2,D4(B4) 610 @item clgrb R1,R2,M3,D4(B4) @tab clgrb<m> R1,R2,D4(B4) 611 @item clrj R1,R2,M3,I4 @tab clrj<m> R1,R2,I4 612 @item clgrj R1,R2,M3,I4 @tab clgrj<m> R1,R2,I4 613 @item clib R1,I2,M3,D4(B4) @tab clib<m> R1,I2,D4(B4) 614 @item clgib R1,I2,M3,D4(B4) @tab clgib<m> R1,I2,D4(B4) 615 @item clij R1,I2,M3,I4 @tab clij<m> R1,I2,I4 616 @item clgij R1,I2,M3,I4 @tab clgij<m> R1,I2,I4 617 @item clrt R1,R2,M3 @tab clrt<m> R1,R2 618 @item clgrt R1,R2,M3 @tab clgrt<m> R1,R2 619 @item clfit R1,I2,M3 @tab clfit<m> R1,I2 620 @item clgit R1,I2,M3 @tab clgit<m> R1,I2 621 @end multitable 622 @end display 623 624 In the mnemonic for a compare and branch and compare and trap instruction 625 the condition code string <m> can be any of the following: 626 627 @display 628 @multitable {nle} {jump on not zero / if not zeros} 629 @item h @tab jump on A high 630 @item nle @tab jump on not low or equal 631 @item l @tab jump on A low 632 @item nhe @tab jump on not high or equal 633 @item ne @tab jump on A not equal B 634 @item lh @tab jump on low or high 635 @item e @tab jump on A equal B 636 @item nlh @tab jump on not low or high 637 @item nl @tab jump on A not low 638 @item he @tab jump on high or equal 639 @item nh @tab jump on A not high 640 @item le @tab jump on low or equal 641 @end multitable 642 @end display 643 644 @node s390 Operand Modifier 645 @subsection Instruction Operand Modifier 646 @cindex instruction operand modifier, s390 647 @cindex s390 instruction operand modifier 648 649 If a symbol modifier is attached to a symbol in an expression for an 650 instruction operand field, the symbol term is replaced with a reference 651 to an object in the global offset table (GOT) or the procedure linkage 652 table (PLT). The following expressions are allowed: 653 @samp{symbol@@modifier + constant}, 654 @samp{symbol@@modifier + label + constant}, and 655 @samp{symbol@@modifier - label + constant}. 656 The term @samp{symbol} is the symbol that will be entered into the GOT or 657 PLT, @samp{label} is a local label, and @samp{constant} is an arbitrary 658 expression that the assembler can evaluate to a constant value. 659 660 The term @samp{(symbol + constant1)@@modifier +/- label + constant2} 661 is also accepted but a warning message is printed and the term is 662 converted to @samp{symbol@@modifier +/- label + constant1 + constant2}. 663 664 @table @code 665 @item @@got 666 @itemx @@got12 667 The @@got modifier can be used for displacement fields, 16-bit immediate 668 fields and 32-bit pc-relative immediate fields. The @@got12 modifier is 669 synonym to @@got. The symbol is added to the GOT. For displacement 670 fields and 16-bit immediate fields the symbol term is replaced with 671 the offset from the start of the GOT to the GOT slot for the symbol. 672 For a 32-bit pc-relative field the pc-relative offset to the GOT 673 slot from the current instruction address is used. 674 @item @@gotent 675 The @@gotent modifier can be used for 32-bit pc-relative immediate fields. 676 The symbol is added to the GOT and the symbol term is replaced with 677 the pc-relative offset from the current instruction to the GOT slot for the 678 symbol. 679 @item @@gotoff 680 The @@gotoff modifier can be used for 16-bit immediate fields. The symbol 681 term is replaced with the offset from the start of the GOT to the 682 address of the symbol. 683 @item @@gotplt 684 The @@gotplt modifier can be used for displacement fields, 16-bit immediate 685 fields, and 32-bit pc-relative immediate fields. A procedure linkage 686 table entry is generated for the symbol and a jump slot for the symbol 687 is added to the GOT. For displacement fields and 16-bit immediate 688 fields the symbol term is replaced with the offset from the start of the 689 GOT to the jump slot for the symbol. For a 32-bit pc-relative field 690 the pc-relative offset to the jump slot from the current instruction 691 address is used. 692 @item @@plt 693 The @@plt modifier can be used for 16-bit and 32-bit pc-relative immediate 694 fields. A procedure linkage table entry is generated for the symbol. 695 The symbol term is replaced with the relative offset from the current 696 instruction to the PLT entry for the symbol. 697 @item @@pltoff 698 The @@pltoff modifier can be used for 16-bit immediate fields. The symbol 699 term is replaced with the offset from the start of the PLT to the address 700 of the symbol. 701 @item @@gotntpoff 702 The @@gotntpoff modifier can be used for displacement fields. The symbol 703 is added to the static TLS block and the negated offset to the symbol 704 in the static TLS block is added to the GOT. The symbol term is replaced 705 with the offset to the GOT slot from the start of the GOT. 706 @item @@indntpoff 707 The @@indntpoff modifier can be used for 32-bit pc-relative immediate 708 fields. The symbol is added to the static TLS block and the negated offset 709 to the symbol in the static TLS block is added to the GOT. The symbol term 710 is replaced with the pc-relative offset to the GOT slot from the current 711 instruction address. 712 @end table 713 714 For more information about the thread local storage modifiers 715 @samp{gotntpoff} and @samp{indntpoff} see the ELF extension documentation 716 @samp{ELF Handling For Thread-Local Storage}. 717 718 @node s390 Instruction Marker 719 @subsection Instruction Marker 720 @cindex instruction marker, s390 721 @cindex s390 instruction marker 722 723 The thread local storage instruction markers are used by the linker to 724 perform code optimization. 725 726 @table @code 727 @item :tls_load 728 The :tls_load marker is used to flag the load instruction in the initial 729 exec TLS model that retrieves the offset from the thread pointer to a 730 thread local storage variable from the GOT. 731 @item :tls_gdcall 732 The :tls_gdcall marker is used to flag the branch-and-save instruction to 733 the __tls_get_offset function in the global dynamic TLS model. 734 @item :tls_ldcall 735 The :tls_ldcall marker is used to flag the branch-and-save instruction to 736 the __tls_get_offset function in the local dynamic TLS model. 737 @end table 738 739 For more information about the thread local storage instruction marker 740 and the linker optimizations see the ELF extension documentation 741 @samp{ELF Handling For Thread-Local Storage}. 742 743 @node s390 Literal Pool Entries 744 @subsection Literal Pool Entries 745 @cindex literal pool entries, s390 746 @cindex s390 literal pool entries 747 748 A literal pool is a collection of values. To access the values a pointer 749 to the literal pool is loaded to a register, the literal pool register. 750 Usually, register %r13 is used as the literal pool register 751 (@ref{s390 Register}). Literal pool entries are created by adding the 752 suffix :lit1, :lit2, :lit4, or :lit8 to the end of an expression for an 753 instruction operand. The expression is added to the literal pool and the 754 operand is replaced with the offset to the literal in the literal pool. 755 756 @table @code 757 @item :lit1 758 The literal pool entry is created as an 8-bit value. An operand modifier 759 must not be used for the original expression. 760 @item :lit2 761 The literal pool entry is created as a 16 bit value. The operand modifier 762 @@got may be used in the original expression. The term @samp{x@@got:lit2} 763 will put the got offset for the global symbol x to the literal pool as 764 16 bit value. 765 @item :lit4 766 The literal pool entry is created as a 32-bit value. The operand modifier 767 @@got and @@plt may be used in the original expression. The term 768 @samp{x@@got:lit4} will put the got offset for the global symbol x to the 769 literal pool as a 32-bit value. The term @samp{x@@plt:lit4} will put the 770 plt offset for the global symbol x to the literal pool as a 32-bit value. 771 @item :lit8 772 The literal pool entry is created as a 64-bit value. The operand modifier 773 @@got and @@plt may be used in the original expression. The term 774 @samp{x@@got:lit8} will put the got offset for the global symbol x to the 775 literal pool as a 64-bit value. The term @samp{x@@plt:lit8} will put the 776 plt offset for the global symbol x to the literal pool as a 64-bit value. 777 @end table 778 779 The assembler directive @samp{.ltorg} is used to emit all literal pool 780 entries to the current position. 781 782 @node s390 Directives 783 @section Assembler Directives 784 785 @code{@value{AS}} for s390 supports all of the standard ELF 786 assembler directives as outlined in the main part of this document. 787 Some directives have been extended and there are some additional 788 directives, which are only available for the s390 @code{@value{AS}}. 789 790 @table @code 791 @cindex @code{.insn} directive, s390 792 @item .insn 793 This directive permits the numeric representation of an instructions 794 and makes the assembler insert the operands according to one of the 795 instructions formats for @samp{.insn} (@ref{s390 Formats}). 796 For example, the instruction @samp{l %r1,24(%r15)} could be written as 797 @samp{.insn rx,0x58000000,%r1,24(%r15)}. 798 @cindex @code{.short} directive, s390 799 @cindex @code{.long} directive, s390 800 @cindex @code{.quad} directive, s390 801 @item .short 802 @itemx .long 803 @itemx .quad 804 This directive places one or more 16-bit (.short), 32-bit (.long), or 805 64-bit (.quad) values into the current section. If an ELF or TLS modifier 806 is used only the following expressions are allowed: 807 @samp{symbol@@modifier + constant}, 808 @samp{symbol@@modifier + label + constant}, and 809 @samp{symbol@@modifier - label + constant}. 810 The following modifiers are available: 811 @table @code 812 @item @@got 813 @itemx @@got12 814 The @@got modifier can be used for .short, .long and .quad. The @@got12 815 modifier is synonym to @@got. The symbol is added to the GOT. The symbol 816 term is replaced with offset from the start of the GOT to the GOT slot for 817 the symbol. 818 @item @@gotoff 819 The @@gotoff modifier can be used for .short, .long and .quad. The symbol 820 term is replaced with the offset from the start of the GOT to the address 821 of the symbol. 822 @item @@gotplt 823 The @@gotplt modifier can be used for .long and .quad. A procedure linkage 824 table entry is generated for the symbol and a jump slot for the symbol 825 is added to the GOT. The symbol term is replaced with the offset from the 826 start of the GOT to the jump slot for the symbol. 827 @item @@plt 828 The @@plt modifier can be used for .long and .quad. A procedure linkage 829 table entry us generated for the symbol. The symbol term is replaced with 830 the address of the PLT entry for the symbol. 831 @item @@pltoff 832 The @@pltoff modifier can be used for .short, .long and .quad. The symbol 833 term is replaced with the offset from the start of the PLT to the address 834 of the symbol. 835 @item @@tlsgd 836 @itemx @@tlsldm 837 The @@tlsgd and @@tlsldm modifier can be used for .long and .quad. A 838 tls_index structure for the symbol is added to the GOT. The symbol term is 839 replaced with the offset from the start of the GOT to the tls_index structure. 840 @item @@gotntpoff 841 @itemx @@indntpoff 842 The @@gotntpoff and @@indntpoff modifier can be used for .long and .quad. 843 The symbol is added to the static TLS block and the negated offset to the 844 symbol in the static TLS block is added to the GOT. For @@gotntpoff the 845 symbol term is replaced with the offset from the start of the GOT to the 846 GOT slot, for @@indntpoff the symbol term is replaced with the address 847 of the GOT slot. 848 @item @@dtpoff 849 The @@dtpoff modifier can be used for .long and .quad. The symbol term 850 is replaced with the offset of the symbol relative to the start of the 851 TLS block it is contained in. 852 @item @@ntpoff 853 The @@ntpoff modifier can be used for .long and .quad. The symbol term 854 is replaced with the offset of the symbol relative to the TCB pointer. 855 @end table 856 857 For more information about the thread local storage modifiers see the 858 ELF extension documentation @samp{ELF Handling For Thread-Local Storage}. 859 860 @cindex @code{.ltorg} directive, s390 861 @item .ltorg 862 This directive causes the current contents of the literal pool to be 863 dumped to the current location (@ref{s390 Literal Pool Entries}). 864 865 @cindex @code{.machine} directive, s390 866 @item .machine string 867 This directive allows you to change the machine for which code is 868 generated. @code{string} may be any of the @code{-march=} selection 869 options (without the -march=), @code{push}, or @code{pop}. 870 @code{.machine push} saves the currently selected cpu, which may be 871 restored with @code{.machine pop}. Be aware that the cpu string has 872 to be put into double quotes in case it contains characters not 873 appropriate for identifiers. So you have to write @code{"z9-109"} 874 instead of just @code{z9-109}. 875 876 @cindex @code{.machinemode} directive, s390 877 @item .machinemode string 878 This directive allows to change the architecture mode for which code 879 is being generated. @code{string} may be @code{esa}, @code{zarch}, 880 @code{zarch_nohighgprs}, @code{push}, or @code{pop}. 881 @code{.machinemode zarch_nohighgprs} can be used to prevent the 882 @code{highgprs} flag from being set in the ELF header of the output 883 file. This is useful in situations where the code is gated with a 884 runtime check which makes sure that the code is only executed on 885 kernels providing the @code{highgprs} feature. 886 @code{.machinemode push} saves the currently selected mode, which may 887 be restored with @code{.machinemode pop}. 888 @end table 889 890 @node s390 Floating Point 891 @section Floating Point 892 @cindex floating point, s390 893 @cindex s390 floating point 894 895 The assembler recognizes both the @sc{ieee} floating-point instruction and 896 the hexadecimal floating-point instructions. The floating-point constructors 897 @samp{.float}, @samp{.single}, and @samp{.double} always emit the 898 @sc{ieee} format. To assemble hexadecimal floating-point constants the 899 @samp{.long} and @samp{.quad} directives must be used. 900