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