1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2015 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> 14 */ 15 16 #include <stdio.h> 17 #include <libdisasm.h> 18 #include <sys/sysmacros.h> 19 #include <sys/debug.h> 20 #include <sys/byteorder.h> 21 22 #include "libdisasm_impl.h" 23 24 #define ILC2LEN(ilc) (2 * ((ilc) >= 2 ? (ilc) : (ilc) + 1)) 25 26 /* 27 * Throughout this file, the instruction format names based on: 28 * SA22-7832-09 z/Architecture Principles of Operation 29 * 30 * System/370, ESA/390, and earlier z/Architecture POP use slightly 31 * different names for the formats (the variant names are numeric). For the 32 * sake of simplicity, we use the most detailed definitions - z/Architecture. 33 * 34 * For ESA/390 we map the formats: 35 * E -> E 36 * I -> I 37 * RR -> RR 38 * RRE -> RRE 39 * RRF -> RRD & RRFa-e 40 * RX -> RXa-b 41 * RXE -> RXE 42 * RXF -> RXF 43 * RS -> RSa-b 44 * RSE -> RSYa-b 45 * RSL -> RSLa 46 * RSI -> RSI 47 * RI -> RIa-c 48 * RIL -> RILa-c 49 * SI -> SI 50 * S -> S 51 * SS -> SSa-b & SSd-e 52 * SSE -> SSE 53 * 54 * For System/370 we map the formats: 55 * RR -> RR 56 * RX -> RXa-b 57 * RS -> RSa-b 58 * SI -> SI 59 * S -> S 60 * SS -> SSa-c 61 * 62 * Disassembly begins in tbl_xx. The first byte of the instruction is used 63 * as the index. This yields either an instruction or a sub-table. 64 * 65 * If an instruction is encountered, its format field is used to format the 66 * instruction. 67 * 68 * There are two types of sub-tables: extended opcode tables (indicated with 69 * IF_TBL) or a multiple mnemonics tables (indicated with IF_MULTI). 70 * 71 * Extended opcode tables indicade which additional bits of the instruction 72 * should be inspected. These bits are used as an index into the sub table. 73 * 74 * Multiple mnemonic tables are used to print different mnemonics depending 75 * on the architecture. Over the years, certain instructions got a new 76 * preferred mnemonic. For example, 0xa70 is test-under-mask-high (tmh) on 77 * System/390. On z/Architecture systems, the instruction behaves 78 * identically (and the assembler hapilly accepts tmh), but the preferred 79 * mnemonic is tmlh (test-under-mask-low-high) because z/Architecture 80 * extended the general purpose registers from 32 bits to 64 bits. The 81 * current architecture flag (e.g., F_390) is used to index into the 82 * sub-table. 83 * 84 * Regardless of which sub-table is encountered, the selected entry in the 85 * sub-table is interpreted using the same rules as the contents of tbl_xx. 86 * 87 * Finally, we use the extended opcode sub-table mechanism to pretty print 88 * the branching instructions. All branches are conditional based on a 89 * 4-bit mask indicating which value of the condition code will result in a 90 * taken branch. In order to produce a more human friendly output, we use 91 * the 4-bit mask as an extended opcode to break up the branching 92 * instruction into 16 different ones. For example, instead of printing: 93 * 94 * bc 7,0x123(%r1,%r2) 95 * 96 * we print: 97 * 98 * bne 0x123(%r1,%r2) 99 * 100 * Note that we are using designated initializers via the INSTR/TABLE/MULTI 101 * macros and therefore the below tables can be sparse. We rely on unset 102 * entries having zero format fields (aka. IF_INVAL) per C99. 103 */ 104 105 /* BEGIN CSTYLED */ 106 enum ifmt { 107 /* invalid */ 108 IF_INVAL = 0, 109 110 /* indirection */ 111 IF_TBL, 112 IF_MULTI, 113 114 /* 2-byte */ 115 IF_ZERO, /* 370, 390, z */ 116 IF_E, /* 390, z */ 117 IF_I, /* 390, z */ 118 IF_RR, /* 370, 390, z */ 119 120 /* 4-byte */ 121 IF_DIAG, /* 370, 390, z */ 122 IF_IE, /* z */ 123 IF_RIa, /* 390, z */ 124 IF_RIb, /* 390, z */ 125 IF_RIc, /* 390, z */ 126 IF_RRD, /* 390, z */ /* on 390 these are RRF */ 127 IF_RRE, /* 390, z */ 128 IF_RRFa, /* 390, z */ 129 IF_RRFb, /* 390, z */ 130 IF_RRFc, /* 390, z */ 131 IF_RRFd, /* 390, z */ 132 IF_RRFe, /* 390, z */ 133 IF_RSa, /* 370, 390, z */ 134 IF_RSb, /* 370, 390, z */ 135 IF_RSI, /* 390, z */ 136 IF_RXa, /* 370, 390, z */ 137 IF_RXb, /* 370, 390, z */ 138 IF_S, /* 370, 390, z */ 139 IF_SI, /* 370, 390, z */ 140 141 /* 6-byte */ 142 IF_MII, /* z */ 143 IF_RIEa, /* z */ 144 IF_RIEb, /* z */ 145 IF_RIEc, /* z */ 146 IF_RIEd, /* z */ 147 IF_RIEe, /* z */ 148 IF_RIEf, /* z */ 149 IF_RILa, /* 390, z */ 150 IF_RILb, /* 390, z */ 151 IF_RILc, /* 390, z */ 152 IF_RIS, /* z */ 153 IF_RRS, /* z */ 154 IF_RSLa, /* 390, z */ 155 IF_RSLb, /* z */ 156 IF_RSYa, /* z */ 157 IF_RSYb, /* z */ 158 IF_RXE, /* 390, z */ 159 IF_RXF, /* 390, z */ 160 IF_RXYa, /* z */ 161 IF_RXYb, /* z */ 162 IF_SIL, /* z */ 163 IF_SIY, /* z */ 164 IF_SMI, /* z */ 165 IF_SSa, /* 370, 390, z */ 166 IF_SSb, /* 370, 390, z */ 167 IF_SSc, /* 370, 390, z */ 168 IF_SSd, /* 390, z */ 169 IF_SSe, /* 390, z */ 170 IF_SSf, /* 390, z */ 171 IF_SSE, /* 390, z */ 172 IF_SSF, /* z */ 173 }; 174 175 #define IF_NFMTS (IF_SSF + 1) 176 177 #define F_370 0x0001 /* 370 */ 178 #define F_390 0x0002 /* 390 */ 179 #define F_Z 0x0004 /* z */ 180 #define F_SIGNED_IMM 0x0010 /* 370, 390, z */ 181 #define F_CTL_REG 0x0020 /* 370, 390, z */ 182 #define F_HIDE_MASK 0x0040 /* 370, 390, z */ 183 #define F_R1_IS_MASK 0x0080 /* 370, 390, z */ 184 /* END CSTYLED */ 185 186 struct inst_table { 187 union { 188 struct { 189 const char *it_name; 190 unsigned it_flags; 191 } it_inst; 192 struct { 193 const struct inst_table *it_ptr; 194 uint8_t it_off:4; 195 uint8_t it_shift:4; 196 uint8_t it_mask; 197 } it_table; 198 struct { 199 const struct inst_table *it_ptr; 200 } it_multi; 201 } it_u; 202 enum ifmt it_fmt; 203 }; 204 205 #define BITFLD(a, b) DECL_BITFIELD2(b:4, a:4) 206 207 union inst { 208 uint8_t raw[6]; 209 struct { 210 uint8_t op; 211 uint8_t par1; 212 uint16_t par2; 213 } diag; 214 struct { 215 uint8_t op; 216 uint8_t i; 217 } i; 218 struct { 219 uint16_t op; 220 uint8_t pad; 221 BITFLD(i1, i2); 222 } ie; 223 struct { 224 uint8_t op; 225 BITFLD(m1, ri2h); 226 uint8_t ri2l; 227 uint8_t ri3h; 228 uint16_t ri3l; 229 } mii; 230 struct { 231 uint8_t op; 232 BITFLD(r1, r2); 233 } rr; 234 struct { 235 uint16_t op; 236 BITFLD(r1, pad); 237 BITFLD(r3, r2); 238 } rrd; 239 struct { 240 uint16_t op; 241 uint8_t pad; 242 BITFLD(r1, r2); 243 } rre; 244 struct { 245 uint16_t op; 246 BITFLD(r1, m4); 247 BITFLD(r3, r2); 248 } rrf_ab; 249 struct { 250 uint16_t op; 251 BITFLD(m3, m4); 252 BITFLD(r1, r2); 253 } rrf_cde; 254 struct { 255 uint8_t op1; 256 BITFLD(r1, r2); 257 BITFLD(b4, d4h); 258 uint8_t d4l; 259 BITFLD(m3, pad); 260 uint8_t op2; 261 } rrs; 262 struct { 263 uint8_t op; 264 BITFLD(r1, x2); 265 BITFLD(b2, d2h); 266 uint8_t d2l; 267 } rx_a; 268 struct { 269 uint8_t op; 270 BITFLD(m1, x2); 271 BITFLD(b2, d2h); 272 uint8_t d2l; 273 } rx_b; 274 struct { 275 uint8_t op1; 276 BITFLD(r1, x2); 277 BITFLD(b2, d2h); 278 uint8_t d2l; 279 uint8_t pad; 280 uint8_t op2; 281 } rxe; 282 struct { 283 uint8_t op1; 284 BITFLD(r3, x2); 285 BITFLD(b2, d2h); 286 uint8_t d2l; 287 BITFLD(r1, pad); 288 uint8_t op2; 289 } rxf; 290 struct { 291 uint8_t op1; 292 BITFLD(r1, x2); 293 BITFLD(b2, dl2h); 294 uint8_t dl2l; 295 uint8_t dh2; 296 uint8_t op2; 297 } rxy_a; 298 struct { 299 uint8_t op1; 300 BITFLD(m1, x2); 301 BITFLD(b2, dl2h); 302 uint8_t dl2l; 303 uint8_t dh2; 304 uint8_t op2; 305 } rxy_b; 306 struct { 307 uint8_t op; 308 BITFLD(r1, r3); 309 BITFLD(b2, d2h); 310 uint8_t d2l; 311 } rs_a; 312 struct { 313 uint8_t op; 314 BITFLD(r1, m3); 315 BITFLD(b2, d2h); 316 uint8_t d2l; 317 } rs_b; 318 struct { 319 uint8_t op1; 320 BITFLD(l1, pad1); 321 BITFLD(b1, d1h); 322 uint8_t d1l; 323 uint8_t pad2; 324 uint8_t op2; 325 } rsl_a; 326 struct { 327 uint8_t op1; 328 uint8_t l2; 329 BITFLD(b2, d2h); 330 uint8_t d2l; 331 BITFLD(r1, m3); 332 uint8_t op2; 333 } rsl_b; 334 struct { 335 uint8_t op; 336 BITFLD(r1, r3); 337 uint16_t ri2; 338 } rsi; 339 struct { 340 uint8_t op1; 341 BITFLD(r1, r3); 342 BITFLD(b2, dl2h); 343 uint8_t dl2l; 344 uint8_t dh2; 345 uint8_t op2; 346 } rsy_a; 347 struct { 348 uint8_t op1; 349 BITFLD(r1, m3); 350 BITFLD(b2, dl2h); 351 uint8_t dl2l; 352 uint8_t dh2; 353 uint8_t op2; 354 } rsy_b; 355 struct { 356 uint8_t op1; 357 BITFLD(r1, op2); 358 uint16_t i2; 359 } ri_a; 360 struct { 361 uint8_t op1; 362 BITFLD(r1, op2); 363 uint16_t ri2; 364 } ri_b; 365 struct { 366 uint8_t op1; 367 BITFLD(m1, op2); 368 uint16_t ri2; 369 } ri_c; 370 struct { 371 uint8_t op1; 372 BITFLD(r1, _pad0); 373 uint16_t i2; 374 BITFLD(m3, _pad1); 375 uint8_t op2; 376 } rie_a; 377 struct { 378 uint8_t op1; 379 BITFLD(r1, r2); 380 uint16_t ri4; 381 BITFLD(m3, _pad); 382 uint8_t op2; 383 } rie_b; 384 struct { 385 uint8_t op1; 386 BITFLD(r1, m3); 387 uint16_t ri4; 388 uint8_t i2; 389 uint8_t op2; 390 } rie_c; 391 struct { 392 uint8_t op1; 393 BITFLD(r1, r3); 394 uint16_t i2; 395 uint8_t _pad; 396 uint8_t op2; 397 } rie_d; 398 struct { 399 uint8_t op1; 400 BITFLD(r1, r3); 401 uint16_t ri2; 402 uint8_t _pad; 403 uint8_t op2; 404 } rie_e; 405 struct { 406 uint8_t op1; 407 BITFLD(r1, r2); 408 uint8_t i3; 409 uint8_t i4; 410 uint8_t i5; 411 uint8_t op2; 412 } rie_f; 413 struct { 414 uint8_t op1; 415 BITFLD(r1, op2); 416 uint16_t i2h; 417 uint16_t i2l; 418 } ril_a; 419 struct { 420 uint8_t op1; 421 BITFLD(r1, op2); 422 uint16_t ri2h; 423 uint16_t ri2l; 424 } ril_b; 425 struct { 426 uint8_t op1; 427 BITFLD(m1, op2); 428 uint16_t ri2h; 429 uint16_t ri2l; 430 } ril_c; 431 struct { 432 uint8_t op1; 433 BITFLD(r1, m3); 434 BITFLD(b4, d4h); 435 uint8_t d4l; 436 uint8_t i2; 437 uint8_t op2; 438 } ris; 439 struct { 440 uint8_t op; 441 uint8_t i2; 442 BITFLD(b1, d1h); 443 uint8_t d1l; 444 } si; 445 struct { 446 uint16_t op; 447 BITFLD(b1, d1h); 448 uint8_t d1l; 449 uint16_t i2; 450 } sil; 451 struct { 452 uint8_t op1; 453 uint8_t i2; 454 BITFLD(b1, dl1h); 455 uint8_t dl1l; 456 uint8_t dh1; 457 uint8_t op2; 458 } siy; 459 struct { 460 uint8_t op; 461 BITFLD(m1, pad); 462 BITFLD(b3, d3h); 463 uint8_t d3l; 464 uint16_t ri2; 465 } smi; 466 struct { 467 uint8_t op1; 468 uint8_t op2; 469 BITFLD(b2, d2h); 470 uint8_t d2l; 471 } s; 472 struct { 473 uint8_t op; 474 uint8_t l; 475 BITFLD(b1, d1h); 476 uint8_t d1l; 477 BITFLD(b2, d2h); 478 uint8_t d2l; 479 } ss_a; 480 struct { 481 uint8_t op; 482 BITFLD(l1, l2); 483 BITFLD(b1, d1h); 484 uint8_t d1l; 485 BITFLD(b2, d2h); 486 uint8_t d2l; 487 } ss_b; 488 struct { 489 uint8_t op; 490 BITFLD(l1, i3); 491 BITFLD(b1, d1h); 492 uint8_t d1l; 493 BITFLD(b2, d2h); 494 uint8_t d2l; 495 } ss_c; 496 struct { 497 uint8_t op; 498 BITFLD(r1, r3); 499 BITFLD(b1, d1h); 500 uint8_t d1l; 501 BITFLD(b2, d2h); 502 uint8_t d2l; 503 } ss_d; 504 struct { 505 uint8_t op; 506 BITFLD(r1, r3); 507 BITFLD(b2, d2h); 508 uint8_t d2l; 509 BITFLD(b4, d4h); 510 uint8_t d4l; 511 } ss_e; 512 struct { 513 uint8_t op; 514 uint8_t l2; 515 BITFLD(b1, d1h); 516 uint8_t d1l; 517 BITFLD(b2, d2h); 518 uint8_t d2l; 519 } ss_f; 520 struct { 521 uint16_t op; 522 BITFLD(b1, d1h); 523 uint8_t d1l; 524 BITFLD(b2, d2h); 525 uint8_t d2l; 526 } sse; 527 struct { 528 uint8_t op1; 529 BITFLD(r3, op2); 530 BITFLD(b1, d1h); 531 uint8_t d1l; 532 BITFLD(b2, d2h); 533 uint8_t d2l; 534 } ssf; 535 }; 536 537 #define INSTR(op, m, fm, fl) [op] = { \ 538 .it_u.it_inst = { \ 539 .it_name = (m), \ 540 .it_flags = (fl), \ 541 }, \ 542 .it_fmt = (fm), \ 543 } 544 #define TABLE(op, tbl, o, s, m) [op] = { \ 545 .it_u.it_table = { \ 546 .it_ptr = (tbl), \ 547 .it_off = (o), \ 548 .it_shift = (s), \ 549 .it_mask = (m), \ 550 }, \ 551 .it_fmt = IF_TBL, \ 552 } 553 #define MULTI(op, tbl) [op] = { \ 554 .it_u.it_multi.it_ptr = (tbl), \ 555 .it_fmt = IF_MULTI, \ 556 } 557 558 /* 559 * Instruction tables based on: 560 * GA22-7000-4 System/370 Principles of Operation 561 * SA22-7201-08 ESA/390 Principles of Operation 562 * SA22-7832-09 z/Architecture Principles of Operation 563 */ 564 565 /* BEGIN CSTYLED */ 566 static const struct inst_table tbl_01xx[256] = { 567 INSTR(0x01, "pr", IF_E, F_390 | F_Z), 568 INSTR(0x02, "upt", IF_E, F_390 | F_Z), 569 INSTR(0x04, "ptff", IF_E, F_Z), 570 INSTR(0x07, "sckpf", IF_E, F_390 | F_Z), 571 INSTR(0x0a, "pfpo", IF_E, F_Z), 572 INSTR(0x0b, "tam", IF_E, F_390 | F_Z), 573 INSTR(0x0c, "sam24", IF_E, F_390 | F_Z), 574 INSTR(0x0d, "sam31", IF_E, F_390 | F_Z), 575 INSTR(0x0e, "sam64", IF_E, F_Z), 576 INSTR(0xff, "trap2", IF_E, F_390 | F_Z), 577 }; 578 579 static const struct inst_table tbl_07[] = { 580 INSTR(0x0, "nopr", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 581 INSTR(0x1, "bor", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 582 INSTR(0x2, "bhr", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 583 INSTR(0x3, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 584 INSTR(0x4, "blr", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 585 INSTR(0x5, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 586 INSTR(0x6, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 587 INSTR(0x7, "bnzr", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 588 INSTR(0x8, "ber", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 589 INSTR(0x9, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 590 INSTR(0xa, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 591 INSTR(0xb, "bner", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 592 INSTR(0xc, "bcr", IF_RR, F_370 | F_390 | F_Z | F_R1_IS_MASK), 593 INSTR(0xd, "bnhr", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 594 INSTR(0xe, "bnor", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 595 INSTR(0xf, "br", IF_RR, F_370 | F_390 | F_Z | F_HIDE_MASK), 596 }; 597 598 static const struct inst_table tbl_47[] = { 599 INSTR(0x0, "nop", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 600 INSTR(0x1, "bo", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 601 INSTR(0x2, "bh", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 602 INSTR(0x3, "bc", IF_RXb, F_370 | F_390 | F_Z), 603 INSTR(0x4, "bl", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 604 INSTR(0x5, "bc", IF_RXb, F_370 | F_390 | F_Z), 605 INSTR(0x6, "bc", IF_RXb, F_370 | F_390 | F_Z), 606 INSTR(0x7, "bne", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 607 INSTR(0x8, "be", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 608 INSTR(0x9, "bc", IF_RXb, F_370 | F_390 | F_Z), 609 INSTR(0xa, "bc", IF_RXb, F_370 | F_390 | F_Z), 610 INSTR(0xb, "bnl", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 611 INSTR(0xc, "bc", IF_RXb, F_370 | F_390 | F_Z), 612 INSTR(0xd, "bnh", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 613 INSTR(0xe, "bno", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 614 INSTR(0xf, "b", IF_RXb, F_370 | F_390 | F_Z | F_HIDE_MASK), 615 }; 616 617 /* the preferred mnemonic changed over time */ 618 static const struct inst_table tbl_25[] = { 619 INSTR(F_370, "lrdr", IF_RR, F_370), 620 INSTR(F_390, "ldxr", IF_RR, F_390), 621 INSTR(F_Z, "ldxr", IF_RR, F_Z), 622 }; 623 624 /* the preferred mnemonic changed over time */ 625 static const struct inst_table tbl_35[] = { 626 INSTR(F_370, "lrer", IF_RR, F_370), 627 INSTR(F_390, "ledr", IF_RR, F_390), 628 INSTR(F_Z, "ledr", IF_RR, F_Z), 629 }; 630 631 /* the preferred mnemonic changed over time */ 632 static const struct inst_table tbl_3c[] = { 633 INSTR(F_370, "mer", IF_RR, F_370), 634 INSTR(F_390, "mder", IF_RR, F_390), 635 INSTR(F_Z, "mder", IF_RR, F_Z), 636 }; 637 638 /* the preferred mnemonic changed over time */ 639 static const struct inst_table tbl_7c[] = { 640 INSTR(F_370, "me", IF_RXa, F_370), 641 INSTR(F_390, "mde", IF_RXa, F_390), 642 INSTR(F_Z, "mde", IF_RXa, F_Z), 643 }; 644 645 /* the meaning of this instruction changed over time */ 646 static const struct inst_table tbl_84[] = { 647 INSTR(F_370, "wrd", IF_SI, F_370), 648 INSTR(F_390, "brxh", IF_RSI, F_390), 649 INSTR(F_Z, "brxh", IF_RSI, F_Z), 650 }; 651 652 /* the meaning of this instruction changed over time */ 653 static const struct inst_table tbl_85[] = { 654 INSTR(F_370, "rdd", IF_SI, F_370), 655 INSTR(F_390, "brxle", IF_RSI, F_390), 656 INSTR(F_Z, "brxle", IF_RSI, F_Z), 657 }; 658 659 static const struct inst_table tbl_a5x[16] = { 660 INSTR(0x0, "iihh", IF_RIa, F_Z), 661 INSTR(0x1, "iihl", IF_RIa, F_Z), 662 INSTR(0x2, "iilh", IF_RIa, F_Z), 663 INSTR(0x3, "iill", IF_RIa, F_Z), 664 INSTR(0x4, "nihh", IF_RIa, F_Z), 665 INSTR(0x5, "nihl", IF_RIa, F_Z), 666 INSTR(0x6, "nilh", IF_RIa, F_Z), 667 INSTR(0x7, "nill", IF_RIa, F_Z), 668 INSTR(0x8, "oihh", IF_RIa, F_Z), 669 INSTR(0x9, "oihl", IF_RIa, F_Z), 670 INSTR(0xa, "oilh", IF_RIa, F_Z), 671 INSTR(0xb, "oill", IF_RIa, F_Z), 672 INSTR(0xc, "llihh", IF_RIa, F_Z), 673 INSTR(0xd, "llihl", IF_RIa, F_Z), 674 INSTR(0xe, "llilh", IF_RIa, F_Z), 675 INSTR(0xf, "llill", IF_RIa, F_Z), 676 }; 677 678 /* the preferred mnemonic changed over time */ 679 static const struct inst_table tbl_a70[] = { 680 INSTR(F_390, "tmh", IF_RIa, F_390), 681 INSTR(F_Z, "tmlh", IF_RIa, F_Z), 682 }; 683 684 /* the preferred mnemonic changed over time */ 685 static const struct inst_table tbl_a71[] = { 686 INSTR(F_390, "tml", IF_RIa, F_390), 687 INSTR(F_Z, "tmll", IF_RIa, F_Z), 688 }; 689 690 static const struct inst_table tbl_a74[16] = { 691 INSTR(0x0, "jnop", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 692 INSTR(0x1, "jo", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 693 INSTR(0x2, "jh", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 694 INSTR(0x3, "brc", IF_RIc, F_390 | F_Z), 695 INSTR(0x4, "jl", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 696 INSTR(0x5, "brc", IF_RIc, F_390 | F_Z), 697 INSTR(0x6, "brc", IF_RIc, F_390 | F_Z), 698 INSTR(0x7, "jne", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 699 INSTR(0x8, "je", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 700 INSTR(0x9, "brc", IF_RIc, F_390 | F_Z), 701 INSTR(0xa, "brc", IF_RIc, F_390 | F_Z), 702 INSTR(0xb, "jnl", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 703 INSTR(0xc, "brc", IF_RIc, F_390 | F_Z), 704 INSTR(0xd, "jnh", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 705 INSTR(0xe, "jno", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 706 INSTR(0xf, "j", IF_RIc, F_390 | F_Z | F_HIDE_MASK), 707 }; 708 709 static const struct inst_table tbl_a7x[16] = { 710 MULTI(0x0, tbl_a70), 711 MULTI(0x1, tbl_a71), 712 INSTR(0x2, "tmhh", IF_RIa, F_Z), 713 INSTR(0x3, "tmhl", IF_RIa, F_Z), 714 TABLE(0x4, tbl_a74, 1, 4, 0x0f), 715 INSTR(0x5, "bras", IF_RIb, F_390 | F_Z), 716 INSTR(0x6, "brct", IF_RIb, F_390 | F_Z), 717 INSTR(0x7, "brctg", IF_RIb, F_Z), 718 INSTR(0x8, "lhi", IF_RIa, F_390 | F_Z), 719 INSTR(0x9, "lghi", IF_RIa, F_Z), 720 INSTR(0xa, "ahi", IF_RIa, F_390 | F_Z | F_SIGNED_IMM), 721 INSTR(0xb, "aghi", IF_RIa, F_Z | F_SIGNED_IMM), 722 INSTR(0xc, "mhi", IF_RIa, F_390 | F_Z), 723 INSTR(0xd, "mghi", IF_RIa, F_Z), 724 INSTR(0xe, "chi", IF_RIa, F_390 | F_Z | F_SIGNED_IMM), 725 INSTR(0xf, "cghi", IF_RIa, F_Z | F_SIGNED_IMM), 726 }; 727 728 static const struct inst_table tbl_b2a6[] = { 729 INSTR(F_390, "cuutf", IF_RRFc, F_390), 730 INSTR(F_Z, "c21", IF_RRFc, F_Z), 731 }; 732 733 static const struct inst_table tbl_b2a7[] = { 734 INSTR(F_390, "cutfu", IF_RRFc, F_390), 735 INSTR(F_Z, "cu12", IF_RRFc, F_Z), 736 }; 737 738 static const struct inst_table tbl_b2xx[256] = { 739 INSTR(0x02, "stidp", IF_S, F_370 | F_390 | F_Z), 740 INSTR(0x04, "sck", IF_S, F_370 | F_390 | F_Z), 741 INSTR(0x05, "stck", IF_S, F_370 | F_390 | F_Z), 742 INSTR(0x06, "sckc", IF_S, F_370 | F_390 | F_Z), 743 INSTR(0x07, "stckc", IF_S, F_370 | F_390 | F_Z), 744 INSTR(0x08, "spt", IF_S, F_370 | F_390 | F_Z), 745 INSTR(0x09, "stpt", IF_S, F_370 | F_390 | F_Z), 746 INSTR(0x0a, "spka", IF_S, F_370 | F_390 | F_Z), 747 INSTR(0x0b, "ipk", IF_S, F_370 | F_390 | F_Z), 748 INSTR(0x0d, "ptlb", IF_S, F_370 | F_390 | F_Z), 749 INSTR(0x10, "spx", IF_S, F_370 | F_390 | F_Z), 750 INSTR(0x11, "stpx", IF_S, F_370 | F_390 | F_Z), 751 INSTR(0x12, "stap", IF_S, F_370 | F_390 | F_Z), 752 INSTR(0x13, "rrb", IF_S, F_370), 753 INSTR(0x14, "sie", IF_S, F_390 | F_Z), 754 INSTR(0x18, "pc", IF_S, F_390 | F_Z), 755 INSTR(0x19, "sac", IF_S, F_390 | F_Z), 756 INSTR(0x1a, "cfc", IF_S, F_390 | F_Z), 757 INSTR(0x21, "ipte", IF_RRE, F_390 | F_Z), 758 INSTR(0x22, "ipm", IF_RRE, F_390 | F_Z), 759 INSTR(0x23, "ivsk", IF_RRE, F_390 | F_Z), 760 INSTR(0x24, "iac", IF_RRE, F_390 | F_Z), 761 INSTR(0x25, "ssar", IF_RRE, F_390 | F_Z), 762 INSTR(0x26, "epar", IF_RRE, F_390 | F_Z), 763 INSTR(0x27, "esar", IF_RRE, F_390 | F_Z), 764 INSTR(0x28, "pt", IF_RRE, F_390 | F_Z), 765 INSTR(0x29, "iske", IF_RRE, F_390 | F_Z), 766 INSTR(0x2a, "rrbe", IF_RRE, F_390 | F_Z), 767 INSTR(0x2b, "sske", IF_RRFc, F_390 | F_Z), 768 INSTR(0x2c, "tb", IF_RRE, F_390 | F_Z), 769 INSTR(0x2d, "dxr", IF_RRE, F_390 | F_Z), 770 INSTR(0x2e, "pgin", IF_RRE, F_390 | F_Z), 771 INSTR(0x2f, "pgout", IF_RRE, F_390 | F_Z), 772 INSTR(0x30, "csch", IF_S, F_Z), 773 INSTR(0x31, "hsch", IF_S, F_Z), 774 INSTR(0x32, "msch", IF_S, F_Z), 775 INSTR(0x33, "ssch", IF_S, F_Z), 776 INSTR(0x34, "stsch", IF_S, F_Z), 777 INSTR(0x35, "tsch", IF_S, F_Z), 778 INSTR(0x36, "tpi", IF_S, F_Z), 779 INSTR(0x37, "sal", IF_S, F_Z), 780 INSTR(0x38, "rsch", IF_S, F_Z), 781 INSTR(0x39, "stcrw", IF_S, F_Z), 782 INSTR(0x3a, "stcps", IF_S, F_Z), 783 INSTR(0x3b, "rchp", IF_S, F_Z), 784 INSTR(0x3d, "schm", IF_S, F_Z), 785 INSTR(0x40, "bakr", IF_RRE, F_390 | F_Z), 786 INSTR(0x41, "cksm", IF_RRE, F_390 | F_Z), 787 INSTR(0x44, "sqdr", IF_RRE, F_390 | F_Z), 788 INSTR(0x45, "sqer", IF_RRE, F_390 | F_Z), 789 INSTR(0x46, "stura", IF_RRE, F_390 | F_Z), 790 INSTR(0x47, "msta", IF_RRE, F_390 | F_Z), 791 INSTR(0x48, "palb", IF_RRE, F_390 | F_Z), 792 INSTR(0x49, "ereg", IF_RRE, F_390 | F_Z), 793 INSTR(0x4a, "esta", IF_RRE, F_390 | F_Z), 794 INSTR(0x4b, "lura", IF_RRE, F_390 | F_Z), 795 INSTR(0x4c, "tar", IF_RRE, F_390 | F_Z), 796 INSTR(0x4d, "cpya", IF_RRE, F_390 | F_Z), 797 INSTR(0x4e, "sar", IF_RRE, F_390 | F_Z), 798 INSTR(0x4f, "ear", IF_RRE, F_390 | F_Z), 799 INSTR(0x50, "csp", IF_RRE, F_390 | F_Z), 800 INSTR(0x52, "msr", IF_RRE, F_390 | F_Z), 801 INSTR(0x54, "mvpg", IF_RRE, F_390 | F_Z), 802 INSTR(0x55, "mvst", IF_RRE, F_390 | F_Z), 803 INSTR(0x57, "cuse", IF_RRE, F_390 | F_Z), 804 INSTR(0x58, "bsg", IF_RRE, F_390 | F_Z), 805 INSTR(0x5a, "bsa", IF_RRE, F_390 | F_Z), 806 INSTR(0x5d, "clst", IF_RRE, F_390 | F_Z), 807 INSTR(0x5e, "srst", IF_RRE, F_390 | F_Z), 808 INSTR(0x63, "cmpsc", IF_RRE, F_Z), 809 INSTR(0x76, "xsch", IF_S, F_Z), 810 INSTR(0x77, "rp", IF_S, F_390 | F_Z), 811 INSTR(0x78, "stcke", IF_S, F_390 | F_Z), 812 INSTR(0x79, "sacf", IF_S, F_390 | F_Z), 813 INSTR(0x7c, "stckf", IF_S, F_Z), 814 INSTR(0x7d, "stsi", IF_S, F_390 | F_Z), 815 INSTR(0x99, "srnm", IF_S, F_390 | F_Z), 816 INSTR(0x9c, "stfpc", IF_S, F_390 | F_Z), 817 INSTR(0x9d, "lfpc", IF_S, F_390 | F_Z), 818 INSTR(0xa5, "tre", IF_RRE, F_390 | F_Z), 819 MULTI(0xa6, tbl_b2a6), 820 MULTI(0xa7, tbl_b2a7), 821 INSTR(0xb0, "stfle", IF_S, F_Z), 822 INSTR(0xb1, "stfl", IF_S, F_390 | F_Z), 823 INSTR(0xb2, "lpswe", IF_S, F_Z), 824 INSTR(0xb8, "srnmb", IF_S, F_Z), 825 INSTR(0xb9, "srnmt", IF_S, F_Z), 826 INSTR(0xbd, "lfas", IF_S, F_Z), 827 INSTR(0xe8, "ppa", IF_RRFc, F_Z), 828 INSTR(0xec, "etnd", IF_RRE, F_Z), 829 INSTR(0xf8, "tend", IF_S, F_Z), 830 INSTR(0xfa, "niai", IF_IE, F_Z), 831 INSTR(0xfc, "tabort", IF_S, F_Z), 832 INSTR(0xff, "trap4", IF_S, F_390 | F_Z), 833 }; 834 835 static const struct inst_table tbl_b344[] = { 836 INSTR(F_390, "ledbr", IF_RRE, F_390), 837 INSTR(F_Z, "ledbra", IF_RRFe, F_Z), 838 }; 839 840 static const struct inst_table tbl_b345[] = { 841 INSTR(F_390, "ldxbr", IF_RRE, F_390), 842 INSTR(F_Z, "ldxbra", IF_RRFe, F_Z), 843 }; 844 845 static const struct inst_table tbl_b346[] = { 846 INSTR(F_390, "lexbr", IF_RRE, F_390), 847 INSTR(F_Z, "lexbra", IF_RRFe, F_Z), 848 }; 849 850 static const struct inst_table tbl_b347[] = { 851 INSTR(F_390, "fixbr", IF_RRFe, F_390), 852 INSTR(F_Z, "fixbra", IF_RRFe, F_Z), 853 }; 854 855 static const struct inst_table tbl_b357[] = { 856 INSTR(F_390, "fiebr", IF_RRFe, F_390), 857 INSTR(F_Z, "fiebre", IF_RRFe, F_Z), 858 }; 859 860 static const struct inst_table tbl_b35f[] = { 861 INSTR(F_390, "fidbr", IF_RRFe, F_390), 862 INSTR(F_Z, "fidbra", IF_RRFe, F_Z), 863 }; 864 865 static const struct inst_table tbl_b394[] = { 866 INSTR(F_390, "cefbr", IF_RRE, F_390), 867 INSTR(F_Z, "cefbra", IF_RRFe, F_Z), 868 }; 869 870 static const struct inst_table tbl_b395[] = { 871 INSTR(F_390, "cdfbr", IF_RRE, F_390), 872 INSTR(F_Z, "cdfbra", IF_RRFe, F_Z), 873 }; 874 875 static const struct inst_table tbl_b396[] = { 876 INSTR(F_390, "cxfbr", IF_RRE, F_390), 877 INSTR(F_Z, "cxfbra", IF_RRFe, F_Z), 878 }; 879 880 static const struct inst_table tbl_b398[] = { 881 INSTR(F_390, "cfebr", IF_RRFe, F_390), 882 INSTR(F_Z, "cfebra", IF_RRFe, F_Z), 883 }; 884 885 static const struct inst_table tbl_b399[] = { 886 INSTR(F_390, "cfdbr", IF_RRFe, F_390), 887 INSTR(F_Z, "cfdbra", IF_RRFe, F_Z), 888 }; 889 890 static const struct inst_table tbl_b39a[] = { 891 INSTR(F_390, "cfxbr", IF_RRFe, F_390), 892 INSTR(F_Z, "cfxbra", IF_RRFe, F_Z), 893 }; 894 895 static const struct inst_table tbl_b3xx[256] = { 896 INSTR(0x00, "lpebr", IF_RRE, F_390 | F_Z), 897 INSTR(0x01, "lnebr", IF_RRE, F_390 | F_Z), 898 INSTR(0x02, "ltebr", IF_RRE, F_390 | F_Z), 899 INSTR(0x03, "lcebr", IF_RRE, F_390 | F_Z), 900 INSTR(0x04, "ldebr", IF_RRE, F_390 | F_Z), 901 INSTR(0x05, "lxdbr", IF_RRE, F_390 | F_Z), 902 INSTR(0x06, "lxebr", IF_RRE, F_390 | F_Z), 903 INSTR(0x07, "mxdbr", IF_RRE, F_390 | F_Z), 904 INSTR(0x08, "kebr", IF_RRE, F_390 | F_Z), 905 INSTR(0x09, "cebr", IF_RRE, F_390 | F_Z), 906 INSTR(0x0a, "aebr", IF_RRE, F_390 | F_Z), 907 INSTR(0x0b, "sebr", IF_RRE, F_390 | F_Z), 908 INSTR(0x0c, "mdebr", IF_RRE, F_390 | F_Z), 909 INSTR(0x0d, "debr", IF_RRE, F_390 | F_Z), 910 INSTR(0x0e, "maebr", IF_RRD, F_390 | F_Z), 911 INSTR(0x0f, "msebr", IF_RRD, F_390 | F_Z), 912 INSTR(0x10, "lpdbr", IF_RRE, F_390 | F_Z), 913 INSTR(0x11, "lndbr", IF_RRE, F_390 | F_Z), 914 INSTR(0x12, "ltdbr", IF_RRE, F_390 | F_Z), 915 INSTR(0x13, "lcdbr", IF_RRE, F_390 | F_Z), 916 INSTR(0x14, "sqebr", IF_RRE, F_390 | F_Z), 917 INSTR(0x15, "sqdbr", IF_RRE, F_390 | F_Z), 918 INSTR(0x16, "sqxbr", IF_RRE, F_390 | F_Z), 919 INSTR(0x17, "meebr", IF_RRE, F_390 | F_Z), 920 INSTR(0x18, "kdbr", IF_RRE, F_390 | F_Z), 921 INSTR(0x19, "cdbr", IF_RRE, F_390 | F_Z), 922 INSTR(0x1a, "adbr", IF_RRE, F_390 | F_Z), 923 INSTR(0x1b, "sdbr", IF_RRE, F_390 | F_Z), 924 INSTR(0x1c, "mdbr", IF_RRE, F_390 | F_Z), 925 INSTR(0x1d, "ddbr", IF_RRE, F_390 | F_Z), 926 INSTR(0x1e, "madbr", IF_RRD, F_390 | F_Z), 927 INSTR(0x1f, "msdbr", IF_RRD, F_390 | F_Z), 928 INSTR(0x24, "lder", IF_RRE, F_390 | F_Z), 929 INSTR(0x25, "lxdr", IF_RRE, F_390 | F_Z), 930 INSTR(0x26, "lxer", IF_RRE, F_390 | F_Z), 931 INSTR(0x2e, "maer", IF_RRD, F_390 | F_Z), 932 INSTR(0x2f, "mser", IF_RRD, F_390 | F_Z), 933 INSTR(0x36, "sqxr", IF_RRE, F_390 | F_Z), 934 INSTR(0x37, "meer", IF_RRE, F_390 | F_Z), 935 INSTR(0x38, "maylr", IF_RRD, F_Z), 936 INSTR(0x39, "mylr", IF_RRD, F_Z), 937 INSTR(0x3a, "mayr", IF_RRD, F_Z), 938 INSTR(0x3b, "myr", IF_RRD, F_Z), 939 INSTR(0x3c, "mayhr", IF_RRD, F_Z), 940 INSTR(0x3d, "myhr", IF_RRD, F_Z), 941 INSTR(0x3e, "madr", IF_RRD, F_390 | F_Z), 942 INSTR(0x3f, "msdr", IF_RRD, F_390 | F_Z), 943 INSTR(0x40, "lpxbr", IF_RRE, F_390 | F_Z), 944 INSTR(0x41, "lnxbr", IF_RRE, F_390 | F_Z), 945 INSTR(0x42, "ltxbr", IF_RRE, F_390 | F_Z), 946 INSTR(0x43, "lcxbr", IF_RRE, F_390 | F_Z), 947 MULTI(0x44, tbl_b344), 948 MULTI(0x45, tbl_b345), 949 MULTI(0x46, tbl_b346), 950 MULTI(0x47, tbl_b347), 951 INSTR(0x48, "kxbr", IF_RRE, F_390 | F_Z), 952 INSTR(0x49, "cxbr", IF_RRE, F_390 | F_Z), 953 INSTR(0x4a, "axbr", IF_RRE, F_390 | F_Z), 954 INSTR(0x4b, "sxbr", IF_RRE, F_390 | F_Z), 955 INSTR(0x4c, "mxbr", IF_RRE, F_390 | F_Z), 956 INSTR(0x4d, "dxbr", IF_RRE, F_390 | F_Z), 957 INSTR(0x50, "tbedr", IF_RRFe, F_390 | F_Z), 958 INSTR(0x51, "tbdr", IF_RRFe, F_390 | F_Z), 959 INSTR(0x53, "diebr", IF_RRFb, F_390 | F_Z), 960 MULTI(0x57, tbl_b357), 961 INSTR(0x58, "thder", IF_RRE, F_390 | F_Z), 962 INSTR(0x59, "thdr", IF_RRE, F_390 | F_Z), 963 INSTR(0x5b, "didbr", IF_RRFe, F_390 | F_Z), 964 MULTI(0x5f, tbl_b35f), 965 INSTR(0x60, "lpxr", IF_RRE, F_390 | F_Z), 966 INSTR(0x61, "lnxr", IF_RRE, F_390 | F_Z), 967 INSTR(0x62, "ltxr", IF_RRE, F_390 | F_Z), 968 INSTR(0x63, "lcxr", IF_RRE, F_390 | F_Z), 969 INSTR(0x65, "lxr", IF_RRE, F_390 | F_Z), 970 INSTR(0x66, "lexr", IF_RRE, F_390 | F_Z), 971 INSTR(0x67, "fixr", IF_RRE, F_390 | F_Z), 972 INSTR(0x69, "cxr", IF_RRE, F_390 | F_Z), 973 INSTR(0x70, "lpdfr", IF_RRE, F_Z), 974 INSTR(0x71, "lndfr", IF_RRE, F_Z), 975 INSTR(0x72, "cpsdr", IF_RRFe, F_Z), 976 INSTR(0x73, "lcdfr", IF_RRE, F_Z), 977 INSTR(0x74, "lzer", IF_RRE, F_390 | F_Z), 978 INSTR(0x75, "lzdr", IF_RRE, F_390 | F_Z), 979 INSTR(0x76, "lzxr", IF_RRE, F_390 | F_Z), 980 INSTR(0x77, "fier", IF_RRE, F_390 | F_Z), 981 INSTR(0x7f, "fidr", IF_RRE, F_390 | F_Z), 982 INSTR(0x84, "sfpc", IF_RRE, F_390 | F_Z), 983 INSTR(0x85, "sfasr", IF_RRE, F_Z), 984 INSTR(0x8c, "efpc", IF_RRE, F_390 | F_Z), 985 INSTR(0x90, "celfbr", IF_RRFe, F_Z), 986 INSTR(0x91, "cdlfbr", IF_RRFe, F_Z), 987 INSTR(0x92, "cxlfbr", IF_RRFe, F_Z), 988 MULTI(0x94, tbl_b394), 989 MULTI(0x95, tbl_b395), 990 MULTI(0x96, tbl_b396), 991 MULTI(0x98, tbl_b398), 992 MULTI(0x99, tbl_b399), 993 MULTI(0x9a, tbl_b39a), 994 INSTR(0x9c, "clfebr", IF_RRFe, F_Z), 995 INSTR(0x9d, "clfdbr", IF_RRFe, F_Z), 996 INSTR(0x9e, "clfxbr", IF_RRFe, F_Z), 997 INSTR(0xa0, "celgbr", IF_RRFe, F_Z), 998 INSTR(0xa1, "cdlgbr", IF_RRFe, F_Z), 999 INSTR(0xa2, "cxlgbr", IF_RRFe, F_Z), 1000 INSTR(0xa4, "cegbra", IF_RRFe, F_Z), 1001 INSTR(0xa5, "cdgbra", IF_RRFe, F_Z), 1002 INSTR(0xa6, "cxgbra", IF_RRFe, F_Z), 1003 INSTR(0xa8, "cgebra", IF_RRFe, F_Z), 1004 INSTR(0xa9, "cgdbra", IF_RRFe, F_Z), 1005 INSTR(0xaa, "cgxbra", IF_RRFe, F_Z), 1006 INSTR(0xac, "clgebr", IF_RRFe, F_Z), 1007 INSTR(0xad, "clgdbr", IF_RRFe, F_Z), 1008 INSTR(0xae, "clgxbr", IF_RRFe, F_Z), 1009 INSTR(0xb4, "cefr", IF_RRE, F_390 | F_Z), 1010 INSTR(0xb5, "cdfr", IF_RRE, F_390 | F_Z), 1011 INSTR(0xb6, "cxfr", IF_RRE, F_390 | F_Z), 1012 INSTR(0xb8, "cfer", IF_RRFe, F_390 | F_Z), 1013 INSTR(0xb9, "cfdr", IF_RRFe, F_390 | F_Z), 1014 INSTR(0xba, "cfxr", IF_RRFe, F_390 | F_Z), 1015 INSTR(0xc1, "ldgr", IF_RRE, F_Z), 1016 INSTR(0xc4, "cegr", IF_RRE, F_Z), 1017 INSTR(0xc5, "cdgr", IF_RRE, F_Z), 1018 INSTR(0xc6, "cxgr", IF_RRE, F_Z), 1019 INSTR(0xc8, "cger", IF_RRFe, F_Z), 1020 INSTR(0xc9, "cgdr", IF_RRFe, F_Z), 1021 INSTR(0xca, "cgxr", IF_RRFe, F_Z), 1022 INSTR(0xcd, "lgdr", IF_RRE, F_Z), 1023 INSTR(0xd0, "mdtra", IF_RRFa, F_Z), 1024 INSTR(0xd1, "ddtra", IF_RRFa, F_Z), 1025 INSTR(0xd2, "adtra", IF_RRFa, F_Z), 1026 INSTR(0xd3, "sdtra", IF_RRFa, F_Z), 1027 INSTR(0xd4, "ldetr", IF_RRFd, F_Z), 1028 INSTR(0xd5, "ledtr", IF_RRFe, F_Z), 1029 INSTR(0xd6, "ltdtr", IF_RRE, F_Z), 1030 INSTR(0xd7, "fidtr", IF_RRFe, F_Z), 1031 INSTR(0xd8, "mxtra", IF_RRFa, F_Z), 1032 INSTR(0xd9, "dxtra", IF_RRFa, F_Z), 1033 INSTR(0xda, "axtra", IF_RRFa, F_Z), 1034 INSTR(0xdb, "sxtra", IF_RRFa, F_Z), 1035 INSTR(0xdc, "lxdtr", IF_RRFd, F_Z), 1036 INSTR(0xdd, "ldxtr", IF_RRFe, F_Z), 1037 INSTR(0xde, "ltxtr", IF_RRE, F_Z), 1038 INSTR(0xdf, "fixtr", IF_RRFe, F_Z), 1039 INSTR(0xe0, "kdtr", IF_RRE, F_Z), 1040 INSTR(0xe1, "cgdtra", IF_RRFe, F_Z), 1041 INSTR(0xe2, "cudtr", IF_RRE, F_Z), 1042 INSTR(0xe3, "csdtr", IF_RRFd, F_Z), 1043 INSTR(0xe4, "cdtr", IF_RRE, F_Z), 1044 INSTR(0xe5, "eedtr", IF_RRE, F_Z), 1045 INSTR(0xe7, "esdtr", IF_RRE, F_Z), 1046 INSTR(0xe8, "kxtr", IF_RRE, F_Z), 1047 INSTR(0xe9, "cgxtra", IF_RRFe, F_Z), 1048 INSTR(0xea, "cuxtr", IF_RRE, F_Z), 1049 INSTR(0xeb, "csxtr", IF_RRFd, F_Z), 1050 INSTR(0xec, "cxtr", IF_RRE, F_Z), 1051 INSTR(0xed, "eextr", IF_RRE, F_Z), 1052 INSTR(0xef, "esxtr", IF_RRE, F_Z), 1053 INSTR(0xf1, "cdgtra", IF_RRE, F_Z), 1054 INSTR(0xf2, "cdutr", IF_RRE, F_Z), 1055 INSTR(0xf3, "cdstr", IF_RRE, F_Z), 1056 INSTR(0xf4, "cedtr", IF_RRE, F_Z), 1057 INSTR(0xf5, "qadtr", IF_RRFb, F_Z), 1058 INSTR(0xf6, "iedtr", IF_RRFb, F_Z), 1059 INSTR(0xf7, "rrdtr", IF_RRFb, F_Z), 1060 INSTR(0xf9, "cxgtra", IF_RRE, F_Z), 1061 INSTR(0xfa, "cxutr", IF_RRE, F_Z), 1062 INSTR(0xfb, "cxstr", IF_RRE, F_Z), 1063 INSTR(0xfc, "cextr", IF_RRE, F_Z), 1064 INSTR(0xfd, "qaxtr", IF_RRFb, F_Z), 1065 INSTR(0xfe, "iextr", IF_RRFb, F_Z), 1066 INSTR(0xff, "rrxtr", IF_RRFb, F_Z), 1067 }; 1068 1069 static const struct inst_table tbl_b9xx[256] = { 1070 INSTR(0x00, "lpgr", IF_RRE, F_Z), 1071 INSTR(0x01, "lngr", IF_RRE, F_Z), 1072 INSTR(0x02, "ltgr", IF_RRE, F_Z), 1073 INSTR(0x03, "lcgr", IF_RRE, F_Z), 1074 INSTR(0x04, "lgr", IF_RRE, F_Z), 1075 INSTR(0x05, "lurag", IF_RRE, F_Z), 1076 INSTR(0x06, "lgbr", IF_RRE, F_Z), 1077 INSTR(0x07, "lghr", IF_RRE, F_Z), 1078 INSTR(0x08, "agr", IF_RRE, F_Z), 1079 INSTR(0x09, "sgr", IF_RRE, F_Z), 1080 INSTR(0x0a, "algr", IF_RRE, F_Z), 1081 INSTR(0x0b, "slgr", IF_RRE, F_Z), 1082 INSTR(0x0c, "msgr", IF_RRE, F_Z), 1083 INSTR(0x0d, "dsgr", IF_RRE, F_Z), 1084 INSTR(0x0e, "eregg", IF_RRE, F_Z), 1085 INSTR(0x0f, "lrvgr", IF_RRE, F_Z), 1086 INSTR(0x10, "lpgfr", IF_RRE, F_Z), 1087 INSTR(0x11, "lngfr", IF_RRE, F_Z), 1088 INSTR(0x12, "ltgfr", IF_RRE, F_Z), 1089 INSTR(0x13, "lcgfr", IF_RRE, F_Z), 1090 INSTR(0x14, "lgfr", IF_RRE, F_Z), 1091 INSTR(0x16, "llgfr", IF_RRE, F_Z), 1092 INSTR(0x17, "llgtr", IF_RRE, F_Z), 1093 INSTR(0x18, "agfr", IF_RRE, F_Z), 1094 INSTR(0x19, "sgfr", IF_RRE, F_Z), 1095 INSTR(0x1a, "algfr", IF_RRE, F_Z), 1096 INSTR(0x1b, "slgfr", IF_RRE, F_Z), 1097 INSTR(0x1c, "msgfr", IF_RRE, F_Z), 1098 INSTR(0x1d, "dsgfr", IF_RRE, F_Z), 1099 INSTR(0x1e, "kmac", IF_RRE, F_390 | F_Z), 1100 INSTR(0x1f, "lrvr", IF_RRE, F_390 | F_Z), 1101 INSTR(0x20, "cgr", IF_RRE, F_Z), 1102 INSTR(0x21, "clgr", IF_RRE, F_Z), 1103 INSTR(0x25, "sturg", IF_RRE, F_Z), 1104 INSTR(0x26, "lbr", IF_RRE, F_Z), 1105 INSTR(0x27, "lhr", IF_RRE, F_Z), 1106 INSTR(0x28, "pckmo", IF_RRE, F_Z), 1107 INSTR(0x2a, "kmf", IF_RRE, F_Z), 1108 INSTR(0x2b, "kmo", IF_RRE, F_Z), 1109 INSTR(0x2c, "pcc", IF_RRE, F_Z), 1110 INSTR(0x2d, "kmctr", IF_RRFd, F_Z), 1111 INSTR(0x2e, "km", IF_RRE, F_390 | F_Z), 1112 INSTR(0x2f, "kmc", IF_RRE, F_390 | F_Z), 1113 INSTR(0x30, "cgfr", IF_RRE, F_Z), 1114 INSTR(0x31, "clgfr", IF_RRE, F_Z), 1115 INSTR(0x3e, "kimd", IF_RRE, F_390 | F_Z), 1116 INSTR(0x3f, "klmd", IF_RRE, F_390 | F_Z), 1117 INSTR(0x41, "cfdtr", IF_RRFe, F_Z), 1118 INSTR(0x42, "clgdtr", IF_RRFe, F_Z), 1119 INSTR(0x43, "clfdtr", IF_RRFe, F_Z), 1120 INSTR(0x46, "bctgr", IF_RRE, F_Z), 1121 INSTR(0x49, "cfxtr", IF_RRFe, F_Z), 1122 INSTR(0x4a, "clgxtr", IF_RRFe, F_Z), 1123 INSTR(0x4b, "clfxtr", IF_RRFe, F_Z), 1124 INSTR(0x51, "cdftr", IF_RRE, F_Z), 1125 INSTR(0x52, "cdlgtr", IF_RRFe, F_Z), 1126 INSTR(0x53, "cdlftr", IF_RRFe, F_Z), 1127 INSTR(0x59, "cxftr", IF_RRE, F_Z), 1128 INSTR(0x5a, "cxlgtr", IF_RRFe, F_Z), 1129 INSTR(0x5b, "cxlftr", IF_RRFe, F_Z), 1130 INSTR(0x60, "cgrt", IF_RRFc, F_Z), 1131 INSTR(0x61, "clgrt", IF_RRFc, F_Z), 1132 INSTR(0x72, "crt", IF_RRFc, F_Z), 1133 INSTR(0x73, "clrt", IF_RRFc, F_Z), 1134 INSTR(0x80, "ngr", IF_RRE, F_Z), 1135 INSTR(0x81, "ogr", IF_RRE, F_Z), 1136 INSTR(0x82, "xgr", IF_RRE, F_Z), 1137 INSTR(0x83, "flogr", IF_RRE, F_Z), 1138 INSTR(0x84, "llgcr", IF_RRE, F_Z), 1139 INSTR(0x85, "llghr", IF_RRE, F_Z), 1140 INSTR(0x86, "mlgr", IF_RRE, F_Z), 1141 INSTR(0x87, "dlgr", IF_RRE, F_Z), 1142 INSTR(0x88, "alcgr", IF_RRE, F_Z), 1143 INSTR(0x89, "slbgr", IF_RRE, F_Z), 1144 INSTR(0x8a, "cspg", IF_RRE, F_Z), 1145 INSTR(0x8d, "epsw", IF_RRE, F_390 | F_Z), 1146 INSTR(0x8e, "idte", IF_RRFb, F_Z), 1147 INSTR(0x8f, "crdte", IF_RRFb, F_Z), 1148 INSTR(0x90, "trtt", IF_RRFc, F_390 | F_Z), 1149 INSTR(0x91, "trto", IF_RRFc, F_390 | F_Z), 1150 INSTR(0x92, "trot", IF_RRFc, F_390 | F_Z), 1151 INSTR(0x93, "troo", IF_RRFc, F_390 | F_Z), 1152 INSTR(0x94, "llcr", IF_RRE, F_Z), 1153 INSTR(0x95, "llhr", IF_RRE, F_Z), 1154 INSTR(0x96, "mlr", IF_RRE, F_390 | F_Z), 1155 INSTR(0x97, "dlr", IF_RRE, F_390 | F_Z), 1156 INSTR(0x98, "alcr", IF_RRE, F_390 | F_Z), 1157 INSTR(0x99, "slbr", IF_RRE, F_390 | F_Z), 1158 INSTR(0x9a, "epair", IF_RRE, F_Z), 1159 INSTR(0x9b, "esair", IF_RRE, F_Z), 1160 INSTR(0x9d, "esea", IF_RRE, F_Z), 1161 INSTR(0x9e, "pti", IF_RRE, F_Z), 1162 INSTR(0x9f, "ssair", IF_RRE, F_Z), 1163 INSTR(0xa2, "ptf", IF_RRE, F_Z), 1164 INSTR(0xaa, "lptea", IF_RRFb, F_Z), 1165 INSTR(0xae, "rrbm", IF_RRE, F_Z), 1166 INSTR(0xaf, "pfmf", IF_RRE, F_Z), 1167 INSTR(0xb0, "cu14", IF_RRFc, F_Z), 1168 INSTR(0xb1, "cu24", IF_RRFc, F_Z), 1169 INSTR(0xb2, "cu41", IF_RRE, F_Z), 1170 INSTR(0xb3, "cu42", IF_RRE, F_Z), 1171 INSTR(0xbd, "trtre", IF_RRFc, F_Z), 1172 INSTR(0xbe, "srstu", IF_RRE, F_Z), 1173 INSTR(0xbf, "trte", IF_RRFc, F_Z), 1174 INSTR(0xc8, "ahhhr", IF_RRFa, F_Z), 1175 INSTR(0xc9, "shhhr", IF_RRFa, F_Z), 1176 INSTR(0xca, "alhhhr", IF_RRFa, F_Z), 1177 INSTR(0xcb, "slhhhr", IF_RRFa, F_Z), 1178 INSTR(0xcd, "chhr", IF_RRE, F_Z), 1179 INSTR(0xcf, "clhhr", IF_RRE, F_Z), 1180 INSTR(0xd8, "ahhlr", IF_RRFa, F_Z), 1181 INSTR(0xd9, "shhlr", IF_RRFa, F_Z), 1182 INSTR(0xda, "alhhlr", IF_RRFa, F_Z), 1183 INSTR(0xdb, "slhhlr", IF_RRFa, F_Z), 1184 INSTR(0xdd, "chlr", IF_RRE, F_Z), 1185 INSTR(0xdf, "clhlr", IF_RRE, F_Z), 1186 INSTR(0xe1, "popcnt", IF_RRE, F_Z), 1187 INSTR(0xe2, "locgr", IF_RRFc, F_Z), 1188 INSTR(0xe4, "ngrk", IF_RRFa, F_Z), 1189 INSTR(0xe6, "ogrk", IF_RRFa, F_Z), 1190 INSTR(0xe7, "xgrk", IF_RRFa, F_Z), 1191 INSTR(0xe8, "agrk", IF_RRFa, F_Z), 1192 INSTR(0xe9, "sgrk", IF_RRFa, F_Z), 1193 INSTR(0xea, "algrk", IF_RRFa, F_Z), 1194 INSTR(0xeb, "slgrk", IF_RRFa, F_Z), 1195 INSTR(0xf2, "locgr", IF_RRFc, F_Z), 1196 INSTR(0xf4, "nrk", IF_RRFa, F_Z), 1197 INSTR(0xf6, "ork", IF_RRFa, F_Z), 1198 INSTR(0xf7, "xrk", IF_RRFa, F_Z), 1199 INSTR(0xf8, "ark", IF_RRFa, F_Z), 1200 INSTR(0xf9, "srk", IF_RRFa, F_Z), 1201 INSTR(0xfa, "alrk", IF_RRFa, F_Z), 1202 INSTR(0xfb, "slrk", IF_RRFa, F_Z), 1203 }; 1204 1205 static const struct inst_table tbl_c0x[16] = { 1206 INSTR(0x0, "larl", IF_RILb, F_390 | F_Z), 1207 INSTR(0x1, "lgfi", IF_RILa, F_Z), 1208 INSTR(0x4, "brcl", IF_RILc, F_390 | F_Z), 1209 INSTR(0x5, "brasl", IF_RILb, F_390 | F_Z), 1210 INSTR(0x6, "xihf", IF_RILa, F_Z), 1211 INSTR(0x7, "xilf", IF_RILa, F_Z), 1212 INSTR(0x8, "iihf", IF_RILa, F_Z), 1213 INSTR(0x9, "iilf", IF_RILa, F_Z), 1214 INSTR(0xa, "nihf", IF_RILa, F_Z), 1215 INSTR(0xb, "nilf", IF_RILa, F_Z), 1216 INSTR(0xc, "oihf", IF_RILa, F_Z), 1217 INSTR(0xd, "oilf", IF_RILa, F_Z), 1218 INSTR(0xe, "llihf", IF_RILa, F_Z), 1219 INSTR(0xf, "llilf", IF_RILa, F_Z), 1220 }; 1221 1222 static const struct inst_table tbl_c2x[16] = { 1223 INSTR(0x0, "msgfi", IF_RILa, F_Z), 1224 INSTR(0x1, "msfi", IF_RILa, F_Z), 1225 INSTR(0x4, "slgfi", IF_RILa, F_Z), 1226 INSTR(0x5, "slfi", IF_RILa, F_Z), 1227 INSTR(0x8, "agfi", IF_RILa, F_Z), 1228 INSTR(0x9, "afi", IF_RILa, F_Z), 1229 INSTR(0xa, "algfi", IF_RILa, F_Z), 1230 INSTR(0xb, "alfi", IF_RILa, F_Z), 1231 INSTR(0xc, "cgfi", IF_RILa, F_Z), 1232 INSTR(0xd, "cfi", IF_RILa, F_Z), 1233 INSTR(0xe, "clgfi", IF_RILa, F_Z), 1234 INSTR(0xf, "clfi", IF_RILa, F_Z), 1235 }; 1236 1237 static const struct inst_table tbl_c4x[16] = { 1238 INSTR(0x2, "llhrl", IF_RILb, F_Z), 1239 INSTR(0x4, "lghrl", IF_RILb, F_Z), 1240 INSTR(0x5, "lhrl", IF_RILb, F_Z), 1241 INSTR(0x6, "llghrl", IF_RILb, F_Z), 1242 INSTR(0x7, "sthrl", IF_RILb, F_Z), 1243 INSTR(0x8, "lgrl", IF_RILb, F_Z), 1244 INSTR(0xb, "stgrl", IF_RILb, F_Z), 1245 INSTR(0xc, "lgfrl", IF_RILb, F_Z), 1246 INSTR(0xd, "lrl", IF_RILb, F_Z), 1247 INSTR(0xe, "llgfrl", IF_RILb, F_Z), 1248 INSTR(0xf, "strl", IF_RILb, F_Z), 1249 }; 1250 1251 static const struct inst_table tbl_c6x[16] = { 1252 INSTR(0x0, "exrl", IF_RILb, F_Z), 1253 INSTR(0x2, "pfdrl", IF_RILc, F_Z), 1254 INSTR(0x4, "cghrl", IF_RILb, F_Z), 1255 INSTR(0x5, "chrl", IF_RILb, F_Z), 1256 INSTR(0x6, "clghrl", IF_RILb, F_Z), 1257 INSTR(0x7, "clhrl", IF_RILb, F_Z), 1258 INSTR(0x8, "cgrl", IF_RILb, F_Z), 1259 INSTR(0xa, "clgrl", IF_RILb, F_Z), 1260 INSTR(0xc, "cgfrl", IF_RILb, F_Z), 1261 INSTR(0xd, "crl", IF_RILb, F_Z), 1262 INSTR(0xe, "clgfrl", IF_RILb, F_Z), 1263 INSTR(0xf, "clrl", IF_RILb, F_Z), 1264 }; 1265 1266 static const struct inst_table tbl_c8x[16] = { 1267 INSTR(0x0, "mvcos", IF_SSF, F_Z), 1268 INSTR(0x1, "ectg", IF_SSF, F_Z), 1269 INSTR(0x2, "csst", IF_SSF, F_Z), 1270 INSTR(0x4, "lpd", IF_SSF, F_Z), 1271 INSTR(0x5, "lpdg", IF_SSF, F_Z), 1272 }; 1273 1274 static const struct inst_table tbl_ccx[16] = { 1275 INSTR(0x6, "brcth", IF_RILb, F_Z), 1276 INSTR(0x8, "aih", IF_RILa, F_Z), 1277 INSTR(0xa, "alsih", IF_RILa, F_Z), 1278 INSTR(0xb, "alsihn", IF_RILa, F_Z), 1279 INSTR(0xd, "cih", IF_RILa, F_Z), 1280 INSTR(0xf, "clih", IF_RILa, F_Z), 1281 }; 1282 1283 static const struct inst_table tbl_e3xx[256] = { 1284 INSTR(0x02, "ltg", IF_RXYa, F_Z), 1285 INSTR(0x03, "lrag", IF_RXYa, F_Z), 1286 INSTR(0x04, "lg", IF_RXYa, F_Z), 1287 INSTR(0x06, "cvby", IF_RXYa, F_Z), 1288 INSTR(0x08, "ag", IF_RXYa, F_Z), 1289 INSTR(0x09, "sg", IF_RXYa, F_Z), 1290 INSTR(0x0a, "alg", IF_RXYa, F_Z), 1291 INSTR(0x0b, "slg", IF_RXYa, F_Z), 1292 INSTR(0x0c, "msg", IF_RXYa, F_Z), 1293 INSTR(0x0d, "dsg", IF_RXYa, F_Z), 1294 INSTR(0x0e, "cvbg", IF_RXYa, F_Z), 1295 INSTR(0x0f, "lrvg", IF_RXYa, F_Z), 1296 INSTR(0x12, "lt", IF_RXYa, F_Z), 1297 INSTR(0x13, "lray", IF_RXYa, F_Z), 1298 INSTR(0x14, "lgf", IF_RXYa, F_Z), 1299 INSTR(0x15, "lgh", IF_RXYa, F_Z), 1300 INSTR(0x16, "llgf", IF_RXYa, F_Z), 1301 INSTR(0x17, "llgt", IF_RXYa, F_Z), 1302 INSTR(0x18, "agf", IF_RXYa, F_Z), 1303 INSTR(0x19, "sgf", IF_RXYa, F_Z), 1304 INSTR(0x1a, "algf", IF_RXYa, F_Z), 1305 INSTR(0x1b, "slgf", IF_RXYa, F_Z), 1306 INSTR(0x1c, "msgf", IF_RXYa, F_Z), 1307 INSTR(0x1d, "dsgf", IF_RXYa, F_Z), 1308 INSTR(0x1e, "lrv", IF_RXYa, F_390 | F_Z), 1309 INSTR(0x1f, "lrvh", IF_RXYa, F_390 | F_Z), 1310 INSTR(0x20, "cg", IF_RXYa, F_Z), 1311 INSTR(0x21, "clg", IF_RXYa, F_Z), 1312 INSTR(0x24, "stg", IF_RXYa, F_Z), 1313 INSTR(0x25, "ntstg", IF_RXYa, F_Z), 1314 INSTR(0x26, "cvdy", IF_RXYa, F_Z), 1315 INSTR(0x2e, "cvdg", IF_RXYa, F_Z), 1316 INSTR(0x2f, "strvg", IF_RXYa, F_Z), 1317 INSTR(0x30, "cgf", IF_RXYa, F_Z), 1318 INSTR(0x31, "clgf", IF_RXYa, F_Z), 1319 INSTR(0x32, "ltgf", IF_RXYa, F_Z), 1320 INSTR(0x34, "cgh", IF_RXYa, F_Z), 1321 INSTR(0x36, "pfd", IF_RXYb, F_Z), 1322 INSTR(0x3e, "strv", IF_RXYa, F_390 | F_Z), 1323 INSTR(0x3f, "strvh", IF_RXYa, F_390 | F_Z), 1324 INSTR(0x46, "bctg", IF_RXYa, F_Z), 1325 INSTR(0x50, "sty", IF_RXYa, F_Z), 1326 INSTR(0x51, "msy", IF_RXYa, F_Z), 1327 INSTR(0x54, "ny", IF_RXYa, F_Z), 1328 INSTR(0x55, "cly", IF_RXYa, F_Z), 1329 INSTR(0x56, "oy", IF_RXYa, F_Z), 1330 INSTR(0x57, "xy", IF_RXYa, F_Z), 1331 INSTR(0x58, "ly", IF_RXYa, F_Z), 1332 INSTR(0x59, "cy", IF_RXYa, F_Z), 1333 INSTR(0x5a, "ay", IF_RXYa, F_Z), 1334 INSTR(0x5b, "sy", IF_RXYa, F_Z), 1335 INSTR(0x5c, "mfy", IF_RXYa, F_Z), 1336 INSTR(0x5e, "aly", IF_RXYa, F_Z), 1337 INSTR(0x5f, "sly", IF_RXYa, F_Z), 1338 INSTR(0x70, "sthy", IF_RXYa, F_Z), 1339 INSTR(0x71, "lay", IF_RXYa, F_Z), 1340 INSTR(0x72, "stcy", IF_RXYa, F_Z), 1341 INSTR(0x73, "icy", IF_RXYa, F_Z), 1342 INSTR(0x75, "laey", IF_RXYa, F_Z), 1343 INSTR(0x76, "lb", IF_RXYa, F_Z), 1344 INSTR(0x77, "lgb", IF_RXYa, F_Z), 1345 INSTR(0x78, "lhy", IF_RXYa, F_Z), 1346 INSTR(0x79, "chy", IF_RXYa, F_Z), 1347 INSTR(0x7a, "ahy", IF_RXYa, F_Z), 1348 INSTR(0x7b, "shy", IF_RXYa, F_Z), 1349 INSTR(0x7c, "mhy", IF_RXYa, F_Z), 1350 INSTR(0x80, "ng", IF_RXYa, F_Z), 1351 INSTR(0x81, "og", IF_RXYa, F_Z), 1352 INSTR(0x82, "xg", IF_RXYa, F_Z), 1353 INSTR(0x85, "lgat", IF_RXYa, F_Z), 1354 INSTR(0x86, "mlg", IF_RXYa, F_Z), 1355 INSTR(0x87, "dlg", IF_RXYa, F_Z), 1356 INSTR(0x88, "alcg", IF_RXYa, F_Z), 1357 INSTR(0x89, "slbg", IF_RXYa, F_Z), 1358 INSTR(0x8e, "stpq", IF_RXYa, F_Z), 1359 INSTR(0x8f, "lpq", IF_RXYa, F_Z), 1360 INSTR(0x90, "llgc", IF_RXYa, F_Z), 1361 INSTR(0x91, "llgh", IF_RXYa, F_Z), 1362 INSTR(0x94, "llc", IF_RXYa, F_Z), 1363 INSTR(0x95, "llh", IF_RXYa, F_Z), 1364 INSTR(0x96, "ml", IF_RXYa, F_390 | F_Z), 1365 INSTR(0x97, "dl", IF_RXYa, F_390 | F_Z), 1366 INSTR(0x98, "alc", IF_RXYa, F_390 | F_Z), 1367 INSTR(0x99, "slb", IF_RXYa, F_390 | F_Z), 1368 INSTR(0x9c, "llgtat", IF_RXYa, F_Z), 1369 INSTR(0x9d, "llgfat", IF_RXYa, F_Z), 1370 INSTR(0x9f, "lat", IF_RXYa, F_Z), 1371 INSTR(0xc0, "lbh", IF_RXYa, F_Z), 1372 INSTR(0xc2, "llch", IF_RXYa, F_Z), 1373 INSTR(0xc3, "stch", IF_RXYa, F_Z), 1374 INSTR(0xc4, "lhh", IF_RXYa, F_Z), 1375 INSTR(0xc6, "llhh", IF_RXYa, F_Z), 1376 INSTR(0xc7, "sthh", IF_RXYa, F_Z), 1377 INSTR(0xc8, "lfhat", IF_RXYa, F_Z), 1378 INSTR(0xca, "lfh", IF_RXYa, F_Z), 1379 INSTR(0xcb, "stfh", IF_RXYa, F_Z), 1380 INSTR(0xcd, "chf", IF_RXYa, F_Z), 1381 INSTR(0xcf, "clhf", IF_RXYa, F_Z), 1382 }; 1383 1384 static const struct inst_table tbl_e5xx[256] = { 1385 INSTR(0x00, "lasp", IF_SSE, F_390 | F_Z), 1386 INSTR(0x01, "tprot", IF_SSE, F_390 | F_Z), 1387 INSTR(0x02, "strag", IF_SSE, F_Z), 1388 INSTR(0x0e, "mvcsk", IF_SSE, F_390 | F_Z), 1389 INSTR(0x0f, "mvcdk", IF_SSE, F_390 | F_Z), 1390 INSTR(0x44, "mvhhi", IF_SIL, F_Z), 1391 INSTR(0x48, "mvghi", IF_SIL, F_Z), 1392 INSTR(0x4c, "mvhi", IF_SIL, F_Z), 1393 INSTR(0x54, "chhsi", IF_SIL, F_Z), 1394 INSTR(0x55, "clhhsi", IF_SIL, F_Z), 1395 INSTR(0x58, "cghsi", IF_SIL, F_Z), 1396 INSTR(0x59, "clghsi", IF_SIL, F_Z), 1397 INSTR(0x5c, "chsi", IF_SIL, F_Z), 1398 INSTR(0x5d, "clfhsi", IF_SIL, F_Z), 1399 INSTR(0x60, "tbegin", IF_SIL, F_Z), 1400 INSTR(0x61, "tbeginc", IF_SIL, F_Z), 1401 }; 1402 1403 static const struct inst_table tbl_ebxx[256] = { 1404 INSTR(0x04, "lmg", IF_RSYa, F_Z), 1405 INSTR(0x0a, "srag", IF_RSYa, F_Z), 1406 INSTR(0x0b, "slag", IF_RSYa, F_Z), 1407 INSTR(0x0c, "srlg", IF_RSYa, F_Z), 1408 INSTR(0x0d, "sllg", IF_RSYa, F_Z), 1409 INSTR(0x0f, "tracg", IF_RSYa, F_Z), 1410 INSTR(0x14, "csy", IF_RSYa, F_Z), 1411 INSTR(0x1c, "rllg", IF_RSYa, F_Z), 1412 INSTR(0x1d, "rll", IF_RSYa, F_390 | F_Z), 1413 INSTR(0x20, "clmh", IF_RSYb, F_Z), 1414 INSTR(0x21, "clmy", IF_RSYb, F_Z), 1415 INSTR(0x23, "clt", IF_RSYb, F_Z), 1416 INSTR(0x24, "stmg", IF_RSYa, F_Z), 1417 INSTR(0x25, "stctg", IF_RSYa, F_Z | F_CTL_REG), 1418 INSTR(0x26, "stmh", IF_RSYa, F_Z), 1419 INSTR(0x2b, "clgt", IF_RSYb, F_Z), 1420 INSTR(0x2c, "stcmh", IF_RSYb, F_Z), 1421 INSTR(0x2d, "stcmy", IF_RSYb, F_Z), 1422 INSTR(0x2f, "lctlg", IF_RSYa, F_Z | F_CTL_REG), 1423 INSTR(0x30, "csg", IF_RSYa, F_Z), 1424 INSTR(0x31, "cdsy", IF_RSYa, F_Z), 1425 INSTR(0x3e, "cdsg", IF_RSYa, F_Z), 1426 INSTR(0x44, "bxhg", IF_RSYa, F_Z), 1427 INSTR(0x45, "bxleg", IF_RSYa, F_Z), 1428 INSTR(0x4c, "ecag", IF_RSYa, F_Z), 1429 INSTR(0x51, "tmy", IF_SIY, F_Z), 1430 INSTR(0x52, "mviy", IF_SIY, F_Z), 1431 INSTR(0x54, "niy", IF_SIY, F_Z), 1432 INSTR(0x55, "cliy", IF_SIY, F_Z), 1433 INSTR(0x56, "oiy", IF_SIY, F_Z), 1434 INSTR(0x57, "xiy", IF_SIY, F_Z), 1435 INSTR(0x6a, "asi", IF_SIY, F_Z), 1436 INSTR(0x6e, "alsi", IF_SIY, F_Z), 1437 INSTR(0x80, "icmh", IF_RSYb, F_Z), 1438 INSTR(0x81, "icmy", IF_RSYb, F_Z), 1439 INSTR(0x8e, "mvclu", IF_RSYa, F_390 | F_Z), 1440 INSTR(0x8f, "clclu", IF_RSYa, F_390 | F_Z), 1441 INSTR(0x90, "stmy", IF_RSYa, F_Z), 1442 INSTR(0x96, "lmh", IF_RSYa, F_Z), 1443 INSTR(0x98, "lmy", IF_RSYa, F_Z), 1444 INSTR(0x9a, "lamy", IF_RSYa, F_Z), 1445 INSTR(0x9b, "stamy", IF_RSYa, F_Z), 1446 INSTR(0xc0, "tp", IF_RSLa, F_390 | F_Z), 1447 INSTR(0xdc, "srak", IF_RSYa, F_Z), 1448 INSTR(0xdd, "slak", IF_RSYa, F_Z), 1449 INSTR(0xde, "srlk", IF_RSYa, F_Z), 1450 INSTR(0xdf, "sllk", IF_RSYa, F_Z), 1451 INSTR(0xe2, "locg", IF_RSYb, F_Z), 1452 INSTR(0xe3, "stocg", IF_RSYb, F_Z), 1453 INSTR(0xe4, "lang", IF_RSYa, F_Z), 1454 INSTR(0xe6, "laog", IF_RSYa, F_Z), 1455 INSTR(0xe7, "laxg", IF_RSYa, F_Z), 1456 INSTR(0xe8, "laag", IF_RSYa, F_Z), 1457 INSTR(0xea, "laalg", IF_RSYa, F_Z), 1458 INSTR(0xf2, "loc", IF_RSYb, F_Z), 1459 INSTR(0xf3, "stoc", IF_RSYb, F_Z), 1460 INSTR(0xf4, "lan", IF_RSYa, F_Z), 1461 INSTR(0xf6, "lao", IF_RSYa, F_Z), 1462 INSTR(0xf7, "lax", IF_RSYa, F_Z), 1463 INSTR(0xf8, "laa", IF_RSYa, F_Z), 1464 INSTR(0xfa, "laal", IF_RSYa, F_Z), 1465 }; 1466 1467 static const struct inst_table tbl_ecxx[256] = { 1468 INSTR(0x44, "brxhg", IF_RIEe, F_Z), 1469 INSTR(0x45, "brxlg", IF_RIEe, F_Z), 1470 INSTR(0x51, "risblg", IF_RIEf, F_Z), 1471 INSTR(0x54, "rnsbg", IF_RIEf, F_Z), 1472 INSTR(0x55, "risbg", IF_RIEf, F_Z), 1473 INSTR(0x56, "rosbg", IF_RIEf, F_Z), 1474 INSTR(0x57, "rxsbg", IF_RIEf, F_Z), 1475 INSTR(0x59, "risbgn", IF_RIEf, F_Z), 1476 INSTR(0x5d, "risbhg", IF_RIEf, F_Z), 1477 INSTR(0x64, "cgrj", IF_RIEb, F_Z), 1478 INSTR(0x65, "clgrj", IF_RIEb, F_Z), 1479 INSTR(0x70, "cgit", IF_RIEa, F_Z), 1480 INSTR(0x71, "clgit", IF_RIEa, F_Z), 1481 INSTR(0x72, "cit", IF_RIEa, F_Z), 1482 INSTR(0x73, "clfit", IF_RIEa, F_Z), 1483 INSTR(0x76, "crj", IF_RIEb, F_Z), 1484 INSTR(0x77, "clrj", IF_RIEb, F_Z), 1485 INSTR(0x7c, "cgij", IF_RIEc, F_Z), 1486 INSTR(0x7d, "clgij", IF_RIEc, F_Z), 1487 INSTR(0x7e, "cij", IF_RIEc, F_Z), 1488 INSTR(0x7f, "clij", IF_RIEc, F_Z), 1489 INSTR(0xd8, "ahik", IF_RIEd, F_Z), 1490 INSTR(0xd9, "aghik", IF_RIEd, F_Z), 1491 INSTR(0xda, "alhsik", IF_RIEd, F_Z), 1492 INSTR(0xdb, "alghsik", IF_RIEd, F_Z), 1493 INSTR(0xe4, "cgrb", IF_RRS, F_Z), 1494 INSTR(0xe5, "clgrb", IF_RRS, F_Z), 1495 INSTR(0xf6, "crb", IF_RRS, F_Z), 1496 INSTR(0xf7, "clrb", IF_RRS, F_Z), 1497 INSTR(0xfc, "cgib", IF_RIS, F_Z), 1498 INSTR(0xfd, "clgib", IF_RIS, F_Z), 1499 INSTR(0xfe, "cib", IF_RIS, F_Z), 1500 INSTR(0xff, "clib", IF_RIS, F_Z), 1501 }; 1502 1503 static const struct inst_table tbl_edxx[256] = { 1504 INSTR(0x04, "ldeb", IF_RXE, F_390 | F_Z), 1505 INSTR(0x05, "lxdb", IF_RXE, F_390 | F_Z), 1506 INSTR(0x06, "lxeb", IF_RXE, F_390 | F_Z), 1507 INSTR(0x07, "mxdb", IF_RXE, F_390 | F_Z), 1508 INSTR(0x08, "keb", IF_RXE, F_390 | F_Z), 1509 INSTR(0x09, "ceb", IF_RXE, F_390 | F_Z), 1510 INSTR(0x0a, "aeb", IF_RXE, F_390 | F_Z), 1511 INSTR(0x0b, "seb", IF_RXE, F_390 | F_Z), 1512 INSTR(0x0c, "mdeb", IF_RXE, F_390 | F_Z), 1513 INSTR(0x0d, "deb", IF_RXE, F_390 | F_Z), 1514 INSTR(0x0e, "maeb", IF_RXF, F_390 | F_Z), 1515 INSTR(0x0f, "mseb", IF_RXF, F_390 | F_Z), 1516 INSTR(0x10, "tceb", IF_RXE, F_390 | F_Z), 1517 INSTR(0x11, "tcdb", IF_RXE, F_390 | F_Z), 1518 INSTR(0x12, "tcxb", IF_RXE, F_390 | F_Z), 1519 INSTR(0x14, "sqeb", IF_RXE, F_390 | F_Z), 1520 INSTR(0x15, "sqdb", IF_RXE, F_390 | F_Z), 1521 INSTR(0x17, "meeb", IF_RXE, F_390 | F_Z), 1522 INSTR(0x18, "kdb", IF_RXE, F_390 | F_Z), 1523 INSTR(0x19, "cdb", IF_RXE, F_390 | F_Z), 1524 INSTR(0x1a, "adb", IF_RXE, F_390 | F_Z), 1525 INSTR(0x1b, "sdb", IF_RXE, F_390 | F_Z), 1526 INSTR(0x1c, "mdb", IF_RXE, F_390 | F_Z), 1527 INSTR(0x1d, "ddb", IF_RXE, F_390 | F_Z), 1528 INSTR(0x1e, "madb", IF_RXF, F_390 | F_Z), 1529 INSTR(0x1f, "msdb", IF_RXF, F_390 | F_Z), 1530 INSTR(0x24, "lde", IF_RXE, F_390 | F_Z), 1531 INSTR(0x25, "lxd", IF_RXE, F_390 | F_Z), 1532 INSTR(0x26, "lxe", IF_RXE, F_390 | F_Z), 1533 INSTR(0x2e, "mae", IF_RXF, F_390 | F_Z), 1534 INSTR(0x2f, "mse", IF_RXF, F_390 | F_Z), 1535 INSTR(0x34, "sqe", IF_RXE, F_390 | F_Z), 1536 INSTR(0x35, "sqd", IF_RXE, F_390 | F_Z), 1537 INSTR(0x37, "mee", IF_RXE, F_390 | F_Z), 1538 INSTR(0x38, "mayl", IF_RXF, F_Z), 1539 INSTR(0x39, "myl", IF_RXF, F_Z), 1540 INSTR(0x3a, "may", IF_RXF, F_Z), 1541 INSTR(0x3b, "my", IF_RXF, F_Z), 1542 INSTR(0x3c, "mayh", IF_RXF, F_Z), 1543 INSTR(0x3d, "myh", IF_RXF, F_Z), 1544 INSTR(0x3e, "mad", IF_RXF, F_390 | F_Z), 1545 INSTR(0x3f, "msd", IF_RXF, F_390 | F_Z), 1546 INSTR(0x40, "sldt", IF_RXF, F_Z), 1547 INSTR(0x41, "srdt", IF_RXF, F_Z), 1548 INSTR(0x48, "slxt", IF_RXF, F_Z), 1549 INSTR(0x49, "srxt", IF_RXF, F_Z), 1550 INSTR(0x50, "tdcet", IF_RXE, F_Z), 1551 INSTR(0x51, "tdget", IF_RXE, F_Z), 1552 INSTR(0x54, "tdcdt", IF_RXE, F_Z), 1553 INSTR(0x55, "tdgdt", IF_RXE, F_Z), 1554 INSTR(0x58, "tdcxt", IF_RXE, F_Z), 1555 INSTR(0x59, "tdgxt", IF_RXE, F_Z), 1556 INSTR(0x64, "ley", IF_RXYa, F_Z), 1557 INSTR(0x65, "ldy", IF_RXYa, F_Z), 1558 INSTR(0x66, "stey", IF_RXYa, F_Z), 1559 INSTR(0x67, "stdy", IF_RXYa, F_Z), 1560 INSTR(0xa8, "czdt", IF_RSLb, F_Z), 1561 INSTR(0xa9, "czxt", IF_RSLb, F_Z), 1562 INSTR(0xaa, "cdzt", IF_RSLb, F_Z), 1563 INSTR(0xab, "cxzt", IF_RSLb, F_Z), 1564 }; 1565 1566 static const struct inst_table tbl_xx[256] = { 1567 INSTR(0x00, ".byte", IF_ZERO, F_370 | F_390 | F_Z), 1568 TABLE(0x01, tbl_01xx, 1, 0, 0xff), 1569 INSTR(0x04, "spm", IF_RR, F_370 | F_Z), 1570 INSTR(0x05, "balr", IF_RR, F_370 | F_Z), 1571 INSTR(0x06, "bctr", IF_RR, F_370 | F_Z), 1572 TABLE(0x07, tbl_07, 1, 4, 0x0f), 1573 INSTR(0x08, "ssk", IF_RR, F_370), 1574 INSTR(0x09, "isk", IF_RR, F_370), 1575 INSTR(0x0a, "svc", IF_I, F_370 | F_390 | F_Z), 1576 INSTR(0x0b, "bsm", IF_RR, F_390 | F_Z), 1577 INSTR(0x0c, "bassm", IF_RR, F_390 | F_Z), 1578 INSTR(0x0d, "basr", IF_RR, F_390 | F_Z), 1579 INSTR(0x0e, "mvcl", IF_RR, F_370 | F_390 | F_Z), 1580 INSTR(0x0f, "clcl", IF_RR, F_370 | F_390 | F_Z), 1581 INSTR(0x10, "lpr", IF_RR, F_370 | F_390 | F_Z), 1582 INSTR(0x11, "lnr", IF_RR, F_370 | F_390 | F_Z), 1583 INSTR(0x12, "ltr", IF_RR, F_370 | F_390 | F_Z), 1584 INSTR(0x13, "lcr", IF_RR, F_370 | F_390 | F_Z), 1585 INSTR(0x14, "nr", IF_RR, F_370 | F_390 | F_Z), 1586 INSTR(0x15, "clr", IF_RR, F_370 | F_390 | F_Z), 1587 INSTR(0x16, "or", IF_RR, F_370 | F_390 | F_Z), 1588 INSTR(0x17, "xr", IF_RR, F_370 | F_390 | F_Z), 1589 INSTR(0x18, "lr", IF_RR, F_370 | F_390 | F_Z), 1590 INSTR(0x19, "cr", IF_RR, F_370 | F_390 | F_Z), 1591 INSTR(0x1a, "ar", IF_RR, F_370 | F_390 | F_Z), 1592 INSTR(0x1b, "sr", IF_RR, F_370 | F_390 | F_Z), 1593 INSTR(0x1c, "mr", IF_RR, F_370 | F_390 | F_Z), 1594 INSTR(0x1d, "dr", IF_RR, F_370 | F_390 | F_Z), 1595 INSTR(0x1e, "alr", IF_RR, F_370 | F_390 | F_Z), 1596 INSTR(0x1f, "slr", IF_RR, F_370 | F_390 | F_Z), 1597 INSTR(0x20, "lpdr", IF_RR, F_370 | F_390 | F_Z), 1598 INSTR(0x21, "lndr", IF_RR, F_370 | F_390 | F_Z), 1599 INSTR(0x22, "ltdr", IF_RR, F_370 | F_390 | F_Z), 1600 INSTR(0x23, "lcdr", IF_RR, F_370 | F_390 | F_Z), 1601 INSTR(0x24, "hdr", IF_RR, F_370 | F_390 | F_Z), 1602 MULTI(0x25, tbl_25), 1603 INSTR(0x26, "mxr", IF_RR, F_370 | F_390 | F_Z), 1604 INSTR(0x27, "mxdr", IF_RR, F_370 | F_390 | F_Z), 1605 INSTR(0x28, "ldr", IF_RR, F_370 | F_390 | F_Z), 1606 INSTR(0x29, "cdr", IF_RR, F_370 | F_390 | F_Z), 1607 INSTR(0x2a, "adr", IF_RR, F_370 | F_390 | F_Z), 1608 INSTR(0x2b, "sdr", IF_RR, F_370 | F_390 | F_Z), 1609 INSTR(0x2c, "mdr", IF_RR, F_370 | F_390 | F_Z), 1610 INSTR(0x2d, "ddr", IF_RR, F_370 | F_390 | F_Z), 1611 INSTR(0x2e, "awr", IF_RR, F_370 | F_390 | F_Z), 1612 INSTR(0x2f, "swr", IF_RR, F_370 | F_390 | F_Z), 1613 INSTR(0x30, "lper", IF_RR, F_370 | F_390 | F_Z), 1614 INSTR(0x31, "lner", IF_RR, F_370 | F_390 | F_Z), 1615 INSTR(0x32, "lter", IF_RR, F_370 | F_390 | F_Z), 1616 INSTR(0x33, "lcer", IF_RR, F_370 | F_390 | F_Z), 1617 INSTR(0x34, "her", IF_RR, F_370 | F_390 | F_Z), 1618 MULTI(0x35, tbl_35), 1619 INSTR(0x36, "axr", IF_RR, F_370 | F_390 | F_Z), 1620 INSTR(0x37, "sxr", IF_RR, F_370 | F_390 | F_Z), 1621 INSTR(0x38, "ler", IF_RR, F_370 | F_390 | F_Z), 1622 INSTR(0x39, "cer", IF_RR, F_370 | F_390 | F_Z), 1623 INSTR(0x3a, "aer", IF_RR, F_370 | F_390 | F_Z), 1624 INSTR(0x3b, "ser", IF_RR, F_370 | F_390 | F_Z), 1625 MULTI(0x3c, tbl_3c), 1626 INSTR(0x3d, "der", IF_RR, F_370 | F_390 | F_Z), 1627 INSTR(0x3e, "aur", IF_RR, F_370 | F_390 | F_Z), 1628 INSTR(0x3f, "sur", IF_RR, F_370 | F_390 | F_Z), 1629 INSTR(0x40, "sth", IF_RXa, F_370 | F_390 | F_Z), 1630 INSTR(0x41, "la", IF_RXa, F_370 | F_390 | F_Z), 1631 INSTR(0x42, "stc", IF_RXa, F_370 | F_390 | F_Z), 1632 INSTR(0x43, "ic", IF_RXa, F_370 | F_390 | F_Z), 1633 INSTR(0x44, "ex", IF_RXa, F_370 | F_390 | F_Z), 1634 INSTR(0x45, "bal", IF_RXa, F_370 | F_390 | F_Z), 1635 INSTR(0x46, "bct", IF_RXa, F_370 | F_390 | F_Z), 1636 TABLE(0x47, tbl_47, 1, 4, 0x0f), 1637 INSTR(0x48, "lh", IF_RXa, F_370 | F_390 | F_Z), 1638 INSTR(0x49, "ch", IF_RXa, F_370 | F_390 | F_Z), 1639 INSTR(0x4a, "ah", IF_RXa, F_370 | F_390 | F_Z), 1640 INSTR(0x4b, "sh", IF_RXa, F_370 | F_390 | F_Z), 1641 INSTR(0x4c, "mh", IF_RXa, F_370 | F_390 | F_Z), 1642 INSTR(0x4d, "bas", IF_RXa, F_390 | F_Z), 1643 INSTR(0x4e, "cvd", IF_RXa, F_370 | F_390 | F_Z), 1644 INSTR(0x4f, "cvb", IF_RXa, F_370 | F_390 | F_Z), 1645 INSTR(0x50, "st", IF_RXa, F_370 | F_390 | F_Z), 1646 INSTR(0x51, "lae", IF_RXa, F_390 | F_Z), 1647 INSTR(0x54, "n", IF_RXa, F_370 | F_390 | F_Z), 1648 INSTR(0x55, "cl", IF_RXa, F_370 | F_390 | F_Z), 1649 INSTR(0x56, "o", IF_RXa, F_370 | F_390 | F_Z), 1650 INSTR(0x57, "x", IF_RXa, F_370 | F_390 | F_Z), 1651 INSTR(0x58, "l", IF_RXa, F_370 | F_390 | F_Z), 1652 INSTR(0x59, "c", IF_RXa, F_370 | F_390 | F_Z), 1653 INSTR(0x5a, "a", IF_RXa, F_370 | F_390 | F_Z), 1654 INSTR(0x5b, "s", IF_RXa, F_370 | F_390 | F_Z), 1655 INSTR(0x5c, "m", IF_RXa, F_370 | F_390 | F_Z), 1656 INSTR(0x5d, "d", IF_RXa, F_370 | F_390 | F_Z), 1657 INSTR(0x5e, "al", IF_RXa, F_370 | F_390 | F_Z), 1658 INSTR(0x5f, "sl", IF_RXa, F_370 | F_390 | F_Z), 1659 INSTR(0x60, "std", IF_RXa, F_370 | F_390 | F_Z), 1660 INSTR(0x67, "mxd", IF_RXa, F_370 | F_390 | F_Z), 1661 INSTR(0x68, "ld", IF_RXa, F_370 | F_390 | F_Z), 1662 INSTR(0x69, "cd", IF_RXa, F_370 | F_390 | F_Z), 1663 INSTR(0x6a, "ad", IF_RXa, F_370 | F_390 | F_Z), 1664 INSTR(0x6b, "sd", IF_RXa, F_370 | F_390 | F_Z), 1665 INSTR(0x6c, "md", IF_RXa, F_370 | F_390 | F_Z), 1666 INSTR(0x6d, "dd", IF_RXa, F_370 | F_390 | F_Z), 1667 INSTR(0x6e, "aw", IF_RXa, F_370 | F_390 | F_Z), 1668 INSTR(0x6f, "sw", IF_RXa, F_370 | F_390 | F_Z), 1669 INSTR(0x70, "ste", IF_RXa, F_370 | F_390 | F_Z), 1670 INSTR(0x71, "ms", IF_RXa, F_390 | F_Z), 1671 INSTR(0x78, "le", IF_RXa, F_370 | F_390 | F_Z), 1672 INSTR(0x79, "ce", IF_RXa, F_370 | F_390 | F_Z), 1673 INSTR(0x7a, "ae", IF_RXa, F_370 | F_390 | F_Z), 1674 INSTR(0x7b, "se", IF_RXa, F_370 | F_390 | F_Z), 1675 MULTI(0x7c, tbl_7c), 1676 INSTR(0x7d, "de", IF_RXa, F_370 | F_390 | F_Z), 1677 INSTR(0x7e, "au", IF_RXa, F_370 | F_390 | F_Z), 1678 INSTR(0x7f, "su", IF_RXa, F_370 | F_390 | F_Z), 1679 INSTR(0x80, "ssm", IF_S, F_370 | F_390 | F_Z), 1680 INSTR(0x82, "lpsw", IF_S, F_370 | F_390 | F_Z), 1681 INSTR(0x83, "diag", IF_DIAG, F_370 | F_390 | F_Z), 1682 MULTI(0x84, tbl_84), 1683 MULTI(0x85, tbl_85), 1684 INSTR(0x86, "bxh", IF_RSa, F_370 | F_390 | F_Z), 1685 INSTR(0x87, "bxle", IF_RSa, F_370 | F_390 | F_Z), 1686 INSTR(0x88, "srl", IF_RSa, F_370 | F_390 | F_Z), 1687 INSTR(0x89, "sll", IF_RSa, F_370 | F_390 | F_Z), 1688 INSTR(0x8a, "sra", IF_RSa, F_370 | F_390 | F_Z), 1689 INSTR(0x8b, "sla", IF_RSa, F_370 | F_390 | F_Z), 1690 INSTR(0x8c, "srdl", IF_RSa, F_370 | F_390 | F_Z), 1691 INSTR(0x8d, "sldl", IF_RSa, F_370 | F_390 | F_Z), 1692 INSTR(0x8e, "srda", IF_RSa, F_370 | F_390 | F_Z), 1693 INSTR(0x8f, "slda", IF_RSa, F_370 | F_390 | F_Z), 1694 INSTR(0x90, "stm", IF_RSa, F_370 | F_390 | F_Z), 1695 INSTR(0x91, "tm", IF_SI, F_370 | F_390 | F_Z), 1696 INSTR(0x92, "mvi", IF_SI, F_370 | F_390 | F_Z), 1697 INSTR(0x93, "ts", IF_S, F_370 | F_390 | F_Z), 1698 INSTR(0x94, "ni", IF_SI, F_370 | F_390 | F_Z), 1699 INSTR(0x95, "cli", IF_SI, F_370 | F_390 | F_Z), 1700 INSTR(0x96, "oi", IF_SI, F_370 | F_390 | F_Z), 1701 INSTR(0x97, "xi", IF_SI, F_370 | F_390 | F_Z), 1702 INSTR(0x98, "lm", IF_RSa, F_370 | F_390 | F_Z), 1703 INSTR(0x99, "trace", IF_RSa, F_390 | F_Z), 1704 INSTR(0x9a, "lam", IF_RSa, F_390 | F_Z), 1705 INSTR(0x9b, "stam", IF_RSa, F_390 | F_Z), 1706 TABLE(0xa5, tbl_a5x, 1, 0, 0x0f), 1707 TABLE(0xa7, tbl_a7x, 1, 0, 0x0f), 1708 INSTR(0xa8, "mvcle", IF_RSa, F_390 | F_Z), 1709 INSTR(0xa9, "clcle", IF_RSa, F_390 | F_Z), 1710 INSTR(0xac, "stnsm", IF_SI, F_370 | F_390 | F_Z), 1711 INSTR(0xad, "stosm", IF_SI, F_370 | F_390 | F_Z), 1712 INSTR(0xae, "sigp", IF_RSa, F_370 | F_390 | F_Z), 1713 INSTR(0xaf, "mc", IF_SI, F_370 | F_390 | F_Z), 1714 INSTR(0xb1, "lra", IF_RXa, F_370 | F_390 | F_Z), 1715 TABLE(0xb2, tbl_b2xx, 1, 0, 0xff), 1716 TABLE(0xb3, tbl_b3xx, 1, 0, 0xff), 1717 INSTR(0xb6, "stctl", IF_RSa, F_370 | F_390 | F_Z | F_CTL_REG), 1718 INSTR(0xb7, "lctl", IF_RSa, F_370 | F_390 | F_Z | F_CTL_REG), 1719 TABLE(0xb9, tbl_b9xx, 1, 0, 0xff), 1720 INSTR(0xba, "cs", IF_RSa, F_370 | F_390 | F_Z), 1721 INSTR(0xbb, "cds", IF_RSa, F_370 | F_390 | F_Z), 1722 INSTR(0xbd, "clm", IF_RSb, F_370 | F_390 | F_Z), 1723 INSTR(0xbe, "stcm", IF_RSb, F_370 | F_390 | F_Z), 1724 INSTR(0xbf, "icm", IF_RSb, F_370 | F_390 | F_Z), 1725 TABLE(0xc0, tbl_c0x, 1, 0, 0x0f), 1726 TABLE(0xc2, tbl_c2x, 1, 0, 0x0f), 1727 TABLE(0xc4, tbl_c4x, 1, 0, 0x0f), 1728 INSTR(0xc5, "bprp", IF_MII, F_Z), 1729 TABLE(0xc6, tbl_c6x, 1, 0, 0x0f), 1730 INSTR(0xc7, "bpp", IF_SMI, F_Z), 1731 TABLE(0xc8, tbl_c8x, 1, 0, 0x0f), 1732 TABLE(0xcc, tbl_ccx, 1, 0, 0x0f), 1733 INSTR(0xd0, "trtr", IF_SSa, F_Z), 1734 INSTR(0xd1, "mvn", IF_SSa, F_370 | F_390 | F_Z), 1735 INSTR(0xd2, "mvc", IF_SSa, F_370 | F_390 | F_Z), 1736 INSTR(0xd3, "mvz", IF_SSa, F_370 | F_390 | F_Z), 1737 INSTR(0xd4, "nc", IF_SSa, F_370 | F_390 | F_Z), 1738 INSTR(0xd5, "clc", IF_SSa, F_370 | F_390 | F_Z), 1739 INSTR(0xd6, "oc", IF_SSa, F_370 | F_390 | F_Z), 1740 INSTR(0xd7, "xc", IF_SSa, F_370 | F_390 | F_Z), 1741 INSTR(0xd9, "mvck", IF_SSd, F_390 | F_Z), 1742 INSTR(0xda, "mvcp", IF_SSd, F_390 | F_Z), 1743 INSTR(0xdb, "mvcs", IF_SSd, F_390 | F_Z), 1744 INSTR(0xdc, "tr", IF_SSa, F_370 | F_390 | F_Z), 1745 INSTR(0xdd, "trt", IF_SSa, F_370 | F_390 | F_Z), 1746 INSTR(0xde, "ed", IF_SSa, F_370 | F_390 | F_Z), 1747 INSTR(0xdf, "edmk", IF_SSa, F_370 | F_390 | F_Z), 1748 INSTR(0xe1, "pku", IF_SSf, F_390 | F_Z), 1749 INSTR(0xe2, "unpku", IF_SSa, F_390 | F_Z), 1750 TABLE(0xe3, tbl_e3xx, 5, 0, 0xff), 1751 TABLE(0xe5, tbl_e5xx, 1, 0, 0xff), 1752 INSTR(0xe8, "mvcin", IF_SSa, F_390 | F_Z), 1753 INSTR(0xe9, "pka", IF_SSf, F_390 | F_Z), 1754 INSTR(0xea, "unpka", IF_SSa, F_390 | F_Z), 1755 TABLE(0xeb, tbl_ebxx, 5, 0, 0xff), 1756 TABLE(0xec, tbl_ecxx, 5, 0, 0xff), 1757 TABLE(0xed, tbl_edxx, 5, 0, 0xff), 1758 INSTR(0xee, "plo", IF_SSe, F_390 | F_Z), 1759 INSTR(0xef, "lmd", IF_SSe, F_Z), 1760 INSTR(0xf0, "srp", IF_SSc, F_370 | F_390 | F_Z), 1761 INSTR(0xf1, "mvo", IF_SSb, F_370 | F_390 | F_Z), 1762 INSTR(0xf2, "pack", IF_SSb, F_370 | F_390 | F_Z), 1763 INSTR(0xf3, "unpk", IF_SSb, F_370 | F_390 | F_Z), 1764 INSTR(0xf8, "zap", IF_SSb, F_370 | F_390 | F_Z), 1765 INSTR(0xf9, "cp", IF_SSb, F_370 | F_390 | F_Z), 1766 INSTR(0xfa, "ap", IF_SSb, F_370 | F_390 | F_Z), 1767 INSTR(0xfb, "sp", IF_SSb, F_370 | F_390 | F_Z), 1768 INSTR(0xfc, "mp", IF_SSb, F_370 | F_390 | F_Z), 1769 INSTR(0xfd, "dp", IF_SSb, F_370 | F_390 | F_Z), 1770 }; 1771 /* END CSTYLED */ 1772 1773 /* how masks are printed */ 1774 static const char *M[16] = { 1775 "0", "1", "2", "3", "4", "5", "6", "7", 1776 "8", "9", "10", "11", "12", "13", "14", "15", 1777 }; 1778 1779 /* how general purpose regs are printed */ 1780 static const char *R[16] = { 1781 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", 1782 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", 1783 }; 1784 1785 /* how control regs are printed */ 1786 static const char *C[16] = { 1787 "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7", 1788 "%c8", "%c9", "%c10", "%c11", "%c12", "%c13", "%c14", "%c15", 1789 }; 1790 1791 /* B and X registers are still registers - print them the same way */ 1792 #define B R 1793 #define X R 1794 1795 static inline uint32_t 1796 val_8_4_8(uint32_t hi, uint32_t mid, uint32_t lo) 1797 { 1798 ASSERT0(hi & ~0xff); 1799 ASSERT0(mid & ~0xf); 1800 ASSERT0(lo & ~0xff); 1801 return ((hi << 12) | (mid << 8) | lo); 1802 } 1803 1804 static inline uint32_t 1805 val_16_16(uint32_t hi, uint32_t lo) 1806 { 1807 ASSERT0(hi & ~0xffff); 1808 ASSERT0(lo & ~0xffff); 1809 return ((BE_16(hi) << 16) | BE_16(lo)); 1810 } 1811 1812 static inline int32_t 1813 sval_16_16(uint32_t hi, uint32_t lo) 1814 { 1815 return (val_16_16(hi, lo)); 1816 } 1817 1818 static inline uint32_t 1819 val_8_16(uint32_t hi, uint32_t lo) 1820 { 1821 ASSERT0(hi & ~0xff); 1822 ASSERT0(lo & ~0xffff); 1823 return ((hi << 16) | BE_16(lo)); 1824 } 1825 1826 static inline int32_t 1827 sval_8_16(uint32_t hi, uint32_t lo) 1828 { 1829 int32_t tmp = val_8_16(hi, lo); 1830 1831 /* sign extend */ 1832 if (tmp & 0x00800000) 1833 return (0xff000000 | tmp); 1834 return (tmp); 1835 } 1836 1837 static inline uint32_t 1838 val_4_8(uint32_t hi, uint32_t lo) 1839 { 1840 ASSERT0(hi & ~0xf); 1841 ASSERT0(lo & ~0xff); 1842 return ((hi << 8) | lo); 1843 } 1844 1845 static inline int32_t 1846 sval_4_8(uint32_t hi, uint32_t lo) 1847 { 1848 uint32_t tmp = val_4_8(hi, lo); 1849 1850 /* sign extend */ 1851 if (tmp & 0x800) 1852 return (0xfffff000 | tmp); 1853 return (tmp); 1854 } 1855 1856 /* ARGSUSED */ 1857 static void 1858 fmt_zero(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1859 { 1860 (void) snprintf(buf, buflen, "0x00, 0x00"); 1861 } 1862 1863 /* ARGSUSED */ 1864 static void 1865 fmt_diag(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1866 { 1867 (void) snprintf(buf, buflen, "%#x", 1868 val_8_16(inst->diag.par1, inst->diag.par2)); 1869 } 1870 1871 /* ARGSUSED */ 1872 static void 1873 fmt_e(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1874 { 1875 /* nothing to do */ 1876 } 1877 1878 /* ARGSUSED */ 1879 static void 1880 fmt_i(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1881 { 1882 (void) snprintf(buf, buflen, "%#x", inst->i.i); 1883 } 1884 1885 /* ARGSUSED */ 1886 static void 1887 fmt_ie(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1888 { 1889 (void) snprintf(buf, buflen, "%u,%u", inst->ie.i1, inst->ie.i2); 1890 } 1891 1892 /* ARGSUSED */ 1893 static void 1894 fmt_mii(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1895 { 1896 uint64_t ri2 = addr + 2 * sval_4_8(inst->mii.ri2h, inst->mii.ri2l); 1897 uint64_t ri3 = addr + 2 * sval_8_16(inst->mii.ri3h, inst->mii.ri3l); 1898 1899 (void) snprintf(buf, buflen, "%s,%#x,%#x", M[inst->mii.m1], ri2, ri3); 1900 } 1901 1902 /* ARGSUSED */ 1903 static void 1904 fmt_ril_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1905 { 1906 (void) snprintf(buf, buflen, "%s,%u", R[inst->ril_a.r1], 1907 val_16_16(inst->ril_a.i2h, inst->ril_a.i2l)); 1908 } 1909 1910 /* ARGSUSED */ 1911 static void 1912 fmt_ril_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1913 { 1914 uint64_t ri2 = addr + 2 * 1915 sval_16_16(inst->ril_b.ri2h, inst->ril_b.ri2l); 1916 1917 (void) snprintf(buf, buflen, "%s,%#x", R[inst->ril_b.r1], ri2); 1918 } 1919 1920 /* ARGSUSED */ 1921 static void 1922 fmt_ril_c(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1923 { 1924 uint64_t ri2 = addr + 2 * 1925 sval_16_16(inst->ril_c.ri2h, inst->ril_c.ri2l); 1926 1927 (void) snprintf(buf, buflen, "%s,%#x", M[inst->ril_c.m1], ri2); 1928 } 1929 1930 /* ARGSUSED */ 1931 static void 1932 fmt_ris(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1933 { 1934 uint32_t d4 = val_4_8(inst->ris.d4h, inst->ris.d4l); 1935 1936 (void) snprintf(buf, buflen, "%s,%u,%s,%u(%s)", 1937 R[inst->ris.r1], inst->ris.i2, M[inst->ris.m3], d4, 1938 B[inst->ris.b4]); 1939 } 1940 1941 /* ARGSUSED */ 1942 static void 1943 fmt_ri_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1944 { 1945 uint16_t i2 = BE_16(inst->ri_a.i2); 1946 1947 if (flags & F_SIGNED_IMM) 1948 (void) snprintf(buf, buflen, "%s,%d", R[inst->ri_a.r1], 1949 (int16_t)i2); 1950 else 1951 (void) snprintf(buf, buflen, "%s,%u", R[inst->ri_a.r1], 1952 i2); 1953 } 1954 1955 /* ARGSUSED */ 1956 static void 1957 fmt_ri_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1958 { 1959 uint64_t ri2 = addr + 2 * (int16_t)BE_16(inst->ri_b.ri2); 1960 1961 (void) snprintf(buf, buflen, "%s,%#x", R[inst->ri_b.r1], ri2); 1962 } 1963 1964 static void 1965 fmt_ri_c(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1966 { 1967 uint64_t ri2 = addr + 2 * (int16_t)BE_16(inst->ri_c.ri2); 1968 1969 if (flags & F_HIDE_MASK) 1970 (void) snprintf(buf, buflen, "%#x", ri2); 1971 else 1972 (void) snprintf(buf, buflen, "%s,%#x", M[inst->ri_c.m1], ri2); 1973 } 1974 1975 /* ARGSUSED */ 1976 static void 1977 fmt_rie_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1978 { 1979 (void) snprintf(buf, buflen, "%s,%u,%s", R[inst->rie_a.r1], 1980 BE_16(inst->rie_a.i2), M[inst->rie_a.m3]); 1981 } 1982 1983 /* ARGSUSED */ 1984 static void 1985 fmt_rie_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1986 { 1987 uint64_t ri4 = addr + 2 * (int16_t)BE_16(inst->rie_b.ri4); 1988 1989 (void) snprintf(buf, buflen, "%s,%s,%s,%#x", R[inst->rie_b.r1], 1990 R[inst->rie_b.r2], M[inst->rie_b.m3], ri4); 1991 } 1992 1993 /* ARGSUSED */ 1994 static void 1995 fmt_rie_c(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 1996 { 1997 uint64_t ri4 = addr + 2 * (int16_t)BE_16(inst->rie_c.ri4); 1998 1999 (void) snprintf(buf, buflen, "%s,%u,%s,%#x", R[inst->rie_c.r1], 2000 inst->rie_c.i2, M[inst->rie_c.m3], ri4); 2001 } 2002 2003 /* ARGSUSED */ 2004 static void 2005 fmt_rie_d(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2006 { 2007 (void) snprintf(buf, buflen, "%s,%s,%u", R[inst->rie_d.r1], 2008 R[inst->rie_d.r3], BE_16(inst->rie_d.i2)); 2009 } 2010 2011 /* ARGSUSED */ 2012 static void 2013 fmt_rie_e(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2014 { 2015 uint64_t ri2 = addr + 2 * (int16_t)BE_16(inst->rie_e.ri2); 2016 2017 (void) snprintf(buf, buflen, "%s,%s,%#x", R[inst->rie_e.r1], 2018 R[inst->rie_e.r3], ri2); 2019 } 2020 2021 /* ARGSUSED */ 2022 static void 2023 fmt_rie_f(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2024 { 2025 (void) snprintf(buf, buflen, "%s,%s,%u,%u,%u", R[inst->rie_f.r1], 2026 R[inst->rie_f.r2], inst->rie_f.i3, inst->rie_f.i4, 2027 inst->rie_f.i5); 2028 } 2029 2030 /* ARGSUSED */ 2031 static void 2032 fmt_rre(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2033 { 2034 (void) snprintf(buf, buflen, "%s,%s", R[inst->rre.r1], R[inst->rre.r2]); 2035 } 2036 2037 /* ARGSUSED */ 2038 static void 2039 fmt_rrf_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2040 { 2041 (void) snprintf(buf, buflen, "%s,%s,%s", 2042 R[inst->rrf_ab.r1], R[inst->rrf_ab.r2], R[inst->rrf_ab.r3]); 2043 } 2044 2045 /* ARGSUSED */ 2046 static void 2047 fmt_rrf_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2048 { 2049 (void) snprintf(buf, buflen, "%s,%s,%s", 2050 R[inst->rrf_ab.r1], R[inst->rrf_ab.r3], R[inst->rrf_ab.r2]); 2051 } 2052 2053 /* ARGSUSED */ 2054 static void 2055 fmt_rrf_c(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2056 { 2057 (void) snprintf(buf, buflen, "%s,%s,%s", 2058 R[inst->rrf_cde.r1], R[inst->rrf_cde.r2], M[inst->rrf_cde.m3]); 2059 } 2060 2061 /* ARGSUSED */ 2062 static void 2063 fmt_rrf_d(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2064 { 2065 (void) snprintf(buf, buflen, "%s,%s,%s", 2066 R[inst->rrf_cde.r1], R[inst->rrf_cde.r2], M[inst->rrf_cde.m4]); 2067 } 2068 2069 /* ARGSUSED */ 2070 static void 2071 fmt_rrf_e(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2072 { 2073 (void) snprintf(buf, buflen, "%s,%s,%s,%s", 2074 R[inst->rrf_cde.r1], M[inst->rrf_cde.m3], 2075 R[inst->rrf_cde.r2], M[inst->rrf_cde.m4]); 2076 } 2077 2078 /* ARGSUSED */ 2079 static void 2080 fmt_rrs(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2081 { 2082 (void) snprintf(buf, buflen, "%s,%s,%s,%u(%s)", R[inst->rrs.r1], 2083 R[inst->rrs.r2], M[inst->rrs.m3], 2084 val_4_8(inst->rrs.d4h, inst->rrs.d4l), B[inst->rrs.b4]); 2085 } 2086 2087 /* ARGSUSED */ 2088 static void 2089 fmt_rr(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2090 { 2091 /* a branch uses r1 as a mask */ 2092 if (flags & F_HIDE_MASK) 2093 (void) snprintf(buf, buflen, "%s", R[inst->rr.r2]); 2094 else if (flags & F_R1_IS_MASK) 2095 (void) snprintf(buf, buflen, "%s,%s", M[inst->rr.r1], 2096 R[inst->rr.r2]); 2097 else 2098 (void) snprintf(buf, buflen, "%s,%s", R[inst->rr.r1], 2099 R[inst->rr.r2]); 2100 } 2101 2102 /* ARGSUSED */ 2103 static void 2104 fmt_rrd(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2105 { 2106 (void) snprintf(buf, buflen, "%s,%s,%s", R[inst->rrd.r1], 2107 R[inst->rrd.r3], R[inst->rrd.r2]); 2108 } 2109 2110 /* ARGSUSED */ 2111 static void 2112 fmt_rx_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2113 { 2114 uint32_t d2 = val_4_8(inst->rx_a.d2h, inst->rx_b.d2l); 2115 2116 (void) snprintf(buf, buflen, "%s,%u(%s,%s)", R[inst->rx_a.r1], 2117 d2, X[inst->rx_a.x2], B[inst->rx_a.b2]); 2118 } 2119 2120 /* ARGSUSED */ 2121 static void 2122 fmt_rx_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2123 { 2124 uint32_t d2 = val_4_8(inst->rx_b.d2h, inst->rx_b.d2l); 2125 2126 if (flags & F_HIDE_MASK) 2127 (void) snprintf(buf, buflen, "%u(%s,%s)", 2128 d2, X[inst->rx_b.x2], B[inst->rx_b.b2]); 2129 else 2130 (void) snprintf(buf, buflen, "%s,%u(%s,%s)", M[inst->rx_b.m1], 2131 d2, X[inst->rx_b.x2], B[inst->rx_b.b2]); 2132 } 2133 2134 /* ARGSUSED */ 2135 static void 2136 fmt_rxe(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2137 { 2138 uint32_t d2 = val_4_8(inst->rxe.d2h, inst->rxe.d2l); 2139 2140 (void) snprintf(buf, buflen, "%s,%u(%s,%s)", 2141 R[inst->rxe.r1], d2, X[inst->rxe.x2], B[inst->rxe.b2]); 2142 } 2143 2144 /* ARGSUSED */ 2145 static void 2146 fmt_rxf(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2147 { 2148 uint32_t d2 = val_4_8(inst->rxf.d2h, inst->rxf.d2l); 2149 2150 (void) snprintf(buf, buflen, "%s,%s,%u(%s,%s)", 2151 R[inst->rxf.r1], R[inst->rxf.r3], d2, X[inst->rxf.x2], 2152 B[inst->rxf.b2]); 2153 } 2154 2155 /* ARGSUSED */ 2156 static void 2157 fmt_rxy_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2158 { 2159 uint32_t d2; 2160 2161 d2 = val_8_4_8(inst->rxy_a.dh2, inst->rxy_a.dl2h, inst->rxy_a.dl2l); 2162 2163 (void) snprintf(buf, buflen, "%s,%u(%s,%s)", 2164 R[inst->rxy_a.r1], d2, X[inst->rxy_a.x2], B[inst->rxy_a.b2]); 2165 } 2166 2167 /* ARGSUSED */ 2168 static void 2169 fmt_rxy_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2170 { 2171 uint32_t d2; 2172 2173 d2 = val_8_4_8(inst->rxy_b.dh2, inst->rxy_b.dl2h, inst->rxy_b.dl2l); 2174 2175 (void) snprintf(buf, buflen, "%s,%u(%s,%s)", 2176 M[inst->rxy_b.m1], d2, X[inst->rxy_b.x2], B[inst->rxy_b.b2]); 2177 } 2178 2179 /* ARGSUSED */ 2180 static void 2181 fmt_rs_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2182 { 2183 const char *r1, *r3; 2184 2185 if (flags & F_CTL_REG) { 2186 r1 = C[inst->rs_a.r1]; 2187 r3 = C[inst->rs_a.r3]; 2188 } else { 2189 r1 = R[inst->rs_a.r1]; 2190 r3 = R[inst->rs_a.r3]; 2191 } 2192 2193 (void) snprintf(buf, buflen, "%s,%s,%u(%s)", r1, r3, 2194 val_4_8(inst->rs_a.d2h, inst->rs_a.d2l), B[inst->rs_a.b2]); 2195 } 2196 2197 /* ARGSUSED */ 2198 static void 2199 fmt_rs_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2200 { 2201 (void) snprintf(buf, buflen, "%s,%s,%u(%s)", R[inst->rs_b.r1], 2202 M[inst->rs_b.m3], val_4_8(inst->rs_b.d2h, inst->rs_b.d2l), 2203 B[inst->rs_b.b2]); 2204 } 2205 2206 /* ARGSUSED */ 2207 static void 2208 fmt_rsl_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2209 { 2210 (void) snprintf(buf, buflen, "%u(%u,%s)", 2211 val_4_8(inst->rsl_a.d1h, inst->rsl_a.d1l), inst->rsl_a.l1, 2212 B[inst->rsl_a.b1]); 2213 } 2214 2215 /* ARGSUSED */ 2216 static void 2217 fmt_rsl_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2218 { 2219 (void) snprintf(buf, buflen, "%s,%u(%u,%s),%s", 2220 R[inst->rsl_b.r1], 2221 val_4_8(inst->rsl_b.d2h, inst->rsl_b.d2l), inst->rsl_b.l2, 2222 B[inst->rsl_b.b2], M[inst->rsl_b.m3]); 2223 } 2224 2225 /* ARGSUSED */ 2226 static void 2227 fmt_rsy_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2228 { 2229 const char *r1, *r3; 2230 uint32_t d2; 2231 2232 d2 = val_8_4_8(inst->rsy_a.dh2, inst->rsy_a.dl2h, inst->rsy_a.dl2l); 2233 2234 if (flags & F_CTL_REG) { 2235 r1 = C[inst->rsy_a.r1]; 2236 r3 = C[inst->rsy_a.r3]; 2237 } else { 2238 r1 = R[inst->rsy_a.r1]; 2239 r3 = R[inst->rsy_a.r3]; 2240 } 2241 2242 (void) snprintf(buf, buflen, "%s,%s,%u(%s)", r1, r3, d2, 2243 B[inst->rsy_a.b2]); 2244 } 2245 2246 /* ARGSUSED */ 2247 static void 2248 fmt_rsy_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2249 { 2250 uint32_t d2; 2251 2252 d2 = val_8_4_8(inst->rsy_b.dh2, inst->rsy_b.dl2h, inst->rsy_b.dl2l); 2253 2254 (void) snprintf(buf, buflen, "%s,%s,%u(%s)", 2255 R[inst->rsy_b.r1], M[inst->rsy_b.m3], 2256 d2, B[inst->rsy_b.b2]); 2257 } 2258 2259 /* ARGSUSED */ 2260 static void 2261 fmt_rsi(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2262 { 2263 uint64_t ri2 = addr + 2 * (int16_t)BE_16(inst->rsi.ri2); 2264 2265 (void) snprintf(buf, buflen, "%s,%s,%#x", R[inst->rsi.r1], 2266 R[inst->rsi.r3], ri2); 2267 } 2268 2269 /* ARGSUSED */ 2270 static void 2271 fmt_si(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2272 { 2273 uint32_t d1 = val_4_8(inst->si.d1h, inst->si.d1l); 2274 2275 (void) snprintf(buf, buflen, "%u(%s),%u", d1, B[inst->si.b1], 2276 inst->si.i2); 2277 } 2278 2279 /* ARGSUSED */ 2280 static void 2281 fmt_sil(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2282 { 2283 (void) snprintf(buf, buflen, "%u(%s),%u", 2284 val_4_8(inst->sil.d1h, inst->sil.d1l), B[inst->sil.b1], 2285 BE_16(inst->sil.i2)); 2286 } 2287 2288 /* ARGSUSED */ 2289 static void 2290 fmt_siy(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2291 { 2292 (void) snprintf(buf, buflen, "%u(%s),%u", 2293 val_8_4_8(inst->siy.dh1, inst->siy.dl1h, inst->siy.dl1l), 2294 B[inst->siy.b1], inst->siy.i2); 2295 } 2296 2297 /* ARGSUSED */ 2298 static void 2299 fmt_smi(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2300 { 2301 uint64_t ri2 = addr + 2 * (int16_t)BE_16(inst->smi.ri2); 2302 2303 (void) snprintf(buf, buflen, "%s,%#x,%u(%s)", M[inst->smi.m1], ri2, 2304 val_4_8(inst->smi.d3h, inst->smi.d3l), B[inst->smi.b3]); 2305 } 2306 2307 /* ARGSUSED */ 2308 static void 2309 fmt_s(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2310 { 2311 uint32_t d = val_4_8(inst->s.d2h, inst->s.d2l); 2312 2313 (void) snprintf(buf, buflen, "%u(%s)", d, B[inst->s.b2]); 2314 } 2315 2316 /* ARGSUSED */ 2317 static void 2318 fmt_ss_a(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2319 { 2320 uint32_t d1, d2; 2321 2322 d1 = val_4_8(inst->ss_a.d1h, inst->ss_a.d1l); 2323 d2 = val_4_8(inst->ss_a.d2h, inst->ss_a.d2l); 2324 2325 (void) snprintf(buf, buflen, "%u(%u,%s),%u(%s)", 2326 d1, inst->ss_a.l + 1, B[inst->ss_a.b1], 2327 d2, B[inst->ss_a.b2]); 2328 } 2329 2330 /* ARGSUSED */ 2331 static void 2332 fmt_ss_b(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2333 { 2334 uint32_t d1, d2; 2335 2336 d1 = val_4_8(inst->ss_b.d1h, inst->ss_b.d1l); 2337 d2 = val_4_8(inst->ss_b.d2h, inst->ss_b.d2l); 2338 2339 (void) snprintf(buf, buflen, "%u(%u,%s),%u(%u,%s)", 2340 d1, inst->ss_b.l1 + 1, B[inst->ss_b.b1], 2341 d2, inst->ss_b.l2 + 1, B[inst->ss_b.b2]); 2342 } 2343 2344 /* ARGSUSED */ 2345 static void 2346 fmt_ss_c(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2347 { 2348 uint32_t d1, d2; 2349 2350 d1 = val_4_8(inst->ss_c.d1h, inst->ss_c.d1l); 2351 d2 = val_4_8(inst->ss_c.d2h, inst->ss_c.d2l); 2352 2353 (void) snprintf(buf, buflen, "%u(%u,%s),%u(%s),%u", 2354 d1, inst->ss_c.l1, B[inst->ss_c.b1], 2355 d2, B[inst->ss_c.b2], inst->ss_c.i3); 2356 } 2357 2358 /* ARGSUSED */ 2359 static void 2360 fmt_ss_d(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2361 { 2362 uint32_t d1, d2; 2363 2364 d1 = val_4_8(inst->ss_d.d1h, inst->ss_d.d1l); 2365 d2 = val_4_8(inst->ss_d.d2h, inst->ss_d.d2l); 2366 2367 (void) snprintf(buf, buflen, "%u(%s,%s),%u(%s),%s", 2368 d1, R[inst->ss_d.r1], B[inst->ss_d.b1], 2369 d2, B[inst->ss_d.b2], R[inst->ss_d.r3]); 2370 } 2371 2372 /* ARGSUSED */ 2373 static void 2374 fmt_ss_e(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2375 { 2376 uint32_t d2, d4; 2377 2378 d2 = val_4_8(inst->ss_e.d2h, inst->ss_e.d2l); 2379 d4 = val_4_8(inst->ss_e.d4h, inst->ss_e.d4l); 2380 2381 (void) snprintf(buf, buflen, "%s,%u(%s),%s,%u(%s)", 2382 R[inst->ss_e.r1], d2, B[inst->ss_e.b2], 2383 R[inst->ss_e.r3], d4, B[inst->ss_e.b4]); 2384 } 2385 2386 /* ARGSUSED */ 2387 static void 2388 fmt_ss_f(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2389 { 2390 uint32_t d1, d2; 2391 2392 d1 = val_4_8(inst->ss_f.d1h, inst->ss_f.d1l); 2393 d2 = val_4_8(inst->ss_f.d2h, inst->ss_f.d2l); 2394 2395 (void) snprintf(buf, buflen, "%u(%s),%u(%u,%s)", 2396 d1, B[inst->ss_f.b1], d2, inst->ss_f.l2, 2397 B[inst->ss_f.b2]); 2398 } 2399 2400 /* ARGSUSED */ 2401 static void 2402 fmt_sse(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2403 { 2404 uint32_t d1 = val_4_8(inst->sse.d1h, inst->sse.d1l); 2405 uint32_t d2 = val_4_8(inst->sse.d2h, inst->sse.d2l); 2406 2407 (void) snprintf(buf, buflen, "%u(%s),%u(%s)", 2408 d1, B[inst->sse.b1], d2, B[inst->sse.b2]); 2409 } 2410 2411 /* ARGSUSED */ 2412 static void 2413 fmt_ssf(uint64_t addr, union inst *inst, char *buf, size_t buflen, int flags) 2414 { 2415 uint32_t d1 = val_4_8(inst->ssf.d1h, inst->ssf.d1l); 2416 uint32_t d2 = val_4_8(inst->ssf.d2h, inst->ssf.d2l); 2417 2418 (void) snprintf(buf, buflen, "%u(%s),%u(%s),%s", 2419 d1, B[inst->ssf.b1], 2420 d2, B[inst->ssf.b2], R[inst->ssf.r3]); 2421 } 2422 2423 static void (*fmt_fxns[IF_NFMTS])(uint64_t, union inst *, char *, size_t, 2424 int) = { 2425 [IF_ZERO] = fmt_zero, 2426 [IF_DIAG] = fmt_diag, 2427 [IF_E] = fmt_e, 2428 [IF_I] = fmt_i, 2429 [IF_IE] = fmt_ie, 2430 [IF_MII] = fmt_mii, 2431 [IF_RIa] = fmt_ri_a, 2432 [IF_RIb] = fmt_ri_b, 2433 [IF_RIc] = fmt_ri_c, 2434 [IF_RIEa] = fmt_rie_a, 2435 [IF_RIEb] = fmt_rie_b, 2436 [IF_RIEc] = fmt_rie_c, 2437 [IF_RIEd] = fmt_rie_d, 2438 [IF_RIEe] = fmt_rie_e, 2439 [IF_RIEf] = fmt_rie_f, 2440 [IF_RILa] = fmt_ril_a, 2441 [IF_RILb] = fmt_ril_b, 2442 [IF_RILc] = fmt_ril_c, 2443 [IF_RIS] = fmt_ris, 2444 [IF_RR] = fmt_rr, 2445 [IF_RRD] = fmt_rrd, 2446 [IF_RRE] = fmt_rre, 2447 [IF_RRFa] = fmt_rrf_a, 2448 [IF_RRFb] = fmt_rrf_b, 2449 [IF_RRFc] = fmt_rrf_c, 2450 [IF_RRFd] = fmt_rrf_d, 2451 [IF_RRFe] = fmt_rrf_e, 2452 [IF_RRS] = fmt_rrs, 2453 [IF_RSa] = fmt_rs_a, 2454 [IF_RSb] = fmt_rs_b, 2455 [IF_RSI] = fmt_rsi, 2456 [IF_RSLa] = fmt_rsl_a, 2457 [IF_RSLb] = fmt_rsl_b, 2458 [IF_RSYa] = fmt_rsy_a, 2459 [IF_RSYb] = fmt_rsy_b, 2460 [IF_RXa] = fmt_rx_a, 2461 [IF_RXb] = fmt_rx_b, 2462 [IF_RXE] = fmt_rxe, 2463 [IF_RXF] = fmt_rxf, 2464 [IF_RXYa] = fmt_rxy_a, 2465 [IF_RXYb] = fmt_rxy_b, 2466 [IF_S] = fmt_s, 2467 [IF_SI] = fmt_si, 2468 [IF_SIL] = fmt_sil, 2469 [IF_SIY] = fmt_siy, 2470 [IF_SMI] = fmt_smi, 2471 [IF_SSa] = fmt_ss_a, 2472 [IF_SSb] = fmt_ss_b, 2473 [IF_SSc] = fmt_ss_c, 2474 [IF_SSd] = fmt_ss_d, 2475 [IF_SSe] = fmt_ss_e, 2476 [IF_SSf] = fmt_ss_f, 2477 [IF_SSE] = fmt_sse, 2478 [IF_SSF] = fmt_ssf, 2479 }; 2480 2481 /* 2482 * Even if we don't know how to disassemble the instruction, we know how long 2483 * it is, so we always succeed. That is why we can get away with returning 2484 * void. 2485 */ 2486 static void 2487 dis_s390(uint64_t addr, union inst *inst, char *buf, size_t buflen, int mach) 2488 { 2489 const struct inst_table *tbl = &tbl_xx[inst->raw[0]]; 2490 int tmp; 2491 2492 /* nothing to do */ 2493 if (buflen == 0) 2494 return; 2495 2496 while (tbl->it_fmt == IF_TBL || tbl->it_fmt == IF_MULTI) { 2497 if (tbl->it_fmt == IF_TBL) { 2498 int idx; 2499 2500 idx = inst->raw[tbl->it_u.it_table.it_off]; 2501 idx >>= tbl->it_u.it_table.it_shift; 2502 idx &= tbl->it_u.it_table.it_mask; 2503 2504 tbl = &tbl->it_u.it_table.it_ptr[idx]; 2505 } else if (tbl->it_fmt == IF_MULTI) { 2506 tbl = &tbl->it_u.it_multi.it_ptr[mach]; 2507 } 2508 } 2509 2510 if (tbl->it_fmt == IF_INVAL) 2511 goto inval; 2512 2513 if ((tbl->it_u.it_inst.it_flags & mach) == 0) 2514 goto inval; 2515 2516 tmp = snprintf(buf, buflen, "%-7s ", tbl->it_u.it_inst.it_name); 2517 if (tmp < 0) 2518 return; 2519 2520 fmt_fxns[tbl->it_fmt](addr, inst, buf + tmp, buflen - tmp, 2521 tbl->it_u.it_inst.it_flags); 2522 2523 return; 2524 2525 inval: 2526 (void) snprintf(buf, buflen, "??"); 2527 } 2528 2529 static int 2530 dis_s390_supports_flags(int flags) 2531 { 2532 int archflags = flags & DIS_ARCH_MASK; 2533 2534 if (archflags == DIS_S370 || archflags == DIS_S390_31 || 2535 archflags == DIS_S390_64) 2536 return (1); 2537 2538 return (0); 2539 } 2540 2541 static int 2542 dis_s390_disassemble(dis_handle_t *dhp, uint64_t addr, char *buf, 2543 size_t buflen) 2544 { 2545 union inst inst; 2546 int mach; 2547 int len; 2548 2549 if (dhp->dh_read(dhp->dh_data, addr, &inst.raw[0], 2) != 2) 2550 return (-1); 2551 2552 len = ILC2LEN(inst.raw[0] >> 6) - 2; 2553 2554 if (len > 0 && 2555 dhp->dh_read(dhp->dh_data, addr + 2, &inst.raw[2], len) != len) 2556 return (-1); 2557 2558 switch (dhp->dh_flags & (DIS_S370 | DIS_S390_31 | DIS_S390_64)) { 2559 case DIS_S370: 2560 mach = F_370; 2561 break; 2562 case DIS_S390_31: 2563 mach = F_390; 2564 break; 2565 case DIS_S390_64: 2566 mach = F_Z; 2567 break; 2568 } 2569 2570 dis_s390(addr, &inst, buf, buflen, mach); 2571 2572 return (0); 2573 } 2574 2575 /* ARGSUSED */ 2576 static int 2577 dis_s390_min_instrlen(dis_handle_t *dhp) 2578 { 2579 return (2); 2580 } 2581 2582 /* ARGSUSED */ 2583 static int 2584 dis_s390_max_instrlen(dis_handle_t *dhp) 2585 { 2586 return (6); 2587 } 2588 2589 dis_arch_t dis_arch_s390 = { 2590 .da_supports_flags = dis_s390_supports_flags, 2591 .da_disassemble = dis_s390_disassemble, 2592 .da_min_instrlen = dis_s390_min_instrlen, 2593 .da_max_instrlen = dis_s390_max_instrlen, 2594 }; 2595