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