1 /* Disassembler for the PA-RISC. Somewhat derived from sparc-pinsn.c. 2 Copyright 1989, 1990, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2003, 3 2005 Free Software Foundation, Inc. 4 5 Contributed by the Center for Software Science at the 6 University of Utah (pa-gdb-bugs@cs.utah.edu). 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 20 21 #include "disas/bfd.h" 22 23 /* HP PA-RISC SOM object file format: definitions internal to BFD. 24 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 25 2003 Free Software Foundation, Inc. 26 27 Contributed by the Center for Software Science at the 28 University of Utah (pa-gdb-bugs@cs.utah.edu). 29 30 This file is part of BFD, the Binary File Descriptor library. 31 32 This program is free software; you can redistribute it and/or modify 33 it under the terms of the GNU General Public License as published by 34 the Free Software Foundation; either version 2 of the License, or 35 (at your option) any later version. 36 37 This program is distributed in the hope that it will be useful, 38 but WITHOUT ANY WARRANTY; without even the implied warranty of 39 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 40 GNU General Public License for more details. 41 42 You should have received a copy of the GNU General Public License 43 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 44 45 #ifndef _LIBHPPA_H 46 #define _LIBHPPA_H 47 48 #define BYTES_IN_WORD 4 49 #define PA_PAGESIZE 0x1000 50 51 /* The PA instruction set variants. */ 52 enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20, pa20w = 25}; 53 54 /* HP PA-RISC relocation types */ 55 56 enum hppa_reloc_field_selector_type 57 { 58 R_HPPA_FSEL = 0x0, 59 R_HPPA_LSSEL = 0x1, 60 R_HPPA_RSSEL = 0x2, 61 R_HPPA_LSEL = 0x3, 62 R_HPPA_RSEL = 0x4, 63 R_HPPA_LDSEL = 0x5, 64 R_HPPA_RDSEL = 0x6, 65 R_HPPA_LRSEL = 0x7, 66 R_HPPA_RRSEL = 0x8, 67 R_HPPA_NSEL = 0x9, 68 R_HPPA_NLSEL = 0xa, 69 R_HPPA_NLRSEL = 0xb, 70 R_HPPA_PSEL = 0xc, 71 R_HPPA_LPSEL = 0xd, 72 R_HPPA_RPSEL = 0xe, 73 R_HPPA_TSEL = 0xf, 74 R_HPPA_LTSEL = 0x10, 75 R_HPPA_RTSEL = 0x11, 76 R_HPPA_LTPSEL = 0x12, 77 R_HPPA_RTPSEL = 0x13 78 }; 79 80 /* /usr/include/reloc.h defines these to constants. We want to use 81 them in enums, so #undef them before we start using them. We might 82 be able to fix this another way by simply managing not to include 83 /usr/include/reloc.h, but currently GDB picks up these defines 84 somewhere. */ 85 #undef e_fsel 86 #undef e_lssel 87 #undef e_rssel 88 #undef e_lsel 89 #undef e_rsel 90 #undef e_ldsel 91 #undef e_rdsel 92 #undef e_lrsel 93 #undef e_rrsel 94 #undef e_nsel 95 #undef e_nlsel 96 #undef e_nlrsel 97 #undef e_psel 98 #undef e_lpsel 99 #undef e_rpsel 100 #undef e_tsel 101 #undef e_ltsel 102 #undef e_rtsel 103 #undef e_one 104 #undef e_two 105 #undef e_pcrel 106 #undef e_con 107 #undef e_plabel 108 #undef e_abs 109 110 /* for compatibility */ 111 enum hppa_reloc_field_selector_type_alt 112 { 113 e_fsel = R_HPPA_FSEL, 114 e_lssel = R_HPPA_LSSEL, 115 e_rssel = R_HPPA_RSSEL, 116 e_lsel = R_HPPA_LSEL, 117 e_rsel = R_HPPA_RSEL, 118 e_ldsel = R_HPPA_LDSEL, 119 e_rdsel = R_HPPA_RDSEL, 120 e_lrsel = R_HPPA_LRSEL, 121 e_rrsel = R_HPPA_RRSEL, 122 e_nsel = R_HPPA_NSEL, 123 e_nlsel = R_HPPA_NLSEL, 124 e_nlrsel = R_HPPA_NLRSEL, 125 e_psel = R_HPPA_PSEL, 126 e_lpsel = R_HPPA_LPSEL, 127 e_rpsel = R_HPPA_RPSEL, 128 e_tsel = R_HPPA_TSEL, 129 e_ltsel = R_HPPA_LTSEL, 130 e_rtsel = R_HPPA_RTSEL, 131 e_ltpsel = R_HPPA_LTPSEL, 132 e_rtpsel = R_HPPA_RTPSEL 133 }; 134 135 enum hppa_reloc_expr_type 136 { 137 R_HPPA_E_ONE = 0, 138 R_HPPA_E_TWO = 1, 139 R_HPPA_E_PCREL = 2, 140 R_HPPA_E_CON = 3, 141 R_HPPA_E_PLABEL = 7, 142 R_HPPA_E_ABS = 18 143 }; 144 145 /* for compatibility */ 146 enum hppa_reloc_expr_type_alt 147 { 148 e_one = R_HPPA_E_ONE, 149 e_two = R_HPPA_E_TWO, 150 e_pcrel = R_HPPA_E_PCREL, 151 e_con = R_HPPA_E_CON, 152 e_plabel = R_HPPA_E_PLABEL, 153 e_abs = R_HPPA_E_ABS 154 }; 155 156 157 /* Relocations for function calls must be accompanied by parameter 158 relocation bits. These bits describe exactly where the caller has 159 placed the function's arguments and where it expects to find a return 160 value. 161 162 Both ELF and SOM encode this information within the addend field 163 of the call relocation. (Note this could break very badly if one 164 was to make a call like bl foo + 0x12345678). 165 166 The high order 10 bits contain parameter relocation information, 167 the low order 22 bits contain the constant offset. */ 168 169 #define HPPA_R_ARG_RELOC(a) \ 170 (((a) >> 22) & 0x3ff) 171 #define HPPA_R_CONSTANT(a) \ 172 ((((bfd_signed_vma)(a)) << (BFD_ARCH_SIZE-22)) >> (BFD_ARCH_SIZE-22)) 173 #define HPPA_R_ADDEND(r, c) \ 174 (((r) << 22) + ((c) & 0x3fffff)) 175 176 177 /* Some functions to manipulate PA instructions. */ 178 179 /* Declare the functions with the unused attribute to avoid warnings. */ 180 static inline int sign_extend (int, int) ATTRIBUTE_UNUSED; 181 static inline int low_sign_extend (int, int) ATTRIBUTE_UNUSED; 182 static inline int sign_unext (int, int) ATTRIBUTE_UNUSED; 183 static inline int low_sign_unext (int, int) ATTRIBUTE_UNUSED; 184 static inline int re_assemble_3 (int) ATTRIBUTE_UNUSED; 185 static inline int re_assemble_12 (int) ATTRIBUTE_UNUSED; 186 static inline int re_assemble_14 (int) ATTRIBUTE_UNUSED; 187 static inline int re_assemble_16 (int) ATTRIBUTE_UNUSED; 188 static inline int re_assemble_17 (int) ATTRIBUTE_UNUSED; 189 static inline int re_assemble_21 (int) ATTRIBUTE_UNUSED; 190 static inline int re_assemble_22 (int) ATTRIBUTE_UNUSED; 191 static inline bfd_signed_vma hppa_field_adjust 192 (bfd_vma, bfd_signed_vma, enum hppa_reloc_field_selector_type_alt) 193 ATTRIBUTE_UNUSED; 194 static inline int hppa_rebuild_insn (int, int, int) ATTRIBUTE_UNUSED; 195 196 197 /* The *sign_extend functions are used to assemble various bitfields 198 taken from an instruction and return the resulting immediate 199 value. */ 200 201 static inline int 202 sign_extend (int x, int len) 203 { 204 int signbit = (1 << (len - 1)); 205 int mask = (signbit << 1) - 1; 206 return ((x & mask) ^ signbit) - signbit; 207 } 208 209 static inline int 210 low_sign_extend (int x, int len) 211 { 212 return (x >> 1) - ((x & 1) << (len - 1)); 213 } 214 215 216 /* The re_assemble_* functions prepare an immediate value for 217 insertion into an opcode. pa-risc uses all sorts of weird bitfields 218 in the instruction to hold the value. */ 219 220 static inline int 221 sign_unext (int x, int len) 222 { 223 int len_ones; 224 225 len_ones = (1 << len) - 1; 226 227 return x & len_ones; 228 } 229 230 static inline int 231 low_sign_unext (int x, int len) 232 { 233 int temp; 234 int sign; 235 236 sign = (x >> (len-1)) & 1; 237 238 temp = sign_unext (x, len-1); 239 240 return (temp << 1) | sign; 241 } 242 243 static inline int 244 re_assemble_3 (int as3) 245 { 246 return (( (as3 & 4) << (13-2)) 247 | ((as3 & 3) << (13+1))); 248 } 249 250 static inline int 251 re_assemble_12 (int as12) 252 { 253 return (( (as12 & 0x800) >> 11) 254 | ((as12 & 0x400) >> (10 - 2)) 255 | ((as12 & 0x3ff) << (1 + 2))); 256 } 257 258 static inline int 259 re_assemble_14 (int as14) 260 { 261 return (( (as14 & 0x1fff) << 1) 262 | ((as14 & 0x2000) >> 13)); 263 } 264 265 static inline int 266 re_assemble_16 (int as16) 267 { 268 int s, t; 269 270 /* Unusual 16-bit encoding, for wide mode only. */ 271 t = (as16 << 1) & 0xffff; 272 s = (as16 & 0x8000); 273 return (t ^ s ^ (s >> 1)) | (s >> 15); 274 } 275 276 static inline int 277 re_assemble_17 (int as17) 278 { 279 return (( (as17 & 0x10000) >> 16) 280 | ((as17 & 0x0f800) << (16 - 11)) 281 | ((as17 & 0x00400) >> (10 - 2)) 282 | ((as17 & 0x003ff) << (1 + 2))); 283 } 284 285 static inline int 286 re_assemble_21 (int as21) 287 { 288 return (( (as21 & 0x100000) >> 20) 289 | ((as21 & 0x0ffe00) >> 8) 290 | ((as21 & 0x000180) << 7) 291 | ((as21 & 0x00007c) << 14) 292 | ((as21 & 0x000003) << 12)); 293 } 294 295 static inline int 296 re_assemble_22 (int as22) 297 { 298 return (( (as22 & 0x200000) >> 21) 299 | ((as22 & 0x1f0000) << (21 - 16)) 300 | ((as22 & 0x00f800) << (16 - 11)) 301 | ((as22 & 0x000400) >> (10 - 2)) 302 | ((as22 & 0x0003ff) << (1 + 2))); 303 } 304 305 306 /* Handle field selectors for PA instructions. 307 The L and R (and LS, RS etc.) selectors are used in pairs to form a 308 full 32 bit address. eg. 309 310 LDIL L'start,%r1 ; put left part into r1 311 LDW R'start(%r1),%r2 ; add r1 and right part to form address 312 313 This function returns sign extended values in all cases. 314 */ 315 316 static inline bfd_signed_vma 317 hppa_field_adjust (bfd_vma sym_val, 318 bfd_signed_vma addend, 319 enum hppa_reloc_field_selector_type_alt r_field) 320 { 321 bfd_signed_vma value; 322 323 value = sym_val + addend; 324 switch (r_field) 325 { 326 case e_fsel: 327 /* F: No change. */ 328 break; 329 330 case e_nsel: 331 /* N: null selector. I don't really understand what this is all 332 about, but HP's documentation says "this indicates that zero 333 bits are to be used for the displacement on the instruction. 334 This fixup is used to identify three-instruction sequences to 335 access data (for importing shared library data)." */ 336 value = 0; 337 break; 338 339 case e_lsel: 340 case e_nlsel: 341 /* L: Select top 21 bits. */ 342 value = value >> 11; 343 break; 344 345 case e_rsel: 346 /* R: Select bottom 11 bits. */ 347 value = value & 0x7ff; 348 break; 349 350 case e_lssel: 351 /* LS: Round to nearest multiple of 2048 then select top 21 bits. */ 352 value = value + 0x400; 353 value = value >> 11; 354 break; 355 356 case e_rssel: 357 /* RS: Select bottom 11 bits for LS. 358 We need to return a value such that 2048 * LS'x + RS'x == x. 359 ie. RS'x = x - ((x + 0x400) & -0x800) 360 this is just a sign extension from bit 21. */ 361 value = ((value & 0x7ff) ^ 0x400) - 0x400; 362 break; 363 364 case e_ldsel: 365 /* LD: Round to next multiple of 2048 then select top 21 bits. 366 Yes, if we are already on a multiple of 2048, we go up to the 367 next one. RD in this case will be -2048. */ 368 value = value + 0x800; 369 value = value >> 11; 370 break; 371 372 case e_rdsel: 373 /* RD: Set bits 0-20 to one. */ 374 value = value | -0x800; 375 break; 376 377 case e_lrsel: 378 case e_nlrsel: 379 /* LR: L with rounding of the addend to nearest 8k. */ 380 value = sym_val + ((addend + 0x1000) & -0x2000); 381 value = value >> 11; 382 break; 383 384 case e_rrsel: 385 /* RR: R with rounding of the addend to nearest 8k. 386 We need to return a value such that 2048 * LR'x + RR'x == x 387 ie. RR'x = s+a - (s + (((a + 0x1000) & -0x2000) & -0x800)) 388 . = s+a - ((s & -0x800) + ((a + 0x1000) & -0x2000)) 389 . = (s & 0x7ff) + a - ((a + 0x1000) & -0x2000) */ 390 value = (sym_val & 0x7ff) + (((addend & 0x1fff) ^ 0x1000) - 0x1000); 391 break; 392 393 default: 394 abort (); 395 } 396 return value; 397 } 398 399 /* PA-RISC OPCODES */ 400 #define get_opcode(insn) (((insn) >> 26) & 0x3f) 401 402 enum hppa_opcode_type 403 { 404 /* None of the opcodes in the first group generate relocs, so we 405 aren't too concerned about them. */ 406 OP_SYSOP = 0x00, 407 OP_MEMMNG = 0x01, 408 OP_ALU = 0x02, 409 OP_NDXMEM = 0x03, 410 OP_SPOP = 0x04, 411 OP_DIAG = 0x05, 412 OP_FMPYADD = 0x06, 413 OP_UNDEF07 = 0x07, 414 OP_COPRW = 0x09, 415 OP_COPRDW = 0x0b, 416 OP_COPR = 0x0c, 417 OP_FLOAT = 0x0e, 418 OP_PRDSPEC = 0x0f, 419 OP_UNDEF15 = 0x15, 420 OP_UNDEF1d = 0x1d, 421 OP_FMPYSUB = 0x26, 422 OP_FPFUSED = 0x2e, 423 OP_SHEXDP0 = 0x34, 424 OP_SHEXDP1 = 0x35, 425 OP_SHEXDP2 = 0x36, 426 OP_UNDEF37 = 0x37, 427 OP_SHEXDP3 = 0x3c, 428 OP_SHEXDP4 = 0x3d, 429 OP_MULTMED = 0x3e, 430 OP_UNDEF3f = 0x3f, 431 432 OP_LDIL = 0x08, 433 OP_ADDIL = 0x0a, 434 435 OP_LDO = 0x0d, 436 OP_LDB = 0x10, 437 OP_LDH = 0x11, 438 OP_LDW = 0x12, 439 OP_LDWM = 0x13, 440 OP_STB = 0x18, 441 OP_STH = 0x19, 442 OP_STW = 0x1a, 443 OP_STWM = 0x1b, 444 445 OP_LDD = 0x14, 446 OP_STD = 0x1c, 447 448 OP_FLDW = 0x16, 449 OP_LDWL = 0x17, 450 OP_FSTW = 0x1e, 451 OP_STWL = 0x1f, 452 453 OP_COMBT = 0x20, 454 OP_COMIBT = 0x21, 455 OP_COMBF = 0x22, 456 OP_COMIBF = 0x23, 457 OP_CMPBDT = 0x27, 458 OP_ADDBT = 0x28, 459 OP_ADDIBT = 0x29, 460 OP_ADDBF = 0x2a, 461 OP_ADDIBF = 0x2b, 462 OP_CMPBDF = 0x2f, 463 OP_BVB = 0x30, 464 OP_BB = 0x31, 465 OP_MOVB = 0x32, 466 OP_MOVIB = 0x33, 467 OP_CMPIBD = 0x3b, 468 469 OP_COMICLR = 0x24, 470 OP_SUBI = 0x25, 471 OP_ADDIT = 0x2c, 472 OP_ADDI = 0x2d, 473 474 OP_BE = 0x38, 475 OP_BLE = 0x39, 476 OP_BL = 0x3a 477 }; 478 479 480 /* Insert VALUE into INSN using R_FORMAT to determine exactly what 481 bits to change. */ 482 483 static inline int 484 hppa_rebuild_insn (int insn, int value, int r_format) 485 { 486 switch (r_format) 487 { 488 case 11: 489 return (insn & ~ 0x7ff) | low_sign_unext (value, 11); 490 491 case 12: 492 return (insn & ~ 0x1ffd) | re_assemble_12 (value); 493 494 495 case 10: 496 return (insn & ~ 0x3ff1) | re_assemble_14 (value & -8); 497 498 case -11: 499 return (insn & ~ 0x3ff9) | re_assemble_14 (value & -4); 500 501 case 14: 502 return (insn & ~ 0x3fff) | re_assemble_14 (value); 503 504 505 case -10: 506 return (insn & ~ 0xfff1) | re_assemble_16 (value & -8); 507 508 case -16: 509 return (insn & ~ 0xfff9) | re_assemble_16 (value & -4); 510 511 case 16: 512 return (insn & ~ 0xffff) | re_assemble_16 (value); 513 514 515 case 17: 516 return (insn & ~ 0x1f1ffd) | re_assemble_17 (value); 517 518 case 21: 519 return (insn & ~ 0x1fffff) | re_assemble_21 (value); 520 521 case 22: 522 return (insn & ~ 0x3ff1ffd) | re_assemble_22 (value); 523 524 case 32: 525 return value; 526 527 default: 528 abort (); 529 } 530 return insn; 531 } 532 533 #endif /* _LIBHPPA_H */ 534 /* Table of opcodes for the PA-RISC. 535 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 536 2001, 2002, 2003, 2004, 2005 537 Free Software Foundation, Inc. 538 539 Contributed by the Center for Software Science at the 540 University of Utah (pa-gdb-bugs@cs.utah.edu). 541 542 This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. 543 544 GAS/GDB is free software; you can redistribute it and/or modify 545 it under the terms of the GNU General Public License as published by 546 the Free Software Foundation; either version 1, or (at your option) 547 any later version. 548 549 GAS/GDB is distributed in the hope that it will be useful, 550 but WITHOUT ANY WARRANTY; without even the implied warranty of 551 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 552 GNU General Public License for more details. 553 554 You should have received a copy of the GNU General Public License 555 along with GAS or GDB; see the file COPYING. 556 If not, see <http://www.gnu.org/licenses/>. */ 557 558 #if !defined(__STDC__) && !defined(const) 559 #define const 560 #endif 561 562 /* 563 * Structure of an opcode table entry. 564 */ 565 566 /* There are two kinds of delay slot nullification: normal which is 567 * controlled by the nullification bit, and conditional, which depends 568 * on the direction of the branch and its success or failure. 569 * 570 * NONE is unfortunately #defined in the hiux system include files. 571 * #undef it away. 572 */ 573 #undef NONE 574 struct pa_opcode 575 { 576 const char *name; 577 unsigned long int match; /* Bits that must be set... */ 578 unsigned long int mask; /* ... in these bits. */ 579 const char *args; 580 enum pa_arch arch; 581 char flags; 582 }; 583 584 /* Enables strict matching. Opcodes with match errors are skipped 585 when this bit is set. */ 586 #define FLAG_STRICT 0x1 587 588 /* 589 All hppa opcodes are 32 bits. 590 591 The match component is a mask saying which bits must match a 592 particular opcode in order for an instruction to be an instance 593 of that opcode. 594 595 The args component is a string containing one character for each operand of 596 the instruction. Characters used as a prefix allow any second character to 597 be used without conflicting with the main operand characters. 598 599 Bit positions in this description follow HP usage of lsb = 31, 600 "at" is lsb of field. 601 602 In the args field, the following characters must match exactly: 603 604 '+,() ' 605 606 In the args field, the following characters are unused: 607 608 ' " - / 34 6789:; ' 609 '@ C M [\] ' 610 '` e g } ' 611 612 Here are all the characters: 613 614 ' !"#$%&'()*+-,./0123456789:;<=>?' 615 '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' 616 '`abcdefghijklmnopqrstuvwxyz{|}~ ' 617 618 Kinds of operands: 619 x integer register field at 15. 620 b integer register field at 10. 621 t integer register field at 31. 622 a integer register field at 10 and 15 (for PERMH) 623 5 5 bit immediate at 15. 624 s 2 bit space specifier at 17. 625 S 3 bit space specifier at 18. 626 V 5 bit immediate value at 31 627 i 11 bit immediate value at 31 628 j 14 bit immediate value at 31 629 k 21 bit immediate value at 31 630 l 16 bit immediate value at 31 (wide mode only, unusual encoding). 631 n nullification for branch instructions 632 N nullification for spop and copr instructions 633 w 12 bit branch displacement 634 W 17 bit branch displacement (PC relative) 635 X 22 bit branch displacement (PC relative) 636 z 17 bit branch displacement (just a number, not an address) 637 638 Also these: 639 640 . 2 bit shift amount at 25 641 * 4 bit shift amount at 25 642 p 5 bit shift count at 26 (to support the SHD instruction) encoded as 643 31-p 644 ~ 6 bit shift count at 20,22:26 encoded as 63-~. 645 P 5 bit bit position at 26 646 q 6 bit bit position at 20,22:26 647 T 5 bit field length at 31 (encoded as 32-T) 648 % 6 bit field length at 23,27:31 (variable extract/deposit) 649 | 6 bit field length at 19,27:31 (fixed extract/deposit) 650 A 13 bit immediate at 18 (to support the BREAK instruction) 651 ^ like b, but describes a control register 652 ! sar (cr11) register 653 D 26 bit immediate at 31 (to support the DIAG instruction) 654 $ 9 bit immediate at 28 (to support POPBTS) 655 656 v 3 bit Special Function Unit identifier at 25 657 O 20 bit Special Function Unit operation split between 15 bits at 20 658 and 5 bits at 31 659 o 15 bit Special Function Unit operation at 20 660 2 22 bit Special Function Unit operation split between 17 bits at 20 661 and 5 bits at 31 662 1 15 bit Special Function Unit operation split between 10 bits at 20 663 and 5 bits at 31 664 0 10 bit Special Function Unit operation split between 5 bits at 20 665 and 5 bits at 31 666 u 3 bit coprocessor unit identifier at 25 667 F Source Floating Point Operand Format Completer encoded 2 bits at 20 668 I Source Floating Point Operand Format Completer encoded 1 bits at 20 669 (for 0xe format FP instructions) 670 G Destination Floating Point Operand Format Completer encoded 2 bits at 18 671 H Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub' 672 (very similar to 'F') 673 674 r 5 bit immediate value at 31 (for the break instruction) 675 (very similar to V above, except the value is unsigned instead of 676 low_sign_ext) 677 R 5 bit immediate value at 15 (for the ssm, rsm, probei instructions) 678 (same as r above, except the value is in a different location) 679 U 10 bit immediate value at 15 (for SSM, RSM on pa2.0) 680 Q 5 bit immediate value at 10 (a bit position specified in 681 the bb instruction. It's the same as r above, except the 682 value is in a different location) 683 B 5 bit immediate value at 10 (a bit position specified in 684 the bb instruction. Similar to Q, but 64 bit handling is 685 different. 686 Z %r1 -- implicit target of addil instruction. 687 L ,%r2 completer for new syntax branch 688 { Source format completer for fcnv 689 _ Destination format completer for fcnv 690 h cbit for fcmp 691 = gfx tests for ftest 692 d 14 bit offset for single precision FP long load/store. 693 # 14 bit offset for double precision FP load long/store. 694 J Yet another 14 bit offset for load/store with ma,mb completers. 695 K Yet another 14 bit offset for load/store with ma,mb completers. 696 y 16 bit offset for word aligned load/store (PA2.0 wide). 697 & 16 bit offset for dword aligned load/store (PA2.0 wide). 698 < 16 bit offset for load/store with ma,mb completers (PA2.0 wide). 699 > 16 bit offset for load/store with ma,mb completers (PA2.0 wide). 700 Y %sr0,%r31 -- implicit target of be,l instruction. 701 @ implicit immediate value of 0 702 703 Completer operands all have 'c' as the prefix: 704 705 cx indexed load and store completer. 706 cX indexed load and store completer. Like cx, but emits a space 707 after in disassembler. 708 cm short load and store completer. 709 cM short load and store completer. Like cm, but emits a space 710 after in disassembler. 711 cq long load and store completer (like cm, but inserted into a 712 different location in the target instruction). 713 cs store bytes short completer. 714 cA store bytes short completer. Like cs, but emits a space 715 after in disassembler. 716 ce long load/store completer for LDW/STW with a different encoding 717 than the others 718 cc load cache control hint 719 cd load and clear cache control hint 720 cC store cache control hint 721 co ordered access 722 723 cp branch link and push completer 724 cP branch pop completer 725 cl branch link completer 726 cg branch gate completer 727 728 cw read/write completer for PROBE 729 cW wide completer for MFCTL 730 cL local processor completer for cache control 731 cZ System Control Completer (to support LPA, LHA, etc.) 732 733 ci correction completer for DCOR 734 ca add completer 735 cy 32 bit add carry completer 736 cY 64 bit add carry completer 737 cv signed overflow trap completer 738 ct trap on condition completer for ADDI, SUB 739 cT trap on condition completer for UADDCM 740 cb 32 bit borrow completer for SUB 741 cB 64 bit borrow completer for SUB 742 743 ch left/right half completer 744 cH signed/unsigned saturation completer 745 cS signed/unsigned completer at 21 746 cz zero/sign extension completer. 747 c* permutation completer 748 749 Condition operands all have '?' as the prefix: 750 751 ?f Floating point compare conditions (encoded as 5 bits at 31) 752 753 ?a add conditions 754 ?A 64 bit add conditions 755 ?@ add branch conditions followed by nullify 756 ?d non-negated add branch conditions 757 ?D negated add branch conditions 758 ?w wide mode non-negated add branch conditions 759 ?W wide mode negated add branch conditions 760 761 ?s compare/subtract conditions 762 ?S 64 bit compare/subtract conditions 763 ?t non-negated compare and branch conditions 764 ?n 32 bit compare and branch conditions followed by nullify 765 ?N 64 bit compare and branch conditions followed by nullify 766 ?Q 64 bit compare and branch conditions for CMPIB instruction 767 768 ?l logical conditions 769 ?L 64 bit logical conditions 770 771 ?b branch on bit conditions 772 ?B 64 bit branch on bit conditions 773 774 ?x shift/extract/deposit conditions 775 ?X 64 bit shift/extract/deposit conditions 776 ?y shift/extract/deposit conditions followed by nullify for conditional 777 branches 778 779 ?u unit conditions 780 ?U 64 bit unit conditions 781 782 Floating point registers all have 'f' as a prefix: 783 784 ft target register at 31 785 fT target register with L/R halves at 31 786 fa operand 1 register at 10 787 fA operand 1 register with L/R halves at 10 788 fX Same as fA, except prints a space before register during disasm 789 fb operand 2 register at 15 790 fB operand 2 register with L/R halves at 15 791 fC operand 3 register with L/R halves at 16:18,21:23 792 fe Like fT, but encoding is different. 793 fE Same as fe, except prints a space before register during disasm. 794 fx target register at 15 (only for PA 2.0 long format FLDD/FSTD). 795 796 Float registers for fmpyadd and fmpysub: 797 798 fi mult operand 1 register at 10 799 fj mult operand 2 register at 15 800 fk mult target register at 20 801 fl add/sub operand register at 25 802 fm add/sub target register at 31 803 804 */ 805 806 807 #if 0 808 /* List of characters not to put a space after. Note that 809 "," is included, as the "spopN" operations use literal 810 commas in their completer sections. */ 811 static const char *const completer_chars = ",CcY<>?!@+&U~FfGHINnOoZMadu|/=0123%e$m}"; 812 #endif 813 814 /* The order of the opcodes in this table is significant: 815 816 * The assembler requires that all instances of the same mnemonic be 817 consecutive. If they aren't, the assembler will bomb at runtime. 818 819 * Immediate fields use pa_get_absolute_expression to parse the 820 string. It will generate a "bad expression" error if passed 821 a register name. Thus, register index variants of an opcode 822 need to precede immediate variants. 823 824 * The disassembler does not care about the order of the opcodes 825 except in cases where implicit addressing is used. 826 827 Here are the rules for ordering the opcodes of a mnemonic: 828 829 1) Opcodes with FLAG_STRICT should precede opcodes without 830 FLAG_STRICT. 831 832 2) Opcodes with FLAG_STRICT should be ordered as follows: 833 register index opcodes, short immediate opcodes, and finally 834 long immediate opcodes. When both pa10 and pa11 variants 835 of the same opcode are available, the pa10 opcode should 836 come first for correct architectural promotion. 837 838 3) When implicit addressing is available for an opcode, the 839 implicit opcode should precede the explicit opcode. 840 841 4) Opcodes without FLAG_STRICT should be ordered as follows: 842 register index opcodes, long immediate opcodes, and finally 843 short immediate opcodes. */ 844 845 static const struct pa_opcode pa_opcodes[] = 846 { 847 848 /* Pseudo-instructions. */ 849 850 { "ldi", 0x34000000, 0xffe00000, "l,x", pa20w, 0},/* ldo val(r0),r */ 851 { "ldi", 0x34000000, 0xffe0c000, "j,x", pa10, 0},/* ldo val(r0),r */ 852 853 { "cmpib", 0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT}, 854 { "cmpib", 0x84000000, 0xf4000000, "?nn5,b,w", pa10, FLAG_STRICT}, 855 { "comib", 0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ 856 /* This entry is for the disassembler only. It will never be used by 857 assembler. */ 858 { "comib", 0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ 859 { "cmpb", 0x9c000000, 0xdc000000, "?Nnx,b,w", pa20, FLAG_STRICT}, 860 { "cmpb", 0x80000000, 0xf4000000, "?nnx,b,w", pa10, FLAG_STRICT}, 861 { "comb", 0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ 862 /* This entry is for the disassembler only. It will never be used by 863 assembler. */ 864 { "comb", 0x88000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ 865 { "addb", 0xa0000000, 0xf4000000, "?Wnx,b,w", pa20w, FLAG_STRICT}, 866 { "addb", 0xa0000000, 0xfc000000, "?@nx,b,w", pa10, 0}, /* addb{tf} */ 867 /* This entry is for the disassembler only. It will never be used by 868 assembler. */ 869 { "addb", 0xa8000000, 0xfc000000, "?@nx,b,w", pa10, 0}, 870 { "addib", 0xa4000000, 0xf4000000, "?Wn5,b,w", pa20w, FLAG_STRICT}, 871 { "addib", 0xa4000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ 872 /* This entry is for the disassembler only. It will never be used by 873 assembler. */ 874 { "addib", 0xac000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ 875 { "nop", 0x08000240, 0xffffffff, "", pa10, 0}, /* or 0,0,0 */ 876 { "copy", 0x08000240, 0xffe0ffe0, "x,t", pa10, 0}, /* or r,0,t */ 877 { "mtsar", 0x01601840, 0xffe0ffff, "x", pa10, 0}, /* mtctl r,cr11 */ 878 879 /* Loads and Stores for integer registers. */ 880 881 { "ldd", 0x0c0000c0, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, 882 { "ldd", 0x0c0000c0, 0xfc0013c0, "cxccx(s,b),t", pa20, FLAG_STRICT}, 883 { "ldd", 0x0c0010e0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 884 { "ldd", 0x0c0010e0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, 885 { "ldd", 0x0c0010c0, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, 886 { "ldd", 0x0c0010c0, 0xfc0013c0, "cmcc5(s,b),t", pa20, FLAG_STRICT}, 887 { "ldd", 0x50000000, 0xfc000002, "cq&(b),x", pa20w, FLAG_STRICT}, 888 { "ldd", 0x50000000, 0xfc00c002, "cq#(b),x", pa20, FLAG_STRICT}, 889 { "ldd", 0x50000000, 0xfc000002, "cq#(s,b),x", pa20, FLAG_STRICT}, 890 { "ldw", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 891 { "ldw", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 892 { "ldw", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 893 { "ldw", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 894 { "ldw", 0x0c0010a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 895 { "ldw", 0x0c0010a0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, 896 { "ldw", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 897 { "ldw", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 898 { "ldw", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 899 { "ldw", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 900 { "ldw", 0x4c000000, 0xfc000000, "ce<(b),x", pa20w, FLAG_STRICT}, 901 { "ldw", 0x5c000004, 0xfc000006, "ce>(b),x", pa20w, FLAG_STRICT}, 902 { "ldw", 0x48000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, 903 { "ldw", 0x5c000004, 0xfc00c006, "ceK(b),x", pa20, FLAG_STRICT}, 904 { "ldw", 0x5c000004, 0xfc000006, "ceK(s,b),x", pa20, FLAG_STRICT}, 905 { "ldw", 0x4c000000, 0xfc00c000, "ceJ(b),x", pa10, FLAG_STRICT}, 906 { "ldw", 0x4c000000, 0xfc000000, "ceJ(s,b),x", pa10, FLAG_STRICT}, 907 { "ldw", 0x48000000, 0xfc00c000, "j(b),x", pa10, 0}, 908 { "ldw", 0x48000000, 0xfc000000, "j(s,b),x", pa10, 0}, 909 { "ldh", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 910 { "ldh", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 911 { "ldh", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 912 { "ldh", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 913 { "ldh", 0x0c001060, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 914 { "ldh", 0x0c001060, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, 915 { "ldh", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 916 { "ldh", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 917 { "ldh", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 918 { "ldh", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 919 { "ldh", 0x44000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, 920 { "ldh", 0x44000000, 0xfc00c000, "j(b),x", pa10, 0}, 921 { "ldh", 0x44000000, 0xfc000000, "j(s,b),x", pa10, 0}, 922 { "ldb", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 923 { "ldb", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 924 { "ldb", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 925 { "ldb", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 926 { "ldb", 0x0c001020, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 927 { "ldb", 0x0c001020, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, 928 { "ldb", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 929 { "ldb", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 930 { "ldb", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 931 { "ldb", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 932 { "ldb", 0x40000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, 933 { "ldb", 0x40000000, 0xfc00c000, "j(b),x", pa10, 0}, 934 { "ldb", 0x40000000, 0xfc000000, "j(s,b),x", pa10, 0}, 935 { "std", 0x0c0012e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 936 { "std", 0x0c0012e0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, 937 { "std", 0x0c0012c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, 938 { "std", 0x0c0012c0, 0xfc0013c0, "cmcCx,V(s,b)", pa20, FLAG_STRICT}, 939 { "std", 0x70000000, 0xfc000002, "cqx,&(b)", pa20w, FLAG_STRICT}, 940 { "std", 0x70000000, 0xfc00c002, "cqx,#(b)", pa20, FLAG_STRICT}, 941 { "std", 0x70000000, 0xfc000002, "cqx,#(s,b)", pa20, FLAG_STRICT}, 942 { "stw", 0x0c0012a0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 943 { "stw", 0x0c0012a0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, 944 { "stw", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 945 { "stw", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 946 { "stw", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 947 { "stw", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 948 { "stw", 0x6c000000, 0xfc000000, "cex,<(b)", pa20w, FLAG_STRICT}, 949 { "stw", 0x7c000004, 0xfc000006, "cex,>(b)", pa20w, FLAG_STRICT}, 950 { "stw", 0x68000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, 951 { "stw", 0x7c000004, 0xfc00c006, "cex,K(b)", pa20, FLAG_STRICT}, 952 { "stw", 0x7c000004, 0xfc000006, "cex,K(s,b)", pa20, FLAG_STRICT}, 953 { "stw", 0x6c000000, 0xfc00c000, "cex,J(b)", pa10, FLAG_STRICT}, 954 { "stw", 0x6c000000, 0xfc000000, "cex,J(s,b)", pa10, FLAG_STRICT}, 955 { "stw", 0x68000000, 0xfc00c000, "x,j(b)", pa10, 0}, 956 { "stw", 0x68000000, 0xfc000000, "x,j(s,b)", pa10, 0}, 957 { "sth", 0x0c001260, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 958 { "sth", 0x0c001260, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, 959 { "sth", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 960 { "sth", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 961 { "sth", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 962 { "sth", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 963 { "sth", 0x64000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, 964 { "sth", 0x64000000, 0xfc00c000, "x,j(b)", pa10, 0}, 965 { "sth", 0x64000000, 0xfc000000, "x,j(s,b)", pa10, 0}, 966 { "stb", 0x0c001220, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 967 { "stb", 0x0c001220, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, 968 { "stb", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 969 { "stb", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 970 { "stb", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 971 { "stb", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 972 { "stb", 0x60000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, 973 { "stb", 0x60000000, 0xfc00c000, "x,j(b)", pa10, 0}, 974 { "stb", 0x60000000, 0xfc000000, "x,j(s,b)", pa10, 0}, 975 { "ldwm", 0x4c000000, 0xfc00c000, "j(b),x", pa10, 0}, 976 { "ldwm", 0x4c000000, 0xfc000000, "j(s,b),x", pa10, 0}, 977 { "stwm", 0x6c000000, 0xfc00c000, "x,j(b)", pa10, 0}, 978 { "stwm", 0x6c000000, 0xfc000000, "x,j(s,b)", pa10, 0}, 979 { "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 980 { "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 981 { "ldwx", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 982 { "ldwx", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 983 { "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, 0}, 984 { "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, 985 { "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 986 { "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 987 { "ldhx", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 988 { "ldhx", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 989 { "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, 0}, 990 { "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, 991 { "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 992 { "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 993 { "ldbx", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 994 { "ldbx", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, 995 { "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, 0}, 996 { "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, 997 { "ldwa", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 998 { "ldwa", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 999 { "ldwa", 0x0c0011a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 1000 { "ldwa", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1001 { "ldwa", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 1002 { "ldcw", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 1003 { "ldcw", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 1004 { "ldcw", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, 1005 { "ldcw", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, 1006 { "ldcw", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1007 { "ldcw", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 1008 { "ldcw", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, 1009 { "ldcw", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, 1010 { "stwa", 0x0c0013a0, 0xfc00d3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 1011 { "stwa", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 1012 { "stwa", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 1013 { "stby", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, 1014 { "stby", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, 1015 { "stby", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, 1016 { "stby", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, 1017 { "ldda", 0x0c000100, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, 1018 { "ldda", 0x0c001120, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, 1019 { "ldda", 0x0c001100, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, 1020 { "ldcd", 0x0c000140, 0xfc00d3c0, "cxcdx(b),t", pa20, FLAG_STRICT}, 1021 { "ldcd", 0x0c000140, 0xfc0013c0, "cxcdx(s,b),t", pa20, FLAG_STRICT}, 1022 { "ldcd", 0x0c001140, 0xfc00d3c0, "cmcd5(b),t", pa20, FLAG_STRICT}, 1023 { "ldcd", 0x0c001140, 0xfc0013c0, "cmcd5(s,b),t", pa20, FLAG_STRICT}, 1024 { "stda", 0x0c0013e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, 1025 { "stda", 0x0c0013c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, 1026 { "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 1027 { "ldwax", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, 1028 { "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, 0}, 1029 { "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, 1030 { "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, 1031 { "ldcwx", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, 1032 { "ldcwx", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, 1033 { "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, 0}, 1034 { "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, 1035 { "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1036 { "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 1037 { "ldws", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 1038 { "ldws", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 1039 { "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, 0}, 1040 { "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, 1041 { "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1042 { "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 1043 { "ldhs", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 1044 { "ldhs", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 1045 { "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, 0}, 1046 { "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, 1047 { "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1048 { "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 1049 { "ldbs", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 1050 { "ldbs", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, 1051 { "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, 0}, 1052 { "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, 1053 { "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1054 { "ldwas", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, 1055 { "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, 0}, 1056 { "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, 1057 { "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, 1058 { "ldcws", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, 1059 { "ldcws", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, 1060 { "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, 0}, 1061 { "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, 1062 { "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 1063 { "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 1064 { "stws", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 1065 { "stws", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 1066 { "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, 1067 { "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, 1068 { "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 1069 { "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 1070 { "sths", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 1071 { "sths", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 1072 { "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, 1073 { "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, 1074 { "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 1075 { "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, 1076 { "stbs", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 1077 { "stbs", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, 1078 { "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, 1079 { "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, 1080 { "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, 1081 { "stwas", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, 1082 { "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, 1083 { "stdby", 0x0c001340, 0xfc00d3c0, "cscCx,V(b)", pa20, FLAG_STRICT}, 1084 { "stdby", 0x0c001340, 0xfc0013c0, "cscCx,V(s,b)", pa20, FLAG_STRICT}, 1085 { "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, 1086 { "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, 1087 { "stbys", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, 1088 { "stbys", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, 1089 { "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, 0}, 1090 { "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, 0}, 1091 1092 /* Immediate instructions. */ 1093 { "ldo", 0x34000000, 0xfc000000, "l(b),x", pa20w, 0}, 1094 { "ldo", 0x34000000, 0xfc00c000, "j(b),x", pa10, 0}, 1095 { "ldil", 0x20000000, 0xfc000000, "k,b", pa10, 0}, 1096 { "addil", 0x28000000, 0xfc000000, "k,b,Z", pa10, 0}, 1097 { "addil", 0x28000000, 0xfc000000, "k,b", pa10, 0}, 1098 1099 /* Branching instructions. */ 1100 { "b", 0xe8008000, 0xfc00e000, "cpnXL", pa20, FLAG_STRICT}, 1101 { "b", 0xe800a000, 0xfc00e000, "clnXL", pa20, FLAG_STRICT}, 1102 { "b", 0xe8000000, 0xfc00e000, "clnW,b", pa10, FLAG_STRICT}, 1103 { "b", 0xe8002000, 0xfc00e000, "cgnW,b", pa10, FLAG_STRICT}, 1104 { "b", 0xe8000000, 0xffe0e000, "nW", pa10, 0}, /* b,l foo,r0 */ 1105 { "bl", 0xe8000000, 0xfc00e000, "nW,b", pa10, 0}, 1106 { "gate", 0xe8002000, 0xfc00e000, "nW,b", pa10, 0}, 1107 { "blr", 0xe8004000, 0xfc00e001, "nx,b", pa10, 0}, 1108 { "bv", 0xe800c000, 0xfc00fffd, "nx(b)", pa10, 0}, 1109 { "bv", 0xe800c000, 0xfc00fffd, "n(b)", pa10, 0}, 1110 { "bve", 0xe800f001, 0xfc1ffffd, "cpn(b)L", pa20, FLAG_STRICT}, 1111 { "bve", 0xe800f000, 0xfc1ffffd, "cln(b)L", pa20, FLAG_STRICT}, 1112 { "bve", 0xe800d001, 0xfc1ffffd, "cPn(b)", pa20, FLAG_STRICT}, 1113 { "bve", 0xe800d000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, 1114 { "be", 0xe4000000, 0xfc000000, "clnz(S,b),Y", pa10, FLAG_STRICT}, 1115 { "be", 0xe4000000, 0xfc000000, "clnz(b),Y", pa10, FLAG_STRICT}, 1116 { "be", 0xe0000000, 0xfc000000, "nz(S,b)", pa10, 0}, 1117 { "be", 0xe0000000, 0xfc000000, "nz(b)", pa10, 0}, 1118 { "ble", 0xe4000000, 0xfc000000, "nz(S,b)", pa10, 0}, 1119 { "movb", 0xc8000000, 0xfc000000, "?ynx,b,w", pa10, 0}, 1120 { "movib", 0xcc000000, 0xfc000000, "?yn5,b,w", pa10, 0}, 1121 { "combt", 0x80000000, 0xfc000000, "?tnx,b,w", pa10, 0}, 1122 { "combf", 0x88000000, 0xfc000000, "?tnx,b,w", pa10, 0}, 1123 { "comibt", 0x84000000, 0xfc000000, "?tn5,b,w", pa10, 0}, 1124 { "comibf", 0x8c000000, 0xfc000000, "?tn5,b,w", pa10, 0}, 1125 { "addbt", 0xa0000000, 0xfc000000, "?dnx,b,w", pa10, 0}, 1126 { "addbf", 0xa8000000, 0xfc000000, "?dnx,b,w", pa10, 0}, 1127 { "addibt", 0xa4000000, 0xfc000000, "?dn5,b,w", pa10, 0}, 1128 { "addibf", 0xac000000, 0xfc000000, "?dn5,b,w", pa10, 0}, 1129 { "bb", 0xc0004000, 0xffe06000, "?bnx,!,w", pa10, FLAG_STRICT}, 1130 { "bb", 0xc0006000, 0xffe06000, "?Bnx,!,w", pa20, FLAG_STRICT}, 1131 { "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, FLAG_STRICT}, 1132 { "bb", 0xc4004000, 0xfc004000, "?Bnx,B,w", pa20, FLAG_STRICT}, 1133 { "bvb", 0xc0004000, 0xffe04000, "?bnx,w", pa10, 0}, 1134 { "clrbts", 0xe8004005, 0xffffffff, "", pa20, FLAG_STRICT}, 1135 { "popbts", 0xe8004005, 0xfffff007, "$", pa20, FLAG_STRICT}, 1136 { "pushnom", 0xe8004001, 0xffffffff, "", pa20, FLAG_STRICT}, 1137 { "pushbts", 0xe8004001, 0xffe0ffff, "x", pa20, FLAG_STRICT}, 1138 1139 /* Computation Instructions. */ 1140 1141 { "cmpclr", 0x080008a0, 0xfc000fe0, "?Sx,b,t", pa20, FLAG_STRICT}, 1142 { "cmpclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, FLAG_STRICT}, 1143 { "comclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1144 { "or", 0x08000260, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, 1145 { "or", 0x08000240, 0xfc000fe0, "?lx,b,t", pa10, 0}, 1146 { "xor", 0x080002a0, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, 1147 { "xor", 0x08000280, 0xfc000fe0, "?lx,b,t", pa10, 0}, 1148 { "and", 0x08000220, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, 1149 { "and", 0x08000200, 0xfc000fe0, "?lx,b,t", pa10, 0}, 1150 { "andcm", 0x08000020, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, 1151 { "andcm", 0x08000000, 0xfc000fe0, "?lx,b,t", pa10, 0}, 1152 { "uxor", 0x080003a0, 0xfc000fe0, "?Ux,b,t", pa20, FLAG_STRICT}, 1153 { "uxor", 0x08000380, 0xfc000fe0, "?ux,b,t", pa10, 0}, 1154 { "uaddcm", 0x080009a0, 0xfc000fa0, "cT?Ux,b,t", pa20, FLAG_STRICT}, 1155 { "uaddcm", 0x08000980, 0xfc000fa0, "cT?ux,b,t", pa10, FLAG_STRICT}, 1156 { "uaddcm", 0x08000980, 0xfc000fe0, "?ux,b,t", pa10, 0}, 1157 { "uaddcmt", 0x080009c0, 0xfc000fe0, "?ux,b,t", pa10, 0}, 1158 { "dcor", 0x08000ba0, 0xfc1f0fa0, "ci?Ub,t", pa20, FLAG_STRICT}, 1159 { "dcor", 0x08000b80, 0xfc1f0fa0, "ci?ub,t", pa10, FLAG_STRICT}, 1160 { "dcor", 0x08000b80, 0xfc1f0fe0, "?ub,t", pa10, 0}, 1161 { "idcor", 0x08000bc0, 0xfc1f0fe0, "?ub,t", pa10, 0}, 1162 { "addi", 0xb0000000, 0xfc000000, "ct?ai,b,x", pa10, FLAG_STRICT}, 1163 { "addi", 0xb4000000, 0xfc000000, "cv?ai,b,x", pa10, FLAG_STRICT}, 1164 { "addi", 0xb4000000, 0xfc000800, "?ai,b,x", pa10, 0}, 1165 { "addio", 0xb4000800, 0xfc000800, "?ai,b,x", pa10, 0}, 1166 { "addit", 0xb0000000, 0xfc000800, "?ai,b,x", pa10, 0}, 1167 { "addito", 0xb0000800, 0xfc000800, "?ai,b,x", pa10, 0}, 1168 { "add", 0x08000720, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT}, 1169 { "add", 0x08000700, 0xfc0007e0, "cy?ax,b,t", pa10, FLAG_STRICT}, 1170 { "add", 0x08000220, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT}, 1171 { "add", 0x08000200, 0xfc0003e0, "ca?ax,b,t", pa10, FLAG_STRICT}, 1172 { "add", 0x08000600, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1173 { "addl", 0x08000a00, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1174 { "addo", 0x08000e00, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1175 { "addc", 0x08000700, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1176 { "addco", 0x08000f00, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1177 { "sub", 0x080004e0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT}, 1178 { "sub", 0x080004c0, 0xfc0007e0, "ct?sx,b,t", pa10, FLAG_STRICT}, 1179 { "sub", 0x08000520, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT}, 1180 { "sub", 0x08000500, 0xfc0007e0, "cb?sx,b,t", pa10, FLAG_STRICT}, 1181 { "sub", 0x08000420, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT}, 1182 { "sub", 0x08000400, 0xfc0007e0, "cv?sx,b,t", pa10, FLAG_STRICT}, 1183 { "sub", 0x08000400, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1184 { "subo", 0x08000c00, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1185 { "subb", 0x08000500, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1186 { "subbo", 0x08000d00, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1187 { "subt", 0x080004c0, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1188 { "subto", 0x08000cc0, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1189 { "ds", 0x08000440, 0xfc000fe0, "?sx,b,t", pa10, 0}, 1190 { "subi", 0x94000000, 0xfc000000, "cv?si,b,x", pa10, FLAG_STRICT}, 1191 { "subi", 0x94000000, 0xfc000800, "?si,b,x", pa10, 0}, 1192 { "subio", 0x94000800, 0xfc000800, "?si,b,x", pa10, 0}, 1193 { "cmpiclr", 0x90000800, 0xfc000800, "?Si,b,x", pa20, FLAG_STRICT}, 1194 { "cmpiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, FLAG_STRICT}, 1195 { "comiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, 0}, 1196 { "shladd", 0x08000220, 0xfc000320, "ca?Ax,.,b,t", pa20, FLAG_STRICT}, 1197 { "shladd", 0x08000200, 0xfc000320, "ca?ax,.,b,t", pa10, FLAG_STRICT}, 1198 { "sh1add", 0x08000640, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1199 { "sh1addl", 0x08000a40, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1200 { "sh1addo", 0x08000e40, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1201 { "sh2add", 0x08000680, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1202 { "sh2addl", 0x08000a80, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1203 { "sh2addo", 0x08000e80, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1204 { "sh3add", 0x080006c0, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1205 { "sh3addl", 0x08000ac0, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1206 { "sh3addo", 0x08000ec0, 0xfc000fe0, "?ax,b,t", pa10, 0}, 1207 1208 /* Subword Operation Instructions. */ 1209 1210 { "hadd", 0x08000300, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, 1211 { "havg", 0x080002c0, 0xfc00ffe0, "x,b,t", pa20, FLAG_STRICT}, 1212 { "hshl", 0xf8008800, 0xffe0fc20, "x,*,t", pa20, FLAG_STRICT}, 1213 { "hshladd", 0x08000700, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, 1214 { "hshr", 0xf800c800, 0xfc1ff820, "cSb,*,t", pa20, FLAG_STRICT}, 1215 { "hshradd", 0x08000500, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, 1216 { "hsub", 0x08000100, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, 1217 { "mixh", 0xf8008400, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, 1218 { "mixw", 0xf8008000, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, 1219 { "permh", 0xf8000000, 0xfc009020, "c*a,t", pa20, FLAG_STRICT}, 1220 1221 1222 /* Extract and Deposit Instructions. */ 1223 1224 { "shrpd", 0xd0000200, 0xfc001fe0, "?Xx,b,!,t", pa20, FLAG_STRICT}, 1225 { "shrpd", 0xd0000400, 0xfc001400, "?Xx,b,~,t", pa20, FLAG_STRICT}, 1226 { "shrpw", 0xd0000000, 0xfc001fe0, "?xx,b,!,t", pa10, FLAG_STRICT}, 1227 { "shrpw", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, FLAG_STRICT}, 1228 { "vshd", 0xd0000000, 0xfc001fe0, "?xx,b,t", pa10, 0}, 1229 { "shd", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, 0}, 1230 { "extrd", 0xd0001200, 0xfc001ae0, "cS?Xb,!,%,x", pa20, FLAG_STRICT}, 1231 { "extrd", 0xd8000000, 0xfc000000, "cS?Xb,q,|,x", pa20, FLAG_STRICT}, 1232 { "extrw", 0xd0001000, 0xfc001be0, "cS?xb,!,T,x", pa10, FLAG_STRICT}, 1233 { "extrw", 0xd0001800, 0xfc001800, "cS?xb,P,T,x", pa10, FLAG_STRICT}, 1234 { "vextru", 0xd0001000, 0xfc001fe0, "?xb,T,x", pa10, 0}, 1235 { "vextrs", 0xd0001400, 0xfc001fe0, "?xb,T,x", pa10, 0}, 1236 { "extru", 0xd0001800, 0xfc001c00, "?xb,P,T,x", pa10, 0}, 1237 { "extrs", 0xd0001c00, 0xfc001c00, "?xb,P,T,x", pa10, 0}, 1238 { "depd", 0xd4000200, 0xfc001ae0, "cz?Xx,!,%,b", pa20, FLAG_STRICT}, 1239 { "depd", 0xf0000000, 0xfc000000, "cz?Xx,~,|,b", pa20, FLAG_STRICT}, 1240 { "depdi", 0xd4001200, 0xfc001ae0, "cz?X5,!,%,b", pa20, FLAG_STRICT}, 1241 { "depdi", 0xf4000000, 0xfc000000, "cz?X5,~,|,b", pa20, FLAG_STRICT}, 1242 { "depw", 0xd4000000, 0xfc001be0, "cz?xx,!,T,b", pa10, FLAG_STRICT}, 1243 { "depw", 0xd4000800, 0xfc001800, "cz?xx,p,T,b", pa10, FLAG_STRICT}, 1244 { "depwi", 0xd4001000, 0xfc001be0, "cz?x5,!,T,b", pa10, FLAG_STRICT}, 1245 { "depwi", 0xd4001800, 0xfc001800, "cz?x5,p,T,b", pa10, FLAG_STRICT}, 1246 { "zvdep", 0xd4000000, 0xfc001fe0, "?xx,T,b", pa10, 0}, 1247 { "vdep", 0xd4000400, 0xfc001fe0, "?xx,T,b", pa10, 0}, 1248 { "zdep", 0xd4000800, 0xfc001c00, "?xx,p,T,b", pa10, 0}, 1249 { "dep", 0xd4000c00, 0xfc001c00, "?xx,p,T,b", pa10, 0}, 1250 { "zvdepi", 0xd4001000, 0xfc001fe0, "?x5,T,b", pa10, 0}, 1251 { "vdepi", 0xd4001400, 0xfc001fe0, "?x5,T,b", pa10, 0}, 1252 { "zdepi", 0xd4001800, 0xfc001c00, "?x5,p,T,b", pa10, 0}, 1253 { "depi", 0xd4001c00, 0xfc001c00, "?x5,p,T,b", pa10, 0}, 1254 1255 /* System Control Instructions. */ 1256 1257 { "break", 0x00000000, 0xfc001fe0, "r,A", pa10, 0}, 1258 { "rfi", 0x00000c00, 0xffffff1f, "cr", pa10, FLAG_STRICT}, 1259 { "rfi", 0x00000c00, 0xffffffff, "", pa10, 0}, 1260 { "rfir", 0x00000ca0, 0xffffffff, "", pa11, 0}, 1261 { "ssm", 0x00000d60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, 1262 { "ssm", 0x00000d60, 0xffe0ffe0, "R,t", pa10, 0}, 1263 { "rsm", 0x00000e60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, 1264 { "rsm", 0x00000e60, 0xffe0ffe0, "R,t", pa10, 0}, 1265 { "mtsm", 0x00001860, 0xffe0ffff, "x", pa10, 0}, 1266 { "ldsid", 0x000010a0, 0xfc1fffe0, "(b),t", pa10, 0}, 1267 { "ldsid", 0x000010a0, 0xfc1f3fe0, "(s,b),t", pa10, 0}, 1268 { "mtsp", 0x00001820, 0xffe01fff, "x,S", pa10, 0}, 1269 { "mtctl", 0x00001840, 0xfc00ffff, "x,^", pa10, 0}, 1270 { "mtsarcm", 0x016018C0, 0xffe0ffff, "x", pa20, FLAG_STRICT}, 1271 { "mfia", 0x000014A0, 0xffffffe0, "t", pa20, FLAG_STRICT}, 1272 { "mfsp", 0x000004a0, 0xffff1fe0, "S,t", pa10, 0}, 1273 { "mfctl", 0x016048a0, 0xffffffe0, "cW!,t", pa20, FLAG_STRICT}, 1274 { "mfctl", 0x000008a0, 0xfc1fffe0, "^,t", pa10, 0}, 1275 { "sync", 0x00000400, 0xffffffff, "", pa10, 0}, 1276 { "syncdma", 0x00100400, 0xffffffff, "", pa10, 0}, 1277 { "probe", 0x04001180, 0xfc00ffa0, "cw(b),x,t", pa10, FLAG_STRICT}, 1278 { "probe", 0x04001180, 0xfc003fa0, "cw(s,b),x,t", pa10, FLAG_STRICT}, 1279 { "probei", 0x04003180, 0xfc00ffa0, "cw(b),R,t", pa10, FLAG_STRICT}, 1280 { "probei", 0x04003180, 0xfc003fa0, "cw(s,b),R,t", pa10, FLAG_STRICT}, 1281 { "prober", 0x04001180, 0xfc00ffe0, "(b),x,t", pa10, 0}, 1282 { "prober", 0x04001180, 0xfc003fe0, "(s,b),x,t", pa10, 0}, 1283 { "proberi", 0x04003180, 0xfc00ffe0, "(b),R,t", pa10, 0}, 1284 { "proberi", 0x04003180, 0xfc003fe0, "(s,b),R,t", pa10, 0}, 1285 { "probew", 0x040011c0, 0xfc00ffe0, "(b),x,t", pa10, 0}, 1286 { "probew", 0x040011c0, 0xfc003fe0, "(s,b),x,t", pa10, 0}, 1287 { "probewi", 0x040031c0, 0xfc00ffe0, "(b),R,t", pa10, 0}, 1288 { "probewi", 0x040031c0, 0xfc003fe0, "(s,b),R,t", pa10, 0}, 1289 { "lpa", 0x04001340, 0xfc00ffc0, "cZx(b),t", pa10, 0}, 1290 { "lpa", 0x04001340, 0xfc003fc0, "cZx(s,b),t", pa10, 0}, 1291 { "lci", 0x04001300, 0xfc00ffe0, "x(b),t", pa11, 0}, 1292 { "lci", 0x04001300, 0xfc003fe0, "x(s,b),t", pa11, 0}, 1293 { "pdtlb", 0x04001600, 0xfc00ffdf, "cLcZx(b)", pa20, FLAG_STRICT}, 1294 { "pdtlb", 0x04001600, 0xfc003fdf, "cLcZx(s,b)", pa20, FLAG_STRICT}, 1295 { "pdtlb", 0x04001600, 0xfc1fffdf, "cLcZ@(b)", pa20, FLAG_STRICT}, 1296 { "pdtlb", 0x04001600, 0xfc1f3fdf, "cLcZ@(s,b)", pa20, FLAG_STRICT}, 1297 { "pdtlb", 0x04001200, 0xfc00ffdf, "cZx(b)", pa10, 0}, 1298 { "pdtlb", 0x04001200, 0xfc003fdf, "cZx(s,b)", pa10, 0}, 1299 { "pitlb", 0x04000600, 0xfc001fdf, "cLcZx(S,b)", pa20, FLAG_STRICT}, 1300 { "pitlb", 0x04000600, 0xfc1f1fdf, "cLcZ@(S,b)", pa20, FLAG_STRICT}, 1301 { "pitlb", 0x04000200, 0xfc001fdf, "cZx(S,b)", pa10, 0}, 1302 { "pdtlbe", 0x04001240, 0xfc00ffdf, "cZx(b)", pa10, 0}, 1303 { "pdtlbe", 0x04001240, 0xfc003fdf, "cZx(s,b)", pa10, 0}, 1304 { "pitlbe", 0x04000240, 0xfc001fdf, "cZx(S,b)", pa10, 0}, 1305 { "idtlba", 0x04001040, 0xfc00ffff, "x,(b)", pa10, 0}, 1306 { "idtlba", 0x04001040, 0xfc003fff, "x,(s,b)", pa10, 0}, 1307 { "iitlba", 0x04000040, 0xfc001fff, "x,(S,b)", pa10, 0}, 1308 { "idtlbp", 0x04001000, 0xfc00ffff, "x,(b)", pa10, 0}, 1309 { "idtlbp", 0x04001000, 0xfc003fff, "x,(s,b)", pa10, 0}, 1310 { "iitlbp", 0x04000000, 0xfc001fff, "x,(S,b)", pa10, 0}, 1311 { "pdc", 0x04001380, 0xfc00ffdf, "cZx(b)", pa10, 0}, 1312 { "pdc", 0x04001380, 0xfc003fdf, "cZx(s,b)", pa10, 0}, 1313 { "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, FLAG_STRICT}, 1314 { "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, FLAG_STRICT}, 1315 { "fdc", 0x04003280, 0xfc00ffff, "5(b)", pa20, FLAG_STRICT}, 1316 { "fdc", 0x04003280, 0xfc003fff, "5(s,b)", pa20, FLAG_STRICT}, 1317 { "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, 0}, 1318 { "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, 0}, 1319 { "fic", 0x040013c0, 0xfc00dfdf, "cZx(b)", pa20, FLAG_STRICT}, 1320 { "fic", 0x04000280, 0xfc001fdf, "cZx(S,b)", pa10, 0}, 1321 { "fdce", 0x040012c0, 0xfc00ffdf, "cZx(b)", pa10, 0}, 1322 { "fdce", 0x040012c0, 0xfc003fdf, "cZx(s,b)", pa10, 0}, 1323 { "fice", 0x040002c0, 0xfc001fdf, "cZx(S,b)", pa10, 0}, 1324 { "diag", 0x14000000, 0xfc000000, "D", pa10, 0}, 1325 { "idtlbt", 0x04001800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, 1326 { "iitlbt", 0x04000800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, 1327 1328 /* These may be specific to certain versions of the PA. Joel claimed 1329 they were 72000 (7200?) specific. However, I'm almost certain the 1330 mtcpu/mfcpu were undocumented, but available in the older 700 machines. */ 1331 { "mtcpu", 0x14001600, 0xfc00ffff, "x,^", pa10, 0}, 1332 { "mfcpu", 0x14001A00, 0xfc00ffff, "^,x", pa10, 0}, 1333 { "tocen", 0x14403600, 0xffffffff, "", pa10, 0}, 1334 { "tocdis", 0x14401620, 0xffffffff, "", pa10, 0}, 1335 { "shdwgr", 0x14402600, 0xffffffff, "", pa10, 0}, 1336 { "grshdw", 0x14400620, 0xffffffff, "", pa10, 0}, 1337 1338 /* gfw and gfr are not in the HP PA 1.1 manual, but they are in either 1339 the Timex FPU or the Mustang ERS (not sure which) manual. */ 1340 { "gfw", 0x04001680, 0xfc00ffdf, "cZx(b)", pa11, 0}, 1341 { "gfw", 0x04001680, 0xfc003fdf, "cZx(s,b)", pa11, 0}, 1342 { "gfr", 0x04001a80, 0xfc00ffdf, "cZx(b)", pa11, 0}, 1343 { "gfr", 0x04001a80, 0xfc003fdf, "cZx(s,b)", pa11, 0}, 1344 1345 /* Floating Point Coprocessor Instructions. */ 1346 1347 { "fldw", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, 1348 { "fldw", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, 1349 { "fldw", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, 1350 { "fldw", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, 1351 { "fldw", 0x24001020, 0xfc1ff3a0, "cocc@(b),fT", pa20, FLAG_STRICT}, 1352 { "fldw", 0x24001020, 0xfc1f33a0, "cocc@(s,b),fT", pa20, FLAG_STRICT}, 1353 { "fldw", 0x24001000, 0xfc00df80, "cM5(b),fT", pa10, FLAG_STRICT}, 1354 { "fldw", 0x24001000, 0xfc001f80, "cM5(s,b),fT", pa10, FLAG_STRICT}, 1355 { "fldw", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, 1356 { "fldw", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, 1357 { "fldw", 0x5c000000, 0xfc000004, "y(b),fe", pa20w, FLAG_STRICT}, 1358 { "fldw", 0x58000000, 0xfc000000, "cJy(b),fe", pa20w, FLAG_STRICT}, 1359 { "fldw", 0x5c000000, 0xfc00c004, "d(b),fe", pa20, FLAG_STRICT}, 1360 { "fldw", 0x5c000000, 0xfc000004, "d(s,b),fe", pa20, FLAG_STRICT}, 1361 { "fldw", 0x58000000, 0xfc00c000, "cJd(b),fe", pa20, FLAG_STRICT}, 1362 { "fldw", 0x58000000, 0xfc000000, "cJd(s,b),fe", pa20, FLAG_STRICT}, 1363 { "fldd", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, 1364 { "fldd", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, 1365 { "fldd", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, 1366 { "fldd", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, 1367 { "fldd", 0x2c001020, 0xfc1ff3e0, "cocc@(b),ft", pa20, FLAG_STRICT}, 1368 { "fldd", 0x2c001020, 0xfc1f33e0, "cocc@(s,b),ft", pa20, FLAG_STRICT}, 1369 { "fldd", 0x2c001000, 0xfc00dfc0, "cM5(b),ft", pa10, FLAG_STRICT}, 1370 { "fldd", 0x2c001000, 0xfc001fc0, "cM5(s,b),ft", pa10, FLAG_STRICT}, 1371 { "fldd", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, 1372 { "fldd", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, 1373 { "fldd", 0x50000002, 0xfc000002, "cq&(b),fx", pa20w, FLAG_STRICT}, 1374 { "fldd", 0x50000002, 0xfc00c002, "cq#(b),fx", pa20, FLAG_STRICT}, 1375 { "fldd", 0x50000002, 0xfc000002, "cq#(s,b),fx", pa20, FLAG_STRICT}, 1376 { "fstw", 0x24000200, 0xfc00df80, "cXfT,x(b)", pa10, FLAG_STRICT}, 1377 { "fstw", 0x24000200, 0xfc001f80, "cXfT,x(s,b)", pa10, FLAG_STRICT}, 1378 { "fstw", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, 1379 { "fstw", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, 1380 { "fstw", 0x24001220, 0xfc1ff3a0, "cocCfT,@(b)", pa20, FLAG_STRICT}, 1381 { "fstw", 0x24001220, 0xfc1f33a0, "cocCfT,@(s,b)", pa20, FLAG_STRICT}, 1382 { "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, 1383 { "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, 1384 { "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, 1385 { "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, 1386 { "fstw", 0x7c000000, 0xfc000004, "fE,y(b)", pa20w, FLAG_STRICT}, 1387 { "fstw", 0x78000000, 0xfc000000, "cJfE,y(b)", pa20w, FLAG_STRICT}, 1388 { "fstw", 0x7c000000, 0xfc00c004, "fE,d(b)", pa20, FLAG_STRICT}, 1389 { "fstw", 0x7c000000, 0xfc000004, "fE,d(s,b)", pa20, FLAG_STRICT}, 1390 { "fstw", 0x78000000, 0xfc00c000, "cJfE,d(b)", pa20, FLAG_STRICT}, 1391 { "fstw", 0x78000000, 0xfc000000, "cJfE,d(s,b)", pa20, FLAG_STRICT}, 1392 { "fstd", 0x2c000200, 0xfc00dfc0, "cXft,x(b)", pa10, FLAG_STRICT}, 1393 { "fstd", 0x2c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, FLAG_STRICT}, 1394 { "fstd", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, 1395 { "fstd", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, 1396 { "fstd", 0x2c001220, 0xfc1ff3e0, "cocCft,@(b)", pa20, FLAG_STRICT}, 1397 { "fstd", 0x2c001220, 0xfc1f33e0, "cocCft,@(s,b)", pa20, FLAG_STRICT}, 1398 { "fstd", 0x2c001200, 0xfc00dfc0, "cMft,5(b)", pa10, FLAG_STRICT}, 1399 { "fstd", 0x2c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, FLAG_STRICT}, 1400 { "fstd", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, 1401 { "fstd", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, 1402 { "fstd", 0x70000002, 0xfc000002, "cqfx,&(b)", pa20w, FLAG_STRICT}, 1403 { "fstd", 0x70000002, 0xfc00c002, "cqfx,#(b)", pa20, FLAG_STRICT}, 1404 { "fstd", 0x70000002, 0xfc000002, "cqfx,#(s,b)", pa20, FLAG_STRICT}, 1405 { "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, 1406 { "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, 1407 { "fldwx", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, 1408 { "fldwx", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, 1409 { "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, 0}, 1410 { "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, 0}, 1411 { "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, 1412 { "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, 1413 { "flddx", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, 1414 { "flddx", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, 1415 { "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, 0}, 1416 { "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, 0}, 1417 { "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, FLAG_STRICT}, 1418 { "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, FLAG_STRICT}, 1419 { "fstwx", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, 1420 { "fstwx", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, 1421 { "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, 0}, 1422 { "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, 0}, 1423 { "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, FLAG_STRICT}, 1424 { "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, FLAG_STRICT}, 1425 { "fstdx", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, 1426 { "fstdx", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, 1427 { "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0}, 1428 { "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0}, 1429 { "fstqx", 0x3c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0}, 1430 { "fstqx", 0x3c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0}, 1431 { "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, FLAG_STRICT}, 1432 { "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, FLAG_STRICT}, 1433 { "fldws", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, 1434 { "fldws", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, 1435 { "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, 0}, 1436 { "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, 0}, 1437 { "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, FLAG_STRICT}, 1438 { "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, FLAG_STRICT}, 1439 { "fldds", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, 1440 { "fldds", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, 1441 { "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, 0}, 1442 { "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, 0}, 1443 { "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, FLAG_STRICT}, 1444 { "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, FLAG_STRICT}, 1445 { "fstws", 0x24001200, 0xfc00d380, "cmcCfT,5(b)", pa11, FLAG_STRICT}, 1446 { "fstws", 0x24001200, 0xfc001380, "cmcCfT,5(s,b)", pa11, FLAG_STRICT}, 1447 { "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, 0}, 1448 { "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, 0}, 1449 { "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, FLAG_STRICT}, 1450 { "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, FLAG_STRICT}, 1451 { "fstds", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, 1452 { "fstds", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, 1453 { "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0}, 1454 { "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0}, 1455 { "fstqs", 0x3c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0}, 1456 { "fstqs", 0x3c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0}, 1457 { "fadd", 0x30000600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, 1458 { "fadd", 0x38000600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, 1459 { "fsub", 0x30002600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, 1460 { "fsub", 0x38002600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, 1461 { "fmpy", 0x30004600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, 1462 { "fmpy", 0x38004600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, 1463 { "fdiv", 0x30006600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, 1464 { "fdiv", 0x38006600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, 1465 { "fsqrt", 0x30008000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, 1466 { "fsqrt", 0x38008000, 0xfc1fe720, "FfA,fT", pa10, 0}, 1467 { "fabs", 0x30006000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, 1468 { "fabs", 0x38006000, 0xfc1fe720, "FfA,fT", pa10, 0}, 1469 { "frem", 0x30008600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, 1470 { "frem", 0x38008600, 0xfc00e720, "FfA,fB,fT", pa10, 0}, 1471 { "frnd", 0x3000a000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, 1472 { "frnd", 0x3800a000, 0xfc1fe720, "FfA,fT", pa10, 0}, 1473 { "fcpy", 0x30004000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, 1474 { "fcpy", 0x38004000, 0xfc1fe720, "FfA,fT", pa10, 0}, 1475 { "fcnvff", 0x30000200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, 1476 { "fcnvff", 0x38000200, 0xfc1f8720, "FGfA,fT", pa10, 0}, 1477 { "fcnvxf", 0x30008200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, 1478 { "fcnvxf", 0x38008200, 0xfc1f8720, "FGfA,fT", pa10, 0}, 1479 { "fcnvfx", 0x30010200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, 1480 { "fcnvfx", 0x38010200, 0xfc1f8720, "FGfA,fT", pa10, 0}, 1481 { "fcnvfxt", 0x30018200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, 1482 { "fcnvfxt", 0x38018200, 0xfc1f8720, "FGfA,fT", pa10, 0}, 1483 { "fmpyfadd", 0xb8000000, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, 1484 { "fmpynfadd", 0xb8000020, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, 1485 { "fneg", 0x3000c000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, 1486 { "fneg", 0x3800c000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, 1487 { "fnegabs", 0x3000e000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, 1488 { "fnegabs", 0x3800e000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, 1489 { "fcnv", 0x30000200, 0xfc1c0720, "{_fa,fT", pa20, FLAG_STRICT}, 1490 { "fcnv", 0x38000200, 0xfc1c0720, "FGfA,fT", pa20, FLAG_STRICT}, 1491 { "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, FLAG_STRICT}, 1492 { "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, FLAG_STRICT}, 1493 { "fcmp", 0x30000400, 0xfc0007e0, "F?ffa,fb,h", pa20, FLAG_STRICT}, 1494 { "fcmp", 0x38000400, 0xfc000720, "I?ffA,fB,h", pa20, FLAG_STRICT}, 1495 { "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, 0}, 1496 { "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, 0}, 1497 { "xmpyu", 0x38004700, 0xfc00e720, "fX,fB,fT", pa11, 0}, 1498 { "fmpyadd", 0x18000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, 1499 { "fmpysub", 0x98000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, 1500 { "ftest", 0x30002420, 0xffffffff, "", pa10, FLAG_STRICT}, 1501 { "ftest", 0x30002420, 0xffffffe0, ",=", pa20, FLAG_STRICT}, 1502 { "ftest", 0x30000420, 0xffff1fff, "m", pa20, FLAG_STRICT}, 1503 { "fid", 0x30000000, 0xffffffff, "", pa11, 0}, 1504 1505 /* Performance Monitor Instructions. */ 1506 1507 { "pmdis", 0x30000280, 0xffffffdf, "N", pa20, FLAG_STRICT}, 1508 { "pmenb", 0x30000680, 0xffffffff, "", pa20, FLAG_STRICT}, 1509 1510 /* Assist Instructions. */ 1511 1512 { "spop0", 0x10000000, 0xfc000600, "v,ON", pa10, 0}, 1513 { "spop1", 0x10000200, 0xfc000600, "v,oNt", pa10, 0}, 1514 { "spop2", 0x10000400, 0xfc000600, "v,1Nb", pa10, 0}, 1515 { "spop3", 0x10000600, 0xfc000600, "v,0Nx,b", pa10, 0}, 1516 { "copr", 0x30000000, 0xfc000000, "u,2N", pa10, 0}, 1517 { "cldw", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, 1518 { "cldw", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, 1519 { "cldw", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, 1520 { "cldw", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, 1521 { "cldw", 0x24001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, 1522 { "cldw", 0x24001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, 1523 { "cldw", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, 1524 { "cldw", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, 1525 { "cldw", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, 1526 { "cldw", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, 1527 { "cldd", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, 1528 { "cldd", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, 1529 { "cldd", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, 1530 { "cldd", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, 1531 { "cldd", 0x2c001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, 1532 { "cldd", 0x2c001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, 1533 { "cldd", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, 1534 { "cldd", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, 1535 { "cldd", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, 1536 { "cldd", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, 1537 { "cstw", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, 1538 { "cstw", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, 1539 { "cstw", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, 1540 { "cstw", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, 1541 { "cstw", 0x24001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, 1542 { "cstw", 0x24001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, 1543 { "cstw", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, 1544 { "cstw", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, 1545 { "cstw", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, 1546 { "cstw", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, 1547 { "cstd", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, 1548 { "cstd", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, 1549 { "cstd", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, 1550 { "cstd", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, 1551 { "cstd", 0x2c001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, 1552 { "cstd", 0x2c001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, 1553 { "cstd", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, 1554 { "cstd", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, 1555 { "cstd", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, 1556 { "cstd", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, 1557 { "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, 1558 { "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, 1559 { "cldwx", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, 1560 { "cldwx", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, 1561 { "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, 1562 { "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, 1563 { "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, 1564 { "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, 1565 { "clddx", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, 1566 { "clddx", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, 1567 { "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, 1568 { "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, 1569 { "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, 1570 { "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, 1571 { "cstwx", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, 1572 { "cstwx", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, 1573 { "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, 1574 { "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, 1575 { "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, 1576 { "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, 1577 { "cstdx", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, 1578 { "cstdx", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, 1579 { "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, 1580 { "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, 1581 { "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, 1582 { "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, 1583 { "cldws", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, 1584 { "cldws", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, 1585 { "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, 1586 { "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, 1587 { "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, 1588 { "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, 1589 { "cldds", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, 1590 { "cldds", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, 1591 { "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, 1592 { "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, 1593 { "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, 1594 { "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, 1595 { "cstws", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, 1596 { "cstws", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, 1597 { "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, 1598 { "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, 1599 { "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, 1600 { "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, 1601 { "cstds", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, 1602 { "cstds", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, 1603 { "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, 1604 { "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, 1605 1606 /* More pseudo instructions which must follow the main table. */ 1607 { "call", 0xe800f000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, 1608 { "call", 0xe800a000, 0xffe0e000, "nW", pa10, FLAG_STRICT}, 1609 { "ret", 0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT}, 1610 1611 }; 1612 1613 #define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0])) 1614 1615 /* SKV 12/18/92. Added some denotations for various operands. */ 1616 1617 #define PA_IMM11_AT_31 'i' 1618 #define PA_IMM14_AT_31 'j' 1619 #define PA_IMM21_AT_31 'k' 1620 #define PA_DISP12 'w' 1621 #define PA_DISP17 'W' 1622 1623 #define N_HPPA_OPERAND_FORMATS 5 1624 1625 /* Integer register names, indexed by the numbers which appear in the 1626 opcodes. */ 1627 static const char *const reg_names[] = 1628 { 1629 "flags", "r1", "rp", "r3", "r4", "r5", "r6", "r7", "r8", "r9", 1630 "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", 1631 "r20", "r21", "r22", "r23", "r24", "r25", "r26", "dp", "ret0", "ret1", 1632 "sp", "r31" 1633 }; 1634 1635 /* Floating point register names, indexed by the numbers which appear in the 1636 opcodes. */ 1637 static const char *const fp_reg_names[] = 1638 { 1639 "fpsr", "fpe2", "fpe4", "fpe6", 1640 "fr4", "fr5", "fr6", "fr7", "fr8", 1641 "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15", 1642 "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", 1643 "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31" 1644 }; 1645 1646 typedef unsigned int CORE_ADDR; 1647 1648 /* Get at various relevant fields of an instruction word. */ 1649 1650 #define MASK_5 0x1f 1651 #define MASK_10 0x3ff 1652 #define MASK_11 0x7ff 1653 #define MASK_14 0x3fff 1654 #define MASK_16 0xffff 1655 #define MASK_21 0x1fffff 1656 1657 /* These macros get bit fields using HP's numbering (MSB = 0). */ 1658 1659 #define GET_FIELD(X, FROM, TO) \ 1660 ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1)) 1661 1662 #define GET_BIT(X, WHICH) \ 1663 GET_FIELD (X, WHICH, WHICH) 1664 1665 /* Some of these have been converted to 2-d arrays because they 1666 consume less storage this way. If the maintenance becomes a 1667 problem, convert them back to const 1-d pointer arrays. */ 1668 static const char *const control_reg[] = 1669 { 1670 "rctr", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 1671 "pidr1", "pidr2", "ccr", "sar", "pidr3", "pidr4", 1672 "iva", "eiem", "itmr", "pcsq", "pcoq", "iir", "isr", 1673 "ior", "ipsw", "eirr", "tr0", "tr1", "tr2", "tr3", 1674 "tr4", "tr5", "tr6", "tr7" 1675 }; 1676 1677 static const char *const compare_cond_names[] = 1678 { 1679 "", ",=", ",<", ",<=", ",<<", ",<<=", ",sv", ",od", 1680 ",tr", ",<>", ",>=", ",>", ",>>=", ",>>", ",nsv", ",ev" 1681 }; 1682 static const char *const compare_cond_64_names[] = 1683 { 1684 "", ",*=", ",*<", ",*<=", ",*<<", ",*<<=", ",*sv", ",*od", 1685 ",*tr", ",*<>", ",*>=", ",*>", ",*>>=", ",*>>", ",*nsv", ",*ev" 1686 }; 1687 static const char *const cmpib_cond_64_names[] = 1688 { 1689 ",*<<", ",*=", ",*<", ",*<=", ",*>>=", ",*<>", ",*>=", ",*>" 1690 }; 1691 static const char *const add_cond_names[] = 1692 { 1693 "", ",=", ",<", ",<=", ",nuv", ",znv", ",sv", ",od", 1694 ",tr", ",<>", ",>=", ",>", ",uv", ",vnz", ",nsv", ",ev" 1695 }; 1696 static const char *const add_cond_64_names[] = 1697 { 1698 "", ",*=", ",*<", ",*<=", ",*nuv", ",*znv", ",*sv", ",*od", 1699 ",*tr", ",*<>", ",*>=", ",*>", ",*uv", ",*vnz", ",*nsv", ",*ev" 1700 }; 1701 static const char *const wide_add_cond_names[] = 1702 { 1703 "", ",=", ",<", ",<=", ",nuv", ",*=", ",*<", ",*<=", 1704 ",tr", ",<>", ",>=", ",>", ",uv", ",*<>", ",*>=", ",*>" 1705 }; 1706 static const char *const logical_cond_names[] = 1707 { 1708 "", ",=", ",<", ",<=", 0, 0, 0, ",od", 1709 ",tr", ",<>", ",>=", ",>", 0, 0, 0, ",ev"}; 1710 static const char *const logical_cond_64_names[] = 1711 { 1712 "", ",*=", ",*<", ",*<=", 0, 0, 0, ",*od", 1713 ",*tr", ",*<>", ",*>=", ",*>", 0, 0, 0, ",*ev"}; 1714 static const char *const unit_cond_names[] = 1715 { 1716 "", ",swz", ",sbz", ",shz", ",sdc", ",swc", ",sbc", ",shc", 1717 ",tr", ",nwz", ",nbz", ",nhz", ",ndc", ",nwc", ",nbc", ",nhc" 1718 }; 1719 static const char *const unit_cond_64_names[] = 1720 { 1721 "", ",*swz", ",*sbz", ",*shz", ",*sdc", ",*swc", ",*sbc", ",*shc", 1722 ",*tr", ",*nwz", ",*nbz", ",*nhz", ",*ndc", ",*nwc", ",*nbc", ",*nhc" 1723 }; 1724 static const char *const shift_cond_names[] = 1725 { 1726 "", ",=", ",<", ",od", ",tr", ",<>", ",>=", ",ev" 1727 }; 1728 static const char *const shift_cond_64_names[] = 1729 { 1730 "", ",*=", ",*<", ",*od", ",*tr", ",*<>", ",*>=", ",*ev" 1731 }; 1732 static const char *const bb_cond_64_names[] = 1733 { 1734 ",*<", ",*>=" 1735 }; 1736 static const char *const index_compl_names[] = {"", ",m", ",s", ",sm"}; 1737 static const char *const short_ldst_compl_names[] = {"", ",ma", "", ",mb"}; 1738 static const char *const short_bytes_compl_names[] = 1739 { 1740 "", ",b,m", ",e", ",e,m" 1741 }; 1742 static const char *const float_format_names[] = {",sgl", ",dbl", "", ",quad"}; 1743 static const char *const fcnv_fixed_names[] = {",w", ",dw", "", ",qw"}; 1744 static const char *const fcnv_ufixed_names[] = {",uw", ",udw", "", ",uqw"}; 1745 static const char *const float_comp_names[] = 1746 { 1747 ",false?", ",false", ",?", ",!<=>", ",=", ",=t", ",?=", ",!<>", 1748 ",!?>=", ",<", ",?<", ",!>=", ",!?>", ",<=", ",?<=", ",!>", 1749 ",!?<=", ",>", ",?>", ",!<=", ",!?<", ",>=", ",?>=", ",!<", 1750 ",!?=", ",<>", ",!=", ",!=t", ",!?", ",<=>", ",true?", ",true" 1751 }; 1752 static const char *const signed_unsigned_names[] = {",u", ",s"}; 1753 static const char *const mix_half_names[] = {",l", ",r"}; 1754 static const char *const saturation_names[] = {",us", ",ss", 0, ""}; 1755 static const char *const read_write_names[] = {",r", ",w"}; 1756 static const char *const add_compl_names[] = { 0, "", ",l", ",tsv" }; 1757 1758 /* For a bunch of different instructions form an index into a 1759 completer name table. */ 1760 #define GET_COMPL(insn) (GET_FIELD (insn, 26, 26) | \ 1761 GET_FIELD (insn, 18, 18) << 1) 1762 1763 #define GET_COND(insn) (GET_FIELD ((insn), 16, 18) + \ 1764 (GET_FIELD ((insn), 19, 19) ? 8 : 0)) 1765 1766 /* Utility function to print registers. Put these first, so gcc's function 1767 inlining can do its stuff. */ 1768 1769 #define fputs_filtered(STR,F) (*info->fprintf_func) (info->stream, "%s", STR) 1770 1771 static void 1772 fput_reg (unsigned reg, disassemble_info *info) 1773 { 1774 (*info->fprintf_func) (info->stream, "%s", reg ? reg_names[reg] : "r0"); 1775 } 1776 1777 static void 1778 fput_fp_reg (unsigned reg, disassemble_info *info) 1779 { 1780 (*info->fprintf_func) (info->stream, "%s", reg ? fp_reg_names[reg] : "fr0"); 1781 } 1782 1783 static void 1784 fput_fp_reg_r (unsigned reg, disassemble_info *info) 1785 { 1786 /* Special case floating point exception registers. */ 1787 if (reg < 4) 1788 (*info->fprintf_func) (info->stream, "fpe%d", reg * 2 + 1); 1789 else 1790 (*info->fprintf_func) (info->stream, "%sR", 1791 reg ? fp_reg_names[reg] : "fr0"); 1792 } 1793 1794 static void 1795 fput_creg (unsigned reg, disassemble_info *info) 1796 { 1797 (*info->fprintf_func) (info->stream, "%s", control_reg[reg]); 1798 } 1799 1800 /* Print constants with sign. */ 1801 1802 static void 1803 fput_const (unsigned num, disassemble_info *info) 1804 { 1805 if ((int) num < 0) 1806 (*info->fprintf_func) (info->stream, "-%x", - (int) num); 1807 else 1808 (*info->fprintf_func) (info->stream, "%x", num); 1809 } 1810 1811 /* Routines to extract various sized constants out of hppa 1812 instructions. */ 1813 1814 /* Extract a 3-bit space register number from a be, ble, mtsp or mfsp. */ 1815 static int 1816 extract_3 (unsigned word) 1817 { 1818 return GET_FIELD (word, 18, 18) << 2 | GET_FIELD (word, 16, 17); 1819 } 1820 1821 static int 1822 extract_5_load (unsigned word) 1823 { 1824 return low_sign_extend (word >> 16 & MASK_5, 5); 1825 } 1826 1827 /* Extract the immediate field from a st{bhw}s instruction. */ 1828 1829 static int 1830 extract_5_store (unsigned word) 1831 { 1832 return low_sign_extend (word & MASK_5, 5); 1833 } 1834 1835 /* Extract the immediate field from a break instruction. */ 1836 1837 static unsigned 1838 extract_5r_store (unsigned word) 1839 { 1840 return (word & MASK_5); 1841 } 1842 1843 /* Extract the immediate field from a {sr}sm instruction. */ 1844 1845 static unsigned 1846 extract_5R_store (unsigned word) 1847 { 1848 return (word >> 16 & MASK_5); 1849 } 1850 1851 /* Extract the 10 bit immediate field from a {sr}sm instruction. */ 1852 1853 static unsigned 1854 extract_10U_store (unsigned word) 1855 { 1856 return (word >> 16 & MASK_10); 1857 } 1858 1859 /* Extract the immediate field from a bb instruction. */ 1860 1861 static unsigned 1862 extract_5Q_store (unsigned word) 1863 { 1864 return (word >> 21 & MASK_5); 1865 } 1866 1867 /* Extract an 11 bit immediate field. */ 1868 1869 static int 1870 extract_11 (unsigned word) 1871 { 1872 return low_sign_extend (word & MASK_11, 11); 1873 } 1874 1875 /* Extract a 14 bit immediate field. */ 1876 1877 static int 1878 extract_14 (unsigned word) 1879 { 1880 return low_sign_extend (word & MASK_14, 14); 1881 } 1882 1883 /* Extract a 16 bit immediate field (PA2.0 wide only). */ 1884 1885 static int 1886 extract_16 (unsigned word) 1887 { 1888 int m15, m0, m1; 1889 1890 m0 = GET_BIT (word, 16); 1891 m1 = GET_BIT (word, 17); 1892 m15 = GET_BIT (word, 31); 1893 word = (word >> 1) & 0x1fff; 1894 word = word | (m15 << 15) | ((m15 ^ m0) << 14) | ((m15 ^ m1) << 13); 1895 return sign_extend (word, 16); 1896 } 1897 1898 /* Extract a 21 bit constant. */ 1899 1900 static int 1901 extract_21 (unsigned word) 1902 { 1903 int val; 1904 1905 word &= MASK_21; 1906 word <<= 11; 1907 val = GET_FIELD (word, 20, 20); 1908 val <<= 11; 1909 val |= GET_FIELD (word, 9, 19); 1910 val <<= 2; 1911 val |= GET_FIELD (word, 5, 6); 1912 val <<= 5; 1913 val |= GET_FIELD (word, 0, 4); 1914 val <<= 2; 1915 val |= GET_FIELD (word, 7, 8); 1916 return sign_extend (val, 21) << 11; 1917 } 1918 1919 /* Extract a 12 bit constant from branch instructions. */ 1920 1921 static int 1922 extract_12 (unsigned word) 1923 { 1924 return sign_extend (GET_FIELD (word, 19, 28) 1925 | GET_FIELD (word, 29, 29) << 10 1926 | (word & 0x1) << 11, 12) << 2; 1927 } 1928 1929 /* Extract a 17 bit constant from branch instructions, returning the 1930 19 bit signed value. */ 1931 1932 static int 1933 extract_17 (unsigned word) 1934 { 1935 return sign_extend (GET_FIELD (word, 19, 28) 1936 | GET_FIELD (word, 29, 29) << 10 1937 | GET_FIELD (word, 11, 15) << 11 1938 | (word & 0x1) << 16, 17) << 2; 1939 } 1940 1941 static int 1942 extract_22 (unsigned word) 1943 { 1944 return sign_extend (GET_FIELD (word, 19, 28) 1945 | GET_FIELD (word, 29, 29) << 10 1946 | GET_FIELD (word, 11, 15) << 11 1947 | GET_FIELD (word, 6, 10) << 16 1948 | (word & 0x1) << 21, 22) << 2; 1949 } 1950 1951 /* Print one instruction. */ 1952 1953 int 1954 print_insn_hppa (bfd_vma memaddr, disassemble_info *info) 1955 { 1956 bfd_byte buffer[4]; 1957 unsigned int insn, i; 1958 1959 { 1960 int status = 1961 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info); 1962 if (status != 0) 1963 { 1964 (*info->memory_error_func) (status, memaddr, info); 1965 return -1; 1966 } 1967 } 1968 1969 insn = bfd_getb32 (buffer); 1970 1971 for (i = 0; i < NUMOPCODES; ++i) 1972 { 1973 const struct pa_opcode *opcode = &pa_opcodes[i]; 1974 1975 if ((insn & opcode->mask) == opcode->match) 1976 { 1977 const char *s; 1978 #ifndef BFD64 1979 if (opcode->arch == pa20w) 1980 continue; 1981 #endif 1982 (*info->fprintf_func) (info->stream, "%s", opcode->name); 1983 1984 if (!strchr ("cfCY?-+nHNZFIuv{", opcode->args[0])) 1985 (*info->fprintf_func) (info->stream, " "); 1986 for (s = opcode->args; *s != '\0'; ++s) 1987 { 1988 switch (*s) 1989 { 1990 case 'x': 1991 fput_reg (GET_FIELD (insn, 11, 15), info); 1992 break; 1993 case 'a': 1994 case 'b': 1995 fput_reg (GET_FIELD (insn, 6, 10), info); 1996 break; 1997 case '^': 1998 fput_creg (GET_FIELD (insn, 6, 10), info); 1999 break; 2000 case 't': 2001 fput_reg (GET_FIELD (insn, 27, 31), info); 2002 break; 2003 2004 /* Handle floating point registers. */ 2005 case 'f': 2006 switch (*++s) 2007 { 2008 case 't': 2009 fput_fp_reg (GET_FIELD (insn, 27, 31), info); 2010 break; 2011 case 'T': 2012 if (GET_FIELD (insn, 25, 25)) 2013 fput_fp_reg_r (GET_FIELD (insn, 27, 31), info); 2014 else 2015 fput_fp_reg (GET_FIELD (insn, 27, 31), info); 2016 break; 2017 case 'a': 2018 if (GET_FIELD (insn, 25, 25)) 2019 fput_fp_reg_r (GET_FIELD (insn, 6, 10), info); 2020 else 2021 fput_fp_reg (GET_FIELD (insn, 6, 10), info); 2022 break; 2023 2024 /* 'fA' will not generate a space before the regsiter 2025 name. Normally that is fine. Except that it 2026 causes problems with xmpyu which has no FP format 2027 completer. */ 2028 case 'X': 2029 fputs_filtered (" ", info); 2030 /* FALLTHRU */ 2031 2032 case 'A': 2033 if (GET_FIELD (insn, 24, 24)) 2034 fput_fp_reg_r (GET_FIELD (insn, 6, 10), info); 2035 else 2036 fput_fp_reg (GET_FIELD (insn, 6, 10), info); 2037 break; 2038 case 'b': 2039 if (GET_FIELD (insn, 25, 25)) 2040 fput_fp_reg_r (GET_FIELD (insn, 11, 15), info); 2041 else 2042 fput_fp_reg (GET_FIELD (insn, 11, 15), info); 2043 break; 2044 case 'B': 2045 if (GET_FIELD (insn, 19, 19)) 2046 fput_fp_reg_r (GET_FIELD (insn, 11, 15), info); 2047 else 2048 fput_fp_reg (GET_FIELD (insn, 11, 15), info); 2049 break; 2050 case 'C': 2051 { 2052 int reg = GET_FIELD (insn, 21, 22); 2053 reg |= GET_FIELD (insn, 16, 18) << 2; 2054 if (GET_FIELD (insn, 23, 23) != 0) 2055 fput_fp_reg_r (reg, info); 2056 else 2057 fput_fp_reg (reg, info); 2058 break; 2059 } 2060 case 'i': 2061 { 2062 int reg = GET_FIELD (insn, 6, 10); 2063 2064 reg |= (GET_FIELD (insn, 26, 26) << 4); 2065 fput_fp_reg (reg, info); 2066 break; 2067 } 2068 case 'j': 2069 { 2070 int reg = GET_FIELD (insn, 11, 15); 2071 2072 reg |= (GET_FIELD (insn, 26, 26) << 4); 2073 fput_fp_reg (reg, info); 2074 break; 2075 } 2076 case 'k': 2077 { 2078 int reg = GET_FIELD (insn, 27, 31); 2079 2080 reg |= (GET_FIELD (insn, 26, 26) << 4); 2081 fput_fp_reg (reg, info); 2082 break; 2083 } 2084 case 'l': 2085 { 2086 int reg = GET_FIELD (insn, 21, 25); 2087 2088 reg |= (GET_FIELD (insn, 26, 26) << 4); 2089 fput_fp_reg (reg, info); 2090 break; 2091 } 2092 case 'm': 2093 { 2094 int reg = GET_FIELD (insn, 16, 20); 2095 2096 reg |= (GET_FIELD (insn, 26, 26) << 4); 2097 fput_fp_reg (reg, info); 2098 break; 2099 } 2100 2101 /* 'fe' will not generate a space before the register 2102 name. Normally that is fine. Except that it 2103 causes problems with fstw fe,y(b) which has no FP 2104 format completer. */ 2105 case 'E': 2106 fputs_filtered (" ", info); 2107 /* FALLTHRU */ 2108 2109 case 'e': 2110 if (GET_FIELD (insn, 30, 30)) 2111 fput_fp_reg_r (GET_FIELD (insn, 11, 15), info); 2112 else 2113 fput_fp_reg (GET_FIELD (insn, 11, 15), info); 2114 break; 2115 case 'x': 2116 fput_fp_reg (GET_FIELD (insn, 11, 15), info); 2117 break; 2118 } 2119 break; 2120 2121 case '5': 2122 fput_const (extract_5_load (insn), info); 2123 break; 2124 case 's': 2125 { 2126 int space = GET_FIELD (insn, 16, 17); 2127 /* Zero means implicit addressing, not use of sr0. */ 2128 if (space != 0) 2129 (*info->fprintf_func) (info->stream, "sr%d", space); 2130 } 2131 break; 2132 2133 case 'S': 2134 (*info->fprintf_func) (info->stream, "sr%d", 2135 extract_3 (insn)); 2136 break; 2137 2138 /* Handle completers. */ 2139 case 'c': 2140 switch (*++s) 2141 { 2142 case 'x': 2143 (*info->fprintf_func) 2144 (info->stream, "%s", 2145 index_compl_names[GET_COMPL (insn)]); 2146 break; 2147 case 'X': 2148 (*info->fprintf_func) 2149 (info->stream, "%s ", 2150 index_compl_names[GET_COMPL (insn)]); 2151 break; 2152 case 'm': 2153 (*info->fprintf_func) 2154 (info->stream, "%s", 2155 short_ldst_compl_names[GET_COMPL (insn)]); 2156 break; 2157 case 'M': 2158 (*info->fprintf_func) 2159 (info->stream, "%s ", 2160 short_ldst_compl_names[GET_COMPL (insn)]); 2161 break; 2162 case 'A': 2163 (*info->fprintf_func) 2164 (info->stream, "%s ", 2165 short_bytes_compl_names[GET_COMPL (insn)]); 2166 break; 2167 case 's': 2168 (*info->fprintf_func) 2169 (info->stream, "%s", 2170 short_bytes_compl_names[GET_COMPL (insn)]); 2171 break; 2172 case 'c': 2173 case 'C': 2174 switch (GET_FIELD (insn, 20, 21)) 2175 { 2176 case 1: 2177 (*info->fprintf_func) (info->stream, ",bc "); 2178 break; 2179 case 2: 2180 (*info->fprintf_func) (info->stream, ",sl "); 2181 break; 2182 default: 2183 (*info->fprintf_func) (info->stream, " "); 2184 } 2185 break; 2186 case 'd': 2187 switch (GET_FIELD (insn, 20, 21)) 2188 { 2189 case 1: 2190 (*info->fprintf_func) (info->stream, ",co "); 2191 break; 2192 default: 2193 (*info->fprintf_func) (info->stream, " "); 2194 } 2195 break; 2196 case 'o': 2197 (*info->fprintf_func) (info->stream, ",o"); 2198 break; 2199 case 'g': 2200 (*info->fprintf_func) (info->stream, ",gate"); 2201 break; 2202 case 'p': 2203 (*info->fprintf_func) (info->stream, ",l,push"); 2204 break; 2205 case 'P': 2206 (*info->fprintf_func) (info->stream, ",pop"); 2207 break; 2208 case 'l': 2209 case 'L': 2210 (*info->fprintf_func) (info->stream, ",l"); 2211 break; 2212 case 'w': 2213 (*info->fprintf_func) 2214 (info->stream, "%s ", 2215 read_write_names[GET_FIELD (insn, 25, 25)]); 2216 break; 2217 case 'W': 2218 (*info->fprintf_func) (info->stream, ",w "); 2219 break; 2220 case 'r': 2221 if (GET_FIELD (insn, 23, 26) == 5) 2222 (*info->fprintf_func) (info->stream, ",r"); 2223 break; 2224 case 'Z': 2225 if (GET_FIELD (insn, 26, 26)) 2226 (*info->fprintf_func) (info->stream, ",m "); 2227 else 2228 (*info->fprintf_func) (info->stream, " "); 2229 break; 2230 case 'i': 2231 if (GET_FIELD (insn, 25, 25)) 2232 (*info->fprintf_func) (info->stream, ",i"); 2233 break; 2234 case 'z': 2235 if (!GET_FIELD (insn, 21, 21)) 2236 (*info->fprintf_func) (info->stream, ",z"); 2237 break; 2238 case 'a': 2239 (*info->fprintf_func) 2240 (info->stream, "%s", 2241 add_compl_names[GET_FIELD (insn, 20, 21)]); 2242 break; 2243 case 'Y': 2244 (*info->fprintf_func) 2245 (info->stream, ",dc%s", 2246 add_compl_names[GET_FIELD (insn, 20, 21)]); 2247 break; 2248 case 'y': 2249 (*info->fprintf_func) 2250 (info->stream, ",c%s", 2251 add_compl_names[GET_FIELD (insn, 20, 21)]); 2252 break; 2253 case 'v': 2254 if (GET_FIELD (insn, 20, 20)) 2255 (*info->fprintf_func) (info->stream, ",tsv"); 2256 break; 2257 case 't': 2258 (*info->fprintf_func) (info->stream, ",tc"); 2259 if (GET_FIELD (insn, 20, 20)) 2260 (*info->fprintf_func) (info->stream, ",tsv"); 2261 break; 2262 case 'B': 2263 (*info->fprintf_func) (info->stream, ",db"); 2264 if (GET_FIELD (insn, 20, 20)) 2265 (*info->fprintf_func) (info->stream, ",tsv"); 2266 break; 2267 case 'b': 2268 (*info->fprintf_func) (info->stream, ",b"); 2269 if (GET_FIELD (insn, 20, 20)) 2270 (*info->fprintf_func) (info->stream, ",tsv"); 2271 break; 2272 case 'T': 2273 if (GET_FIELD (insn, 25, 25)) 2274 (*info->fprintf_func) (info->stream, ",tc"); 2275 break; 2276 case 'S': 2277 /* EXTRD/W has a following condition. */ 2278 if (*(s + 1) == '?') 2279 (*info->fprintf_func) 2280 (info->stream, "%s", 2281 signed_unsigned_names[GET_FIELD (insn, 21, 21)]); 2282 else 2283 (*info->fprintf_func) 2284 (info->stream, "%s ", 2285 signed_unsigned_names[GET_FIELD (insn, 21, 21)]); 2286 break; 2287 case 'h': 2288 (*info->fprintf_func) 2289 (info->stream, "%s", 2290 mix_half_names[GET_FIELD (insn, 17, 17)]); 2291 break; 2292 case 'H': 2293 (*info->fprintf_func) 2294 (info->stream, "%s ", 2295 saturation_names[GET_FIELD (insn, 24, 25)]); 2296 break; 2297 case '*': 2298 (*info->fprintf_func) 2299 (info->stream, ",%d%d%d%d ", 2300 GET_FIELD (insn, 17, 18), GET_FIELD (insn, 20, 21), 2301 GET_FIELD (insn, 22, 23), GET_FIELD (insn, 24, 25)); 2302 break; 2303 2304 case 'q': 2305 { 2306 int m, a; 2307 2308 m = GET_FIELD (insn, 28, 28); 2309 a = GET_FIELD (insn, 29, 29); 2310 2311 if (m && !a) 2312 fputs_filtered (",ma ", info); 2313 else if (m && a) 2314 fputs_filtered (",mb ", info); 2315 else 2316 fputs_filtered (" ", info); 2317 break; 2318 } 2319 2320 case 'J': 2321 { 2322 int opc = GET_FIELD (insn, 0, 5); 2323 2324 if (opc == 0x16 || opc == 0x1e) 2325 { 2326 if (GET_FIELD (insn, 29, 29) == 0) 2327 fputs_filtered (",ma ", info); 2328 else 2329 fputs_filtered (",mb ", info); 2330 } 2331 else 2332 fputs_filtered (" ", info); 2333 break; 2334 } 2335 2336 case 'e': 2337 { 2338 int opc = GET_FIELD (insn, 0, 5); 2339 2340 if (opc == 0x13 || opc == 0x1b) 2341 { 2342 if (GET_FIELD (insn, 18, 18) == 1) 2343 fputs_filtered (",mb ", info); 2344 else 2345 fputs_filtered (",ma ", info); 2346 } 2347 else if (opc == 0x17 || opc == 0x1f) 2348 { 2349 if (GET_FIELD (insn, 31, 31) == 1) 2350 fputs_filtered (",ma ", info); 2351 else 2352 fputs_filtered (",mb ", info); 2353 } 2354 else 2355 fputs_filtered (" ", info); 2356 2357 break; 2358 } 2359 } 2360 break; 2361 2362 /* Handle conditions. */ 2363 case '?': 2364 { 2365 s++; 2366 switch (*s) 2367 { 2368 case 'f': 2369 (*info->fprintf_func) 2370 (info->stream, "%s ", 2371 float_comp_names[GET_FIELD (insn, 27, 31)]); 2372 break; 2373 2374 /* These four conditions are for the set of instructions 2375 which distinguish true/false conditions by opcode 2376 rather than by the 'f' bit (sigh): comb, comib, 2377 addb, addib. */ 2378 case 't': 2379 fputs_filtered 2380 (compare_cond_names[GET_FIELD (insn, 16, 18)], info); 2381 break; 2382 case 'n': 2383 fputs_filtered 2384 (compare_cond_names[GET_FIELD (insn, 16, 18) 2385 + GET_FIELD (insn, 4, 4) * 8], 2386 info); 2387 break; 2388 case 'N': 2389 fputs_filtered 2390 (compare_cond_64_names[GET_FIELD (insn, 16, 18) 2391 + GET_FIELD (insn, 2, 2) * 8], 2392 info); 2393 break; 2394 case 'Q': 2395 fputs_filtered 2396 (cmpib_cond_64_names[GET_FIELD (insn, 16, 18)], 2397 info); 2398 break; 2399 case '@': 2400 fputs_filtered 2401 (add_cond_names[GET_FIELD (insn, 16, 18) 2402 + GET_FIELD (insn, 4, 4) * 8], 2403 info); 2404 break; 2405 case 's': 2406 (*info->fprintf_func) 2407 (info->stream, "%s ", 2408 compare_cond_names[GET_COND (insn)]); 2409 break; 2410 case 'S': 2411 (*info->fprintf_func) 2412 (info->stream, "%s ", 2413 compare_cond_64_names[GET_COND (insn)]); 2414 break; 2415 case 'a': 2416 (*info->fprintf_func) 2417 (info->stream, "%s ", 2418 add_cond_names[GET_COND (insn)]); 2419 break; 2420 case 'A': 2421 (*info->fprintf_func) 2422 (info->stream, "%s ", 2423 add_cond_64_names[GET_COND (insn)]); 2424 break; 2425 case 'd': 2426 (*info->fprintf_func) 2427 (info->stream, "%s", 2428 add_cond_names[GET_FIELD (insn, 16, 18)]); 2429 break; 2430 2431 case 'W': 2432 (*info->fprintf_func) 2433 (info->stream, "%s", 2434 wide_add_cond_names[GET_FIELD (insn, 16, 18) + 2435 GET_FIELD (insn, 4, 4) * 8]); 2436 break; 2437 2438 case 'l': 2439 (*info->fprintf_func) 2440 (info->stream, "%s ", 2441 logical_cond_names[GET_COND (insn)]); 2442 break; 2443 case 'L': 2444 (*info->fprintf_func) 2445 (info->stream, "%s ", 2446 logical_cond_64_names[GET_COND (insn)]); 2447 break; 2448 case 'u': 2449 (*info->fprintf_func) 2450 (info->stream, "%s ", 2451 unit_cond_names[GET_COND (insn)]); 2452 break; 2453 case 'U': 2454 (*info->fprintf_func) 2455 (info->stream, "%s ", 2456 unit_cond_64_names[GET_COND (insn)]); 2457 break; 2458 case 'y': 2459 case 'x': 2460 case 'b': 2461 (*info->fprintf_func) 2462 (info->stream, "%s", 2463 shift_cond_names[GET_FIELD (insn, 16, 18)]); 2464 2465 /* If the next character in args is 'n', it will handle 2466 putting out the space. */ 2467 if (s[1] != 'n') 2468 (*info->fprintf_func) (info->stream, " "); 2469 break; 2470 case 'X': 2471 (*info->fprintf_func) 2472 (info->stream, "%s ", 2473 shift_cond_64_names[GET_FIELD (insn, 16, 18)]); 2474 break; 2475 case 'B': 2476 (*info->fprintf_func) 2477 (info->stream, "%s", 2478 bb_cond_64_names[GET_FIELD (insn, 16, 16)]); 2479 2480 /* If the next character in args is 'n', it will handle 2481 putting out the space. */ 2482 if (s[1] != 'n') 2483 (*info->fprintf_func) (info->stream, " "); 2484 break; 2485 } 2486 break; 2487 } 2488 2489 case 'V': 2490 fput_const (extract_5_store (insn), info); 2491 break; 2492 case 'r': 2493 fput_const (extract_5r_store (insn), info); 2494 break; 2495 case 'R': 2496 fput_const (extract_5R_store (insn), info); 2497 break; 2498 case 'U': 2499 fput_const (extract_10U_store (insn), info); 2500 break; 2501 case 'B': 2502 case 'Q': 2503 fput_const (extract_5Q_store (insn), info); 2504 break; 2505 case 'i': 2506 fput_const (extract_11 (insn), info); 2507 break; 2508 case 'j': 2509 fput_const (extract_14 (insn), info); 2510 break; 2511 case 'k': 2512 fputs_filtered ("L%", info); 2513 fput_const (extract_21 (insn), info); 2514 break; 2515 case '<': 2516 case 'l': 2517 /* 16-bit long disp., PA2.0 wide only. */ 2518 fput_const (extract_16 (insn), info); 2519 break; 2520 case 'n': 2521 if (insn & 0x2) 2522 (*info->fprintf_func) (info->stream, ",n "); 2523 else 2524 (*info->fprintf_func) (info->stream, " "); 2525 break; 2526 case 'N': 2527 if ((insn & 0x20) && s[1]) 2528 (*info->fprintf_func) (info->stream, ",n "); 2529 else if (insn & 0x20) 2530 (*info->fprintf_func) (info->stream, ",n"); 2531 else if (s[1]) 2532 (*info->fprintf_func) (info->stream, " "); 2533 break; 2534 case 'w': 2535 (*info->print_address_func) 2536 (memaddr + 8 + extract_12 (insn), info); 2537 break; 2538 case 'W': 2539 /* 17 bit PC-relative branch. */ 2540 (*info->print_address_func) 2541 ((memaddr + 8 + extract_17 (insn)), info); 2542 break; 2543 case 'z': 2544 /* 17 bit displacement. This is an offset from a register 2545 so it gets disasssembled as just a number, not any sort 2546 of address. */ 2547 fput_const (extract_17 (insn), info); 2548 break; 2549 2550 case 'Z': 2551 /* addil %r1 implicit output. */ 2552 fputs_filtered ("r1", info); 2553 break; 2554 2555 case 'Y': 2556 /* be,l %sr0,%r31 implicit output. */ 2557 fputs_filtered ("sr0,r31", info); 2558 break; 2559 2560 case '@': 2561 (*info->fprintf_func) (info->stream, "0"); 2562 break; 2563 2564 case '.': 2565 (*info->fprintf_func) (info->stream, "%d", 2566 GET_FIELD (insn, 24, 25)); 2567 break; 2568 case '*': 2569 (*info->fprintf_func) (info->stream, "%d", 2570 GET_FIELD (insn, 22, 25)); 2571 break; 2572 case '!': 2573 fputs_filtered ("sar", info); 2574 break; 2575 case 'p': 2576 (*info->fprintf_func) (info->stream, "%d", 2577 31 - GET_FIELD (insn, 22, 26)); 2578 break; 2579 case '~': 2580 { 2581 int num; 2582 num = GET_FIELD (insn, 20, 20) << 5; 2583 num |= GET_FIELD (insn, 22, 26); 2584 (*info->fprintf_func) (info->stream, "%d", 63 - num); 2585 break; 2586 } 2587 case 'P': 2588 (*info->fprintf_func) (info->stream, "%d", 2589 GET_FIELD (insn, 22, 26)); 2590 break; 2591 case 'q': 2592 { 2593 int num; 2594 num = GET_FIELD (insn, 20, 20) << 5; 2595 num |= GET_FIELD (insn, 22, 26); 2596 (*info->fprintf_func) (info->stream, "%d", num); 2597 break; 2598 } 2599 case 'T': 2600 (*info->fprintf_func) (info->stream, "%d", 2601 32 - GET_FIELD (insn, 27, 31)); 2602 break; 2603 case '%': 2604 { 2605 int num; 2606 num = (GET_FIELD (insn, 23, 23) + 1) * 32; 2607 num -= GET_FIELD (insn, 27, 31); 2608 (*info->fprintf_func) (info->stream, "%d", num); 2609 break; 2610 } 2611 case '|': 2612 { 2613 int num; 2614 num = (GET_FIELD (insn, 19, 19) + 1) * 32; 2615 num -= GET_FIELD (insn, 27, 31); 2616 (*info->fprintf_func) (info->stream, "%d", num); 2617 break; 2618 } 2619 case '$': 2620 fput_const (GET_FIELD (insn, 20, 28), info); 2621 break; 2622 case 'A': 2623 fput_const (GET_FIELD (insn, 6, 18), info); 2624 break; 2625 case 'D': 2626 fput_const (GET_FIELD (insn, 6, 31), info); 2627 break; 2628 case 'v': 2629 (*info->fprintf_func) (info->stream, ",%d", 2630 GET_FIELD (insn, 23, 25)); 2631 break; 2632 case 'O': 2633 fput_const ((GET_FIELD (insn, 6,20) << 5 | 2634 GET_FIELD (insn, 27, 31)), info); 2635 break; 2636 case 'o': 2637 fput_const (GET_FIELD (insn, 6, 20), info); 2638 break; 2639 case '2': 2640 fput_const ((GET_FIELD (insn, 6, 22) << 5 | 2641 GET_FIELD (insn, 27, 31)), info); 2642 break; 2643 case '1': 2644 fput_const ((GET_FIELD (insn, 11, 20) << 5 | 2645 GET_FIELD (insn, 27, 31)), info); 2646 break; 2647 case '0': 2648 fput_const ((GET_FIELD (insn, 16, 20) << 5 | 2649 GET_FIELD (insn, 27, 31)), info); 2650 break; 2651 case 'u': 2652 (*info->fprintf_func) (info->stream, ",%d", 2653 GET_FIELD (insn, 23, 25)); 2654 break; 2655 case 'F': 2656 /* If no destination completer and not before a completer 2657 for fcmp, need a space here. */ 2658 if (s[1] == 'G' || s[1] == '?') 2659 fputs_filtered 2660 (float_format_names[GET_FIELD (insn, 19, 20)], info); 2661 else 2662 (*info->fprintf_func) 2663 (info->stream, "%s ", 2664 float_format_names[GET_FIELD (insn, 19, 20)]); 2665 break; 2666 case 'G': 2667 (*info->fprintf_func) 2668 (info->stream, "%s ", 2669 float_format_names[GET_FIELD (insn, 17, 18)]); 2670 break; 2671 case 'H': 2672 if (GET_FIELD (insn, 26, 26) == 1) 2673 (*info->fprintf_func) (info->stream, "%s ", 2674 float_format_names[0]); 2675 else 2676 (*info->fprintf_func) (info->stream, "%s ", 2677 float_format_names[1]); 2678 break; 2679 case 'I': 2680 /* If no destination completer and not before a completer 2681 for fcmp, need a space here. */ 2682 if (s[1] == '?') 2683 fputs_filtered 2684 (float_format_names[GET_FIELD (insn, 20, 20)], info); 2685 else 2686 (*info->fprintf_func) 2687 (info->stream, "%s ", 2688 float_format_names[GET_FIELD (insn, 20, 20)]); 2689 break; 2690 2691 case 'J': 2692 fput_const (extract_14 (insn), info); 2693 break; 2694 2695 case '#': 2696 { 2697 int sign = GET_FIELD (insn, 31, 31); 2698 int imm10 = GET_FIELD (insn, 18, 27); 2699 int disp; 2700 2701 if (sign) 2702 disp = (-1 << 10) | imm10; 2703 else 2704 disp = imm10; 2705 2706 disp <<= 3; 2707 fput_const (disp, info); 2708 break; 2709 } 2710 case 'K': 2711 case 'd': 2712 { 2713 int sign = GET_FIELD (insn, 31, 31); 2714 int imm11 = GET_FIELD (insn, 18, 28); 2715 int disp; 2716 2717 if (sign) 2718 disp = (-1 << 11) | imm11; 2719 else 2720 disp = imm11; 2721 2722 disp <<= 2; 2723 fput_const (disp, info); 2724 break; 2725 } 2726 2727 case '>': 2728 case 'y': 2729 { 2730 /* 16-bit long disp., PA2.0 wide only. */ 2731 int disp = extract_16 (insn); 2732 disp &= ~3; 2733 fput_const (disp, info); 2734 break; 2735 } 2736 2737 case '&': 2738 { 2739 /* 16-bit long disp., PA2.0 wide only. */ 2740 int disp = extract_16 (insn); 2741 disp &= ~7; 2742 fput_const (disp, info); 2743 break; 2744 } 2745 2746 case '_': 2747 break; /* Dealt with by '{' */ 2748 2749 case '{': 2750 { 2751 int sub = GET_FIELD (insn, 14, 16); 2752 int df = GET_FIELD (insn, 17, 18); 2753 int sf = GET_FIELD (insn, 19, 20); 2754 const char * const * source = float_format_names; 2755 const char * const * dest = float_format_names; 2756 const char *t = ""; 2757 2758 if (sub == 4) 2759 { 2760 fputs_filtered (",UND ", info); 2761 break; 2762 } 2763 if ((sub & 3) == 3) 2764 t = ",t"; 2765 if ((sub & 3) == 1) 2766 source = sub & 4 ? fcnv_ufixed_names : fcnv_fixed_names; 2767 if (sub & 2) 2768 dest = sub & 4 ? fcnv_ufixed_names : fcnv_fixed_names; 2769 2770 (*info->fprintf_func) (info->stream, "%s%s%s ", 2771 t, source[sf], dest[df]); 2772 break; 2773 } 2774 2775 case 'm': 2776 { 2777 int y = GET_FIELD (insn, 16, 18); 2778 2779 if (y != 1) 2780 fput_const ((y ^ 1) - 1, info); 2781 } 2782 break; 2783 2784 case 'h': 2785 { 2786 int cbit; 2787 2788 cbit = GET_FIELD (insn, 16, 18); 2789 2790 if (cbit > 0) 2791 (*info->fprintf_func) (info->stream, ",%d", cbit - 1); 2792 break; 2793 } 2794 2795 case '=': 2796 { 2797 int cond = GET_FIELD (insn, 27, 31); 2798 2799 switch (cond) 2800 { 2801 case 0: fputs_filtered (" ", info); break; 2802 case 1: fputs_filtered ("acc ", info); break; 2803 case 2: fputs_filtered ("rej ", info); break; 2804 case 5: fputs_filtered ("acc8 ", info); break; 2805 case 6: fputs_filtered ("rej8 ", info); break; 2806 case 9: fputs_filtered ("acc6 ", info); break; 2807 case 13: fputs_filtered ("acc4 ", info); break; 2808 case 17: fputs_filtered ("acc2 ", info); break; 2809 default: break; 2810 } 2811 break; 2812 } 2813 2814 case 'X': 2815 (*info->print_address_func) 2816 (memaddr + 8 + extract_22 (insn), info); 2817 break; 2818 case 'L': 2819 fputs_filtered (",rp", info); 2820 break; 2821 default: 2822 (*info->fprintf_func) (info->stream, "%c", *s); 2823 break; 2824 } 2825 } 2826 return sizeof (insn); 2827 } 2828 } 2829 (*info->fprintf_func) (info->stream, "#%8x", insn); 2830 return sizeof (insn); 2831 } 2832