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