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