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.
5 Contributed by the Center for Software Science at the
6 University of Utah (pa-gdb-bugs@cs.utah.edu).
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.
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.
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/>. */
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.
27 Contributed by the Center for Software Science at the
28 University of Utah (pa-gdb-bugs@cs.utah.edu).
30 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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/>. */
48 #define BYTES_IN_WORD 4
49 #define PA_PAGESIZE 0x1000
51 /* The PA instruction set variants. */
52 enum pa_arch
{pa10
= 10, pa11
= 11, pa20
= 20, pa20w
= 25};
54 /* HP PA-RISC relocation types */
56 enum hppa_reloc_field_selector_type
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
110 /* for compatibility */
111 enum hppa_reloc_field_selector_type_alt
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
135 enum hppa_reloc_expr_type
145 /* for compatibility */
146 enum hppa_reloc_expr_type_alt
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
,
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
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).
166 The high order 10 bits contain parameter relocation information,
167 the low order 22 bits contain the constant offset. */
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))
177 /* Some functions to manipulate PA instructions. */
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
)
194 static inline int hppa_rebuild_insn (int, int, int) ATTRIBUTE_UNUSED
;
197 /* The *sign_extend functions are used to assemble various bitfields
198 taken from an instruction and return the resulting immediate
202 sign_extend (int x
, int len
)
204 int signbit
= (1 << (len
- 1));
205 int mask
= (signbit
<< 1) - 1;
206 return ((x
& mask
) ^ signbit
) - signbit
;
210 low_sign_extend (int x
, int len
)
212 return (x
>> 1) - ((x
& 1) << (len
- 1));
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. */
221 sign_unext (int x
, int len
)
225 len_ones
= (1 << len
) - 1;
231 low_sign_unext (int x
, int len
)
236 sign
= (x
>> (len
-1)) & 1;
238 temp
= sign_unext (x
, len
-1);
240 return (temp
<< 1) | sign
;
244 re_assemble_3 (int as3
)
246 return (( (as3
& 4) << (13-2))
247 | ((as3
& 3) << (13+1)));
251 re_assemble_12 (int as12
)
253 return (( (as12
& 0x800) >> 11)
254 | ((as12
& 0x400) >> (10 - 2))
255 | ((as12
& 0x3ff) << (1 + 2)));
259 re_assemble_14 (int as14
)
261 return (( (as14
& 0x1fff) << 1)
262 | ((as14
& 0x2000) >> 13));
266 re_assemble_16 (int as16
)
270 /* Unusual 16-bit encoding, for wide mode only. */
271 t
= (as16
<< 1) & 0xffff;
273 return (t
^ s
^ (s
>> 1)) | (s
>> 15);
277 re_assemble_17 (int as17
)
279 return (( (as17
& 0x10000) >> 16)
280 | ((as17
& 0x0f800) << (16 - 11))
281 | ((as17
& 0x00400) >> (10 - 2))
282 | ((as17
& 0x003ff) << (1 + 2)));
286 re_assemble_21 (int as21
)
288 return (( (as21
& 0x100000) >> 20)
289 | ((as21
& 0x0ffe00) >> 8)
290 | ((as21
& 0x000180) << 7)
291 | ((as21
& 0x00007c) << 14)
292 | ((as21
& 0x000003) << 12));
296 re_assemble_22 (int as22
)
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)));
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.
310 LDIL L'start,%r1 ; put left part into r1
311 LDW R'start(%r1),%r2 ; add r1 and right part to form address
313 This function returns sign extended values in all cases.
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
)
321 bfd_signed_vma value
;
323 value
= sym_val
+ addend
;
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)." */
341 /* L: Select top 21 bits. */
346 /* R: Select bottom 11 bits. */
347 value
= value
& 0x7ff;
351 /* LS: Round to nearest multiple of 2048 then select top 21 bits. */
352 value
= value
+ 0x400;
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;
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;
373 /* RD: Set bits 0-20 to one. */
374 value
= value
| -0x800;
379 /* LR: L with rounding of the addend to nearest 8k. */
380 value
= sym_val
+ ((addend
+ 0x1000) & -0x2000);
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);
399 /* PA-RISC OPCODES */
400 #define get_opcode(insn) (((insn) >> 26) & 0x3f)
402 enum hppa_opcode_type
404 /* None of the opcodes in the first group generate relocs, so we
405 aren't too concerned about them. */
480 /* Insert VALUE into INSN using R_FORMAT to determine exactly what
484 hppa_rebuild_insn (int insn
, int value
, int r_format
)
489 return (insn
& ~ 0x7ff) | low_sign_unext (value
, 11);
492 return (insn
& ~ 0x1ffd) | re_assemble_12 (value
);
496 return (insn
& ~ 0x3ff1) | re_assemble_14 (value
& -8);
499 return (insn
& ~ 0x3ff9) | re_assemble_14 (value
& -4);
502 return (insn
& ~ 0x3fff) | re_assemble_14 (value
);
506 return (insn
& ~ 0xfff1) | re_assemble_16 (value
& -8);
509 return (insn
& ~ 0xfff9) | re_assemble_16 (value
& -4);
512 return (insn
& ~ 0xffff) | re_assemble_16 (value
);
516 return (insn
& ~ 0x1f1ffd) | re_assemble_17 (value
);
519 return (insn
& ~ 0x1fffff) | re_assemble_21 (value
);
522 return (insn
& ~ 0x3ff1ffd) | re_assemble_22 (value
);
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.
539 Contributed by the Center for Software Science at the
540 University of Utah (pa-gdb-bugs@cs.utah.edu).
542 This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler.
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)
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.
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/>. */
558 #if !defined(__STDC__) && !defined(const)
563 * Structure of an opcode table entry.
566 /* There are two kinds of delay slot nullification: normal which is
567 * controled by the nullification bit, and conditional, which depends
568 * on the direction of the branch and its success or failure.
570 * NONE is unfortunately #defined in the hiux system include files.
577 unsigned long int match
; /* Bits that must be set... */
578 unsigned long int mask
; /* ... in these bits. */
584 /* Enables strict matching. Opcodes with match errors are skipped
585 when this bit is set. */
586 #define FLAG_STRICT 0x1
589 All hppa opcodes are 32 bits.
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
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.
599 Bit positions in this description follow HP usage of lsb = 31,
600 "at" is lsb of field.
602 In the args field, the following characters must match exactly:
606 In the args field, the following characters are unused:
612 Here are all the characters:
614 ' !"#$%&'()*+-,./0123456789:;<=>?'
615 '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'
616 '`abcdefghijklmnopqrstuvwxyz{|}~ '
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)
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
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)
656 v 3 bit Special Function Unit identifier at 25
657 O 20 bit Special Function Unit operation split between 15 bits at 20
659 o 15 bit Special Function Unit operation at 20
660 2 22 bit Special Function Unit operation split between 17 bits at 20
662 1 15 bit Special Function Unit operation split between 10 bits at 20
664 0 10 bit Special Function Unit operation split between 5 bits at 20
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')
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
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
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
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
703 Completer operands all have 'c' as the prefix:
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
718 cc load cache control hint
719 cd load and clear cache control hint
720 cC store cache control hint
723 cp branch link and push completer
724 cP branch pop completer
725 cl branch link completer
726 cg branch gate completer
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.)
733 ci correction completer for DCOR
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
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
749 Condition operands all have '?' as the prefix:
751 ?f Floating point compare conditions (encoded as 5 bits at 31)
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
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
768 ?l logical conditions
769 ?L 64 bit logical conditions
771 ?b branch on bit conditions
772 ?B 64 bit branch on bit conditions
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
780 ?U 64 bit unit conditions
782 Floating point registers all have 'f' as a prefix:
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).
796 Float registers for fmpyadd and fmpysub:
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
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}";
814 /* The order of the opcodes in this table is significant:
816 * The assembler requires that all instances of the same mnemonic be
817 consecutive. If they aren't, the assembler will bomb at runtime.
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.
824 * The disassembler does not care about the order of the opcodes
825 except in cases where implicit addressing is used.
827 Here are the rules for ordering the opcodes of a mnemonic:
829 1) Opcodes with FLAG_STRICT should precede opcodes without
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.
838 3) When implicit addressing is available for an opcode, the
839 implicit opcode should precede the explicit opcode.
841 4) Opcodes without FLAG_STRICT should be ordered as follows:
842 register index opcodes, long immediate opcodes, and finally
843 short immediate opcodes. */
845 static const struct pa_opcode pa_opcodes
[] =
848 /* Pseudo-instructions. */
850 { "ldi", 0x34000000, 0xffe00000, "l,x", pa20w
, 0},/* ldo val(r0),r */
851 { "ldi", 0x34000000, 0xffe0c000, "j,x", pa10
, 0},/* ldo val(r0),r */
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
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
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
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
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 */
879 /* Loads and Stores for integer registers. */
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},
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},
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
},
1139 /* Computation Instructions. */
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},
1208 /* Subword Operation Instructions. */
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
},
1222 /* Extract and Deposit Instructions. */
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},
1255 /* System Control Instructions. */
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
},
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},
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},
1345 /* Floating Point Coprocessor Instructions. */
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},
1505 /* Performance Monitor Instructions. */
1507 { "pmdis", 0x30000280, 0xffffffdf, "N", pa20
, FLAG_STRICT
},
1508 { "pmenb", 0x30000680, 0xffffffff, "", pa20
, FLAG_STRICT
},
1510 /* Assist Instructions. */
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},
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
},
1613 #define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0]))
1615 /* SKV 12/18/92. Added some denotations for various operands. */
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'
1623 #define N_HPPA_OPERAND_FORMATS 5
1625 /* Integer register names, indexed by the numbers which appear in the
1627 static const char *const reg_names
[] =
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",
1635 /* Floating point register names, indexed by the numbers which appear in the
1637 static const char *const fp_reg_names
[] =
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"
1646 typedef unsigned int CORE_ADDR
;
1648 /* Get at various relevent fields of an instruction word. */
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
1657 /* These macros get bit fields using HP's numbering (MSB = 0). */
1659 #define GET_FIELD(X, FROM, TO) \
1660 ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1))
1662 #define GET_BIT(X, WHICH) \
1663 GET_FIELD (X, WHICH, WHICH)
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
[] =
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"
1677 static const char *const compare_cond_names
[] =
1679 "", ",=", ",<", ",<=", ",<<", ",<<=", ",sv", ",od",
1680 ",tr", ",<>", ",>=", ",>", ",>>=", ",>>", ",nsv", ",ev"
1682 static const char *const compare_cond_64_names
[] =
1684 "", ",*=", ",*<", ",*<=", ",*<<", ",*<<=", ",*sv", ",*od",
1685 ",*tr", ",*<>", ",*>=", ",*>", ",*>>=", ",*>>", ",*nsv", ",*ev"
1687 static const char *const cmpib_cond_64_names
[] =
1689 ",*<<", ",*=", ",*<", ",*<=", ",*>>=", ",*<>", ",*>=", ",*>"
1691 static const char *const add_cond_names
[] =
1693 "", ",=", ",<", ",<=", ",nuv", ",znv", ",sv", ",od",
1694 ",tr", ",<>", ",>=", ",>", ",uv", ",vnz", ",nsv", ",ev"
1696 static const char *const add_cond_64_names
[] =
1698 "", ",*=", ",*<", ",*<=", ",*nuv", ",*znv", ",*sv", ",*od",
1699 ",*tr", ",*<>", ",*>=", ",*>", ",*uv", ",*vnz", ",*nsv", ",*ev"
1701 static const char *const wide_add_cond_names
[] =
1703 "", ",=", ",<", ",<=", ",nuv", ",*=", ",*<", ",*<=",
1704 ",tr", ",<>", ",>=", ",>", ",uv", ",*<>", ",*>=", ",*>"
1706 static const char *const logical_cond_names
[] =
1708 "", ",=", ",<", ",<=", 0, 0, 0, ",od",
1709 ",tr", ",<>", ",>=", ",>", 0, 0, 0, ",ev"};
1710 static const char *const logical_cond_64_names
[] =
1712 "", ",*=", ",*<", ",*<=", 0, 0, 0, ",*od",
1713 ",*tr", ",*<>", ",*>=", ",*>", 0, 0, 0, ",*ev"};
1714 static const char *const unit_cond_names
[] =
1716 "", ",swz", ",sbz", ",shz", ",sdc", ",swc", ",sbc", ",shc",
1717 ",tr", ",nwz", ",nbz", ",nhz", ",ndc", ",nwc", ",nbc", ",nhc"
1719 static const char *const unit_cond_64_names
[] =
1721 "", ",*swz", ",*sbz", ",*shz", ",*sdc", ",*swc", ",*sbc", ",*shc",
1722 ",*tr", ",*nwz", ",*nbz", ",*nhz", ",*ndc", ",*nwc", ",*nbc", ",*nhc"
1724 static const char *const shift_cond_names
[] =
1726 "", ",=", ",<", ",od", ",tr", ",<>", ",>=", ",ev"
1728 static const char *const shift_cond_64_names
[] =
1730 "", ",*=", ",*<", ",*od", ",*tr", ",*<>", ",*>=", ",*ev"
1732 static const char *const bb_cond_64_names
[] =
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
[] =
1740 "", ",b,m", ",e", ",e,m"
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
[] =
1747 ",false?", ",false", ",?", ",!<=>", ",=", ",=t", ",?=", ",!<>",
1748 ",!?>=", ",<", ",?<", ",!>=", ",!?>", ",<=", ",?<=", ",!>",
1749 ",!?<=", ",>", ",?>", ",!<=", ",!?<", ",>=", ",?>=", ",!<",
1750 ",!?=", ",<>", ",!=", ",!=t", ",!?", ",<=>", ",true?", ",true"
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" };
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)
1763 #define GET_COND(insn) (GET_FIELD ((insn), 16, 18) + \
1764 (GET_FIELD ((insn), 19, 19) ? 8 : 0))
1766 /* Utility function to print registers. Put these first, so gcc's function
1767 inlining can do its stuff. */
1769 #define fputs_filtered(STR,F) (*info->fprintf_func) (info->stream, "%s", STR)
1772 fput_reg (unsigned reg
, disassemble_info
*info
)
1774 (*info
->fprintf_func
) (info
->stream
, reg
? reg_names
[reg
] : "r0");
1778 fput_fp_reg (unsigned reg
, disassemble_info
*info
)
1780 (*info
->fprintf_func
) (info
->stream
, reg
? fp_reg_names
[reg
] : "fr0");
1784 fput_fp_reg_r (unsigned reg
, disassemble_info
*info
)
1786 /* Special case floating point exception registers. */
1788 (*info
->fprintf_func
) (info
->stream
, "fpe%d", reg
* 2 + 1);
1790 (*info
->fprintf_func
) (info
->stream
, "%sR",
1791 reg
? fp_reg_names
[reg
] : "fr0");
1795 fput_creg (unsigned reg
, disassemble_info
*info
)
1797 (*info
->fprintf_func
) (info
->stream
, control_reg
[reg
]);
1800 /* Print constants with sign. */
1803 fput_const (unsigned num
, disassemble_info
*info
)
1806 (*info
->fprintf_func
) (info
->stream
, "-%x", - (int) num
);
1808 (*info
->fprintf_func
) (info
->stream
, "%x", num
);
1811 /* Routines to extract various sized constants out of hppa
1814 /* Extract a 3-bit space register number from a be, ble, mtsp or mfsp. */
1816 extract_3 (unsigned word
)
1818 return GET_FIELD (word
, 18, 18) << 2 | GET_FIELD (word
, 16, 17);
1822 extract_5_load (unsigned word
)
1824 return low_sign_extend (word
>> 16 & MASK_5
, 5);
1827 /* Extract the immediate field from a st{bhw}s instruction. */
1830 extract_5_store (unsigned word
)
1832 return low_sign_extend (word
& MASK_5
, 5);
1835 /* Extract the immediate field from a break instruction. */
1838 extract_5r_store (unsigned word
)
1840 return (word
& MASK_5
);
1843 /* Extract the immediate field from a {sr}sm instruction. */
1846 extract_5R_store (unsigned word
)
1848 return (word
>> 16 & MASK_5
);
1851 /* Extract the 10 bit immediate field from a {sr}sm instruction. */
1854 extract_10U_store (unsigned word
)
1856 return (word
>> 16 & MASK_10
);
1859 /* Extract the immediate field from a bb instruction. */
1862 extract_5Q_store (unsigned word
)
1864 return (word
>> 21 & MASK_5
);
1867 /* Extract an 11 bit immediate field. */
1870 extract_11 (unsigned word
)
1872 return low_sign_extend (word
& MASK_11
, 11);
1875 /* Extract a 14 bit immediate field. */
1878 extract_14 (unsigned word
)
1880 return low_sign_extend (word
& MASK_14
, 14);
1883 /* Extract a 16 bit immediate field (PA2.0 wide only). */
1886 extract_16 (unsigned word
)
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);
1898 /* Extract a 21 bit constant. */
1901 extract_21 (unsigned word
)
1907 val
= GET_FIELD (word
, 20, 20);
1909 val
|= GET_FIELD (word
, 9, 19);
1911 val
|= GET_FIELD (word
, 5, 6);
1913 val
|= GET_FIELD (word
, 0, 4);
1915 val
|= GET_FIELD (word
, 7, 8);
1916 return sign_extend (val
, 21) << 11;
1919 /* Extract a 12 bit constant from branch instructions. */
1922 extract_12 (unsigned word
)
1924 return sign_extend (GET_FIELD (word
, 19, 28)
1925 | GET_FIELD (word
, 29, 29) << 10
1926 | (word
& 0x1) << 11, 12) << 2;
1929 /* Extract a 17 bit constant from branch instructions, returning the
1930 19 bit signed value. */
1933 extract_17 (unsigned word
)
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;
1942 extract_22 (unsigned word
)
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;
1951 /* Print one instruction. */
1954 print_insn_hppa (bfd_vma memaddr
, disassemble_info
*info
)
1957 unsigned int insn
, i
;
1961 (*info
->read_memory_func
) (memaddr
, buffer
, sizeof (buffer
), info
);
1964 (*info
->memory_error_func
) (status
, memaddr
, info
);
1969 insn
= bfd_getb32 (buffer
);
1971 for (i
= 0; i
< NUMOPCODES
; ++i
)
1973 const struct pa_opcode
*opcode
= &pa_opcodes
[i
];
1975 if ((insn
& opcode
->mask
) == opcode
->match
)
1979 if (opcode
->arch
== pa20w
)
1982 (*info
->fprintf_func
) (info
->stream
, "%s", opcode
->name
);
1984 if (!strchr ("cfCY?-+nHNZFIuv{", opcode
->args
[0]))
1985 (*info
->fprintf_func
) (info
->stream
, " ");
1986 for (s
= opcode
->args
; *s
!= '\0'; ++s
)
1991 fput_reg (GET_FIELD (insn
, 11, 15), info
);
1995 fput_reg (GET_FIELD (insn
, 6, 10), info
);
1998 fput_creg (GET_FIELD (insn
, 6, 10), info
);
2001 fput_reg (GET_FIELD (insn
, 27, 31), info
);
2004 /* Handle floating point registers. */
2009 fput_fp_reg (GET_FIELD (insn
, 27, 31), info
);
2012 if (GET_FIELD (insn
, 25, 25))
2013 fput_fp_reg_r (GET_FIELD (insn
, 27, 31), info
);
2015 fput_fp_reg (GET_FIELD (insn
, 27, 31), info
);
2018 if (GET_FIELD (insn
, 25, 25))
2019 fput_fp_reg_r (GET_FIELD (insn
, 6, 10), info
);
2021 fput_fp_reg (GET_FIELD (insn
, 6, 10), info
);
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
2029 fputs_filtered (" ", info
);
2033 if (GET_FIELD (insn
, 24, 24))
2034 fput_fp_reg_r (GET_FIELD (insn
, 6, 10), info
);
2036 fput_fp_reg (GET_FIELD (insn
, 6, 10), info
);
2039 if (GET_FIELD (insn
, 25, 25))
2040 fput_fp_reg_r (GET_FIELD (insn
, 11, 15), info
);
2042 fput_fp_reg (GET_FIELD (insn
, 11, 15), info
);
2045 if (GET_FIELD (insn
, 19, 19))
2046 fput_fp_reg_r (GET_FIELD (insn
, 11, 15), info
);
2048 fput_fp_reg (GET_FIELD (insn
, 11, 15), info
);
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
);
2057 fput_fp_reg (reg
, info
);
2062 int reg
= GET_FIELD (insn
, 6, 10);
2064 reg
|= (GET_FIELD (insn
, 26, 26) << 4);
2065 fput_fp_reg (reg
, info
);
2070 int reg
= GET_FIELD (insn
, 11, 15);
2072 reg
|= (GET_FIELD (insn
, 26, 26) << 4);
2073 fput_fp_reg (reg
, info
);
2078 int reg
= GET_FIELD (insn
, 27, 31);
2080 reg
|= (GET_FIELD (insn
, 26, 26) << 4);
2081 fput_fp_reg (reg
, info
);
2086 int reg
= GET_FIELD (insn
, 21, 25);
2088 reg
|= (GET_FIELD (insn
, 26, 26) << 4);
2089 fput_fp_reg (reg
, info
);
2094 int reg
= GET_FIELD (insn
, 16, 20);
2096 reg
|= (GET_FIELD (insn
, 26, 26) << 4);
2097 fput_fp_reg (reg
, info
);
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. */
2106 fputs_filtered (" ", info
);
2110 if (GET_FIELD (insn
, 30, 30))
2111 fput_fp_reg_r (GET_FIELD (insn
, 11, 15), info
);
2113 fput_fp_reg (GET_FIELD (insn
, 11, 15), info
);
2116 fput_fp_reg (GET_FIELD (insn
, 11, 15), info
);
2122 fput_const (extract_5_load (insn
), info
);
2126 int space
= GET_FIELD (insn
, 16, 17);
2127 /* Zero means implicit addressing, not use of sr0. */
2129 (*info
->fprintf_func
) (info
->stream
, "sr%d", space
);
2134 (*info
->fprintf_func
) (info
->stream
, "sr%d",
2138 /* Handle completers. */
2143 (*info
->fprintf_func
)
2144 (info
->stream
, "%s",
2145 index_compl_names
[GET_COMPL (insn
)]);
2148 (*info
->fprintf_func
)
2149 (info
->stream
, "%s ",
2150 index_compl_names
[GET_COMPL (insn
)]);
2153 (*info
->fprintf_func
)
2154 (info
->stream
, "%s",
2155 short_ldst_compl_names
[GET_COMPL (insn
)]);
2158 (*info
->fprintf_func
)
2159 (info
->stream
, "%s ",
2160 short_ldst_compl_names
[GET_COMPL (insn
)]);
2163 (*info
->fprintf_func
)
2164 (info
->stream
, "%s ",
2165 short_bytes_compl_names
[GET_COMPL (insn
)]);
2168 (*info
->fprintf_func
)
2169 (info
->stream
, "%s",
2170 short_bytes_compl_names
[GET_COMPL (insn
)]);
2174 switch (GET_FIELD (insn
, 20, 21))
2177 (*info
->fprintf_func
) (info
->stream
, ",bc ");
2180 (*info
->fprintf_func
) (info
->stream
, ",sl ");
2183 (*info
->fprintf_func
) (info
->stream
, " ");
2187 switch (GET_FIELD (insn
, 20, 21))
2190 (*info
->fprintf_func
) (info
->stream
, ",co ");
2193 (*info
->fprintf_func
) (info
->stream
, " ");
2197 (*info
->fprintf_func
) (info
->stream
, ",o");
2200 (*info
->fprintf_func
) (info
->stream
, ",gate");
2203 (*info
->fprintf_func
) (info
->stream
, ",l,push");
2206 (*info
->fprintf_func
) (info
->stream
, ",pop");
2210 (*info
->fprintf_func
) (info
->stream
, ",l");
2213 (*info
->fprintf_func
)
2214 (info
->stream
, "%s ",
2215 read_write_names
[GET_FIELD (insn
, 25, 25)]);
2218 (*info
->fprintf_func
) (info
->stream
, ",w ");
2221 if (GET_FIELD (insn
, 23, 26) == 5)
2222 (*info
->fprintf_func
) (info
->stream
, ",r");
2225 if (GET_FIELD (insn
, 26, 26))
2226 (*info
->fprintf_func
) (info
->stream
, ",m ");
2228 (*info
->fprintf_func
) (info
->stream
, " ");
2231 if (GET_FIELD (insn
, 25, 25))
2232 (*info
->fprintf_func
) (info
->stream
, ",i");
2235 if (!GET_FIELD (insn
, 21, 21))
2236 (*info
->fprintf_func
) (info
->stream
, ",z");
2239 (*info
->fprintf_func
)
2240 (info
->stream
, "%s",
2241 add_compl_names
[GET_FIELD (insn
, 20, 21)]);
2244 (*info
->fprintf_func
)
2245 (info
->stream
, ",dc%s",
2246 add_compl_names
[GET_FIELD (insn
, 20, 21)]);
2249 (*info
->fprintf_func
)
2250 (info
->stream
, ",c%s",
2251 add_compl_names
[GET_FIELD (insn
, 20, 21)]);
2254 if (GET_FIELD (insn
, 20, 20))
2255 (*info
->fprintf_func
) (info
->stream
, ",tsv");
2258 (*info
->fprintf_func
) (info
->stream
, ",tc");
2259 if (GET_FIELD (insn
, 20, 20))
2260 (*info
->fprintf_func
) (info
->stream
, ",tsv");
2263 (*info
->fprintf_func
) (info
->stream
, ",db");
2264 if (GET_FIELD (insn
, 20, 20))
2265 (*info
->fprintf_func
) (info
->stream
, ",tsv");
2268 (*info
->fprintf_func
) (info
->stream
, ",b");
2269 if (GET_FIELD (insn
, 20, 20))
2270 (*info
->fprintf_func
) (info
->stream
, ",tsv");
2273 if (GET_FIELD (insn
, 25, 25))
2274 (*info
->fprintf_func
) (info
->stream
, ",tc");
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)]);
2283 (*info
->fprintf_func
)
2284 (info
->stream
, "%s ",
2285 signed_unsigned_names
[GET_FIELD (insn
, 21, 21)]);
2288 (*info
->fprintf_func
)
2289 (info
->stream
, "%s",
2290 mix_half_names
[GET_FIELD (insn
, 17, 17)]);
2293 (*info
->fprintf_func
)
2294 (info
->stream
, "%s ",
2295 saturation_names
[GET_FIELD (insn
, 24, 25)]);
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));
2308 m
= GET_FIELD (insn
, 28, 28);
2309 a
= GET_FIELD (insn
, 29, 29);
2312 fputs_filtered (",ma ", info
);
2314 fputs_filtered (",mb ", info
);
2316 fputs_filtered (" ", info
);
2322 int opc
= GET_FIELD (insn
, 0, 5);
2324 if (opc
== 0x16 || opc
== 0x1e)
2326 if (GET_FIELD (insn
, 29, 29) == 0)
2327 fputs_filtered (",ma ", info
);
2329 fputs_filtered (",mb ", info
);
2332 fputs_filtered (" ", info
);
2338 int opc
= GET_FIELD (insn
, 0, 5);
2340 if (opc
== 0x13 || opc
== 0x1b)
2342 if (GET_FIELD (insn
, 18, 18) == 1)
2343 fputs_filtered (",mb ", info
);
2345 fputs_filtered (",ma ", info
);
2347 else if (opc
== 0x17 || opc
== 0x1f)
2349 if (GET_FIELD (insn
, 31, 31) == 1)
2350 fputs_filtered (",ma ", info
);
2352 fputs_filtered (",mb ", info
);
2355 fputs_filtered (" ", info
);
2362 /* Handle conditions. */
2369 (*info
->fprintf_func
)
2370 (info
->stream
, "%s ",
2371 float_comp_names
[GET_FIELD (insn
, 27, 31)]);
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,
2380 (compare_cond_names
[GET_FIELD (insn
, 16, 18)], info
);
2384 (compare_cond_names
[GET_FIELD (insn
, 16, 18)
2385 + GET_FIELD (insn
, 4, 4) * 8],
2390 (compare_cond_64_names
[GET_FIELD (insn
, 16, 18)
2391 + GET_FIELD (insn
, 2, 2) * 8],
2396 (cmpib_cond_64_names
[GET_FIELD (insn
, 16, 18)],
2401 (add_cond_names
[GET_FIELD (insn
, 16, 18)
2402 + GET_FIELD (insn
, 4, 4) * 8],
2406 (*info
->fprintf_func
)
2407 (info
->stream
, "%s ",
2408 compare_cond_names
[GET_COND (insn
)]);
2411 (*info
->fprintf_func
)
2412 (info
->stream
, "%s ",
2413 compare_cond_64_names
[GET_COND (insn
)]);
2416 (*info
->fprintf_func
)
2417 (info
->stream
, "%s ",
2418 add_cond_names
[GET_COND (insn
)]);
2421 (*info
->fprintf_func
)
2422 (info
->stream
, "%s ",
2423 add_cond_64_names
[GET_COND (insn
)]);
2426 (*info
->fprintf_func
)
2427 (info
->stream
, "%s",
2428 add_cond_names
[GET_FIELD (insn
, 16, 18)]);
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]);
2439 (*info
->fprintf_func
)
2440 (info
->stream
, "%s ",
2441 logical_cond_names
[GET_COND (insn
)]);
2444 (*info
->fprintf_func
)
2445 (info
->stream
, "%s ",
2446 logical_cond_64_names
[GET_COND (insn
)]);
2449 (*info
->fprintf_func
)
2450 (info
->stream
, "%s ",
2451 unit_cond_names
[GET_COND (insn
)]);
2454 (*info
->fprintf_func
)
2455 (info
->stream
, "%s ",
2456 unit_cond_64_names
[GET_COND (insn
)]);
2461 (*info
->fprintf_func
)
2462 (info
->stream
, "%s",
2463 shift_cond_names
[GET_FIELD (insn
, 16, 18)]);
2465 /* If the next character in args is 'n', it will handle
2466 putting out the space. */
2468 (*info
->fprintf_func
) (info
->stream
, " ");
2471 (*info
->fprintf_func
)
2472 (info
->stream
, "%s ",
2473 shift_cond_64_names
[GET_FIELD (insn
, 16, 18)]);
2476 (*info
->fprintf_func
)
2477 (info
->stream
, "%s",
2478 bb_cond_64_names
[GET_FIELD (insn
, 16, 16)]);
2480 /* If the next character in args is 'n', it will handle
2481 putting out the space. */
2483 (*info
->fprintf_func
) (info
->stream
, " ");
2490 fput_const (extract_5_store (insn
), info
);
2493 fput_const (extract_5r_store (insn
), info
);
2496 fput_const (extract_5R_store (insn
), info
);
2499 fput_const (extract_10U_store (insn
), info
);
2503 fput_const (extract_5Q_store (insn
), info
);
2506 fput_const (extract_11 (insn
), info
);
2509 fput_const (extract_14 (insn
), info
);
2512 fputs_filtered ("L%", info
);
2513 fput_const (extract_21 (insn
), info
);
2517 /* 16-bit long disp., PA2.0 wide only. */
2518 fput_const (extract_16 (insn
), info
);
2522 (*info
->fprintf_func
) (info
->stream
, ",n ");
2524 (*info
->fprintf_func
) (info
->stream
, " ");
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");
2532 (*info
->fprintf_func
) (info
->stream
, " ");
2535 (*info
->print_address_func
)
2536 (memaddr
+ 8 + extract_12 (insn
), info
);
2539 /* 17 bit PC-relative branch. */
2540 (*info
->print_address_func
)
2541 ((memaddr
+ 8 + extract_17 (insn
)), info
);
2544 /* 17 bit displacement. This is an offset from a register
2545 so it gets disasssembled as just a number, not any sort
2547 fput_const (extract_17 (insn
), info
);
2551 /* addil %r1 implicit output. */
2552 fputs_filtered ("r1", info
);
2556 /* be,l %sr0,%r31 implicit output. */
2557 fputs_filtered ("sr0,r31", info
);
2561 (*info
->fprintf_func
) (info
->stream
, "0");
2565 (*info
->fprintf_func
) (info
->stream
, "%d",
2566 GET_FIELD (insn
, 24, 25));
2569 (*info
->fprintf_func
) (info
->stream
, "%d",
2570 GET_FIELD (insn
, 22, 25));
2573 fputs_filtered ("sar", info
);
2576 (*info
->fprintf_func
) (info
->stream
, "%d",
2577 31 - GET_FIELD (insn
, 22, 26));
2582 num
= GET_FIELD (insn
, 20, 20) << 5;
2583 num
|= GET_FIELD (insn
, 22, 26);
2584 (*info
->fprintf_func
) (info
->stream
, "%d", 63 - num
);
2588 (*info
->fprintf_func
) (info
->stream
, "%d",
2589 GET_FIELD (insn
, 22, 26));
2594 num
= GET_FIELD (insn
, 20, 20) << 5;
2595 num
|= GET_FIELD (insn
, 22, 26);
2596 (*info
->fprintf_func
) (info
->stream
, "%d", num
);
2600 (*info
->fprintf_func
) (info
->stream
, "%d",
2601 32 - GET_FIELD (insn
, 27, 31));
2606 num
= (GET_FIELD (insn
, 23, 23) + 1) * 32;
2607 num
-= GET_FIELD (insn
, 27, 31);
2608 (*info
->fprintf_func
) (info
->stream
, "%d", 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
);
2620 fput_const (GET_FIELD (insn
, 20, 28), info
);
2623 fput_const (GET_FIELD (insn
, 6, 18), info
);
2626 fput_const (GET_FIELD (insn
, 6, 31), info
);
2629 (*info
->fprintf_func
) (info
->stream
, ",%d",
2630 GET_FIELD (insn
, 23, 25));
2633 fput_const ((GET_FIELD (insn
, 6,20) << 5 |
2634 GET_FIELD (insn
, 27, 31)), info
);
2637 fput_const (GET_FIELD (insn
, 6, 20), info
);
2640 fput_const ((GET_FIELD (insn
, 6, 22) << 5 |
2641 GET_FIELD (insn
, 27, 31)), info
);
2644 fput_const ((GET_FIELD (insn
, 11, 20) << 5 |
2645 GET_FIELD (insn
, 27, 31)), info
);
2648 fput_const ((GET_FIELD (insn
, 16, 20) << 5 |
2649 GET_FIELD (insn
, 27, 31)), info
);
2652 (*info
->fprintf_func
) (info
->stream
, ",%d",
2653 GET_FIELD (insn
, 23, 25));
2656 /* If no destination completer and not before a completer
2657 for fcmp, need a space here. */
2658 if (s
[1] == 'G' || s
[1] == '?')
2660 (float_format_names
[GET_FIELD (insn
, 19, 20)], info
);
2662 (*info
->fprintf_func
)
2663 (info
->stream
, "%s ",
2664 float_format_names
[GET_FIELD (insn
, 19, 20)]);
2667 (*info
->fprintf_func
)
2668 (info
->stream
, "%s ",
2669 float_format_names
[GET_FIELD (insn
, 17, 18)]);
2672 if (GET_FIELD (insn
, 26, 26) == 1)
2673 (*info
->fprintf_func
) (info
->stream
, "%s ",
2674 float_format_names
[0]);
2676 (*info
->fprintf_func
) (info
->stream
, "%s ",
2677 float_format_names
[1]);
2680 /* If no destination completer and not before a completer
2681 for fcmp, need a space here. */
2684 (float_format_names
[GET_FIELD (insn
, 20, 20)], info
);
2686 (*info
->fprintf_func
)
2687 (info
->stream
, "%s ",
2688 float_format_names
[GET_FIELD (insn
, 20, 20)]);
2692 fput_const (extract_14 (insn
), info
);
2697 int sign
= GET_FIELD (insn
, 31, 31);
2698 int imm10
= GET_FIELD (insn
, 18, 27);
2702 disp
= (-1 << 10) | imm10
;
2707 fput_const (disp
, info
);
2713 int sign
= GET_FIELD (insn
, 31, 31);
2714 int imm11
= GET_FIELD (insn
, 18, 28);
2718 disp
= (-1 << 11) | imm11
;
2723 fput_const (disp
, info
);
2730 /* 16-bit long disp., PA2.0 wide only. */
2731 int disp
= extract_16 (insn
);
2733 fput_const (disp
, info
);
2739 /* 16-bit long disp., PA2.0 wide only. */
2740 int disp
= extract_16 (insn
);
2742 fput_const (disp
, info
);
2747 break; /* Dealt with by '{' */
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
;
2760 fputs_filtered (",UND ", info
);
2766 source
= sub
& 4 ? fcnv_ufixed_names
: fcnv_fixed_names
;
2768 dest
= sub
& 4 ? fcnv_ufixed_names
: fcnv_fixed_names
;
2770 (*info
->fprintf_func
) (info
->stream
, "%s%s%s ",
2771 t
, source
[sf
], dest
[df
]);
2777 int y
= GET_FIELD (insn
, 16, 18);
2780 fput_const ((y
^ 1) - 1, info
);
2788 cbit
= GET_FIELD (insn
, 16, 18);
2791 (*info
->fprintf_func
) (info
->stream
, ",%d", cbit
- 1);
2797 int cond
= GET_FIELD (insn
, 27, 31);
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;
2815 (*info
->print_address_func
)
2816 (memaddr
+ 8 + extract_22 (insn
), info
);
2819 fputs_filtered (",rp", info
);
2822 (*info
->fprintf_func
) (info
->stream
, "%c", *s
);
2826 return sizeof (insn
);
2829 (*info
->fprintf_func
) (info
->stream
, "#%8x", insn
);
2830 return sizeof (insn
);