Home | History | Annotate | Line # | Download | only in opcodes
bfin-dis.c revision 1.1
      1  1.1  christos /* Disassemble ADI Blackfin Instructions.
      2  1.1  christos    Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
      3  1.1  christos    Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    This file is part of libopcodes.
      6  1.1  christos 
      7  1.1  christos    This library is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 3, or (at your option)
     10  1.1  christos    any later version.
     11  1.1  christos 
     12  1.1  christos    It is distributed in the hope that it will be useful, but WITHOUT
     13  1.1  christos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  christos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15  1.1  christos    License for more details.
     16  1.1  christos 
     17  1.1  christos    You should have received a copy of the GNU General Public License
     18  1.1  christos    along with this program; if not, write to the Free Software
     19  1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20  1.1  christos    MA 02110-1301, USA.  */
     21  1.1  christos 
     22  1.1  christos #include "sysdep.h"
     23  1.1  christos #include <stdio.h>
     24  1.1  christos 
     25  1.1  christos #include "opcode/bfin.h"
     26  1.1  christos 
     27  1.1  christos #ifndef PRINTF
     28  1.1  christos #define PRINTF printf
     29  1.1  christos #endif
     30  1.1  christos 
     31  1.1  christos #ifndef EXIT
     32  1.1  christos #define EXIT exit
     33  1.1  christos #endif
     34  1.1  christos 
     35  1.1  christos typedef long TIword;
     36  1.1  christos 
     37  1.1  christos #define HOST_LONG_WORD_SIZE (sizeof (long) * 8)
     38  1.1  christos #define XFIELD(w,p,s)       (((w) & ((1 << (s)) - 1) << (p)) >> (p))
     39  1.1  christos #define SIGNEXTEND(v, n)    ((v << (HOST_LONG_WORD_SIZE - (n))) >> (HOST_LONG_WORD_SIZE - (n)))
     40  1.1  christos #define MASKBITS(val, bits) (val & ((1 << bits) - 1))
     41  1.1  christos 
     42  1.1  christos #include "dis-asm.h"
     43  1.1  christos 
     44  1.1  christos typedef unsigned int bu32;
     45  1.1  christos 
     46  1.1  christos static char comment = 0;
     47  1.1  christos static char parallel = 0;
     48  1.1  christos 
     49  1.1  christos typedef enum
     50  1.1  christos {
     51  1.1  christos   c_0, c_1, c_4, c_2, c_uimm2, c_uimm3, c_imm3, c_pcrel4,
     52  1.1  christos   c_imm4, c_uimm4s4, c_uimm4s4d, c_uimm4, c_uimm4s2, c_negimm5s4, c_imm5, c_imm5d, c_uimm5, c_imm6,
     53  1.1  christos   c_imm7, c_imm7d, c_imm8, c_uimm8, c_pcrel8, c_uimm8s4, c_pcrel8s4, c_lppcrel10, c_pcrel10,
     54  1.1  christos   c_pcrel12, c_imm16s4, c_luimm16, c_imm16, c_imm16d, c_huimm16, c_rimm16, c_imm16s2, c_uimm16s4,
     55  1.1  christos   c_uimm16s4d, c_uimm16, c_pcrel24, c_uimm32, c_imm32, c_huimm32, c_huimm32e,
     56  1.1  christos } const_forms_t;
     57  1.1  christos 
     58  1.1  christos static const struct
     59  1.1  christos {
     60  1.1  christos   const char *name;
     61  1.1  christos   const int nbits;
     62  1.1  christos   const char reloc;
     63  1.1  christos   const char issigned;
     64  1.1  christos   const char pcrel;
     65  1.1  christos   const char scale;
     66  1.1  christos   const char offset;
     67  1.1  christos   const char negative;
     68  1.1  christos   const char positive;
     69  1.1  christos   const char decimal;
     70  1.1  christos   const char leading;
     71  1.1  christos   const char exact;
     72  1.1  christos } constant_formats[] =
     73  1.1  christos {
     74  1.1  christos   { "0",          0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     75  1.1  christos   { "1",          0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     76  1.1  christos   { "4",          0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     77  1.1  christos   { "2",          0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     78  1.1  christos   { "uimm2",      2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     79  1.1  christos   { "uimm3",      3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     80  1.1  christos   { "imm3",       3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     81  1.1  christos   { "pcrel4",     4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
     82  1.1  christos   { "imm4",       4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     83  1.1  christos   { "uimm4s4",    4, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0},
     84  1.1  christos   { "uimm4s4d",   4, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0},
     85  1.1  christos   { "uimm4",      4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     86  1.1  christos   { "uimm4s2",    4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
     87  1.1  christos   { "negimm5s4",  5, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0},
     88  1.1  christos   { "imm5",       5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     89  1.1  christos   { "imm5d",      5, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
     90  1.1  christos   { "uimm5",      5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     91  1.1  christos   { "imm6",       6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     92  1.1  christos   { "imm7",       7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     93  1.1  christos   { "imm7d",      7, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
     94  1.1  christos   { "imm8",       8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
     95  1.1  christos   { "uimm8",      8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     96  1.1  christos   { "pcrel8",     8, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
     97  1.1  christos   { "uimm8s4",    8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
     98  1.1  christos   { "pcrel8s4",   8, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
     99  1.1  christos   { "lppcrel10", 10, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
    100  1.1  christos   { "pcrel10",   10, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
    101  1.1  christos   { "pcrel12",   12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
    102  1.1  christos   { "imm16s4",   16, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0},
    103  1.1  christos   { "luimm16",   16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    104  1.1  christos   { "imm16",     16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
    105  1.1  christos   { "imm16d",    16, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
    106  1.1  christos   { "huimm16",   16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    107  1.1  christos   { "rimm16",    16, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
    108  1.1  christos   { "imm16s2",   16, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
    109  1.1  christos   { "uimm16s4",  16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
    110  1.1  christos   { "uimm16s4d", 16, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0},
    111  1.1  christos   { "uimm16",    16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    112  1.1  christos   { "pcrel24",   24, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
    113  1.1  christos   { "uimm32",    32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    114  1.1  christos   { "imm32",     32, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
    115  1.1  christos   { "huimm32",   32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    116  1.1  christos   { "huimm32e",  32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
    117  1.1  christos };
    118  1.1  christos 
    119  1.1  christos static const char *
    120  1.1  christos fmtconst (const_forms_t cf, TIword x, bfd_vma pc, disassemble_info *outf)
    121  1.1  christos {
    122  1.1  christos   static char buf[60];
    123  1.1  christos 
    124  1.1  christos   if (constant_formats[cf].reloc)
    125  1.1  christos     {
    126  1.1  christos       bfd_vma ea = (((constant_formats[cf].pcrel ? SIGNEXTEND (x, constant_formats[cf].nbits)
    127  1.1  christos 		      : x) + constant_formats[cf].offset) << constant_formats[cf].scale);
    128  1.1  christos       if (constant_formats[cf].pcrel)
    129  1.1  christos 	ea += pc;
    130  1.1  christos 
    131  1.1  christos       /* truncate to 32-bits for proper symbol lookup/matching */
    132  1.1  christos       ea = (bu32)ea;
    133  1.1  christos 
    134  1.1  christos       if (outf->symbol_at_address_func (ea, outf) || !constant_formats[cf].exact)
    135  1.1  christos 	{
    136  1.1  christos 	  outf->print_address_func (ea, outf);
    137  1.1  christos 	  return "";
    138  1.1  christos 	}
    139  1.1  christos       else
    140  1.1  christos 	{
    141  1.1  christos 	  sprintf (buf, "%lx", (unsigned long) x);
    142  1.1  christos 	  return buf;
    143  1.1  christos 	}
    144  1.1  christos     }
    145  1.1  christos 
    146  1.1  christos   /* Negative constants have an implied sign bit.  */
    147  1.1  christos   if (constant_formats[cf].negative)
    148  1.1  christos     {
    149  1.1  christos       int nb = constant_formats[cf].nbits + 1;
    150  1.1  christos 
    151  1.1  christos       x = x | (1 << constant_formats[cf].nbits);
    152  1.1  christos       x = SIGNEXTEND (x, nb);
    153  1.1  christos     }
    154  1.1  christos   else
    155  1.1  christos     x = constant_formats[cf].issigned ? SIGNEXTEND (x, constant_formats[cf].nbits) : x;
    156  1.1  christos 
    157  1.1  christos   if (constant_formats[cf].offset)
    158  1.1  christos     x += constant_formats[cf].offset;
    159  1.1  christos 
    160  1.1  christos   if (constant_formats[cf].scale)
    161  1.1  christos     x <<= constant_formats[cf].scale;
    162  1.1  christos 
    163  1.1  christos   if (constant_formats[cf].decimal)
    164  1.1  christos     sprintf (buf, "%*li", constant_formats[cf].leading, x);
    165  1.1  christos   else
    166  1.1  christos     {
    167  1.1  christos       if (constant_formats[cf].issigned && x < 0)
    168  1.1  christos 	sprintf (buf, "-0x%x", abs (x));
    169  1.1  christos       else
    170  1.1  christos 	sprintf (buf, "0x%lx", (unsigned long) x);
    171  1.1  christos     }
    172  1.1  christos 
    173  1.1  christos   return buf;
    174  1.1  christos }
    175  1.1  christos 
    176  1.1  christos static bu32
    177  1.1  christos fmtconst_val (const_forms_t cf, unsigned int x, unsigned int pc)
    178  1.1  christos {
    179  1.1  christos   if (0 && constant_formats[cf].reloc)
    180  1.1  christos     {
    181  1.1  christos       bu32 ea = (((constant_formats[cf].pcrel
    182  1.1  christos 		   ? SIGNEXTEND (x, constant_formats[cf].nbits)
    183  1.1  christos 		   : x) + constant_formats[cf].offset)
    184  1.1  christos 		 << constant_formats[cf].scale);
    185  1.1  christos       if (constant_formats[cf].pcrel)
    186  1.1  christos 	ea += pc;
    187  1.1  christos 
    188  1.1  christos       return ea;
    189  1.1  christos     }
    190  1.1  christos 
    191  1.1  christos   /* Negative constants have an implied sign bit.  */
    192  1.1  christos   if (constant_formats[cf].negative)
    193  1.1  christos     {
    194  1.1  christos       int nb = constant_formats[cf].nbits + 1;
    195  1.1  christos       x = x | (1 << constant_formats[cf].nbits);
    196  1.1  christos       x = SIGNEXTEND (x, nb);
    197  1.1  christos     }
    198  1.1  christos   else if (constant_formats[cf].issigned)
    199  1.1  christos     x = SIGNEXTEND (x, constant_formats[cf].nbits);
    200  1.1  christos 
    201  1.1  christos   x += constant_formats[cf].offset;
    202  1.1  christos   x <<= constant_formats[cf].scale;
    203  1.1  christos 
    204  1.1  christos   return x;
    205  1.1  christos }
    206  1.1  christos 
    207  1.1  christos enum machine_registers
    208  1.1  christos {
    209  1.1  christos   REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
    210  1.1  christos   REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
    211  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    212  1.1  christos   REG_R1_0, REG_R3_2, REG_R5_4, REG_R7_6, REG_P0, REG_P1, REG_P2, REG_P3,
    213  1.1  christos   REG_P4, REG_P5, REG_SP, REG_FP, REG_A0x, REG_A1x, REG_A0w, REG_A1w,
    214  1.1  christos   REG_A0, REG_A1, REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1,
    215  1.1  christos   REG_M2, REG_M3, REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1,
    216  1.1  christos   REG_L2, REG_L3,
    217  1.1  christos   REG_AZ, REG_AN, REG_AC0, REG_AC1, REG_AV0, REG_AV1, REG_AV0S, REG_AV1S,
    218  1.1  christos   REG_AQ, REG_V, REG_VS,
    219  1.1  christos   REG_sftreset, REG_omode, REG_excause, REG_emucause, REG_idle_req, REG_hwerrcause, REG_CC, REG_LC0,
    220  1.1  christos   REG_LC1, REG_ASTAT, REG_RETS, REG_LT0, REG_LB0, REG_LT1, REG_LB1,
    221  1.1  christos   REG_CYCLES, REG_CYCLES2, REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN,
    222  1.1  christos   REG_RETE, REG_EMUDAT, REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6,
    223  1.1  christos   REG_BR7, REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
    224  1.1  christos   REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
    225  1.1  christos   REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
    226  1.1  christos   REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
    227  1.1  christos   REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_MH2, REG_MH3,
    228  1.1  christos   REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
    229  1.1  christos   REG_AC0_COPY, REG_V_COPY, REG_RND_MOD,
    230  1.1  christos   REG_LASTREG,
    231  1.1  christos };
    232  1.1  christos 
    233  1.1  christos enum reg_class
    234  1.1  christos {
    235  1.1  christos   rc_dregs_lo, rc_dregs_hi, rc_dregs, rc_dregs_pair, rc_pregs, rc_spfp, rc_dregs_hilo, rc_accum_ext,
    236  1.1  christos   rc_accum_word, rc_accum, rc_iregs, rc_mregs, rc_bregs, rc_lregs, rc_dpregs, rc_gregs,
    237  1.1  christos   rc_regs, rc_statbits, rc_ignore_bits, rc_ccstat, rc_counters, rc_dregs2_sysregs1, rc_open, rc_sysregs2,
    238  1.1  christos   rc_sysregs3, rc_allregs,
    239  1.1  christos   LIM_REG_CLASSES
    240  1.1  christos };
    241  1.1  christos 
    242  1.1  christos static const char * const reg_names[] =
    243  1.1  christos {
    244  1.1  christos   "R0.L", "R1.L", "R2.L", "R3.L", "R4.L", "R5.L", "R6.L", "R7.L",
    245  1.1  christos   "R0.H", "R1.H", "R2.H", "R3.H", "R4.H", "R5.H", "R6.H", "R7.H",
    246  1.1  christos   "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
    247  1.1  christos   "R1:0", "R3:2", "R5:4", "R7:6", "P0", "P1", "P2", "P3",
    248  1.1  christos   "P4", "P5", "SP", "FP", "A0.X", "A1.X", "A0.W", "A1.W",
    249  1.1  christos   "A0", "A1", "I0", "I1", "I2", "I3", "M0", "M1",
    250  1.1  christos   "M2", "M3", "B0", "B1", "B2", "B3", "L0", "L1",
    251  1.1  christos   "L2", "L3",
    252  1.1  christos   "AZ", "AN", "AC0", "AC1", "AV0", "AV1", "AV0S", "AV1S",
    253  1.1  christos   "AQ", "V", "VS",
    254  1.1  christos   "sftreset", "omode", "excause", "emucause", "idle_req", "hwerrcause", "CC", "LC0",
    255  1.1  christos   "LC1", "ASTAT", "RETS", "LT0", "LB0", "LT1", "LB1",
    256  1.1  christos   "CYCLES", "CYCLES2", "USP", "SEQSTAT", "SYSCFG", "RETI", "RETX", "RETN",
    257  1.1  christos   "RETE", "EMUDAT",
    258  1.1  christos   "R0.B", "R1.B", "R2.B", "R3.B", "R4.B", "R5.B", "R6.B", "R7.B",
    259  1.1  christos   "P0.L", "P1.L", "P2.L", "P3.L", "P4.L", "P5.L", "SP.L", "FP.L",
    260  1.1  christos   "P0.H", "P1.H", "P2.H", "P3.H", "P4.H", "P5.H", "SP.H", "FP.H",
    261  1.1  christos   "I0.L", "I1.L", "I2.L", "I3.L", "M0.L", "M1.L", "M2.L", "M3.L",
    262  1.1  christos   "B0.L", "B1.L", "B2.L", "B3.L", "L0.L", "L1.L", "L2.L", "L3.L",
    263  1.1  christos   "I0.H", "I1.H", "I2.H", "I3.H", "M0.H", "M1.H", "M2.H", "M3.H",
    264  1.1  christos   "B0.H", "B1.H", "B2.H", "B3.H", "L0.H", "L1.H", "L2.H", "L3.H",
    265  1.1  christos   "AC0_COPY", "V_COPY", "RND_MOD",
    266  1.1  christos   "LASTREG",
    267  1.1  christos   0
    268  1.1  christos };
    269  1.1  christos 
    270  1.1  christos #define REGNAME(x) ((x) < REG_LASTREG ? (reg_names[x]) : "...... Illegal register .......")
    271  1.1  christos 
    272  1.1  christos /* RL(0..7).  */
    273  1.1  christos static const enum machine_registers decode_dregs_lo[] =
    274  1.1  christos {
    275  1.1  christos   REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
    276  1.1  christos };
    277  1.1  christos 
    278  1.1  christos #define dregs_lo(x) REGNAME (decode_dregs_lo[(x) & 7])
    279  1.1  christos 
    280  1.1  christos /* RH(0..7).  */
    281  1.1  christos static const enum machine_registers decode_dregs_hi[] =
    282  1.1  christos {
    283  1.1  christos   REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
    284  1.1  christos };
    285  1.1  christos 
    286  1.1  christos #define dregs_hi(x) REGNAME (decode_dregs_hi[(x) & 7])
    287  1.1  christos 
    288  1.1  christos /* R(0..7).  */
    289  1.1  christos static const enum machine_registers decode_dregs[] =
    290  1.1  christos {
    291  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    292  1.1  christos };
    293  1.1  christos 
    294  1.1  christos #define dregs(x) REGNAME (decode_dregs[(x) & 7])
    295  1.1  christos 
    296  1.1  christos /* R BYTE(0..7).  */
    297  1.1  christos static const enum machine_registers decode_dregs_byte[] =
    298  1.1  christos {
    299  1.1  christos   REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6, REG_BR7,
    300  1.1  christos };
    301  1.1  christos 
    302  1.1  christos #define dregs_byte(x) REGNAME (decode_dregs_byte[(x) & 7])
    303  1.1  christos 
    304  1.1  christos /* P(0..5) SP FP.  */
    305  1.1  christos static const enum machine_registers decode_pregs[] =
    306  1.1  christos {
    307  1.1  christos   REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    308  1.1  christos };
    309  1.1  christos 
    310  1.1  christos #define pregs(x)	REGNAME (decode_pregs[(x) & 7])
    311  1.1  christos #define spfp(x)		REGNAME (decode_spfp[(x) & 1])
    312  1.1  christos #define dregs_hilo(x, i)	REGNAME (decode_dregs_hilo[((i) << 3) | (x)])
    313  1.1  christos #define accum_ext(x)	REGNAME (decode_accum_ext[(x) & 1])
    314  1.1  christos #define accum_word(x)	REGNAME (decode_accum_word[(x) & 1])
    315  1.1  christos #define accum(x)	REGNAME (decode_accum[(x) & 1])
    316  1.1  christos 
    317  1.1  christos /* I(0..3).  */
    318  1.1  christos static const enum machine_registers decode_iregs[] =
    319  1.1  christos {
    320  1.1  christos   REG_I0, REG_I1, REG_I2, REG_I3,
    321  1.1  christos };
    322  1.1  christos 
    323  1.1  christos #define iregs(x) REGNAME (decode_iregs[(x) & 3])
    324  1.1  christos 
    325  1.1  christos /* M(0..3).  */
    326  1.1  christos static const enum machine_registers decode_mregs[] =
    327  1.1  christos {
    328  1.1  christos   REG_M0, REG_M1, REG_M2, REG_M3,
    329  1.1  christos };
    330  1.1  christos 
    331  1.1  christos #define mregs(x) REGNAME (decode_mregs[(x) & 3])
    332  1.1  christos #define bregs(x) REGNAME (decode_bregs[(x) & 3])
    333  1.1  christos #define lregs(x) REGNAME (decode_lregs[(x) & 3])
    334  1.1  christos 
    335  1.1  christos /* dregs pregs.  */
    336  1.1  christos static const enum machine_registers decode_dpregs[] =
    337  1.1  christos {
    338  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    339  1.1  christos   REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    340  1.1  christos };
    341  1.1  christos 
    342  1.1  christos #define dpregs(x) REGNAME (decode_dpregs[(x) & 15])
    343  1.1  christos 
    344  1.1  christos /* [dregs pregs].  */
    345  1.1  christos static const enum machine_registers decode_gregs[] =
    346  1.1  christos {
    347  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    348  1.1  christos   REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    349  1.1  christos };
    350  1.1  christos 
    351  1.1  christos #define gregs(x, i) REGNAME (decode_gregs[((i) << 3) | (x)])
    352  1.1  christos 
    353  1.1  christos /* [dregs pregs (iregs mregs) (bregs lregs)].  */
    354  1.1  christos static const enum machine_registers decode_regs[] =
    355  1.1  christos {
    356  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    357  1.1  christos   REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    358  1.1  christos   REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
    359  1.1  christos   REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
    360  1.1  christos };
    361  1.1  christos 
    362  1.1  christos #define regs(x, i) REGNAME (decode_regs[((i) << 3) | (x)])
    363  1.1  christos 
    364  1.1  christos /* [dregs pregs (iregs mregs) (bregs lregs) Low Half].  */
    365  1.1  christos static const enum machine_registers decode_regs_lo[] =
    366  1.1  christos {
    367  1.1  christos   REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
    368  1.1  christos   REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
    369  1.1  christos   REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
    370  1.1  christos   REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
    371  1.1  christos };
    372  1.1  christos 
    373  1.1  christos #define regs_lo(x, i) REGNAME (decode_regs_lo[((i) << 3) | (x)])
    374  1.1  christos 
    375  1.1  christos /* [dregs pregs (iregs mregs) (bregs lregs) High Half].  */
    376  1.1  christos static const enum machine_registers decode_regs_hi[] =
    377  1.1  christos {
    378  1.1  christos   REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
    379  1.1  christos   REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
    380  1.1  christos   REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_MH2, REG_MH3,
    381  1.1  christos   REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
    382  1.1  christos };
    383  1.1  christos 
    384  1.1  christos #define regs_hi(x, i) REGNAME (decode_regs_hi[((i) << 3) | (x)])
    385  1.1  christos 
    386  1.1  christos static const enum machine_registers decode_statbits[] =
    387  1.1  christos {
    388  1.1  christos   REG_AZ,        REG_AN,        REG_AC0_COPY,    REG_V_COPY,
    389  1.1  christos   REG_LASTREG,   REG_LASTREG,   REG_AQ,          REG_LASTREG,
    390  1.1  christos   REG_RND_MOD,   REG_LASTREG,   REG_LASTREG,     REG_LASTREG,
    391  1.1  christos   REG_AC0,       REG_AC1,       REG_LASTREG,     REG_LASTREG,
    392  1.1  christos   REG_AV0,       REG_AV0S,      REG_AV1,         REG_AV1S,
    393  1.1  christos   REG_LASTREG,   REG_LASTREG,   REG_LASTREG,     REG_LASTREG,
    394  1.1  christos   REG_V,         REG_VS,        REG_LASTREG,     REG_LASTREG,
    395  1.1  christos   REG_LASTREG,   REG_LASTREG,   REG_LASTREG,     REG_LASTREG,
    396  1.1  christos };
    397  1.1  christos 
    398  1.1  christos #define statbits(x) REGNAME (decode_statbits[(x) & 31])
    399  1.1  christos 
    400  1.1  christos /* LC0 LC1.  */
    401  1.1  christos static const enum machine_registers decode_counters[] =
    402  1.1  christos {
    403  1.1  christos   REG_LC0, REG_LC1,
    404  1.1  christos };
    405  1.1  christos 
    406  1.1  christos #define counters(x)        REGNAME (decode_counters[(x) & 1])
    407  1.1  christos #define dregs2_sysregs1(x) REGNAME (decode_dregs2_sysregs1[(x) & 7])
    408  1.1  christos 
    409  1.1  christos /* [dregs pregs (iregs mregs) (bregs lregs)
    410  1.1  christos    dregs2_sysregs1 open sysregs2 sysregs3].  */
    411  1.1  christos static const enum machine_registers decode_allregs[] =
    412  1.1  christos {
    413  1.1  christos   REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    414  1.1  christos   REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    415  1.1  christos   REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
    416  1.1  christos   REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
    417  1.1  christos   REG_A0x, REG_A0w, REG_A1x, REG_A1w, REG_LASTREG, REG_LASTREG, REG_ASTAT, REG_RETS,
    418  1.1  christos   REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
    419  1.1  christos   REG_LC0, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1, REG_CYCLES, REG_CYCLES2,
    420  1.1  christos   REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
    421  1.1  christos   REG_LASTREG,
    422  1.1  christos };
    423  1.1  christos 
    424  1.1  christos #define IS_DREG(g,r)	((g) == 0 && (r) < 8)
    425  1.1  christos #define IS_PREG(g,r)	((g) == 1 && (r) < 8)
    426  1.1  christos #define IS_AREG(g,r)	((g) == 4 && (r) >= 0 && (r) < 4)
    427  1.1  christos #define IS_GENREG(g,r)	((((g) == 0 || (g) == 1) && (r) < 8) || IS_AREG (g, r))
    428  1.1  christos #define IS_DAGREG(g,r)	(((g) == 2 || (g) == 3) && (r) < 8)
    429  1.1  christos #define IS_SYSREG(g,r) \
    430  1.1  christos   (((g) == 4 && ((r) == 6 || (r) == 7)) || (g) == 6 || (g) == 7)
    431  1.1  christos #define IS_RESERVEDREG(g,r) \
    432  1.1  christos   (((r) > 7) || ((g) == 4 && ((r) == 4 || (r) == 5)) || (g) == 5)
    433  1.1  christos 
    434  1.1  christos #define allreg(r,g)	(!IS_RESERVEDREG (g, r))
    435  1.1  christos #define mostreg(r,g)	(!(IS_DREG (g, r) || IS_PREG (g, r) || IS_RESERVEDREG (g, r)))
    436  1.1  christos 
    437  1.1  christos #define allregs(x, i)	REGNAME (decode_allregs[((i) << 3) | (x)])
    438  1.1  christos #define uimm16s4(x)	fmtconst (c_uimm16s4, x, 0, outf)
    439  1.1  christos #define uimm16s4d(x)	fmtconst (c_uimm16s4d, x, 0, outf)
    440  1.1  christos #define pcrel4(x)	fmtconst (c_pcrel4, x, pc, outf)
    441  1.1  christos #define pcrel8(x)	fmtconst (c_pcrel8, x, pc, outf)
    442  1.1  christos #define pcrel8s4(x)	fmtconst (c_pcrel8s4, x, pc, outf)
    443  1.1  christos #define pcrel10(x)	fmtconst (c_pcrel10, x, pc, outf)
    444  1.1  christos #define pcrel12(x)	fmtconst (c_pcrel12, x, pc, outf)
    445  1.1  christos #define negimm5s4(x)	fmtconst (c_negimm5s4, x, 0, outf)
    446  1.1  christos #define rimm16(x)	fmtconst (c_rimm16, x, 0, outf)
    447  1.1  christos #define huimm16(x)	fmtconst (c_huimm16, x, 0, outf)
    448  1.1  christos #define imm16(x)	fmtconst (c_imm16, x, 0, outf)
    449  1.1  christos #define imm16d(x)	fmtconst (c_imm16d, x, 0, outf)
    450  1.1  christos #define uimm2(x)	fmtconst (c_uimm2, x, 0, outf)
    451  1.1  christos #define uimm3(x)	fmtconst (c_uimm3, x, 0, outf)
    452  1.1  christos #define luimm16(x)	fmtconst (c_luimm16, x, 0, outf)
    453  1.1  christos #define uimm4(x)	fmtconst (c_uimm4, x, 0, outf)
    454  1.1  christos #define uimm5(x)	fmtconst (c_uimm5, x, 0, outf)
    455  1.1  christos #define imm16s2(x)	fmtconst (c_imm16s2, x, 0, outf)
    456  1.1  christos #define uimm8(x)	fmtconst (c_uimm8, x, 0, outf)
    457  1.1  christos #define imm16s4(x)	fmtconst (c_imm16s4, x, 0, outf)
    458  1.1  christos #define uimm4s2(x)	fmtconst (c_uimm4s2, x, 0, outf)
    459  1.1  christos #define uimm4s4(x)	fmtconst (c_uimm4s4, x, 0, outf)
    460  1.1  christos #define uimm4s4d(x)	fmtconst (c_uimm4s4d, x, 0, outf)
    461  1.1  christos #define lppcrel10(x)	fmtconst (c_lppcrel10, x, pc, outf)
    462  1.1  christos #define imm3(x)		fmtconst (c_imm3, x, 0, outf)
    463  1.1  christos #define imm4(x)		fmtconst (c_imm4, x, 0, outf)
    464  1.1  christos #define uimm8s4(x)	fmtconst (c_uimm8s4, x, 0, outf)
    465  1.1  christos #define imm5(x)		fmtconst (c_imm5, x, 0, outf)
    466  1.1  christos #define imm5d(x)	fmtconst (c_imm5d, x, 0, outf)
    467  1.1  christos #define imm6(x)		fmtconst (c_imm6, x, 0, outf)
    468  1.1  christos #define imm7(x)		fmtconst (c_imm7, x, 0, outf)
    469  1.1  christos #define imm7d(x)	fmtconst (c_imm7d, x, 0, outf)
    470  1.1  christos #define imm8(x)		fmtconst (c_imm8, x, 0, outf)
    471  1.1  christos #define pcrel24(x)	fmtconst (c_pcrel24, x, pc, outf)
    472  1.1  christos #define uimm16(x)	fmtconst (c_uimm16, x, 0, outf)
    473  1.1  christos #define uimm32(x)	fmtconst (c_uimm32, x, 0, outf)
    474  1.1  christos #define imm32(x)	fmtconst (c_imm32, x, 0, outf)
    475  1.1  christos #define huimm32(x)	fmtconst (c_huimm32, x, 0, outf)
    476  1.1  christos #define huimm32e(x)	fmtconst (c_huimm32e, x, 0, outf)
    477  1.1  christos #define imm7_val(x)	fmtconst_val (c_imm7, x, 0)
    478  1.1  christos #define imm16_val(x)	fmtconst_val (c_uimm16, x, 0)
    479  1.1  christos #define luimm16_val(x)	fmtconst_val (c_luimm16, x, 0)
    480  1.1  christos 
    481  1.1  christos /* (arch.pm)arch_disassembler_functions.  */
    482  1.1  christos #ifndef OUTS
    483  1.1  christos #define OUTS(p, txt) (p)->fprintf_func ((p)->stream, "%s", txt)
    484  1.1  christos #endif
    485  1.1  christos 
    486  1.1  christos static void
    487  1.1  christos amod0 (int s0, int x0, disassemble_info *outf)
    488  1.1  christos {
    489  1.1  christos   if (s0 == 1 && x0 == 0)
    490  1.1  christos     OUTS (outf, " (S)");
    491  1.1  christos   else if (s0 == 0 && x0 == 1)
    492  1.1  christos     OUTS (outf, " (CO)");
    493  1.1  christos   else if (s0 == 1 && x0 == 1)
    494  1.1  christos     OUTS (outf, " (SCO)");
    495  1.1  christos }
    496  1.1  christos 
    497  1.1  christos static void
    498  1.1  christos amod1 (int s0, int x0, disassemble_info *outf)
    499  1.1  christos {
    500  1.1  christos   if (s0 == 0 && x0 == 0)
    501  1.1  christos     OUTS (outf, " (NS)");
    502  1.1  christos   else if (s0 == 1 && x0 == 0)
    503  1.1  christos     OUTS (outf, " (S)");
    504  1.1  christos }
    505  1.1  christos 
    506  1.1  christos static void
    507  1.1  christos amod0amod2 (int s0, int x0, int aop0, disassemble_info *outf)
    508  1.1  christos {
    509  1.1  christos   if (s0 == 1 && x0 == 0 && aop0 == 0)
    510  1.1  christos     OUTS (outf, " (S)");
    511  1.1  christos   else if (s0 == 0 && x0 == 1 && aop0 == 0)
    512  1.1  christos     OUTS (outf, " (CO)");
    513  1.1  christos   else if (s0 == 1 && x0 == 1 && aop0 == 0)
    514  1.1  christos     OUTS (outf, " (SCO)");
    515  1.1  christos   else if (s0 == 0 && x0 == 0 && aop0 == 2)
    516  1.1  christos     OUTS (outf, " (ASR)");
    517  1.1  christos   else if (s0 == 1 && x0 == 0 && aop0 == 2)
    518  1.1  christos     OUTS (outf, " (S, ASR)");
    519  1.1  christos   else if (s0 == 0 && x0 == 1 && aop0 == 2)
    520  1.1  christos     OUTS (outf, " (CO, ASR)");
    521  1.1  christos   else if (s0 == 1 && x0 == 1 && aop0 == 2)
    522  1.1  christos     OUTS (outf, " (SCO, ASR)");
    523  1.1  christos   else if (s0 == 0 && x0 == 0 && aop0 == 3)
    524  1.1  christos     OUTS (outf, " (ASL)");
    525  1.1  christos   else if (s0 == 1 && x0 == 0 && aop0 == 3)
    526  1.1  christos     OUTS (outf, " (S, ASL)");
    527  1.1  christos   else if (s0 == 0 && x0 == 1 && aop0 == 3)
    528  1.1  christos     OUTS (outf, " (CO, ASL)");
    529  1.1  christos   else if (s0 == 1 && x0 == 1 && aop0 == 3)
    530  1.1  christos     OUTS (outf, " (SCO, ASL)");
    531  1.1  christos }
    532  1.1  christos 
    533  1.1  christos static void
    534  1.1  christos searchmod (int r0, disassemble_info *outf)
    535  1.1  christos {
    536  1.1  christos   if (r0 == 0)
    537  1.1  christos     OUTS (outf, "GT");
    538  1.1  christos   else if (r0 == 1)
    539  1.1  christos     OUTS (outf, "GE");
    540  1.1  christos   else if (r0 == 2)
    541  1.1  christos     OUTS (outf, "LT");
    542  1.1  christos   else if (r0 == 3)
    543  1.1  christos     OUTS (outf, "LE");
    544  1.1  christos }
    545  1.1  christos 
    546  1.1  christos static void
    547  1.1  christos aligndir (int r0, disassemble_info *outf)
    548  1.1  christos {
    549  1.1  christos   if (r0 == 1)
    550  1.1  christos     OUTS (outf, " (R)");
    551  1.1  christos }
    552  1.1  christos 
    553  1.1  christos static int
    554  1.1  christos decode_multfunc (int h0, int h1, int src0, int src1, disassemble_info *outf)
    555  1.1  christos {
    556  1.1  christos   const char *s0, *s1;
    557  1.1  christos 
    558  1.1  christos   if (h0)
    559  1.1  christos     s0 = dregs_hi (src0);
    560  1.1  christos   else
    561  1.1  christos     s0 = dregs_lo (src0);
    562  1.1  christos 
    563  1.1  christos   if (h1)
    564  1.1  christos     s1 = dregs_hi (src1);
    565  1.1  christos   else
    566  1.1  christos     s1 = dregs_lo (src1);
    567  1.1  christos 
    568  1.1  christos   OUTS (outf, s0);
    569  1.1  christos   OUTS (outf, " * ");
    570  1.1  christos   OUTS (outf, s1);
    571  1.1  christos   return 0;
    572  1.1  christos }
    573  1.1  christos 
    574  1.1  christos static int
    575  1.1  christos decode_macfunc (int which, int op, int h0, int h1, int src0, int src1, disassemble_info *outf)
    576  1.1  christos {
    577  1.1  christos   const char *a;
    578  1.1  christos   const char *sop = "<unknown op>";
    579  1.1  christos 
    580  1.1  christos   if (which)
    581  1.1  christos     a = "A1";
    582  1.1  christos   else
    583  1.1  christos     a = "A0";
    584  1.1  christos 
    585  1.1  christos   if (op == 3)
    586  1.1  christos     {
    587  1.1  christos       OUTS (outf, a);
    588  1.1  christos       return 0;
    589  1.1  christos     }
    590  1.1  christos 
    591  1.1  christos   switch (op)
    592  1.1  christos     {
    593  1.1  christos     case 0: sop = " = ";   break;
    594  1.1  christos     case 1: sop = " += ";  break;
    595  1.1  christos     case 2: sop = " -= ";  break;
    596  1.1  christos     default: break;
    597  1.1  christos     }
    598  1.1  christos 
    599  1.1  christos   OUTS (outf, a);
    600  1.1  christos   OUTS (outf, sop);
    601  1.1  christos   decode_multfunc (h0, h1, src0, src1, outf);
    602  1.1  christos 
    603  1.1  christos   return 0;
    604  1.1  christos }
    605  1.1  christos 
    606  1.1  christos static void
    607  1.1  christos decode_optmode (int mod, int MM, disassemble_info *outf)
    608  1.1  christos {
    609  1.1  christos   if (mod == 0 && MM == 0)
    610  1.1  christos     return;
    611  1.1  christos 
    612  1.1  christos   OUTS (outf, " (");
    613  1.1  christos 
    614  1.1  christos   if (MM && !mod)
    615  1.1  christos     {
    616  1.1  christos       OUTS (outf, "M)");
    617  1.1  christos       return;
    618  1.1  christos     }
    619  1.1  christos 
    620  1.1  christos   if (MM)
    621  1.1  christos     OUTS (outf, "M, ");
    622  1.1  christos 
    623  1.1  christos   if (mod == M_S2RND)
    624  1.1  christos     OUTS (outf, "S2RND");
    625  1.1  christos   else if (mod == M_T)
    626  1.1  christos     OUTS (outf, "T");
    627  1.1  christos   else if (mod == M_W32)
    628  1.1  christos     OUTS (outf, "W32");
    629  1.1  christos   else if (mod == M_FU)
    630  1.1  christos     OUTS (outf, "FU");
    631  1.1  christos   else if (mod == M_TFU)
    632  1.1  christos     OUTS (outf, "TFU");
    633  1.1  christos   else if (mod == M_IS)
    634  1.1  christos     OUTS (outf, "IS");
    635  1.1  christos   else if (mod == M_ISS2)
    636  1.1  christos     OUTS (outf, "ISS2");
    637  1.1  christos   else if (mod == M_IH)
    638  1.1  christos     OUTS (outf, "IH");
    639  1.1  christos   else if (mod == M_IU)
    640  1.1  christos     OUTS (outf, "IU");
    641  1.1  christos   else
    642  1.1  christos     abort ();
    643  1.1  christos 
    644  1.1  christos   OUTS (outf, ")");
    645  1.1  christos }
    646  1.1  christos 
    647  1.1  christos static struct saved_state
    648  1.1  christos {
    649  1.1  christos   bu32 dpregs[16], iregs[4], mregs[4], bregs[4], lregs[4];
    650  1.1  christos   bu32 ax[2], aw[2];
    651  1.1  christos   bu32 lt[2], lc[2], lb[2];
    652  1.1  christos   bu32 rets;
    653  1.1  christos } saved_state;
    654  1.1  christos 
    655  1.1  christos #define DREG(x)         (saved_state.dpregs[x])
    656  1.1  christos #define GREG(x, i)      DPREG ((x) | ((i) << 3))
    657  1.1  christos #define DPREG(x)        (saved_state.dpregs[x])
    658  1.1  christos #define DREG(x)         (saved_state.dpregs[x])
    659  1.1  christos #define PREG(x)         (saved_state.dpregs[(x) + 8])
    660  1.1  christos #define SPREG           PREG (6)
    661  1.1  christos #define FPREG           PREG (7)
    662  1.1  christos #define IREG(x)         (saved_state.iregs[x])
    663  1.1  christos #define MREG(x)         (saved_state.mregs[x])
    664  1.1  christos #define BREG(x)         (saved_state.bregs[x])
    665  1.1  christos #define LREG(x)         (saved_state.lregs[x])
    666  1.1  christos #define AXREG(x)        (saved_state.ax[x])
    667  1.1  christos #define AWREG(x)        (saved_state.aw[x])
    668  1.1  christos #define LCREG(x)        (saved_state.lc[x])
    669  1.1  christos #define LTREG(x)        (saved_state.lt[x])
    670  1.1  christos #define LBREG(x)        (saved_state.lb[x])
    671  1.1  christos #define RETSREG         (saved_state.rets)
    672  1.1  christos 
    673  1.1  christos static bu32 *
    674  1.1  christos get_allreg (int grp, int reg)
    675  1.1  christos {
    676  1.1  christos   int fullreg = (grp << 3) | reg;
    677  1.1  christos   /* REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
    678  1.1  christos      REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
    679  1.1  christos      REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
    680  1.1  christos      REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
    681  1.1  christos      REG_A0x, REG_A0w, REG_A1x, REG_A1w, , , REG_ASTAT, REG_RETS,
    682  1.1  christos      , , , , , , , ,
    683  1.1  christos      REG_LC0, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1, REG_CYCLES,
    684  1.1  christos      REG_CYCLES2,
    685  1.1  christos      REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN, REG_RETE,
    686  1.1  christos      REG_LASTREG */
    687  1.1  christos   switch (fullreg >> 2)
    688  1.1  christos     {
    689  1.1  christos     case 0: case 1: return &DREG (reg);
    690  1.1  christos     case 2: case 3: return &PREG (reg);
    691  1.1  christos     case 4: return &IREG (reg & 3);
    692  1.1  christos     case 5: return &MREG (reg & 3);
    693  1.1  christos     case 6: return &BREG (reg & 3);
    694  1.1  christos     case 7: return &LREG (reg & 3);
    695  1.1  christos     default:
    696  1.1  christos       switch (fullreg)
    697  1.1  christos 	{
    698  1.1  christos 	case 32: return &AXREG (0);
    699  1.1  christos 	case 33: return &AWREG (0);
    700  1.1  christos 	case 34: return &AXREG (1);
    701  1.1  christos 	case 35: return &AWREG (1);
    702  1.1  christos 	case 39: return &RETSREG;
    703  1.1  christos 	case 48: return &LCREG (0);
    704  1.1  christos 	case 49: return &LTREG (0);
    705  1.1  christos 	case 50: return &LBREG (0);
    706  1.1  christos 	case 51: return &LCREG (1);
    707  1.1  christos 	case 52: return &LTREG (1);
    708  1.1  christos 	case 53: return &LBREG (1);
    709  1.1  christos 	}
    710  1.1  christos     }
    711  1.1  christos   abort ();
    712  1.1  christos }
    713  1.1  christos 
    714  1.1  christos static int
    715  1.1  christos decode_ProgCtrl_0 (TIword iw0, disassemble_info *outf)
    716  1.1  christos {
    717  1.1  christos   /* ProgCtrl
    718  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
    719  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........|
    720  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
    721  1.1  christos   int poprnd  = ((iw0 >> ProgCtrl_poprnd_bits) & ProgCtrl_poprnd_mask);
    722  1.1  christos   int prgfunc = ((iw0 >> ProgCtrl_prgfunc_bits) & ProgCtrl_prgfunc_mask);
    723  1.1  christos 
    724  1.1  christos   if (prgfunc == 0 && poprnd == 0)
    725  1.1  christos     OUTS (outf, "NOP");
    726  1.1  christos   else if (parallel)
    727  1.1  christos     return 0;
    728  1.1  christos   else if (prgfunc == 1 && poprnd == 0)
    729  1.1  christos     OUTS (outf, "RTS");
    730  1.1  christos   else if (prgfunc == 1 && poprnd == 1)
    731  1.1  christos     OUTS (outf, "RTI");
    732  1.1  christos   else if (prgfunc == 1 && poprnd == 2)
    733  1.1  christos     OUTS (outf, "RTX");
    734  1.1  christos   else if (prgfunc == 1 && poprnd == 3)
    735  1.1  christos     OUTS (outf, "RTN");
    736  1.1  christos   else if (prgfunc == 1 && poprnd == 4)
    737  1.1  christos     OUTS (outf, "RTE");
    738  1.1  christos   else if (prgfunc == 2 && poprnd == 0)
    739  1.1  christos     OUTS (outf, "IDLE");
    740  1.1  christos   else if (prgfunc == 2 && poprnd == 3)
    741  1.1  christos     OUTS (outf, "CSYNC");
    742  1.1  christos   else if (prgfunc == 2 && poprnd == 4)
    743  1.1  christos     OUTS (outf, "SSYNC");
    744  1.1  christos   else if (prgfunc == 2 && poprnd == 5)
    745  1.1  christos     OUTS (outf, "EMUEXCPT");
    746  1.1  christos   else if (prgfunc == 3 && IS_DREG (0, poprnd))
    747  1.1  christos     {
    748  1.1  christos       OUTS (outf, "CLI ");
    749  1.1  christos       OUTS (outf, dregs (poprnd));
    750  1.1  christos     }
    751  1.1  christos   else if (prgfunc == 4 && IS_DREG (0, poprnd))
    752  1.1  christos     {
    753  1.1  christos       OUTS (outf, "STI ");
    754  1.1  christos       OUTS (outf, dregs (poprnd));
    755  1.1  christos     }
    756  1.1  christos   else if (prgfunc == 5 && IS_PREG (1, poprnd))
    757  1.1  christos     {
    758  1.1  christos       OUTS (outf, "JUMP (");
    759  1.1  christos       OUTS (outf, pregs (poprnd));
    760  1.1  christos       OUTS (outf, ")");
    761  1.1  christos     }
    762  1.1  christos   else if (prgfunc == 6 && IS_PREG (1, poprnd))
    763  1.1  christos     {
    764  1.1  christos       OUTS (outf, "CALL (");
    765  1.1  christos       OUTS (outf, pregs (poprnd));
    766  1.1  christos       OUTS (outf, ")");
    767  1.1  christos     }
    768  1.1  christos   else if (prgfunc == 7 && IS_PREG (1, poprnd))
    769  1.1  christos     {
    770  1.1  christos       OUTS (outf, "CALL (PC + ");
    771  1.1  christos       OUTS (outf, pregs (poprnd));
    772  1.1  christos       OUTS (outf, ")");
    773  1.1  christos     }
    774  1.1  christos   else if (prgfunc == 8 && IS_PREG (1, poprnd))
    775  1.1  christos     {
    776  1.1  christos       OUTS (outf, "JUMP (PC + ");
    777  1.1  christos       OUTS (outf, pregs (poprnd));
    778  1.1  christos       OUTS (outf, ")");
    779  1.1  christos     }
    780  1.1  christos   else if (prgfunc == 9)
    781  1.1  christos     {
    782  1.1  christos       OUTS (outf, "RAISE ");
    783  1.1  christos       OUTS (outf, uimm4 (poprnd));
    784  1.1  christos     }
    785  1.1  christos   else if (prgfunc == 10)
    786  1.1  christos     {
    787  1.1  christos       OUTS (outf, "EXCPT ");
    788  1.1  christos       OUTS (outf, uimm4 (poprnd));
    789  1.1  christos     }
    790  1.1  christos   else if (prgfunc == 11 && IS_PREG (1, poprnd) && poprnd <= 5)
    791  1.1  christos     {
    792  1.1  christos       OUTS (outf, "TESTSET (");
    793  1.1  christos       OUTS (outf, pregs (poprnd));
    794  1.1  christos       OUTS (outf, ")");
    795  1.1  christos     }
    796  1.1  christos   else
    797  1.1  christos     return 0;
    798  1.1  christos   return 2;
    799  1.1  christos }
    800  1.1  christos 
    801  1.1  christos static int
    802  1.1  christos decode_CaCTRL_0 (TIword iw0, disassemble_info *outf)
    803  1.1  christos {
    804  1.1  christos   /* CaCTRL
    805  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
    806  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......|
    807  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
    808  1.1  christos   int a   = ((iw0 >> CaCTRL_a_bits) & CaCTRL_a_mask);
    809  1.1  christos   int op  = ((iw0 >> CaCTRL_op_bits) & CaCTRL_op_mask);
    810  1.1  christos   int reg = ((iw0 >> CaCTRL_reg_bits) & CaCTRL_reg_mask);
    811  1.1  christos 
    812  1.1  christos   if (parallel)
    813  1.1  christos     return 0;
    814  1.1  christos 
    815  1.1  christos   if (a == 0 && op == 0)
    816  1.1  christos     {
    817  1.1  christos       OUTS (outf, "PREFETCH[");
    818  1.1  christos       OUTS (outf, pregs (reg));
    819  1.1  christos       OUTS (outf, "]");
    820  1.1  christos     }
    821  1.1  christos   else if (a == 0 && op == 1)
    822  1.1  christos     {
    823  1.1  christos       OUTS (outf, "FLUSHINV[");
    824  1.1  christos       OUTS (outf, pregs (reg));
    825  1.1  christos       OUTS (outf, "]");
    826  1.1  christos     }
    827  1.1  christos   else if (a == 0 && op == 2)
    828  1.1  christos     {
    829  1.1  christos       OUTS (outf, "FLUSH[");
    830  1.1  christos       OUTS (outf, pregs (reg));
    831  1.1  christos       OUTS (outf, "]");
    832  1.1  christos     }
    833  1.1  christos   else if (a == 0 && op == 3)
    834  1.1  christos     {
    835  1.1  christos       OUTS (outf, "IFLUSH[");
    836  1.1  christos       OUTS (outf, pregs (reg));
    837  1.1  christos       OUTS (outf, "]");
    838  1.1  christos     }
    839  1.1  christos   else if (a == 1 && op == 0)
    840  1.1  christos     {
    841  1.1  christos       OUTS (outf, "PREFETCH[");
    842  1.1  christos       OUTS (outf, pregs (reg));
    843  1.1  christos       OUTS (outf, "++]");
    844  1.1  christos     }
    845  1.1  christos   else if (a == 1 && op == 1)
    846  1.1  christos     {
    847  1.1  christos       OUTS (outf, "FLUSHINV[");
    848  1.1  christos       OUTS (outf, pregs (reg));
    849  1.1  christos       OUTS (outf, "++]");
    850  1.1  christos     }
    851  1.1  christos   else if (a == 1 && op == 2)
    852  1.1  christos     {
    853  1.1  christos       OUTS (outf, "FLUSH[");
    854  1.1  christos       OUTS (outf, pregs (reg));
    855  1.1  christos       OUTS (outf, "++]");
    856  1.1  christos     }
    857  1.1  christos   else if (a == 1 && op == 3)
    858  1.1  christos     {
    859  1.1  christos       OUTS (outf, "IFLUSH[");
    860  1.1  christos       OUTS (outf, pregs (reg));
    861  1.1  christos       OUTS (outf, "++]");
    862  1.1  christos     }
    863  1.1  christos   else
    864  1.1  christos     return 0;
    865  1.1  christos   return 2;
    866  1.1  christos }
    867  1.1  christos 
    868  1.1  christos static int
    869  1.1  christos decode_PushPopReg_0 (TIword iw0, disassemble_info *outf)
    870  1.1  christos {
    871  1.1  christos   /* PushPopReg
    872  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
    873  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......|
    874  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
    875  1.1  christos   int W   = ((iw0 >> PushPopReg_W_bits) & PushPopReg_W_mask);
    876  1.1  christos   int grp = ((iw0 >> PushPopReg_grp_bits) & PushPopReg_grp_mask);
    877  1.1  christos   int reg = ((iw0 >> PushPopReg_reg_bits) & PushPopReg_reg_mask);
    878  1.1  christos 
    879  1.1  christos   if (parallel)
    880  1.1  christos     return 0;
    881  1.1  christos 
    882  1.1  christos   if (W == 0 && mostreg (reg, grp))
    883  1.1  christos     {
    884  1.1  christos       OUTS (outf, allregs (reg, grp));
    885  1.1  christos       OUTS (outf, " = [SP++]");
    886  1.1  christos     }
    887  1.1  christos   else if (W == 1 && allreg (reg, grp) && !(grp == 1 && reg == 6))
    888  1.1  christos     {
    889  1.1  christos       OUTS (outf, "[--SP] = ");
    890  1.1  christos       OUTS (outf, allregs (reg, grp));
    891  1.1  christos     }
    892  1.1  christos   else
    893  1.1  christos     return 0;
    894  1.1  christos   return 2;
    895  1.1  christos }
    896  1.1  christos 
    897  1.1  christos static int
    898  1.1  christos decode_PushPopMultiple_0 (TIword iw0, disassemble_info *outf)
    899  1.1  christos {
    900  1.1  christos   /* PushPopMultiple
    901  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
    902  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........|
    903  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
    904  1.1  christos   int p  = ((iw0 >> PushPopMultiple_p_bits) & PushPopMultiple_p_mask);
    905  1.1  christos   int d  = ((iw0 >> PushPopMultiple_d_bits) & PushPopMultiple_d_mask);
    906  1.1  christos   int W  = ((iw0 >> PushPopMultiple_W_bits) & PushPopMultiple_W_mask);
    907  1.1  christos   int dr = ((iw0 >> PushPopMultiple_dr_bits) & PushPopMultiple_dr_mask);
    908  1.1  christos   int pr = ((iw0 >> PushPopMultiple_pr_bits) & PushPopMultiple_pr_mask);
    909  1.1  christos 
    910  1.1  christos   if (parallel)
    911  1.1  christos     return 0;
    912  1.1  christos 
    913  1.1  christos   if (pr > 5)
    914  1.1  christos     return 0;
    915  1.1  christos 
    916  1.1  christos   if (W == 1 && d == 1 && p == 1)
    917  1.1  christos     {
    918  1.1  christos       OUTS (outf, "[--SP] = (R7:");
    919  1.1  christos       OUTS (outf, imm5d (dr));
    920  1.1  christos       OUTS (outf, ", P5:");
    921  1.1  christos       OUTS (outf, imm5d (pr));
    922  1.1  christos       OUTS (outf, ")");
    923  1.1  christos     }
    924  1.1  christos   else if (W == 1 && d == 1 && p == 0 && pr == 0)
    925  1.1  christos     {
    926  1.1  christos       OUTS (outf, "[--SP] = (R7:");
    927  1.1  christos       OUTS (outf, imm5d (dr));
    928  1.1  christos       OUTS (outf, ")");
    929  1.1  christos     }
    930  1.1  christos   else if (W == 1 && d == 0 && p == 1 && dr == 0)
    931  1.1  christos     {
    932  1.1  christos       OUTS (outf, "[--SP] = (P5:");
    933  1.1  christos       OUTS (outf, imm5d (pr));
    934  1.1  christos       OUTS (outf, ")");
    935  1.1  christos     }
    936  1.1  christos   else if (W == 0 && d == 1 && p == 1)
    937  1.1  christos     {
    938  1.1  christos       OUTS (outf, "(R7:");
    939  1.1  christos       OUTS (outf, imm5d (dr));
    940  1.1  christos       OUTS (outf, ", P5:");
    941  1.1  christos       OUTS (outf, imm5d (pr));
    942  1.1  christos       OUTS (outf, ") = [SP++]");
    943  1.1  christos     }
    944  1.1  christos   else if (W == 0 && d == 1 && p == 0 && pr == 0)
    945  1.1  christos     {
    946  1.1  christos       OUTS (outf, "(R7:");
    947  1.1  christos       OUTS (outf, imm5d (dr));
    948  1.1  christos       OUTS (outf, ") = [SP++]");
    949  1.1  christos     }
    950  1.1  christos   else if (W == 0 && d == 0 && p == 1 && dr == 0)
    951  1.1  christos     {
    952  1.1  christos       OUTS (outf, "(P5:");
    953  1.1  christos       OUTS (outf, imm5d (pr));
    954  1.1  christos       OUTS (outf, ") = [SP++]");
    955  1.1  christos     }
    956  1.1  christos   else
    957  1.1  christos     return 0;
    958  1.1  christos   return 2;
    959  1.1  christos }
    960  1.1  christos 
    961  1.1  christos static int
    962  1.1  christos decode_ccMV_0 (TIword iw0, disassemble_info *outf)
    963  1.1  christos {
    964  1.1  christos   /* ccMV
    965  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
    966  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......|
    967  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
    968  1.1  christos   int s  = ((iw0 >> CCmv_s_bits) & CCmv_s_mask);
    969  1.1  christos   int d  = ((iw0 >> CCmv_d_bits) & CCmv_d_mask);
    970  1.1  christos   int T  = ((iw0 >> CCmv_T_bits) & CCmv_T_mask);
    971  1.1  christos   int src = ((iw0 >> CCmv_src_bits) & CCmv_src_mask);
    972  1.1  christos   int dst = ((iw0 >> CCmv_dst_bits) & CCmv_dst_mask);
    973  1.1  christos 
    974  1.1  christos   if (parallel)
    975  1.1  christos     return 0;
    976  1.1  christos 
    977  1.1  christos   if (T == 1)
    978  1.1  christos     {
    979  1.1  christos       OUTS (outf, "IF CC ");
    980  1.1  christos       OUTS (outf, gregs (dst, d));
    981  1.1  christos       OUTS (outf, " = ");
    982  1.1  christos       OUTS (outf, gregs (src, s));
    983  1.1  christos     }
    984  1.1  christos   else if (T == 0)
    985  1.1  christos     {
    986  1.1  christos       OUTS (outf, "IF !CC ");
    987  1.1  christos       OUTS (outf, gregs (dst, d));
    988  1.1  christos       OUTS (outf, " = ");
    989  1.1  christos       OUTS (outf, gregs (src, s));
    990  1.1  christos     }
    991  1.1  christos   else
    992  1.1  christos     return 0;
    993  1.1  christos   return 2;
    994  1.1  christos }
    995  1.1  christos 
    996  1.1  christos static int
    997  1.1  christos decode_CCflag_0 (TIword iw0, disassemble_info *outf)
    998  1.1  christos {
    999  1.1  christos   /* CCflag
   1000  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1001  1.1  christos      | 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........|
   1002  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1003  1.1  christos   int x = ((iw0 >> CCflag_x_bits) & CCflag_x_mask);
   1004  1.1  christos   int y = ((iw0 >> CCflag_y_bits) & CCflag_y_mask);
   1005  1.1  christos   int I = ((iw0 >> CCflag_I_bits) & CCflag_I_mask);
   1006  1.1  christos   int G = ((iw0 >> CCflag_G_bits) & CCflag_G_mask);
   1007  1.1  christos   int opc = ((iw0 >> CCflag_opc_bits) & CCflag_opc_mask);
   1008  1.1  christos 
   1009  1.1  christos   if (parallel)
   1010  1.1  christos     return 0;
   1011  1.1  christos 
   1012  1.1  christos   if (opc == 0 && I == 0 && G == 0)
   1013  1.1  christos     {
   1014  1.1  christos       OUTS (outf, "CC = ");
   1015  1.1  christos       OUTS (outf, dregs (x));
   1016  1.1  christos       OUTS (outf, " == ");
   1017  1.1  christos       OUTS (outf, dregs (y));
   1018  1.1  christos     }
   1019  1.1  christos   else if (opc == 1 && I == 0 && G == 0)
   1020  1.1  christos     {
   1021  1.1  christos       OUTS (outf, "CC = ");
   1022  1.1  christos       OUTS (outf, dregs (x));
   1023  1.1  christos       OUTS (outf, " < ");
   1024  1.1  christos       OUTS (outf, dregs (y));
   1025  1.1  christos     }
   1026  1.1  christos   else if (opc == 2 && I == 0 && G == 0)
   1027  1.1  christos     {
   1028  1.1  christos       OUTS (outf, "CC = ");
   1029  1.1  christos       OUTS (outf, dregs (x));
   1030  1.1  christos       OUTS (outf, " <= ");
   1031  1.1  christos       OUTS (outf, dregs (y));
   1032  1.1  christos     }
   1033  1.1  christos   else if (opc == 3 && I == 0 && G == 0)
   1034  1.1  christos     {
   1035  1.1  christos       OUTS (outf, "CC = ");
   1036  1.1  christos       OUTS (outf, dregs (x));
   1037  1.1  christos       OUTS (outf, " < ");
   1038  1.1  christos       OUTS (outf, dregs (y));
   1039  1.1  christos       OUTS (outf, " (IU)");
   1040  1.1  christos     }
   1041  1.1  christos   else if (opc == 4 && I == 0 && G == 0)
   1042  1.1  christos     {
   1043  1.1  christos       OUTS (outf, "CC = ");
   1044  1.1  christos       OUTS (outf, dregs (x));
   1045  1.1  christos       OUTS (outf, " <= ");
   1046  1.1  christos       OUTS (outf, dregs (y));
   1047  1.1  christos       OUTS (outf, " (IU)");
   1048  1.1  christos     }
   1049  1.1  christos   else if (opc == 0 && I == 1 && G == 0)
   1050  1.1  christos     {
   1051  1.1  christos       OUTS (outf, "CC = ");
   1052  1.1  christos       OUTS (outf, dregs (x));
   1053  1.1  christos       OUTS (outf, " == ");
   1054  1.1  christos       OUTS (outf, imm3 (y));
   1055  1.1  christos     }
   1056  1.1  christos   else if (opc == 1 && I == 1 && G == 0)
   1057  1.1  christos     {
   1058  1.1  christos       OUTS (outf, "CC = ");
   1059  1.1  christos       OUTS (outf, dregs (x));
   1060  1.1  christos       OUTS (outf, " < ");
   1061  1.1  christos       OUTS (outf, imm3 (y));
   1062  1.1  christos     }
   1063  1.1  christos   else if (opc == 2 && I == 1 && G == 0)
   1064  1.1  christos     {
   1065  1.1  christos       OUTS (outf, "CC = ");
   1066  1.1  christos       OUTS (outf, dregs (x));
   1067  1.1  christos       OUTS (outf, " <= ");
   1068  1.1  christos       OUTS (outf, imm3 (y));
   1069  1.1  christos     }
   1070  1.1  christos   else if (opc == 3 && I == 1 && G == 0)
   1071  1.1  christos     {
   1072  1.1  christos       OUTS (outf, "CC = ");
   1073  1.1  christos       OUTS (outf, dregs (x));
   1074  1.1  christos       OUTS (outf, " < ");
   1075  1.1  christos       OUTS (outf, uimm3 (y));
   1076  1.1  christos       OUTS (outf, " (IU)");
   1077  1.1  christos     }
   1078  1.1  christos   else if (opc == 4 && I == 1 && G == 0)
   1079  1.1  christos     {
   1080  1.1  christos       OUTS (outf, "CC = ");
   1081  1.1  christos       OUTS (outf, dregs (x));
   1082  1.1  christos       OUTS (outf, " <= ");
   1083  1.1  christos       OUTS (outf, uimm3 (y));
   1084  1.1  christos       OUTS (outf, " (IU)");
   1085  1.1  christos     }
   1086  1.1  christos   else if (opc == 0 && I == 0 && G == 1)
   1087  1.1  christos     {
   1088  1.1  christos       OUTS (outf, "CC = ");
   1089  1.1  christos       OUTS (outf, pregs (x));
   1090  1.1  christos       OUTS (outf, " == ");
   1091  1.1  christos       OUTS (outf, pregs (y));
   1092  1.1  christos     }
   1093  1.1  christos   else if (opc == 1 && I == 0 && G == 1)
   1094  1.1  christos     {
   1095  1.1  christos       OUTS (outf, "CC = ");
   1096  1.1  christos       OUTS (outf, pregs (x));
   1097  1.1  christos       OUTS (outf, " < ");
   1098  1.1  christos       OUTS (outf, pregs (y));
   1099  1.1  christos     }
   1100  1.1  christos   else if (opc == 2 && I == 0 && G == 1)
   1101  1.1  christos     {
   1102  1.1  christos       OUTS (outf, "CC = ");
   1103  1.1  christos       OUTS (outf, pregs (x));
   1104  1.1  christos       OUTS (outf, " <= ");
   1105  1.1  christos       OUTS (outf, pregs (y));
   1106  1.1  christos     }
   1107  1.1  christos   else if (opc == 3 && I == 0 && G == 1)
   1108  1.1  christos     {
   1109  1.1  christos       OUTS (outf, "CC = ");
   1110  1.1  christos       OUTS (outf, pregs (x));
   1111  1.1  christos       OUTS (outf, " < ");
   1112  1.1  christos       OUTS (outf, pregs (y));
   1113  1.1  christos       OUTS (outf, " (IU)");
   1114  1.1  christos     }
   1115  1.1  christos   else if (opc == 4 && I == 0 && G == 1)
   1116  1.1  christos     {
   1117  1.1  christos       OUTS (outf, "CC = ");
   1118  1.1  christos       OUTS (outf, pregs (x));
   1119  1.1  christos       OUTS (outf, " <= ");
   1120  1.1  christos       OUTS (outf, pregs (y));
   1121  1.1  christos       OUTS (outf, " (IU)");
   1122  1.1  christos     }
   1123  1.1  christos   else if (opc == 0 && I == 1 && G == 1)
   1124  1.1  christos     {
   1125  1.1  christos       OUTS (outf, "CC = ");
   1126  1.1  christos       OUTS (outf, pregs (x));
   1127  1.1  christos       OUTS (outf, " == ");
   1128  1.1  christos       OUTS (outf, imm3 (y));
   1129  1.1  christos     }
   1130  1.1  christos   else if (opc == 1 && I == 1 && G == 1)
   1131  1.1  christos     {
   1132  1.1  christos       OUTS (outf, "CC = ");
   1133  1.1  christos       OUTS (outf, pregs (x));
   1134  1.1  christos       OUTS (outf, " < ");
   1135  1.1  christos       OUTS (outf, imm3 (y));
   1136  1.1  christos     }
   1137  1.1  christos   else if (opc == 2 && I == 1 && G == 1)
   1138  1.1  christos     {
   1139  1.1  christos       OUTS (outf, "CC = ");
   1140  1.1  christos       OUTS (outf, pregs (x));
   1141  1.1  christos       OUTS (outf, " <= ");
   1142  1.1  christos       OUTS (outf, imm3 (y));
   1143  1.1  christos     }
   1144  1.1  christos   else if (opc == 3 && I == 1 && G == 1)
   1145  1.1  christos     {
   1146  1.1  christos       OUTS (outf, "CC = ");
   1147  1.1  christos       OUTS (outf, pregs (x));
   1148  1.1  christos       OUTS (outf, " < ");
   1149  1.1  christos       OUTS (outf, uimm3 (y));
   1150  1.1  christos       OUTS (outf, " (IU)");
   1151  1.1  christos     }
   1152  1.1  christos   else if (opc == 4 && I == 1 && G == 1)
   1153  1.1  christos     {
   1154  1.1  christos       OUTS (outf, "CC = ");
   1155  1.1  christos       OUTS (outf, pregs (x));
   1156  1.1  christos       OUTS (outf, " <= ");
   1157  1.1  christos       OUTS (outf, uimm3 (y));
   1158  1.1  christos       OUTS (outf, " (IU)");
   1159  1.1  christos     }
   1160  1.1  christos   else if (opc == 5 && I == 0 && G == 0 && x == 0 && y == 0)
   1161  1.1  christos     OUTS (outf, "CC = A0 == A1");
   1162  1.1  christos 
   1163  1.1  christos   else if (opc == 6 && I == 0 && G == 0 && x == 0 && y == 0)
   1164  1.1  christos     OUTS (outf, "CC = A0 < A1");
   1165  1.1  christos 
   1166  1.1  christos   else if (opc == 7 && I == 0 && G == 0 && x == 0 && y == 0)
   1167  1.1  christos     OUTS (outf, "CC = A0 <= A1");
   1168  1.1  christos 
   1169  1.1  christos   else
   1170  1.1  christos     return 0;
   1171  1.1  christos   return 2;
   1172  1.1  christos }
   1173  1.1  christos 
   1174  1.1  christos static int
   1175  1.1  christos decode_CC2dreg_0 (TIword iw0, disassemble_info *outf)
   1176  1.1  christos {
   1177  1.1  christos   /* CC2dreg
   1178  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1179  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |.op....|.reg.......|
   1180  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1181  1.1  christos   int op  = ((iw0 >> CC2dreg_op_bits) & CC2dreg_op_mask);
   1182  1.1  christos   int reg = ((iw0 >> CC2dreg_reg_bits) & CC2dreg_reg_mask);
   1183  1.1  christos 
   1184  1.1  christos   if (parallel)
   1185  1.1  christos     return 0;
   1186  1.1  christos 
   1187  1.1  christos   if (op == 0)
   1188  1.1  christos     {
   1189  1.1  christos       OUTS (outf, dregs (reg));
   1190  1.1  christos       OUTS (outf, " = CC");
   1191  1.1  christos     }
   1192  1.1  christos   else if (op == 1)
   1193  1.1  christos     {
   1194  1.1  christos       OUTS (outf, "CC = ");
   1195  1.1  christos       OUTS (outf, dregs (reg));
   1196  1.1  christos     }
   1197  1.1  christos   else if (op == 3 && reg == 0)
   1198  1.1  christos     OUTS (outf, "CC = !CC");
   1199  1.1  christos   else
   1200  1.1  christos     return 0;
   1201  1.1  christos 
   1202  1.1  christos   return 2;
   1203  1.1  christos }
   1204  1.1  christos 
   1205  1.1  christos static int
   1206  1.1  christos decode_CC2stat_0 (TIword iw0, disassemble_info *outf)
   1207  1.1  christos {
   1208  1.1  christos   /* CC2stat
   1209  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1210  1.1  christos      | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............|
   1211  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1212  1.1  christos   int D    = ((iw0 >> CC2stat_D_bits) & CC2stat_D_mask);
   1213  1.1  christos   int op   = ((iw0 >> CC2stat_op_bits) & CC2stat_op_mask);
   1214  1.1  christos   int cbit = ((iw0 >> CC2stat_cbit_bits) & CC2stat_cbit_mask);
   1215  1.1  christos 
   1216  1.1  christos   const char *bitname = statbits (cbit);
   1217  1.1  christos 
   1218  1.1  christos   if (parallel)
   1219  1.1  christos     return 0;
   1220  1.1  christos 
   1221  1.1  christos   if (decode_statbits[cbit] == REG_LASTREG)
   1222  1.1  christos     {
   1223  1.1  christos       /* All ASTAT bits except CC may be operated on in hardware, but may
   1224  1.1  christos          not have a dedicated insn, so still decode "valid" insns.  */
   1225  1.1  christos       static char bitnames[64];
   1226  1.1  christos       if (cbit != 5)
   1227  1.1  christos 	sprintf (bitnames, "ASTAT[%i /* unused bit */]", cbit);
   1228  1.1  christos       else
   1229  1.1  christos 	return 0;
   1230  1.1  christos 
   1231  1.1  christos       bitname = bitnames;
   1232  1.1  christos     }
   1233  1.1  christos 
   1234  1.1  christos   if (op == 0 && D == 0)
   1235  1.1  christos     {
   1236  1.1  christos       OUTS (outf, "CC = ");
   1237  1.1  christos       OUTS (outf, bitname);
   1238  1.1  christos     }
   1239  1.1  christos   else if (op == 1 && D == 0)
   1240  1.1  christos     {
   1241  1.1  christos       OUTS (outf, "CC |= ");
   1242  1.1  christos       OUTS (outf, bitname);
   1243  1.1  christos     }
   1244  1.1  christos   else if (op == 2 && D == 0)
   1245  1.1  christos     {
   1246  1.1  christos       OUTS (outf, "CC &= ");
   1247  1.1  christos       OUTS (outf, bitname);
   1248  1.1  christos     }
   1249  1.1  christos   else if (op == 3 && D == 0)
   1250  1.1  christos     {
   1251  1.1  christos       OUTS (outf, "CC ^= ");
   1252  1.1  christos       OUTS (outf, bitname);
   1253  1.1  christos     }
   1254  1.1  christos   else if (op == 0 && D == 1)
   1255  1.1  christos     {
   1256  1.1  christos       OUTS (outf, bitname);
   1257  1.1  christos       OUTS (outf, " = CC");
   1258  1.1  christos     }
   1259  1.1  christos   else if (op == 1 && D == 1)
   1260  1.1  christos     {
   1261  1.1  christos       OUTS (outf, bitname);
   1262  1.1  christos       OUTS (outf, " |= CC");
   1263  1.1  christos     }
   1264  1.1  christos   else if (op == 2 && D == 1)
   1265  1.1  christos     {
   1266  1.1  christos       OUTS (outf, bitname);
   1267  1.1  christos       OUTS (outf, " &= CC");
   1268  1.1  christos     }
   1269  1.1  christos   else if (op == 3 && D == 1)
   1270  1.1  christos     {
   1271  1.1  christos       OUTS (outf, bitname);
   1272  1.1  christos       OUTS (outf, " ^= CC");
   1273  1.1  christos     }
   1274  1.1  christos   else
   1275  1.1  christos     return 0;
   1276  1.1  christos 
   1277  1.1  christos   return 2;
   1278  1.1  christos }
   1279  1.1  christos 
   1280  1.1  christos static int
   1281  1.1  christos decode_BRCC_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
   1282  1.1  christos {
   1283  1.1  christos   /* BRCC
   1284  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1285  1.1  christos      | 0 | 0 | 0 | 1 |.T.|.B.|.offset................................|
   1286  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1287  1.1  christos   int B = ((iw0 >> BRCC_B_bits) & BRCC_B_mask);
   1288  1.1  christos   int T = ((iw0 >> BRCC_T_bits) & BRCC_T_mask);
   1289  1.1  christos   int offset = ((iw0 >> BRCC_offset_bits) & BRCC_offset_mask);
   1290  1.1  christos 
   1291  1.1  christos   if (parallel)
   1292  1.1  christos     return 0;
   1293  1.1  christos 
   1294  1.1  christos   if (T == 1 && B == 1)
   1295  1.1  christos     {
   1296  1.1  christos       OUTS (outf, "IF CC JUMP 0x");
   1297  1.1  christos       OUTS (outf, pcrel10 (offset));
   1298  1.1  christos       OUTS (outf, " (BP)");
   1299  1.1  christos     }
   1300  1.1  christos   else if (T == 0 && B == 1)
   1301  1.1  christos     {
   1302  1.1  christos       OUTS (outf, "IF !CC JUMP 0x");
   1303  1.1  christos       OUTS (outf, pcrel10 (offset));
   1304  1.1  christos       OUTS (outf, " (BP)");
   1305  1.1  christos     }
   1306  1.1  christos   else if (T == 1)
   1307  1.1  christos     {
   1308  1.1  christos       OUTS (outf, "IF CC JUMP 0x");
   1309  1.1  christos       OUTS (outf, pcrel10 (offset));
   1310  1.1  christos     }
   1311  1.1  christos   else if (T == 0)
   1312  1.1  christos     {
   1313  1.1  christos       OUTS (outf, "IF !CC JUMP 0x");
   1314  1.1  christos       OUTS (outf, pcrel10 (offset));
   1315  1.1  christos     }
   1316  1.1  christos   else
   1317  1.1  christos     return 0;
   1318  1.1  christos 
   1319  1.1  christos   return 2;
   1320  1.1  christos }
   1321  1.1  christos 
   1322  1.1  christos static int
   1323  1.1  christos decode_UJUMP_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
   1324  1.1  christos {
   1325  1.1  christos   /* UJUMP
   1326  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1327  1.1  christos      | 0 | 0 | 1 | 0 |.offset........................................|
   1328  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1329  1.1  christos   int offset = ((iw0 >> UJump_offset_bits) & UJump_offset_mask);
   1330  1.1  christos 
   1331  1.1  christos   if (parallel)
   1332  1.1  christos     return 0;
   1333  1.1  christos 
   1334  1.1  christos   OUTS (outf, "JUMP.S 0x");
   1335  1.1  christos   OUTS (outf, pcrel12 (offset));
   1336  1.1  christos   return 2;
   1337  1.1  christos }
   1338  1.1  christos 
   1339  1.1  christos static int
   1340  1.1  christos decode_REGMV_0 (TIword iw0, disassemble_info *outf)
   1341  1.1  christos {
   1342  1.1  christos   /* REGMV
   1343  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1344  1.1  christos      | 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......|
   1345  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1346  1.1  christos   int gs  = ((iw0 >> RegMv_gs_bits) & RegMv_gs_mask);
   1347  1.1  christos   int gd  = ((iw0 >> RegMv_gd_bits) & RegMv_gd_mask);
   1348  1.1  christos   int src = ((iw0 >> RegMv_src_bits) & RegMv_src_mask);
   1349  1.1  christos   int dst = ((iw0 >> RegMv_dst_bits) & RegMv_dst_mask);
   1350  1.1  christos 
   1351  1.1  christos   /* Reserved slots cannot be a src/dst.  */
   1352  1.1  christos   if (IS_RESERVEDREG (gs, src) || IS_RESERVEDREG (gd, dst))
   1353  1.1  christos     goto invalid_move;
   1354  1.1  christos 
   1355  1.1  christos   /* Standard register moves  */
   1356  1.1  christos   if ((gs < 2) ||                               /* Dregs/Pregs as source  */
   1357  1.1  christos       (gd < 2) ||                               /* Dregs/Pregs as dest    */
   1358  1.1  christos       (gs == 4 && src < 4) ||                   /* Accumulators as source */
   1359  1.1  christos       (gd == 4 && dst < 4 && (gs < 4)) ||       /* Accumulators as dest   */
   1360  1.1  christos       (gs == 7 && src == 7 && !(gd == 4 && dst < 4)) || /* EMUDAT as src  */
   1361  1.1  christos       (gd == 7 && dst == 7))                    /* EMUDAT as dest         */
   1362  1.1  christos     goto valid_move;
   1363  1.1  christos 
   1364  1.1  christos   /* dareg = dareg (IMBL) */
   1365  1.1  christos   if (gs < 4 && gd < 4)
   1366  1.1  christos     goto valid_move;
   1367  1.1  christos 
   1368  1.1  christos   /* USP can be src to sysregs, but not dagregs.  */
   1369  1.1  christos   if ((gs == 7 && src == 0) && (gd >= 4))
   1370  1.1  christos     goto valid_move;
   1371  1.1  christos 
   1372  1.1  christos   /* USP can move between genregs (only check Accumulators).  */
   1373  1.1  christos   if (((gs == 7 && src == 0) && (gd == 4 && dst < 4)) ||
   1374  1.1  christos       ((gd == 7 && dst == 0) && (gs == 4 && src < 4)))
   1375  1.1  christos     goto valid_move;
   1376  1.1  christos 
   1377  1.1  christos   /* Still here ?  Invalid reg pair.  */
   1378  1.1  christos  invalid_move:
   1379  1.1  christos   return 0;
   1380  1.1  christos 
   1381  1.1  christos  valid_move:
   1382  1.1  christos   OUTS (outf, allregs (dst, gd));
   1383  1.1  christos   OUTS (outf, " = ");
   1384  1.1  christos   OUTS (outf, allregs (src, gs));
   1385  1.1  christos   return 2;
   1386  1.1  christos }
   1387  1.1  christos 
   1388  1.1  christos static int
   1389  1.1  christos decode_ALU2op_0 (TIword iw0, disassemble_info *outf)
   1390  1.1  christos {
   1391  1.1  christos   /* ALU2op
   1392  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1393  1.1  christos      | 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......|
   1394  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1395  1.1  christos   int src = ((iw0 >> ALU2op_src_bits) & ALU2op_src_mask);
   1396  1.1  christos   int opc = ((iw0 >> ALU2op_opc_bits) & ALU2op_opc_mask);
   1397  1.1  christos   int dst = ((iw0 >> ALU2op_dst_bits) & ALU2op_dst_mask);
   1398  1.1  christos 
   1399  1.1  christos   if (opc == 0)
   1400  1.1  christos     {
   1401  1.1  christos       OUTS (outf, dregs (dst));
   1402  1.1  christos       OUTS (outf, " >>>= ");
   1403  1.1  christos       OUTS (outf, dregs (src));
   1404  1.1  christos     }
   1405  1.1  christos   else if (opc == 1)
   1406  1.1  christos     {
   1407  1.1  christos       OUTS (outf, dregs (dst));
   1408  1.1  christos       OUTS (outf, " >>= ");
   1409  1.1  christos       OUTS (outf, dregs (src));
   1410  1.1  christos     }
   1411  1.1  christos   else if (opc == 2)
   1412  1.1  christos     {
   1413  1.1  christos       OUTS (outf, dregs (dst));
   1414  1.1  christos       OUTS (outf, " <<= ");
   1415  1.1  christos       OUTS (outf, dregs (src));
   1416  1.1  christos     }
   1417  1.1  christos   else if (opc == 3)
   1418  1.1  christos     {
   1419  1.1  christos       OUTS (outf, dregs (dst));
   1420  1.1  christos       OUTS (outf, " *= ");
   1421  1.1  christos       OUTS (outf, dregs (src));
   1422  1.1  christos     }
   1423  1.1  christos   else if (opc == 4)
   1424  1.1  christos     {
   1425  1.1  christos       OUTS (outf, dregs (dst));
   1426  1.1  christos       OUTS (outf, " = (");
   1427  1.1  christos       OUTS (outf, dregs (dst));
   1428  1.1  christos       OUTS (outf, " + ");
   1429  1.1  christos       OUTS (outf, dregs (src));
   1430  1.1  christos       OUTS (outf, ") << 0x1");
   1431  1.1  christos     }
   1432  1.1  christos   else if (opc == 5)
   1433  1.1  christos     {
   1434  1.1  christos       OUTS (outf, dregs (dst));
   1435  1.1  christos       OUTS (outf, " = (");
   1436  1.1  christos       OUTS (outf, dregs (dst));
   1437  1.1  christos       OUTS (outf, " + ");
   1438  1.1  christos       OUTS (outf, dregs (src));
   1439  1.1  christos       OUTS (outf, ") << 0x2");
   1440  1.1  christos     }
   1441  1.1  christos   else if (opc == 8)
   1442  1.1  christos     {
   1443  1.1  christos       OUTS (outf, "DIVQ (");
   1444  1.1  christos       OUTS (outf, dregs (dst));
   1445  1.1  christos       OUTS (outf, ", ");
   1446  1.1  christos       OUTS (outf, dregs (src));
   1447  1.1  christos       OUTS (outf, ")");
   1448  1.1  christos     }
   1449  1.1  christos   else if (opc == 9)
   1450  1.1  christos     {
   1451  1.1  christos       OUTS (outf, "DIVS (");
   1452  1.1  christos       OUTS (outf, dregs (dst));
   1453  1.1  christos       OUTS (outf, ", ");
   1454  1.1  christos       OUTS (outf, dregs (src));
   1455  1.1  christos       OUTS (outf, ")");
   1456  1.1  christos     }
   1457  1.1  christos   else if (opc == 10)
   1458  1.1  christos     {
   1459  1.1  christos       OUTS (outf, dregs (dst));
   1460  1.1  christos       OUTS (outf, " = ");
   1461  1.1  christos       OUTS (outf, dregs_lo (src));
   1462  1.1  christos       OUTS (outf, " (X)");
   1463  1.1  christos     }
   1464  1.1  christos   else if (opc == 11)
   1465  1.1  christos     {
   1466  1.1  christos       OUTS (outf, dregs (dst));
   1467  1.1  christos       OUTS (outf, " = ");
   1468  1.1  christos       OUTS (outf, dregs_lo (src));
   1469  1.1  christos       OUTS (outf, " (Z)");
   1470  1.1  christos     }
   1471  1.1  christos   else if (opc == 12)
   1472  1.1  christos     {
   1473  1.1  christos       OUTS (outf, dregs (dst));
   1474  1.1  christos       OUTS (outf, " = ");
   1475  1.1  christos       OUTS (outf, dregs_byte (src));
   1476  1.1  christos       OUTS (outf, " (X)");
   1477  1.1  christos     }
   1478  1.1  christos   else if (opc == 13)
   1479  1.1  christos     {
   1480  1.1  christos       OUTS (outf, dregs (dst));
   1481  1.1  christos       OUTS (outf, " = ");
   1482  1.1  christos       OUTS (outf, dregs_byte (src));
   1483  1.1  christos       OUTS (outf, " (Z)");
   1484  1.1  christos     }
   1485  1.1  christos   else if (opc == 14)
   1486  1.1  christos     {
   1487  1.1  christos       OUTS (outf, dregs (dst));
   1488  1.1  christos       OUTS (outf, " = -");
   1489  1.1  christos       OUTS (outf, dregs (src));
   1490  1.1  christos     }
   1491  1.1  christos   else if (opc == 15)
   1492  1.1  christos     {
   1493  1.1  christos       OUTS (outf, dregs (dst));
   1494  1.1  christos       OUTS (outf, " =~ ");
   1495  1.1  christos       OUTS (outf, dregs (src));
   1496  1.1  christos     }
   1497  1.1  christos   else
   1498  1.1  christos     return 0;
   1499  1.1  christos 
   1500  1.1  christos   return 2;
   1501  1.1  christos }
   1502  1.1  christos 
   1503  1.1  christos static int
   1504  1.1  christos decode_PTR2op_0 (TIword iw0, disassemble_info *outf)
   1505  1.1  christos {
   1506  1.1  christos   /* PTR2op
   1507  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1508  1.1  christos      | 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......|
   1509  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1510  1.1  christos   int src = ((iw0 >> PTR2op_src_bits) & PTR2op_dst_mask);
   1511  1.1  christos   int opc = ((iw0 >> PTR2op_opc_bits) & PTR2op_opc_mask);
   1512  1.1  christos   int dst = ((iw0 >> PTR2op_dst_bits) & PTR2op_dst_mask);
   1513  1.1  christos 
   1514  1.1  christos   if (opc == 0)
   1515  1.1  christos     {
   1516  1.1  christos       OUTS (outf, pregs (dst));
   1517  1.1  christos       OUTS (outf, " -= ");
   1518  1.1  christos       OUTS (outf, pregs (src));
   1519  1.1  christos     }
   1520  1.1  christos   else if (opc == 1)
   1521  1.1  christos     {
   1522  1.1  christos       OUTS (outf, pregs (dst));
   1523  1.1  christos       OUTS (outf, " = ");
   1524  1.1  christos       OUTS (outf, pregs (src));
   1525  1.1  christos       OUTS (outf, " << 0x2");
   1526  1.1  christos     }
   1527  1.1  christos   else if (opc == 3)
   1528  1.1  christos     {
   1529  1.1  christos       OUTS (outf, pregs (dst));
   1530  1.1  christos       OUTS (outf, " = ");
   1531  1.1  christos       OUTS (outf, pregs (src));
   1532  1.1  christos       OUTS (outf, " >> 0x2");
   1533  1.1  christos     }
   1534  1.1  christos   else if (opc == 4)
   1535  1.1  christos     {
   1536  1.1  christos       OUTS (outf, pregs (dst));
   1537  1.1  christos       OUTS (outf, " = ");
   1538  1.1  christos       OUTS (outf, pregs (src));
   1539  1.1  christos       OUTS (outf, " >> 0x1");
   1540  1.1  christos     }
   1541  1.1  christos   else if (opc == 5)
   1542  1.1  christos     {
   1543  1.1  christos       OUTS (outf, pregs (dst));
   1544  1.1  christos       OUTS (outf, " += ");
   1545  1.1  christos       OUTS (outf, pregs (src));
   1546  1.1  christos       OUTS (outf, " (BREV)");
   1547  1.1  christos     }
   1548  1.1  christos   else if (opc == 6)
   1549  1.1  christos     {
   1550  1.1  christos       OUTS (outf, pregs (dst));
   1551  1.1  christos       OUTS (outf, " = (");
   1552  1.1  christos       OUTS (outf, pregs (dst));
   1553  1.1  christos       OUTS (outf, " + ");
   1554  1.1  christos       OUTS (outf, pregs (src));
   1555  1.1  christos       OUTS (outf, ") << 0x1");
   1556  1.1  christos     }
   1557  1.1  christos   else if (opc == 7)
   1558  1.1  christos     {
   1559  1.1  christos       OUTS (outf, pregs (dst));
   1560  1.1  christos       OUTS (outf, " = (");
   1561  1.1  christos       OUTS (outf, pregs (dst));
   1562  1.1  christos       OUTS (outf, " + ");
   1563  1.1  christos       OUTS (outf, pregs (src));
   1564  1.1  christos       OUTS (outf, ") << 0x2");
   1565  1.1  christos     }
   1566  1.1  christos   else
   1567  1.1  christos     return 0;
   1568  1.1  christos 
   1569  1.1  christos   return 2;
   1570  1.1  christos }
   1571  1.1  christos 
   1572  1.1  christos static int
   1573  1.1  christos decode_LOGI2op_0 (TIword iw0, disassemble_info *outf)
   1574  1.1  christos {
   1575  1.1  christos   /* LOGI2op
   1576  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1577  1.1  christos      | 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......|
   1578  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1579  1.1  christos   int src = ((iw0 >> LOGI2op_src_bits) & LOGI2op_src_mask);
   1580  1.1  christos   int opc = ((iw0 >> LOGI2op_opc_bits) & LOGI2op_opc_mask);
   1581  1.1  christos   int dst = ((iw0 >> LOGI2op_dst_bits) & LOGI2op_dst_mask);
   1582  1.1  christos 
   1583  1.1  christos   if (parallel)
   1584  1.1  christos     return 0;
   1585  1.1  christos 
   1586  1.1  christos   if (opc == 0)
   1587  1.1  christos     {
   1588  1.1  christos       OUTS (outf, "CC = !BITTST (");
   1589  1.1  christos       OUTS (outf, dregs (dst));
   1590  1.1  christos       OUTS (outf, ", ");
   1591  1.1  christos       OUTS (outf, uimm5 (src));
   1592  1.1  christos       OUTS (outf, ");\t\t/* bit");
   1593  1.1  christos       OUTS (outf, imm7d (src));
   1594  1.1  christos       OUTS (outf, " */");
   1595  1.1  christos       comment = 1;
   1596  1.1  christos     }
   1597  1.1  christos   else if (opc == 1)
   1598  1.1  christos     {
   1599  1.1  christos       OUTS (outf, "CC = BITTST (");
   1600  1.1  christos       OUTS (outf, dregs (dst));
   1601  1.1  christos       OUTS (outf, ", ");
   1602  1.1  christos       OUTS (outf, uimm5 (src));
   1603  1.1  christos       OUTS (outf, ");\t\t/* bit");
   1604  1.1  christos       OUTS (outf, imm7d (src));
   1605  1.1  christos       OUTS (outf, " */");
   1606  1.1  christos       comment = 1;
   1607  1.1  christos     }
   1608  1.1  christos   else if (opc == 2)
   1609  1.1  christos     {
   1610  1.1  christos       OUTS (outf, "BITSET (");
   1611  1.1  christos       OUTS (outf, dregs (dst));
   1612  1.1  christos       OUTS (outf, ", ");
   1613  1.1  christos       OUTS (outf, uimm5 (src));
   1614  1.1  christos       OUTS (outf, ");\t\t/* bit");
   1615  1.1  christos       OUTS (outf, imm7d (src));
   1616  1.1  christos       OUTS (outf, " */");
   1617  1.1  christos       comment = 1;
   1618  1.1  christos     }
   1619  1.1  christos   else if (opc == 3)
   1620  1.1  christos     {
   1621  1.1  christos       OUTS (outf, "BITTGL (");
   1622  1.1  christos       OUTS (outf, dregs (dst));
   1623  1.1  christos       OUTS (outf, ", ");
   1624  1.1  christos       OUTS (outf, uimm5 (src));
   1625  1.1  christos       OUTS (outf, ");\t\t/* bit");
   1626  1.1  christos       OUTS (outf, imm7d (src));
   1627  1.1  christos       OUTS (outf, " */");
   1628  1.1  christos       comment = 1;
   1629  1.1  christos     }
   1630  1.1  christos   else if (opc == 4)
   1631  1.1  christos     {
   1632  1.1  christos       OUTS (outf, "BITCLR (");
   1633  1.1  christos       OUTS (outf, dregs (dst));
   1634  1.1  christos       OUTS (outf, ", ");
   1635  1.1  christos       OUTS (outf, uimm5 (src));
   1636  1.1  christos       OUTS (outf, ");\t\t/* bit");
   1637  1.1  christos       OUTS (outf, imm7d (src));
   1638  1.1  christos       OUTS (outf, " */");
   1639  1.1  christos       comment = 1;
   1640  1.1  christos     }
   1641  1.1  christos   else if (opc == 5)
   1642  1.1  christos     {
   1643  1.1  christos       OUTS (outf, dregs (dst));
   1644  1.1  christos       OUTS (outf, " >>>= ");
   1645  1.1  christos       OUTS (outf, uimm5 (src));
   1646  1.1  christos     }
   1647  1.1  christos   else if (opc == 6)
   1648  1.1  christos     {
   1649  1.1  christos       OUTS (outf, dregs (dst));
   1650  1.1  christos       OUTS (outf, " >>= ");
   1651  1.1  christos       OUTS (outf, uimm5 (src));
   1652  1.1  christos     }
   1653  1.1  christos   else if (opc == 7)
   1654  1.1  christos     {
   1655  1.1  christos       OUTS (outf, dregs (dst));
   1656  1.1  christos       OUTS (outf, " <<= ");
   1657  1.1  christos       OUTS (outf, uimm5 (src));
   1658  1.1  christos     }
   1659  1.1  christos   else
   1660  1.1  christos     return 0;
   1661  1.1  christos 
   1662  1.1  christos   return 2;
   1663  1.1  christos }
   1664  1.1  christos 
   1665  1.1  christos static int
   1666  1.1  christos decode_COMP3op_0 (TIword iw0, disassemble_info *outf)
   1667  1.1  christos {
   1668  1.1  christos   /* COMP3op
   1669  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1670  1.1  christos      | 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......|
   1671  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1672  1.1  christos   int opc  = ((iw0 >> COMP3op_opc_bits) & COMP3op_opc_mask);
   1673  1.1  christos   int dst  = ((iw0 >> COMP3op_dst_bits) & COMP3op_dst_mask);
   1674  1.1  christos   int src0 = ((iw0 >> COMP3op_src0_bits) & COMP3op_src0_mask);
   1675  1.1  christos   int src1 = ((iw0 >> COMP3op_src1_bits) & COMP3op_src1_mask);
   1676  1.1  christos 
   1677  1.1  christos   if (opc == 5 && src1 == src0)
   1678  1.1  christos     {
   1679  1.1  christos       OUTS (outf, pregs (dst));
   1680  1.1  christos       OUTS (outf, " = ");
   1681  1.1  christos       OUTS (outf, pregs (src0));
   1682  1.1  christos       OUTS (outf, " << 0x1");
   1683  1.1  christos     }
   1684  1.1  christos   else if (opc == 1)
   1685  1.1  christos     {
   1686  1.1  christos       OUTS (outf, dregs (dst));
   1687  1.1  christos       OUTS (outf, " = ");
   1688  1.1  christos       OUTS (outf, dregs (src0));
   1689  1.1  christos       OUTS (outf, " - ");
   1690  1.1  christos       OUTS (outf, dregs (src1));
   1691  1.1  christos     }
   1692  1.1  christos   else if (opc == 2)
   1693  1.1  christos     {
   1694  1.1  christos       OUTS (outf, dregs (dst));
   1695  1.1  christos       OUTS (outf, " = ");
   1696  1.1  christos       OUTS (outf, dregs (src0));
   1697  1.1  christos       OUTS (outf, " & ");
   1698  1.1  christos       OUTS (outf, dregs (src1));
   1699  1.1  christos     }
   1700  1.1  christos   else if (opc == 3)
   1701  1.1  christos     {
   1702  1.1  christos       OUTS (outf, dregs (dst));
   1703  1.1  christos       OUTS (outf, " = ");
   1704  1.1  christos       OUTS (outf, dregs (src0));
   1705  1.1  christos       OUTS (outf, " | ");
   1706  1.1  christos       OUTS (outf, dregs (src1));
   1707  1.1  christos     }
   1708  1.1  christos   else if (opc == 4)
   1709  1.1  christos     {
   1710  1.1  christos       OUTS (outf, dregs (dst));
   1711  1.1  christos       OUTS (outf, " = ");
   1712  1.1  christos       OUTS (outf, dregs (src0));
   1713  1.1  christos       OUTS (outf, " ^ ");
   1714  1.1  christos       OUTS (outf, dregs (src1));
   1715  1.1  christos     }
   1716  1.1  christos   else if (opc == 5)
   1717  1.1  christos     {
   1718  1.1  christos       OUTS (outf, pregs (dst));
   1719  1.1  christos       OUTS (outf, " = ");
   1720  1.1  christos       OUTS (outf, pregs (src0));
   1721  1.1  christos       OUTS (outf, " + ");
   1722  1.1  christos       OUTS (outf, pregs (src1));
   1723  1.1  christos     }
   1724  1.1  christos   else if (opc == 6)
   1725  1.1  christos     {
   1726  1.1  christos       OUTS (outf, pregs (dst));
   1727  1.1  christos       OUTS (outf, " = ");
   1728  1.1  christos       OUTS (outf, pregs (src0));
   1729  1.1  christos       OUTS (outf, " + (");
   1730  1.1  christos       OUTS (outf, pregs (src1));
   1731  1.1  christos       OUTS (outf, " << 0x1)");
   1732  1.1  christos     }
   1733  1.1  christos   else if (opc == 7)
   1734  1.1  christos     {
   1735  1.1  christos       OUTS (outf, pregs (dst));
   1736  1.1  christos       OUTS (outf, " = ");
   1737  1.1  christos       OUTS (outf, pregs (src0));
   1738  1.1  christos       OUTS (outf, " + (");
   1739  1.1  christos       OUTS (outf, pregs (src1));
   1740  1.1  christos       OUTS (outf, " << 0x2)");
   1741  1.1  christos     }
   1742  1.1  christos   else if (opc == 0)
   1743  1.1  christos     {
   1744  1.1  christos       OUTS (outf, dregs (dst));
   1745  1.1  christos       OUTS (outf, " = ");
   1746  1.1  christos       OUTS (outf, dregs (src0));
   1747  1.1  christos       OUTS (outf, " + ");
   1748  1.1  christos       OUTS (outf, dregs (src1));
   1749  1.1  christos     }
   1750  1.1  christos   else
   1751  1.1  christos     return 0;
   1752  1.1  christos 
   1753  1.1  christos   return 2;
   1754  1.1  christos }
   1755  1.1  christos 
   1756  1.1  christos static int
   1757  1.1  christos decode_COMPI2opD_0 (TIword iw0, disassemble_info *outf)
   1758  1.1  christos {
   1759  1.1  christos   /* COMPI2opD
   1760  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1761  1.1  christos      | 0 | 1 | 1 | 0 | 0 |.op|..src......................|.dst.......|
   1762  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1763  1.1  christos   int op  = ((iw0 >> COMPI2opD_op_bits) & COMPI2opD_op_mask);
   1764  1.1  christos   int dst = ((iw0 >> COMPI2opD_dst_bits) & COMPI2opD_dst_mask);
   1765  1.1  christos   int src = ((iw0 >> COMPI2opD_src_bits) & COMPI2opD_src_mask);
   1766  1.1  christos 
   1767  1.1  christos   bu32 *pval = get_allreg (0, dst);
   1768  1.1  christos 
   1769  1.1  christos   if (parallel)
   1770  1.1  christos     return 0;
   1771  1.1  christos 
   1772  1.1  christos   /* Since we don't have 32-bit immediate loads, we allow the disassembler
   1773  1.1  christos      to combine them, so it prints out the right values.
   1774  1.1  christos      Here we keep track of the registers.  */
   1775  1.1  christos   if (op == 0)
   1776  1.1  christos     {
   1777  1.1  christos       *pval = imm7_val (src);
   1778  1.1  christos       if (src & 0x40)
   1779  1.1  christos 	*pval |= 0xFFFFFF80;
   1780  1.1  christos       else
   1781  1.1  christos 	*pval &= 0x7F;
   1782  1.1  christos     }
   1783  1.1  christos 
   1784  1.1  christos   if (op == 0)
   1785  1.1  christos     {
   1786  1.1  christos       OUTS (outf, dregs (dst));
   1787  1.1  christos       OUTS (outf, " = ");
   1788  1.1  christos       OUTS (outf, imm7 (src));
   1789  1.1  christos       OUTS (outf, " (X);\t\t/*\t\t");
   1790  1.1  christos       OUTS (outf, dregs (dst));
   1791  1.1  christos       OUTS (outf, "=");
   1792  1.1  christos       OUTS (outf, uimm32 (*pval));
   1793  1.1  christos       OUTS (outf, "(");
   1794  1.1  christos       OUTS (outf, imm32 (*pval));
   1795  1.1  christos       OUTS (outf, ") */");
   1796  1.1  christos       comment = 1;
   1797  1.1  christos     }
   1798  1.1  christos   else if (op == 1)
   1799  1.1  christos     {
   1800  1.1  christos       OUTS (outf, dregs (dst));
   1801  1.1  christos       OUTS (outf, " += ");
   1802  1.1  christos       OUTS (outf, imm7 (src));
   1803  1.1  christos       OUTS (outf, ";\t\t/* (");
   1804  1.1  christos       OUTS (outf, imm7d (src));
   1805  1.1  christos       OUTS (outf, ") */");
   1806  1.1  christos       comment = 1;
   1807  1.1  christos     }
   1808  1.1  christos   else
   1809  1.1  christos     return 0;
   1810  1.1  christos 
   1811  1.1  christos   return 2;
   1812  1.1  christos }
   1813  1.1  christos 
   1814  1.1  christos static int
   1815  1.1  christos decode_COMPI2opP_0 (TIword iw0, disassemble_info *outf)
   1816  1.1  christos {
   1817  1.1  christos   /* COMPI2opP
   1818  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1819  1.1  christos      | 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......|
   1820  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1821  1.1  christos   int op  = ((iw0 >> COMPI2opP_op_bits) & COMPI2opP_op_mask);
   1822  1.1  christos   int src = ((iw0 >> COMPI2opP_src_bits) & COMPI2opP_src_mask);
   1823  1.1  christos   int dst = ((iw0 >> COMPI2opP_dst_bits) & COMPI2opP_dst_mask);
   1824  1.1  christos 
   1825  1.1  christos   bu32 *pval = get_allreg (1, dst);
   1826  1.1  christos 
   1827  1.1  christos   if (parallel)
   1828  1.1  christos     return 0;
   1829  1.1  christos 
   1830  1.1  christos   if (op == 0)
   1831  1.1  christos     {
   1832  1.1  christos       *pval = imm7_val (src);
   1833  1.1  christos       if (src & 0x40)
   1834  1.1  christos 	*pval |= 0xFFFFFF80;
   1835  1.1  christos       else
   1836  1.1  christos 	*pval &= 0x7F;
   1837  1.1  christos     }
   1838  1.1  christos 
   1839  1.1  christos   if (op == 0)
   1840  1.1  christos     {
   1841  1.1  christos       OUTS (outf, pregs (dst));
   1842  1.1  christos       OUTS (outf, " = ");
   1843  1.1  christos       OUTS (outf, imm7 (src));
   1844  1.1  christos       OUTS (outf, " (X);\t\t/*\t\t");
   1845  1.1  christos       OUTS (outf, pregs (dst));
   1846  1.1  christos       OUTS (outf, "=");
   1847  1.1  christos       OUTS (outf, uimm32 (*pval));
   1848  1.1  christos       OUTS (outf, "(");
   1849  1.1  christos       OUTS (outf, imm32 (*pval));
   1850  1.1  christos       OUTS (outf, ") */");
   1851  1.1  christos       comment = 1;
   1852  1.1  christos     }
   1853  1.1  christos   else if (op == 1)
   1854  1.1  christos     {
   1855  1.1  christos       OUTS (outf, pregs (dst));
   1856  1.1  christos       OUTS (outf, " += ");
   1857  1.1  christos       OUTS (outf, imm7 (src));
   1858  1.1  christos       OUTS (outf, ";\t\t/* (");
   1859  1.1  christos       OUTS (outf, imm7d (src));
   1860  1.1  christos       OUTS (outf, ") */");
   1861  1.1  christos       comment = 1;
   1862  1.1  christos     }
   1863  1.1  christos   else
   1864  1.1  christos     return 0;
   1865  1.1  christos 
   1866  1.1  christos   return 2;
   1867  1.1  christos }
   1868  1.1  christos 
   1869  1.1  christos static int
   1870  1.1  christos decode_LDSTpmod_0 (TIword iw0, disassemble_info *outf)
   1871  1.1  christos {
   1872  1.1  christos   /* LDSTpmod
   1873  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1874  1.1  christos      | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
   1875  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1876  1.1  christos   int W   = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
   1877  1.1  christos   int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
   1878  1.1  christos   int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
   1879  1.1  christos   int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
   1880  1.1  christos   int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
   1881  1.1  christos 
   1882  1.1  christos   if (aop == 1 && W == 0 && idx == ptr)
   1883  1.1  christos     {
   1884  1.1  christos       OUTS (outf, dregs_lo (reg));
   1885  1.1  christos       OUTS (outf, " = W[");
   1886  1.1  christos       OUTS (outf, pregs (ptr));
   1887  1.1  christos       OUTS (outf, "]");
   1888  1.1  christos     }
   1889  1.1  christos   else if (aop == 2 && W == 0 && idx == ptr)
   1890  1.1  christos     {
   1891  1.1  christos       OUTS (outf, dregs_hi (reg));
   1892  1.1  christos       OUTS (outf, " = W[");
   1893  1.1  christos       OUTS (outf, pregs (ptr));
   1894  1.1  christos       OUTS (outf, "]");
   1895  1.1  christos     }
   1896  1.1  christos   else if (aop == 1 && W == 1 && idx == ptr)
   1897  1.1  christos     {
   1898  1.1  christos       OUTS (outf, "W[");
   1899  1.1  christos       OUTS (outf, pregs (ptr));
   1900  1.1  christos       OUTS (outf, "] = ");
   1901  1.1  christos       OUTS (outf, dregs_lo (reg));
   1902  1.1  christos     }
   1903  1.1  christos   else if (aop == 2 && W == 1 && idx == ptr)
   1904  1.1  christos     {
   1905  1.1  christos       OUTS (outf, "W[");
   1906  1.1  christos       OUTS (outf, pregs (ptr));
   1907  1.1  christos       OUTS (outf, "] = ");
   1908  1.1  christos       OUTS (outf, dregs_hi (reg));
   1909  1.1  christos     }
   1910  1.1  christos   else if (aop == 0 && W == 0)
   1911  1.1  christos     {
   1912  1.1  christos       OUTS (outf, dregs (reg));
   1913  1.1  christos       OUTS (outf, " = [");
   1914  1.1  christos       OUTS (outf, pregs (ptr));
   1915  1.1  christos       OUTS (outf, " ++ ");
   1916  1.1  christos       OUTS (outf, pregs (idx));
   1917  1.1  christos       OUTS (outf, "]");
   1918  1.1  christos     }
   1919  1.1  christos   else if (aop == 1 && W == 0)
   1920  1.1  christos     {
   1921  1.1  christos       OUTS (outf, dregs_lo (reg));
   1922  1.1  christos       OUTS (outf, " = W[");
   1923  1.1  christos       OUTS (outf, pregs (ptr));
   1924  1.1  christos       OUTS (outf, " ++ ");
   1925  1.1  christos       OUTS (outf, pregs (idx));
   1926  1.1  christos       OUTS (outf, "]");
   1927  1.1  christos     }
   1928  1.1  christos   else if (aop == 2 && W == 0)
   1929  1.1  christos     {
   1930  1.1  christos       OUTS (outf, dregs_hi (reg));
   1931  1.1  christos       OUTS (outf, " = W[");
   1932  1.1  christos       OUTS (outf, pregs (ptr));
   1933  1.1  christos       OUTS (outf, " ++ ");
   1934  1.1  christos       OUTS (outf, pregs (idx));
   1935  1.1  christos       OUTS (outf, "]");
   1936  1.1  christos     }
   1937  1.1  christos   else if (aop == 3 && W == 0)
   1938  1.1  christos     {
   1939  1.1  christos       OUTS (outf, dregs (reg));
   1940  1.1  christos       OUTS (outf, " = W[");
   1941  1.1  christos       OUTS (outf, pregs (ptr));
   1942  1.1  christos       OUTS (outf, " ++ ");
   1943  1.1  christos       OUTS (outf, pregs (idx));
   1944  1.1  christos       OUTS (outf, "] (Z)");
   1945  1.1  christos     }
   1946  1.1  christos   else if (aop == 3 && W == 1)
   1947  1.1  christos     {
   1948  1.1  christos       OUTS (outf, dregs (reg));
   1949  1.1  christos       OUTS (outf, " = W[");
   1950  1.1  christos       OUTS (outf, pregs (ptr));
   1951  1.1  christos       OUTS (outf, " ++ ");
   1952  1.1  christos       OUTS (outf, pregs (idx));
   1953  1.1  christos       OUTS (outf, "] (X)");
   1954  1.1  christos     }
   1955  1.1  christos   else if (aop == 0 && W == 1)
   1956  1.1  christos     {
   1957  1.1  christos       OUTS (outf, "[");
   1958  1.1  christos       OUTS (outf, pregs (ptr));
   1959  1.1  christos       OUTS (outf, " ++ ");
   1960  1.1  christos       OUTS (outf, pregs (idx));
   1961  1.1  christos       OUTS (outf, "] = ");
   1962  1.1  christos       OUTS (outf, dregs (reg));
   1963  1.1  christos     }
   1964  1.1  christos   else if (aop == 1 && W == 1)
   1965  1.1  christos     {
   1966  1.1  christos       OUTS (outf, "W[");
   1967  1.1  christos       OUTS (outf, pregs (ptr));
   1968  1.1  christos       OUTS (outf, " ++ ");
   1969  1.1  christos       OUTS (outf, pregs (idx));
   1970  1.1  christos       OUTS (outf, "] = ");
   1971  1.1  christos       OUTS (outf, dregs_lo (reg));
   1972  1.1  christos     }
   1973  1.1  christos   else if (aop == 2 && W == 1)
   1974  1.1  christos     {
   1975  1.1  christos       OUTS (outf, "W[");
   1976  1.1  christos       OUTS (outf, pregs (ptr));
   1977  1.1  christos       OUTS (outf, " ++ ");
   1978  1.1  christos       OUTS (outf, pregs (idx));
   1979  1.1  christos       OUTS (outf, "] = ");
   1980  1.1  christos       OUTS (outf, dregs_hi (reg));
   1981  1.1  christos     }
   1982  1.1  christos   else
   1983  1.1  christos     return 0;
   1984  1.1  christos 
   1985  1.1  christos   return 2;
   1986  1.1  christos }
   1987  1.1  christos 
   1988  1.1  christos static int
   1989  1.1  christos decode_dagMODim_0 (TIword iw0, disassemble_info *outf)
   1990  1.1  christos {
   1991  1.1  christos   /* dagMODim
   1992  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1993  1.1  christos      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
   1994  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   1995  1.1  christos   int i  = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
   1996  1.1  christos   int m  = ((iw0 >> DagMODim_m_bits) & DagMODim_m_mask);
   1997  1.1  christos   int br = ((iw0 >> DagMODim_br_bits) & DagMODim_br_mask);
   1998  1.1  christos   int op = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
   1999  1.1  christos 
   2000  1.1  christos   if (op == 0 && br == 1)
   2001  1.1  christos     {
   2002  1.1  christos       OUTS (outf, iregs (i));
   2003  1.1  christos       OUTS (outf, " += ");
   2004  1.1  christos       OUTS (outf, mregs (m));
   2005  1.1  christos       OUTS (outf, " (BREV)");
   2006  1.1  christos     }
   2007  1.1  christos   else if (op == 0)
   2008  1.1  christos     {
   2009  1.1  christos       OUTS (outf, iregs (i));
   2010  1.1  christos       OUTS (outf, " += ");
   2011  1.1  christos       OUTS (outf, mregs (m));
   2012  1.1  christos     }
   2013  1.1  christos   else if (op == 1 && br == 0)
   2014  1.1  christos     {
   2015  1.1  christos       OUTS (outf, iregs (i));
   2016  1.1  christos       OUTS (outf, " -= ");
   2017  1.1  christos       OUTS (outf, mregs (m));
   2018  1.1  christos     }
   2019  1.1  christos   else
   2020  1.1  christos     return 0;
   2021  1.1  christos 
   2022  1.1  christos   return 2;
   2023  1.1  christos }
   2024  1.1  christos 
   2025  1.1  christos static int
   2026  1.1  christos decode_dagMODik_0 (TIword iw0, disassemble_info *outf)
   2027  1.1  christos {
   2028  1.1  christos   /* dagMODik
   2029  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2030  1.1  christos      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
   2031  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2032  1.1  christos   int i  = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
   2033  1.1  christos   int op = ((iw0 >> DagMODik_op_bits) & DagMODik_op_mask);
   2034  1.1  christos 
   2035  1.1  christos   if (op == 0)
   2036  1.1  christos     {
   2037  1.1  christos       OUTS (outf, iregs (i));
   2038  1.1  christos       OUTS (outf, " += 0x2");
   2039  1.1  christos     }
   2040  1.1  christos   else if (op == 1)
   2041  1.1  christos     {
   2042  1.1  christos       OUTS (outf, iregs (i));
   2043  1.1  christos       OUTS (outf, " -= 0x2");
   2044  1.1  christos     }
   2045  1.1  christos   else if (op == 2)
   2046  1.1  christos     {
   2047  1.1  christos       OUTS (outf, iregs (i));
   2048  1.1  christos       OUTS (outf, " += 0x4");
   2049  1.1  christos     }
   2050  1.1  christos   else if (op == 3)
   2051  1.1  christos     {
   2052  1.1  christos       OUTS (outf, iregs (i));
   2053  1.1  christos       OUTS (outf, " -= 0x4");
   2054  1.1  christos     }
   2055  1.1  christos   else
   2056  1.1  christos     return 0;
   2057  1.1  christos 
   2058  1.1  christos   if (! parallel)
   2059  1.1  christos     {
   2060  1.1  christos       OUTS (outf, ";\t\t/* (  ");
   2061  1.1  christos       if (op == 0 || op == 1)
   2062  1.1  christos 	OUTS (outf, "2");
   2063  1.1  christos       else if (op == 2 || op == 3)
   2064  1.1  christos 	OUTS (outf, "4");
   2065  1.1  christos       OUTS (outf, ") */");
   2066  1.1  christos       comment = 1;
   2067  1.1  christos     }
   2068  1.1  christos 
   2069  1.1  christos   return 2;
   2070  1.1  christos }
   2071  1.1  christos 
   2072  1.1  christos static int
   2073  1.1  christos decode_dspLDST_0 (TIword iw0, disassemble_info *outf)
   2074  1.1  christos {
   2075  1.1  christos   /* dspLDST
   2076  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2077  1.1  christos      | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
   2078  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2079  1.1  christos   int i   = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
   2080  1.1  christos   int m   = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
   2081  1.1  christos   int W   = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
   2082  1.1  christos   int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
   2083  1.1  christos   int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
   2084  1.1  christos 
   2085  1.1  christos   if (aop == 0 && W == 0 && m == 0)
   2086  1.1  christos     {
   2087  1.1  christos       OUTS (outf, dregs (reg));
   2088  1.1  christos       OUTS (outf, " = [");
   2089  1.1  christos       OUTS (outf, iregs (i));
   2090  1.1  christos       OUTS (outf, "++]");
   2091  1.1  christos     }
   2092  1.1  christos   else if (aop == 0 && W == 0 && m == 1)
   2093  1.1  christos     {
   2094  1.1  christos       OUTS (outf, dregs_lo (reg));
   2095  1.1  christos       OUTS (outf, " = W[");
   2096  1.1  christos       OUTS (outf, iregs (i));
   2097  1.1  christos       OUTS (outf, "++]");
   2098  1.1  christos     }
   2099  1.1  christos   else if (aop == 0 && W == 0 && m == 2)
   2100  1.1  christos     {
   2101  1.1  christos       OUTS (outf, dregs_hi (reg));
   2102  1.1  christos       OUTS (outf, " = W[");
   2103  1.1  christos       OUTS (outf, iregs (i));
   2104  1.1  christos       OUTS (outf, "++]");
   2105  1.1  christos     }
   2106  1.1  christos   else if (aop == 1 && W == 0 && m == 0)
   2107  1.1  christos     {
   2108  1.1  christos       OUTS (outf, dregs (reg));
   2109  1.1  christos       OUTS (outf, " = [");
   2110  1.1  christos       OUTS (outf, iregs (i));
   2111  1.1  christos       OUTS (outf, "--]");
   2112  1.1  christos     }
   2113  1.1  christos   else if (aop == 1 && W == 0 && m == 1)
   2114  1.1  christos     {
   2115  1.1  christos       OUTS (outf, dregs_lo (reg));
   2116  1.1  christos       OUTS (outf, " = W[");
   2117  1.1  christos       OUTS (outf, iregs (i));
   2118  1.1  christos       OUTS (outf, "--]");
   2119  1.1  christos     }
   2120  1.1  christos   else if (aop == 1 && W == 0 && m == 2)
   2121  1.1  christos     {
   2122  1.1  christos       OUTS (outf, dregs_hi (reg));
   2123  1.1  christos       OUTS (outf, " = W[");
   2124  1.1  christos       OUTS (outf, iregs (i));
   2125  1.1  christos       OUTS (outf, "--]");
   2126  1.1  christos     }
   2127  1.1  christos   else if (aop == 2 && W == 0 && m == 0)
   2128  1.1  christos     {
   2129  1.1  christos       OUTS (outf, dregs (reg));
   2130  1.1  christos       OUTS (outf, " = [");
   2131  1.1  christos       OUTS (outf, iregs (i));
   2132  1.1  christos       OUTS (outf, "]");
   2133  1.1  christos     }
   2134  1.1  christos   else if (aop == 2 && W == 0 && m == 1)
   2135  1.1  christos     {
   2136  1.1  christos       OUTS (outf, dregs_lo (reg));
   2137  1.1  christos       OUTS (outf, " = W[");
   2138  1.1  christos       OUTS (outf, iregs (i));
   2139  1.1  christos       OUTS (outf, "]");
   2140  1.1  christos     }
   2141  1.1  christos   else if (aop == 2 && W == 0 && m == 2)
   2142  1.1  christos     {
   2143  1.1  christos       OUTS (outf, dregs_hi (reg));
   2144  1.1  christos       OUTS (outf, " = W[");
   2145  1.1  christos       OUTS (outf, iregs (i));
   2146  1.1  christos       OUTS (outf, "]");
   2147  1.1  christos     }
   2148  1.1  christos   else if (aop == 0 && W == 1 && m == 0)
   2149  1.1  christos     {
   2150  1.1  christos       OUTS (outf, "[");
   2151  1.1  christos       OUTS (outf, iregs (i));
   2152  1.1  christos       OUTS (outf, "++] = ");
   2153  1.1  christos       OUTS (outf, dregs (reg));
   2154  1.1  christos     }
   2155  1.1  christos   else if (aop == 0 && W == 1 && m == 1)
   2156  1.1  christos     {
   2157  1.1  christos       OUTS (outf, "W[");
   2158  1.1  christos       OUTS (outf, iregs (i));
   2159  1.1  christos       OUTS (outf, "++] = ");
   2160  1.1  christos       OUTS (outf, dregs_lo (reg));
   2161  1.1  christos     }
   2162  1.1  christos   else if (aop == 0 && W == 1 && m == 2)
   2163  1.1  christos     {
   2164  1.1  christos       OUTS (outf, "W[");
   2165  1.1  christos       OUTS (outf, iregs (i));
   2166  1.1  christos       OUTS (outf, "++] = ");
   2167  1.1  christos       OUTS (outf, dregs_hi (reg));
   2168  1.1  christos     }
   2169  1.1  christos   else if (aop == 1 && W == 1 && m == 0)
   2170  1.1  christos     {
   2171  1.1  christos       OUTS (outf, "[");
   2172  1.1  christos       OUTS (outf, iregs (i));
   2173  1.1  christos       OUTS (outf, "--] = ");
   2174  1.1  christos       OUTS (outf, dregs (reg));
   2175  1.1  christos     }
   2176  1.1  christos   else if (aop == 1 && W == 1 && m == 1)
   2177  1.1  christos     {
   2178  1.1  christos       OUTS (outf, "W[");
   2179  1.1  christos       OUTS (outf, iregs (i));
   2180  1.1  christos       OUTS (outf, "--] = ");
   2181  1.1  christos       OUTS (outf, dregs_lo (reg));
   2182  1.1  christos     }
   2183  1.1  christos   else if (aop == 1 && W == 1 && m == 2)
   2184  1.1  christos     {
   2185  1.1  christos       OUTS (outf, "W[");
   2186  1.1  christos       OUTS (outf, iregs (i));
   2187  1.1  christos       OUTS (outf, "--] = ");
   2188  1.1  christos       OUTS (outf, dregs_hi (reg));
   2189  1.1  christos     }
   2190  1.1  christos   else if (aop == 2 && W == 1 && m == 0)
   2191  1.1  christos     {
   2192  1.1  christos       OUTS (outf, "[");
   2193  1.1  christos       OUTS (outf, iregs (i));
   2194  1.1  christos       OUTS (outf, "] = ");
   2195  1.1  christos       OUTS (outf, dregs (reg));
   2196  1.1  christos     }
   2197  1.1  christos   else if (aop == 2 && W == 1 && m == 1)
   2198  1.1  christos     {
   2199  1.1  christos       OUTS (outf, "W[");
   2200  1.1  christos       OUTS (outf, iregs (i));
   2201  1.1  christos       OUTS (outf, "] = ");
   2202  1.1  christos       OUTS (outf, dregs_lo (reg));
   2203  1.1  christos     }
   2204  1.1  christos   else if (aop == 2 && W == 1 && m == 2)
   2205  1.1  christos     {
   2206  1.1  christos       OUTS (outf, "W[");
   2207  1.1  christos       OUTS (outf, iregs (i));
   2208  1.1  christos       OUTS (outf, "] = ");
   2209  1.1  christos       OUTS (outf, dregs_hi (reg));
   2210  1.1  christos     }
   2211  1.1  christos   else if (aop == 3 && W == 0)
   2212  1.1  christos     {
   2213  1.1  christos       OUTS (outf, dregs (reg));
   2214  1.1  christos       OUTS (outf, " = [");
   2215  1.1  christos       OUTS (outf, iregs (i));
   2216  1.1  christos       OUTS (outf, " ++ ");
   2217  1.1  christos       OUTS (outf, mregs (m));
   2218  1.1  christos       OUTS (outf, "]");
   2219  1.1  christos     }
   2220  1.1  christos   else if (aop == 3 && W == 1)
   2221  1.1  christos     {
   2222  1.1  christos       OUTS (outf, "[");
   2223  1.1  christos       OUTS (outf, iregs (i));
   2224  1.1  christos       OUTS (outf, " ++ ");
   2225  1.1  christos       OUTS (outf, mregs (m));
   2226  1.1  christos       OUTS (outf, "] = ");
   2227  1.1  christos       OUTS (outf, dregs (reg));
   2228  1.1  christos     }
   2229  1.1  christos   else
   2230  1.1  christos     return 0;
   2231  1.1  christos 
   2232  1.1  christos   return 2;
   2233  1.1  christos }
   2234  1.1  christos 
   2235  1.1  christos static int
   2236  1.1  christos decode_LDST_0 (TIword iw0, disassemble_info *outf)
   2237  1.1  christos {
   2238  1.1  christos   /* LDST
   2239  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2240  1.1  christos      | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
   2241  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2242  1.1  christos   int Z   = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
   2243  1.1  christos   int W   = ((iw0 >> LDST_W_bits) & LDST_W_mask);
   2244  1.1  christos   int sz  = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
   2245  1.1  christos   int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
   2246  1.1  christos   int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
   2247  1.1  christos   int ptr = ((iw0 >> LDST_ptr_bits) & LDST_ptr_mask);
   2248  1.1  christos 
   2249  1.1  christos   if (aop == 0 && sz == 0 && Z == 0 && W == 0)
   2250  1.1  christos     {
   2251  1.1  christos       OUTS (outf, dregs (reg));
   2252  1.1  christos       OUTS (outf, " = [");
   2253  1.1  christos       OUTS (outf, pregs (ptr));
   2254  1.1  christos       OUTS (outf, "++]");
   2255  1.1  christos     }
   2256  1.1  christos   else if (aop == 0 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
   2257  1.1  christos     {
   2258  1.1  christos       OUTS (outf, pregs (reg));
   2259  1.1  christos       OUTS (outf, " = [");
   2260  1.1  christos       OUTS (outf, pregs (ptr));
   2261  1.1  christos       OUTS (outf, "++]");
   2262  1.1  christos     }
   2263  1.1  christos   else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
   2264  1.1  christos     {
   2265  1.1  christos       OUTS (outf, dregs (reg));
   2266  1.1  christos       OUTS (outf, " = W[");
   2267  1.1  christos       OUTS (outf, pregs (ptr));
   2268  1.1  christos       OUTS (outf, "++] (Z)");
   2269  1.1  christos     }
   2270  1.1  christos   else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
   2271  1.1  christos     {
   2272  1.1  christos       OUTS (outf, dregs (reg));
   2273  1.1  christos       OUTS (outf, " = W[");
   2274  1.1  christos       OUTS (outf, pregs (ptr));
   2275  1.1  christos       OUTS (outf, "++] (X)");
   2276  1.1  christos     }
   2277  1.1  christos   else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
   2278  1.1  christos     {
   2279  1.1  christos       OUTS (outf, dregs (reg));
   2280  1.1  christos       OUTS (outf, " = B[");
   2281  1.1  christos       OUTS (outf, pregs (ptr));
   2282  1.1  christos       OUTS (outf, "++] (Z)");
   2283  1.1  christos     }
   2284  1.1  christos   else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
   2285  1.1  christos     {
   2286  1.1  christos       OUTS (outf, dregs (reg));
   2287  1.1  christos       OUTS (outf, " = B[");
   2288  1.1  christos       OUTS (outf, pregs (ptr));
   2289  1.1  christos       OUTS (outf, "++] (X)");
   2290  1.1  christos     }
   2291  1.1  christos   else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
   2292  1.1  christos     {
   2293  1.1  christos       OUTS (outf, dregs (reg));
   2294  1.1  christos       OUTS (outf, " = [");
   2295  1.1  christos       OUTS (outf, pregs (ptr));
   2296  1.1  christos       OUTS (outf, "--]");
   2297  1.1  christos     }
   2298  1.1  christos   else if (aop == 1 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
   2299  1.1  christos     {
   2300  1.1  christos       OUTS (outf, pregs (reg));
   2301  1.1  christos       OUTS (outf, " = [");
   2302  1.1  christos       OUTS (outf, pregs (ptr));
   2303  1.1  christos       OUTS (outf, "--]");
   2304  1.1  christos     }
   2305  1.1  christos   else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
   2306  1.1  christos     {
   2307  1.1  christos       OUTS (outf, dregs (reg));
   2308  1.1  christos       OUTS (outf, " = W[");
   2309  1.1  christos       OUTS (outf, pregs (ptr));
   2310  1.1  christos       OUTS (outf, "--] (Z)");
   2311  1.1  christos     }
   2312  1.1  christos   else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
   2313  1.1  christos     {
   2314  1.1  christos       OUTS (outf, dregs (reg));
   2315  1.1  christos       OUTS (outf, " = W[");
   2316  1.1  christos       OUTS (outf, pregs (ptr));
   2317  1.1  christos       OUTS (outf, "--] (X)");
   2318  1.1  christos     }
   2319  1.1  christos   else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
   2320  1.1  christos     {
   2321  1.1  christos       OUTS (outf, dregs (reg));
   2322  1.1  christos       OUTS (outf, " = B[");
   2323  1.1  christos       OUTS (outf, pregs (ptr));
   2324  1.1  christos       OUTS (outf, "--] (Z)");
   2325  1.1  christos     }
   2326  1.1  christos   else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
   2327  1.1  christos     {
   2328  1.1  christos       OUTS (outf, dregs (reg));
   2329  1.1  christos       OUTS (outf, " = B[");
   2330  1.1  christos       OUTS (outf, pregs (ptr));
   2331  1.1  christos       OUTS (outf, "--] (X)");
   2332  1.1  christos     }
   2333  1.1  christos   else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
   2334  1.1  christos     {
   2335  1.1  christos       OUTS (outf, dregs (reg));
   2336  1.1  christos       OUTS (outf, " = [");
   2337  1.1  christos       OUTS (outf, pregs (ptr));
   2338  1.1  christos       OUTS (outf, "]");
   2339  1.1  christos     }
   2340  1.1  christos   else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
   2341  1.1  christos     {
   2342  1.1  christos       OUTS (outf, pregs (reg));
   2343  1.1  christos       OUTS (outf, " = [");
   2344  1.1  christos       OUTS (outf, pregs (ptr));
   2345  1.1  christos       OUTS (outf, "]");
   2346  1.1  christos     }
   2347  1.1  christos   else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
   2348  1.1  christos     {
   2349  1.1  christos       OUTS (outf, dregs (reg));
   2350  1.1  christos       OUTS (outf, " = W[");
   2351  1.1  christos       OUTS (outf, pregs (ptr));
   2352  1.1  christos       OUTS (outf, "] (Z)");
   2353  1.1  christos     }
   2354  1.1  christos   else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
   2355  1.1  christos     {
   2356  1.1  christos       OUTS (outf, dregs (reg));
   2357  1.1  christos       OUTS (outf, " = W[");
   2358  1.1  christos       OUTS (outf, pregs (ptr));
   2359  1.1  christos       OUTS (outf, "] (X)");
   2360  1.1  christos     }
   2361  1.1  christos   else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
   2362  1.1  christos     {
   2363  1.1  christos       OUTS (outf, dregs (reg));
   2364  1.1  christos       OUTS (outf, " = B[");
   2365  1.1  christos       OUTS (outf, pregs (ptr));
   2366  1.1  christos       OUTS (outf, "] (Z)");
   2367  1.1  christos     }
   2368  1.1  christos   else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
   2369  1.1  christos     {
   2370  1.1  christos       OUTS (outf, dregs (reg));
   2371  1.1  christos       OUTS (outf, " = B[");
   2372  1.1  christos       OUTS (outf, pregs (ptr));
   2373  1.1  christos       OUTS (outf, "] (X)");
   2374  1.1  christos     }
   2375  1.1  christos   else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
   2376  1.1  christos     {
   2377  1.1  christos       OUTS (outf, "[");
   2378  1.1  christos       OUTS (outf, pregs (ptr));
   2379  1.1  christos       OUTS (outf, "++] = ");
   2380  1.1  christos       OUTS (outf, dregs (reg));
   2381  1.1  christos     }
   2382  1.1  christos   else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
   2383  1.1  christos     {
   2384  1.1  christos       OUTS (outf, "[");
   2385  1.1  christos       OUTS (outf, pregs (ptr));
   2386  1.1  christos       OUTS (outf, "++] = ");
   2387  1.1  christos       OUTS (outf, pregs (reg));
   2388  1.1  christos     }
   2389  1.1  christos   else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
   2390  1.1  christos     {
   2391  1.1  christos       OUTS (outf, "W[");
   2392  1.1  christos       OUTS (outf, pregs (ptr));
   2393  1.1  christos       OUTS (outf, "++] = ");
   2394  1.1  christos       OUTS (outf, dregs (reg));
   2395  1.1  christos     }
   2396  1.1  christos   else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
   2397  1.1  christos     {
   2398  1.1  christos       OUTS (outf, "B[");
   2399  1.1  christos       OUTS (outf, pregs (ptr));
   2400  1.1  christos       OUTS (outf, "++] = ");
   2401  1.1  christos       OUTS (outf, dregs (reg));
   2402  1.1  christos     }
   2403  1.1  christos   else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
   2404  1.1  christos     {
   2405  1.1  christos       OUTS (outf, "[");
   2406  1.1  christos       OUTS (outf, pregs (ptr));
   2407  1.1  christos       OUTS (outf, "--] = ");
   2408  1.1  christos       OUTS (outf, dregs (reg));
   2409  1.1  christos     }
   2410  1.1  christos   else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
   2411  1.1  christos     {
   2412  1.1  christos       OUTS (outf, "[");
   2413  1.1  christos       OUTS (outf, pregs (ptr));
   2414  1.1  christos       OUTS (outf, "--] = ");
   2415  1.1  christos       OUTS (outf, pregs (reg));
   2416  1.1  christos     }
   2417  1.1  christos   else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
   2418  1.1  christos     {
   2419  1.1  christos       OUTS (outf, "W[");
   2420  1.1  christos       OUTS (outf, pregs (ptr));
   2421  1.1  christos       OUTS (outf, "--] = ");
   2422  1.1  christos       OUTS (outf, dregs (reg));
   2423  1.1  christos     }
   2424  1.1  christos   else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
   2425  1.1  christos     {
   2426  1.1  christos       OUTS (outf, "B[");
   2427  1.1  christos       OUTS (outf, pregs (ptr));
   2428  1.1  christos       OUTS (outf, "--] = ");
   2429  1.1  christos       OUTS (outf, dregs (reg));
   2430  1.1  christos     }
   2431  1.1  christos   else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
   2432  1.1  christos     {
   2433  1.1  christos       OUTS (outf, "[");
   2434  1.1  christos       OUTS (outf, pregs (ptr));
   2435  1.1  christos       OUTS (outf, "] = ");
   2436  1.1  christos       OUTS (outf, dregs (reg));
   2437  1.1  christos     }
   2438  1.1  christos   else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
   2439  1.1  christos     {
   2440  1.1  christos       OUTS (outf, "[");
   2441  1.1  christos       OUTS (outf, pregs (ptr));
   2442  1.1  christos       OUTS (outf, "] = ");
   2443  1.1  christos       OUTS (outf, pregs (reg));
   2444  1.1  christos     }
   2445  1.1  christos   else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
   2446  1.1  christos     {
   2447  1.1  christos       OUTS (outf, "W[");
   2448  1.1  christos       OUTS (outf, pregs (ptr));
   2449  1.1  christos       OUTS (outf, "] = ");
   2450  1.1  christos       OUTS (outf, dregs (reg));
   2451  1.1  christos     }
   2452  1.1  christos   else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
   2453  1.1  christos     {
   2454  1.1  christos       OUTS (outf, "B[");
   2455  1.1  christos       OUTS (outf, pregs (ptr));
   2456  1.1  christos       OUTS (outf, "] = ");
   2457  1.1  christos       OUTS (outf, dregs (reg));
   2458  1.1  christos     }
   2459  1.1  christos   else
   2460  1.1  christos     return 0;
   2461  1.1  christos 
   2462  1.1  christos   return 2;
   2463  1.1  christos }
   2464  1.1  christos 
   2465  1.1  christos static int
   2466  1.1  christos decode_LDSTiiFP_0 (TIword iw0, disassemble_info *outf)
   2467  1.1  christos {
   2468  1.1  christos   /* LDSTiiFP
   2469  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2470  1.1  christos      | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
   2471  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2472  1.1  christos   int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
   2473  1.1  christos   int offset = ((iw0 >> LDSTiiFP_offset_bits) & LDSTiiFP_offset_mask);
   2474  1.1  christos   int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
   2475  1.1  christos 
   2476  1.1  christos   if (W == 0)
   2477  1.1  christos     {
   2478  1.1  christos       OUTS (outf, dpregs (reg));
   2479  1.1  christos       OUTS (outf, " = [FP ");
   2480  1.1  christos       OUTS (outf, negimm5s4 (offset));
   2481  1.1  christos       OUTS (outf, "]");
   2482  1.1  christos     }
   2483  1.1  christos   else if (W == 1)
   2484  1.1  christos     {
   2485  1.1  christos       OUTS (outf, "[FP ");
   2486  1.1  christos       OUTS (outf, negimm5s4 (offset));
   2487  1.1  christos       OUTS (outf, "] = ");
   2488  1.1  christos       OUTS (outf, dpregs (reg));
   2489  1.1  christos     }
   2490  1.1  christos   else
   2491  1.1  christos     return 0;
   2492  1.1  christos 
   2493  1.1  christos   return 2;
   2494  1.1  christos }
   2495  1.1  christos 
   2496  1.1  christos static int
   2497  1.1  christos decode_LDSTii_0 (TIword iw0, disassemble_info *outf)
   2498  1.1  christos {
   2499  1.1  christos   /* LDSTii
   2500  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2501  1.1  christos      | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
   2502  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2503  1.1  christos   int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
   2504  1.1  christos   int ptr = ((iw0 >> LDSTii_ptr_bit) & LDSTii_ptr_mask);
   2505  1.1  christos   int offset = ((iw0 >> LDSTii_offset_bit) & LDSTii_offset_mask);
   2506  1.1  christos   int op = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
   2507  1.1  christos   int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
   2508  1.1  christos 
   2509  1.1  christos   if (W == 0 && op == 0)
   2510  1.1  christos     {
   2511  1.1  christos       OUTS (outf, dregs (reg));
   2512  1.1  christos       OUTS (outf, " = [");
   2513  1.1  christos       OUTS (outf, pregs (ptr));
   2514  1.1  christos       OUTS (outf, " + ");
   2515  1.1  christos       OUTS (outf, uimm4s4 (offset));
   2516  1.1  christos       OUTS (outf, "]");
   2517  1.1  christos     }
   2518  1.1  christos   else if (W == 0 && op == 1)
   2519  1.1  christos     {
   2520  1.1  christos       OUTS (outf, dregs (reg));
   2521  1.1  christos       OUTS (outf, " = W[");
   2522  1.1  christos       OUTS (outf, pregs (ptr));
   2523  1.1  christos       OUTS (outf, " + ");
   2524  1.1  christos       OUTS (outf, uimm4s2 (offset));
   2525  1.1  christos       OUTS (outf, "] (Z)");
   2526  1.1  christos     }
   2527  1.1  christos   else if (W == 0 && op == 2)
   2528  1.1  christos     {
   2529  1.1  christos       OUTS (outf, dregs (reg));
   2530  1.1  christos       OUTS (outf, " = W[");
   2531  1.1  christos       OUTS (outf, pregs (ptr));
   2532  1.1  christos       OUTS (outf, " + ");
   2533  1.1  christos       OUTS (outf, uimm4s2 (offset));
   2534  1.1  christos       OUTS (outf, "] (X)");
   2535  1.1  christos     }
   2536  1.1  christos   else if (W == 0 && op == 3)
   2537  1.1  christos     {
   2538  1.1  christos       OUTS (outf, pregs (reg));
   2539  1.1  christos       OUTS (outf, " = [");
   2540  1.1  christos       OUTS (outf, pregs (ptr));
   2541  1.1  christos       OUTS (outf, " + ");
   2542  1.1  christos       OUTS (outf, uimm4s4 (offset));
   2543  1.1  christos       OUTS (outf, "]");
   2544  1.1  christos     }
   2545  1.1  christos   else if (W == 1 && op == 0)
   2546  1.1  christos     {
   2547  1.1  christos       OUTS (outf, "[");
   2548  1.1  christos       OUTS (outf, pregs (ptr));
   2549  1.1  christos       OUTS (outf, " + ");
   2550  1.1  christos       OUTS (outf, uimm4s4 (offset));
   2551  1.1  christos       OUTS (outf, "] = ");
   2552  1.1  christos       OUTS (outf, dregs (reg));
   2553  1.1  christos     }
   2554  1.1  christos   else if (W == 1 && op == 1)
   2555  1.1  christos     {
   2556  1.1  christos       OUTS (outf, "W[");
   2557  1.1  christos       OUTS (outf, pregs (ptr));
   2558  1.1  christos       OUTS (outf, " + ");
   2559  1.1  christos       OUTS (outf, uimm4s2 (offset));
   2560  1.1  christos       OUTS (outf, "] = ");
   2561  1.1  christos       OUTS (outf, dregs (reg));
   2562  1.1  christos     }
   2563  1.1  christos   else if (W == 1 && op == 3)
   2564  1.1  christos     {
   2565  1.1  christos       OUTS (outf, "[");
   2566  1.1  christos       OUTS (outf, pregs (ptr));
   2567  1.1  christos       OUTS (outf, " + ");
   2568  1.1  christos       OUTS (outf, uimm4s4 (offset));
   2569  1.1  christos       OUTS (outf, "] = ");
   2570  1.1  christos       OUTS (outf, pregs (reg));
   2571  1.1  christos     }
   2572  1.1  christos   else
   2573  1.1  christos     return 0;
   2574  1.1  christos 
   2575  1.1  christos   return 2;
   2576  1.1  christos }
   2577  1.1  christos 
   2578  1.1  christos static int
   2579  1.1  christos decode_LoopSetup_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
   2580  1.1  christos {
   2581  1.1  christos   /* LoopSetup
   2582  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2583  1.1  christos      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |.rop...|.c.|.soffset.......|
   2584  1.1  christos      |.reg...........| - | - |.eoffset...............................|
   2585  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2586  1.1  christos   int c   = ((iw0 >> (LoopSetup_c_bits - 16)) & LoopSetup_c_mask);
   2587  1.1  christos   int reg = ((iw1 >> LoopSetup_reg_bits) & LoopSetup_reg_mask);
   2588  1.1  christos   int rop = ((iw0 >> (LoopSetup_rop_bits - 16)) & LoopSetup_rop_mask);
   2589  1.1  christos   int soffset = ((iw0 >> (LoopSetup_soffset_bits - 16)) & LoopSetup_soffset_mask);
   2590  1.1  christos   int eoffset = ((iw1 >> LoopSetup_eoffset_bits) & LoopSetup_eoffset_mask);
   2591  1.1  christos 
   2592  1.1  christos   if (parallel)
   2593  1.1  christos     return 0;
   2594  1.1  christos 
   2595  1.1  christos   if (reg > 7)
   2596  1.1  christos     return 0;
   2597  1.1  christos 
   2598  1.1  christos   if (rop == 0)
   2599  1.1  christos     {
   2600  1.1  christos       OUTS (outf, "LSETUP");
   2601  1.1  christos       OUTS (outf, "(0x");
   2602  1.1  christos       OUTS (outf, pcrel4 (soffset));
   2603  1.1  christos       OUTS (outf, ", 0x");
   2604  1.1  christos       OUTS (outf, lppcrel10 (eoffset));
   2605  1.1  christos       OUTS (outf, ") ");
   2606  1.1  christos       OUTS (outf, counters (c));
   2607  1.1  christos     }
   2608  1.1  christos   else if (rop == 1)
   2609  1.1  christos     {
   2610  1.1  christos       OUTS (outf, "LSETUP");
   2611  1.1  christos       OUTS (outf, "(0x");
   2612  1.1  christos       OUTS (outf, pcrel4 (soffset));
   2613  1.1  christos       OUTS (outf, ", 0x");
   2614  1.1  christos       OUTS (outf, lppcrel10 (eoffset));
   2615  1.1  christos       OUTS (outf, ") ");
   2616  1.1  christos       OUTS (outf, counters (c));
   2617  1.1  christos       OUTS (outf, " = ");
   2618  1.1  christos       OUTS (outf, pregs (reg));
   2619  1.1  christos     }
   2620  1.1  christos   else if (rop == 3)
   2621  1.1  christos     {
   2622  1.1  christos       OUTS (outf, "LSETUP");
   2623  1.1  christos       OUTS (outf, "(0x");
   2624  1.1  christos       OUTS (outf, pcrel4 (soffset));
   2625  1.1  christos       OUTS (outf, ", 0x");
   2626  1.1  christos       OUTS (outf, lppcrel10 (eoffset));
   2627  1.1  christos       OUTS (outf, ") ");
   2628  1.1  christos       OUTS (outf, counters (c));
   2629  1.1  christos       OUTS (outf, " = ");
   2630  1.1  christos       OUTS (outf, pregs (reg));
   2631  1.1  christos       OUTS (outf, " >> 0x1");
   2632  1.1  christos     }
   2633  1.1  christos   else
   2634  1.1  christos     return 0;
   2635  1.1  christos 
   2636  1.1  christos   return 4;
   2637  1.1  christos }
   2638  1.1  christos 
   2639  1.1  christos static int
   2640  1.1  christos decode_LDIMMhalf_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   2641  1.1  christos {
   2642  1.1  christos   /* LDIMMhalf
   2643  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2644  1.1  christos      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |.Z.|.H.|.S.|.grp...|.reg.......|
   2645  1.1  christos      |.hword.........................................................|
   2646  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2647  1.1  christos   int H = ((iw0 >> (LDIMMhalf_H_bits - 16)) & LDIMMhalf_H_mask);
   2648  1.1  christos   int Z = ((iw0 >> (LDIMMhalf_Z_bits - 16)) & LDIMMhalf_Z_mask);
   2649  1.1  christos   int S = ((iw0 >> (LDIMMhalf_S_bits - 16)) & LDIMMhalf_S_mask);
   2650  1.1  christos   int reg = ((iw0 >> (LDIMMhalf_reg_bits - 16)) & LDIMMhalf_reg_mask);
   2651  1.1  christos   int grp = ((iw0 >> (LDIMMhalf_grp_bits - 16)) & LDIMMhalf_grp_mask);
   2652  1.1  christos   int hword = ((iw1 >> LDIMMhalf_hword_bits) & LDIMMhalf_hword_mask);
   2653  1.1  christos 
   2654  1.1  christos   bu32 *pval = get_allreg (grp, reg);
   2655  1.1  christos 
   2656  1.1  christos   if (parallel)
   2657  1.1  christos     return 0;
   2658  1.1  christos 
   2659  1.1  christos   /* Since we don't have 32-bit immediate loads, we allow the disassembler
   2660  1.1  christos      to combine them, so it prints out the right values.
   2661  1.1  christos      Here we keep track of the registers.  */
   2662  1.1  christos   if (H == 0 && S == 1 && Z == 0)
   2663  1.1  christos     {
   2664  1.1  christos       /* regs = imm16 (x) */
   2665  1.1  christos       *pval = imm16_val (hword);
   2666  1.1  christos       if (hword & 0x8000)
   2667  1.1  christos 	*pval |= 0xFFFF0000;
   2668  1.1  christos       else
   2669  1.1  christos 	*pval &= 0xFFFF;
   2670  1.1  christos     }
   2671  1.1  christos   else if (H == 0 && S == 0 && Z == 1)
   2672  1.1  christos     {
   2673  1.1  christos       /* regs = luimm16 (Z) */
   2674  1.1  christos       *pval = luimm16_val (hword);
   2675  1.1  christos       *pval &= 0xFFFF;
   2676  1.1  christos     }
   2677  1.1  christos   else if (H == 0 && S == 0 && Z == 0)
   2678  1.1  christos     {
   2679  1.1  christos       /* regs_lo = luimm16 */
   2680  1.1  christos       *pval &= 0xFFFF0000;
   2681  1.1  christos       *pval |= luimm16_val (hword);
   2682  1.1  christos     }
   2683  1.1  christos   else if (H == 1 && S == 0 && Z == 0)
   2684  1.1  christos     {
   2685  1.1  christos       /* regs_hi = huimm16 */
   2686  1.1  christos       *pval &= 0xFFFF;
   2687  1.1  christos       *pval |= luimm16_val (hword) << 16;
   2688  1.1  christos     }
   2689  1.1  christos 
   2690  1.1  christos   /* Here we do the disassembly */
   2691  1.1  christos   if (grp == 0 && H == 0 && S == 0 && Z == 0)
   2692  1.1  christos     {
   2693  1.1  christos       OUTS (outf, dregs_lo (reg));
   2694  1.1  christos       OUTS (outf, " = ");
   2695  1.1  christos       OUTS (outf, uimm16 (hword));
   2696  1.1  christos     }
   2697  1.1  christos   else if (grp == 0 && H == 1 && S == 0 && Z == 0)
   2698  1.1  christos     {
   2699  1.1  christos       OUTS (outf, dregs_hi (reg));
   2700  1.1  christos       OUTS (outf, " = ");
   2701  1.1  christos       OUTS (outf, uimm16 (hword));
   2702  1.1  christos     }
   2703  1.1  christos   else if (grp == 0 && H == 0 && S == 1 && Z == 0)
   2704  1.1  christos     {
   2705  1.1  christos       OUTS (outf, dregs (reg));
   2706  1.1  christos       OUTS (outf, " = ");
   2707  1.1  christos       OUTS (outf, imm16 (hword));
   2708  1.1  christos       OUTS (outf, " (X)");
   2709  1.1  christos     }
   2710  1.1  christos   else if (H == 0 && S == 1 && Z == 0)
   2711  1.1  christos     {
   2712  1.1  christos       OUTS (outf, regs (reg, grp));
   2713  1.1  christos       OUTS (outf, " = ");
   2714  1.1  christos       OUTS (outf, imm16 (hword));
   2715  1.1  christos       OUTS (outf, " (X)");
   2716  1.1  christos     }
   2717  1.1  christos   else if (H == 0 && S == 0 && Z == 1)
   2718  1.1  christos     {
   2719  1.1  christos       OUTS (outf, regs (reg, grp));
   2720  1.1  christos       OUTS (outf, " = ");
   2721  1.1  christos       OUTS (outf, uimm16 (hword));
   2722  1.1  christos       OUTS (outf, " (Z)");
   2723  1.1  christos     }
   2724  1.1  christos   else if (H == 0 && S == 0 && Z == 0)
   2725  1.1  christos     {
   2726  1.1  christos       OUTS (outf, regs_lo (reg, grp));
   2727  1.1  christos       OUTS (outf, " = ");
   2728  1.1  christos       OUTS (outf, uimm16 (hword));
   2729  1.1  christos     }
   2730  1.1  christos   else if (H == 1 && S == 0 && Z == 0)
   2731  1.1  christos     {
   2732  1.1  christos       OUTS (outf, regs_hi (reg, grp));
   2733  1.1  christos       OUTS (outf, " = ");
   2734  1.1  christos       OUTS (outf, uimm16 (hword));
   2735  1.1  christos     }
   2736  1.1  christos   else
   2737  1.1  christos     return 0;
   2738  1.1  christos 
   2739  1.1  christos   /* And we print out the 32-bit value if it is a pointer.  */
   2740  1.1  christos   if (S == 0 && Z == 0)
   2741  1.1  christos     {
   2742  1.1  christos       OUTS (outf, ";\t\t/* (");
   2743  1.1  christos       OUTS (outf, imm16d (hword));
   2744  1.1  christos       OUTS (outf, ")\t");
   2745  1.1  christos 
   2746  1.1  christos       /* If it is an MMR, don't print the symbol.  */
   2747  1.1  christos       if (*pval < 0xFFC00000 && grp == 1)
   2748  1.1  christos 	{
   2749  1.1  christos 	  OUTS (outf, regs (reg, grp));
   2750  1.1  christos 	  OUTS (outf, "=0x");
   2751  1.1  christos 	  OUTS (outf, huimm32e (*pval));
   2752  1.1  christos 	}
   2753  1.1  christos       else
   2754  1.1  christos 	{
   2755  1.1  christos 	  OUTS (outf, regs (reg, grp));
   2756  1.1  christos 	  OUTS (outf, "=0x");
   2757  1.1  christos 	  OUTS (outf, huimm32e (*pval));
   2758  1.1  christos 	  OUTS (outf, "(");
   2759  1.1  christos 	  OUTS (outf, imm32 (*pval));
   2760  1.1  christos 	  OUTS (outf, ")");
   2761  1.1  christos 	}
   2762  1.1  christos 
   2763  1.1  christos       OUTS (outf, " */");
   2764  1.1  christos       comment = 1;
   2765  1.1  christos     }
   2766  1.1  christos   if (S == 1 || Z == 1)
   2767  1.1  christos     {
   2768  1.1  christos       OUTS (outf, ";\t\t/*\t\t");
   2769  1.1  christos       OUTS (outf, regs (reg, grp));
   2770  1.1  christos       OUTS (outf, "=0x");
   2771  1.1  christos       OUTS (outf, huimm32e (*pval));
   2772  1.1  christos       OUTS (outf, "(");
   2773  1.1  christos       OUTS (outf, imm32 (*pval));
   2774  1.1  christos       OUTS (outf, ") */");
   2775  1.1  christos       comment = 1;
   2776  1.1  christos     }
   2777  1.1  christos   return 4;
   2778  1.1  christos }
   2779  1.1  christos 
   2780  1.1  christos static int
   2781  1.1  christos decode_CALLa_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
   2782  1.1  christos {
   2783  1.1  christos   /* CALLa
   2784  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2785  1.1  christos      | 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................|
   2786  1.1  christos      |.lsw...........................................................|
   2787  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2788  1.1  christos   int S   = ((iw0 >> (CALLa_S_bits - 16)) & CALLa_S_mask);
   2789  1.1  christos   int lsw = ((iw1 >> 0) & 0xffff);
   2790  1.1  christos   int msw = ((iw0 >> 0) & 0xff);
   2791  1.1  christos 
   2792  1.1  christos   if (parallel)
   2793  1.1  christos     return 0;
   2794  1.1  christos 
   2795  1.1  christos   if (S == 1)
   2796  1.1  christos     OUTS (outf, "CALL 0x");
   2797  1.1  christos   else if (S == 0)
   2798  1.1  christos     OUTS (outf, "JUMP.L 0x");
   2799  1.1  christos   else
   2800  1.1  christos     return 0;
   2801  1.1  christos 
   2802  1.1  christos   OUTS (outf, pcrel24 (((msw) << 16) | (lsw)));
   2803  1.1  christos   return 4;
   2804  1.1  christos }
   2805  1.1  christos 
   2806  1.1  christos static int
   2807  1.1  christos decode_LDSTidxI_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   2808  1.1  christos {
   2809  1.1  christos   /* LDSTidxI
   2810  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2811  1.1  christos      | 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......|
   2812  1.1  christos      |.offset........................................................|
   2813  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2814  1.1  christos   int Z = ((iw0 >> (LDSTidxI_Z_bits - 16)) & LDSTidxI_Z_mask);
   2815  1.1  christos   int W = ((iw0 >> (LDSTidxI_W_bits - 16)) & LDSTidxI_W_mask);
   2816  1.1  christos   int sz = ((iw0 >> (LDSTidxI_sz_bits - 16)) & LDSTidxI_sz_mask);
   2817  1.1  christos   int reg = ((iw0 >> (LDSTidxI_reg_bits - 16)) & LDSTidxI_reg_mask);
   2818  1.1  christos   int ptr = ((iw0 >> (LDSTidxI_ptr_bits - 16)) & LDSTidxI_ptr_mask);
   2819  1.1  christos   int offset = ((iw1 >> LDSTidxI_offset_bits) & LDSTidxI_offset_mask);
   2820  1.1  christos 
   2821  1.1  christos   if (W == 0 && sz == 0 && Z == 0)
   2822  1.1  christos     {
   2823  1.1  christos       OUTS (outf, dregs (reg));
   2824  1.1  christos       OUTS (outf, " = [");
   2825  1.1  christos       OUTS (outf, pregs (ptr));
   2826  1.1  christos       OUTS (outf, " + ");
   2827  1.1  christos       OUTS (outf, imm16s4 (offset));
   2828  1.1  christos       OUTS (outf, "]");
   2829  1.1  christos     }
   2830  1.1  christos   else if (W == 0 && sz == 0 && Z == 1)
   2831  1.1  christos     {
   2832  1.1  christos       OUTS (outf, pregs (reg));
   2833  1.1  christos       OUTS (outf, " = [");
   2834  1.1  christos       OUTS (outf, pregs (ptr));
   2835  1.1  christos       OUTS (outf, " + ");
   2836  1.1  christos       OUTS (outf, imm16s4 (offset));
   2837  1.1  christos       OUTS (outf, "]");
   2838  1.1  christos     }
   2839  1.1  christos   else if (W == 0 && sz == 1 && Z == 0)
   2840  1.1  christos     {
   2841  1.1  christos       OUTS (outf, dregs (reg));
   2842  1.1  christos       OUTS (outf, " = W[");
   2843  1.1  christos       OUTS (outf, pregs (ptr));
   2844  1.1  christos       OUTS (outf, " + ");
   2845  1.1  christos       OUTS (outf, imm16s2 (offset));
   2846  1.1  christos       OUTS (outf, "] (Z)");
   2847  1.1  christos     }
   2848  1.1  christos   else if (W == 0 && sz == 1 && Z == 1)
   2849  1.1  christos     {
   2850  1.1  christos       OUTS (outf, dregs (reg));
   2851  1.1  christos       OUTS (outf, " = W[");
   2852  1.1  christos       OUTS (outf, pregs (ptr));
   2853  1.1  christos       OUTS (outf, " + ");
   2854  1.1  christos       OUTS (outf, imm16s2 (offset));
   2855  1.1  christos       OUTS (outf, "] (X)");
   2856  1.1  christos     }
   2857  1.1  christos   else if (W == 0 && sz == 2 && Z == 0)
   2858  1.1  christos     {
   2859  1.1  christos       OUTS (outf, dregs (reg));
   2860  1.1  christos       OUTS (outf, " = B[");
   2861  1.1  christos       OUTS (outf, pregs (ptr));
   2862  1.1  christos       OUTS (outf, " + ");
   2863  1.1  christos       OUTS (outf, imm16 (offset));
   2864  1.1  christos       OUTS (outf, "] (Z)");
   2865  1.1  christos     }
   2866  1.1  christos   else if (W == 0 && sz == 2 && Z == 1)
   2867  1.1  christos     {
   2868  1.1  christos       OUTS (outf, dregs (reg));
   2869  1.1  christos       OUTS (outf, " = B[");
   2870  1.1  christos       OUTS (outf, pregs (ptr));
   2871  1.1  christos       OUTS (outf, " + ");
   2872  1.1  christos       OUTS (outf, imm16 (offset));
   2873  1.1  christos       OUTS (outf, "] (X)");
   2874  1.1  christos     }
   2875  1.1  christos   else if (W == 1 && sz == 0 && Z == 0)
   2876  1.1  christos     {
   2877  1.1  christos       OUTS (outf, "[");
   2878  1.1  christos       OUTS (outf, pregs (ptr));
   2879  1.1  christos       OUTS (outf, " + ");
   2880  1.1  christos       OUTS (outf, imm16s4 (offset));
   2881  1.1  christos       OUTS (outf, "] = ");
   2882  1.1  christos       OUTS (outf, dregs (reg));
   2883  1.1  christos     }
   2884  1.1  christos   else if (W == 1 && sz == 0 && Z == 1)
   2885  1.1  christos     {
   2886  1.1  christos       OUTS (outf, "[");
   2887  1.1  christos       OUTS (outf, pregs (ptr));
   2888  1.1  christos       OUTS (outf, " + ");
   2889  1.1  christos       OUTS (outf, imm16s4 (offset));
   2890  1.1  christos       OUTS (outf, "] = ");
   2891  1.1  christos       OUTS (outf, pregs (reg));
   2892  1.1  christos     }
   2893  1.1  christos   else if (W == 1 && sz == 1 && Z == 0)
   2894  1.1  christos     {
   2895  1.1  christos       OUTS (outf, "W[");
   2896  1.1  christos       OUTS (outf, pregs (ptr));
   2897  1.1  christos       OUTS (outf, " + ");
   2898  1.1  christos       OUTS (outf, imm16s2 (offset));
   2899  1.1  christos       OUTS (outf, "] = ");
   2900  1.1  christos       OUTS (outf, dregs (reg));
   2901  1.1  christos     }
   2902  1.1  christos   else if (W == 1 && sz == 2 && Z == 0)
   2903  1.1  christos     {
   2904  1.1  christos       OUTS (outf, "B[");
   2905  1.1  christos       OUTS (outf, pregs (ptr));
   2906  1.1  christos       OUTS (outf, " + ");
   2907  1.1  christos       OUTS (outf, imm16 (offset));
   2908  1.1  christos       OUTS (outf, "] = ");
   2909  1.1  christos       OUTS (outf, dregs (reg));
   2910  1.1  christos     }
   2911  1.1  christos   else
   2912  1.1  christos     return 0;
   2913  1.1  christos 
   2914  1.1  christos   return 4;
   2915  1.1  christos }
   2916  1.1  christos 
   2917  1.1  christos static int
   2918  1.1  christos decode_linkage_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   2919  1.1  christos {
   2920  1.1  christos   /* linkage
   2921  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2922  1.1  christos      | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.R.|
   2923  1.1  christos      |.framesize.....................................................|
   2924  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2925  1.1  christos   int R = ((iw0 >> (Linkage_R_bits - 16)) & Linkage_R_mask);
   2926  1.1  christos   int framesize = ((iw1 >> Linkage_framesize_bits) & Linkage_framesize_mask);
   2927  1.1  christos 
   2928  1.1  christos   if (parallel)
   2929  1.1  christos     return 0;
   2930  1.1  christos 
   2931  1.1  christos   if (R == 0)
   2932  1.1  christos     {
   2933  1.1  christos       OUTS (outf, "LINK ");
   2934  1.1  christos       OUTS (outf, uimm16s4 (framesize));
   2935  1.1  christos       OUTS (outf, ";\t\t/* (");
   2936  1.1  christos       OUTS (outf, uimm16s4d (framesize));
   2937  1.1  christos       OUTS (outf, ") */");
   2938  1.1  christos       comment = 1;
   2939  1.1  christos     }
   2940  1.1  christos   else if (R == 1)
   2941  1.1  christos     OUTS (outf, "UNLINK");
   2942  1.1  christos   else
   2943  1.1  christos     return 0;
   2944  1.1  christos 
   2945  1.1  christos   return 4;
   2946  1.1  christos }
   2947  1.1  christos 
   2948  1.1  christos static int
   2949  1.1  christos decode_dsp32mac_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   2950  1.1  christos {
   2951  1.1  christos   /* dsp32mac
   2952  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2953  1.1  christos      | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
   2954  1.1  christos      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
   2955  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2956  1.1  christos   int op1  = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
   2957  1.1  christos   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
   2958  1.1  christos   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
   2959  1.1  christos   int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
   2960  1.1  christos   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
   2961  1.1  christos   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
   2962  1.1  christos   int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
   2963  1.1  christos   int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
   2964  1.1  christos   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
   2965  1.1  christos   int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
   2966  1.1  christos   int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
   2967  1.1  christos   int op0  = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
   2968  1.1  christos   int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
   2969  1.1  christos   int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
   2970  1.1  christos 
   2971  1.1  christos   if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
   2972  1.1  christos     return 0;
   2973  1.1  christos 
   2974  1.1  christos   if (op1 == 3 && MM)
   2975  1.1  christos     return 0;
   2976  1.1  christos 
   2977  1.1  christos   if ((w1 || w0) && mmod == M_W32)
   2978  1.1  christos     return 0;
   2979  1.1  christos 
   2980  1.1  christos   if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
   2981  1.1  christos     return 0;
   2982  1.1  christos 
   2983  1.1  christos   if (w1 == 1 || op1 != 3)
   2984  1.1  christos     {
   2985  1.1  christos       if (w1)
   2986  1.1  christos 	OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
   2987  1.1  christos 
   2988  1.1  christos       if (op1 == 3)
   2989  1.1  christos 	OUTS (outf, " = A1");
   2990  1.1  christos       else
   2991  1.1  christos 	{
   2992  1.1  christos 	  if (w1)
   2993  1.1  christos 	    OUTS (outf, " = (");
   2994  1.1  christos 	  decode_macfunc (1, op1, h01, h11, src0, src1, outf);
   2995  1.1  christos 	  if (w1)
   2996  1.1  christos 	    OUTS (outf, ")");
   2997  1.1  christos 	}
   2998  1.1  christos 
   2999  1.1  christos       if (w0 == 1 || op0 != 3)
   3000  1.1  christos 	{
   3001  1.1  christos 	  if (MM)
   3002  1.1  christos 	    OUTS (outf, " (M)");
   3003  1.1  christos 	  OUTS (outf, ", ");
   3004  1.1  christos 	}
   3005  1.1  christos     }
   3006  1.1  christos 
   3007  1.1  christos   if (w0 == 1 || op0 != 3)
   3008  1.1  christos     {
   3009  1.1  christos       /* Clear MM option since it only matters for MAC1, and if we made
   3010  1.1  christos          it this far, we've already shown it or we want to ignore it.  */
   3011  1.1  christos       MM = 0;
   3012  1.1  christos 
   3013  1.1  christos       if (w0)
   3014  1.1  christos 	OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
   3015  1.1  christos 
   3016  1.1  christos       if (op0 == 3)
   3017  1.1  christos 	OUTS (outf, " = A0");
   3018  1.1  christos       else
   3019  1.1  christos 	{
   3020  1.1  christos 	  if (w0)
   3021  1.1  christos 	    OUTS (outf, " = (");
   3022  1.1  christos 	  decode_macfunc (0, op0, h00, h10, src0, src1, outf);
   3023  1.1  christos 	  if (w0)
   3024  1.1  christos 	    OUTS (outf, ")");
   3025  1.1  christos 	}
   3026  1.1  christos     }
   3027  1.1  christos 
   3028  1.1  christos   decode_optmode (mmod, MM, outf);
   3029  1.1  christos 
   3030  1.1  christos   return 4;
   3031  1.1  christos }
   3032  1.1  christos 
   3033  1.1  christos static int
   3034  1.1  christos decode_dsp32mult_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   3035  1.1  christos {
   3036  1.1  christos   /* dsp32mult
   3037  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   3038  1.1  christos      | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
   3039  1.1  christos      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
   3040  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   3041  1.1  christos   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
   3042  1.1  christos   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
   3043  1.1  christos   int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
   3044  1.1  christos   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
   3045  1.1  christos   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
   3046  1.1  christos   int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
   3047  1.1  christos   int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
   3048  1.1  christos   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
   3049  1.1  christos   int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
   3050  1.1  christos   int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
   3051  1.1  christos   int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
   3052  1.1  christos   int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
   3053  1.1  christos 
   3054  1.1  christos   if (w1 == 0 && w0 == 0)
   3055  1.1  christos     return 0;
   3056  1.1  christos 
   3057  1.1  christos   if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
   3058  1.1  christos     return 0;
   3059  1.1  christos 
   3060  1.1  christos   if (w1)
   3061  1.1  christos     {
   3062  1.1  christos       OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
   3063  1.1  christos       OUTS (outf, " = ");
   3064  1.1  christos       decode_multfunc (h01, h11, src0, src1, outf);
   3065  1.1  christos 
   3066  1.1  christos       if (w0)
   3067  1.1  christos 	{
   3068  1.1  christos 	  if (MM)
   3069  1.1  christos 	    OUTS (outf, " (M)");
   3070  1.1  christos 	  MM = 0;
   3071  1.1  christos 	  OUTS (outf, ", ");
   3072  1.1  christos 	}
   3073  1.1  christos     }
   3074  1.1  christos 
   3075  1.1  christos   if (w0)
   3076  1.1  christos     {
   3077  1.1  christos       OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
   3078  1.1  christos       OUTS (outf, " = ");
   3079  1.1  christos       decode_multfunc (h00, h10, src0, src1, outf);
   3080  1.1  christos     }
   3081  1.1  christos 
   3082  1.1  christos   decode_optmode (mmod, MM, outf);
   3083  1.1  christos   return 4;
   3084  1.1  christos }
   3085  1.1  christos 
   3086  1.1  christos static int
   3087  1.1  christos decode_dsp32alu_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   3088  1.1  christos {
   3089  1.1  christos   /* dsp32alu
   3090  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   3091  1.1  christos      | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
   3092  1.1  christos      |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
   3093  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   3094  1.1  christos   int s    = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
   3095  1.1  christos   int x    = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
   3096  1.1  christos   int aop  = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
   3097  1.1  christos   int src0 = ((iw1 >> DSP32Alu_src0_bits) & DSP32Alu_src0_mask);
   3098  1.1  christos   int src1 = ((iw1 >> DSP32Alu_src1_bits) & DSP32Alu_src1_mask);
   3099  1.1  christos   int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
   3100  1.1  christos   int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
   3101  1.1  christos   int HL   = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
   3102  1.1  christos   int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
   3103  1.1  christos 
   3104  1.1  christos   if (aop == 0 && aopcde == 9 && HL == 0 && s == 0)
   3105  1.1  christos     {
   3106  1.1  christos       OUTS (outf, "A0.L = ");
   3107  1.1  christos       OUTS (outf, dregs_lo (src0));
   3108  1.1  christos     }
   3109  1.1  christos   else if (aop == 2 && aopcde == 9 && HL == 1 && s == 0)
   3110  1.1  christos     {
   3111  1.1  christos       OUTS (outf, "A1.H = ");
   3112  1.1  christos       OUTS (outf, dregs_hi (src0));
   3113  1.1  christos     }
   3114  1.1  christos   else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
   3115  1.1  christos     {
   3116  1.1  christos       OUTS (outf, "A1.L = ");
   3117  1.1  christos       OUTS (outf, dregs_lo (src0));
   3118  1.1  christos     }
   3119  1.1  christos   else if (aop == 0 && aopcde == 9 && HL == 1 && s == 0)
   3120  1.1  christos     {
   3121  1.1  christos       OUTS (outf, "A0.H = ");
   3122  1.1  christos       OUTS (outf, dregs_hi (src0));
   3123  1.1  christos     }
   3124  1.1  christos   else if (x == 1 && HL == 1 && aop == 3 && aopcde == 5)
   3125  1.1  christos     {
   3126  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3127  1.1  christos       OUTS (outf, " = ");
   3128  1.1  christos       OUTS (outf, dregs (src0));
   3129  1.1  christos       OUTS (outf, " - ");
   3130  1.1  christos       OUTS (outf, dregs (src1));
   3131  1.1  christos       OUTS (outf, " (RND20)");
   3132  1.1  christos     }
   3133  1.1  christos   else if (x == 1 && HL == 1 && aop == 2 && aopcde == 5)
   3134  1.1  christos     {
   3135  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3136  1.1  christos       OUTS (outf, " = ");
   3137  1.1  christos       OUTS (outf, dregs (src0));
   3138  1.1  christos       OUTS (outf, " + ");
   3139  1.1  christos       OUTS (outf, dregs (src1));
   3140  1.1  christos       OUTS (outf, " (RND20)");
   3141  1.1  christos     }
   3142  1.1  christos   else if (x == 0 && HL == 0 && aop == 1 && aopcde == 5)
   3143  1.1  christos     {
   3144  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3145  1.1  christos       OUTS (outf, " = ");
   3146  1.1  christos       OUTS (outf, dregs (src0));
   3147  1.1  christos       OUTS (outf, " - ");
   3148  1.1  christos       OUTS (outf, dregs (src1));
   3149  1.1  christos       OUTS (outf, " (RND12)");
   3150  1.1  christos     }
   3151  1.1  christos   else if (x == 0 && HL == 0 && aop == 0 && aopcde == 5)
   3152  1.1  christos     {
   3153  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3154  1.1  christos       OUTS (outf, " = ");
   3155  1.1  christos       OUTS (outf, dregs (src0));
   3156  1.1  christos       OUTS (outf, " + ");
   3157  1.1  christos       OUTS (outf, dregs (src1));
   3158  1.1  christos       OUTS (outf, " (RND12)");
   3159  1.1  christos     }
   3160  1.1  christos   else if (x == 1 && HL == 0 && aop == 3 && aopcde == 5)
   3161  1.1  christos     {
   3162  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3163  1.1  christos       OUTS (outf, " = ");
   3164  1.1  christos       OUTS (outf, dregs (src0));
   3165  1.1  christos       OUTS (outf, " - ");
   3166  1.1  christos       OUTS (outf, dregs (src1));
   3167  1.1  christos       OUTS (outf, " (RND20)");
   3168  1.1  christos     }
   3169  1.1  christos   else if (x == 0 && HL == 1 && aop == 0 && aopcde == 5)
   3170  1.1  christos     {
   3171  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3172  1.1  christos       OUTS (outf, " = ");
   3173  1.1  christos       OUTS (outf, dregs (src0));
   3174  1.1  christos       OUTS (outf, " + ");
   3175  1.1  christos       OUTS (outf, dregs (src1));
   3176  1.1  christos       OUTS (outf, " (RND12)");
   3177  1.1  christos     }
   3178  1.1  christos   else if (x == 1 && HL == 0 && aop == 2 && aopcde == 5)
   3179  1.1  christos     {
   3180  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3181  1.1  christos       OUTS (outf, " = ");
   3182  1.1  christos       OUTS (outf, dregs (src0));
   3183  1.1  christos       OUTS (outf, " + ");
   3184  1.1  christos       OUTS (outf, dregs (src1));
   3185  1.1  christos       OUTS (outf, " (RND20)");
   3186  1.1  christos     }
   3187  1.1  christos   else if (x == 0 && HL == 1 && aop == 1 && aopcde == 5)
   3188  1.1  christos     {
   3189  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3190  1.1  christos       OUTS (outf, " = ");
   3191  1.1  christos       OUTS (outf, dregs (src0));
   3192  1.1  christos       OUTS (outf, " - ");
   3193  1.1  christos       OUTS (outf, dregs (src1));
   3194  1.1  christos       OUTS (outf, " (RND12)");
   3195  1.1  christos     }
   3196  1.1  christos   else if (HL == 1 && aop == 0 && aopcde == 2)
   3197  1.1  christos     {
   3198  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3199  1.1  christos       OUTS (outf, " = ");
   3200  1.1  christos       OUTS (outf, dregs_lo (src0));
   3201  1.1  christos       OUTS (outf, " + ");
   3202  1.1  christos       OUTS (outf, dregs_lo (src1));
   3203  1.1  christos       amod1 (s, x, outf);
   3204  1.1  christos     }
   3205  1.1  christos   else if (HL == 1 && aop == 1 && aopcde == 2)
   3206  1.1  christos     {
   3207  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3208  1.1  christos       OUTS (outf, " = ");
   3209  1.1  christos       OUTS (outf, dregs_lo (src0));
   3210  1.1  christos       OUTS (outf, " + ");
   3211  1.1  christos       OUTS (outf, dregs_hi (src1));
   3212  1.1  christos       amod1 (s, x, outf);
   3213  1.1  christos     }
   3214  1.1  christos   else if (HL == 1 && aop == 2 && aopcde == 2)
   3215  1.1  christos     {
   3216  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3217  1.1  christos       OUTS (outf, " = ");
   3218  1.1  christos       OUTS (outf, dregs_hi (src0));
   3219  1.1  christos       OUTS (outf, " + ");
   3220  1.1  christos       OUTS (outf, dregs_lo (src1));
   3221  1.1  christos       amod1 (s, x, outf);
   3222  1.1  christos     }
   3223  1.1  christos   else if (HL == 1 && aop == 3 && aopcde == 2)
   3224  1.1  christos     {
   3225  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3226  1.1  christos       OUTS (outf, " = ");
   3227  1.1  christos       OUTS (outf, dregs_hi (src0));
   3228  1.1  christos       OUTS (outf, " + ");
   3229  1.1  christos       OUTS (outf, dregs_hi (src1));
   3230  1.1  christos       amod1 (s, x, outf);
   3231  1.1  christos     }
   3232  1.1  christos   else if (HL == 0 && aop == 0 && aopcde == 3)
   3233  1.1  christos     {
   3234  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3235  1.1  christos       OUTS (outf, " = ");
   3236  1.1  christos       OUTS (outf, dregs_lo (src0));
   3237  1.1  christos       OUTS (outf, " - ");
   3238  1.1  christos       OUTS (outf, dregs_lo (src1));
   3239  1.1  christos       amod1 (s, x, outf);
   3240  1.1  christos     }
   3241  1.1  christos   else if (HL == 0 && aop == 1 && aopcde == 3)
   3242  1.1  christos     {
   3243  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3244  1.1  christos       OUTS (outf, " = ");
   3245  1.1  christos       OUTS (outf, dregs_lo (src0));
   3246  1.1  christos       OUTS (outf, " - ");
   3247  1.1  christos       OUTS (outf, dregs_hi (src1));
   3248  1.1  christos       amod1 (s, x, outf);
   3249  1.1  christos     }
   3250  1.1  christos   else if (HL == 0 && aop == 3 && aopcde == 2)
   3251  1.1  christos     {
   3252  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3253  1.1  christos       OUTS (outf, " = ");
   3254  1.1  christos       OUTS (outf, dregs_hi (src0));
   3255  1.1  christos       OUTS (outf, " + ");
   3256  1.1  christos       OUTS (outf, dregs_hi (src1));
   3257  1.1  christos       amod1 (s, x, outf);
   3258  1.1  christos     }
   3259  1.1  christos   else if (HL == 1 && aop == 0 && aopcde == 3)
   3260  1.1  christos     {
   3261  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3262  1.1  christos       OUTS (outf, " = ");
   3263  1.1  christos       OUTS (outf, dregs_lo (src0));
   3264  1.1  christos       OUTS (outf, " - ");
   3265  1.1  christos       OUTS (outf, dregs_lo (src1));
   3266  1.1  christos       amod1 (s, x, outf);
   3267  1.1  christos     }
   3268  1.1  christos   else if (HL == 1 && aop == 1 && aopcde == 3)
   3269  1.1  christos     {
   3270  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3271  1.1  christos       OUTS (outf, " = ");
   3272  1.1  christos       OUTS (outf, dregs_lo (src0));
   3273  1.1  christos       OUTS (outf, " - ");
   3274  1.1  christos       OUTS (outf, dregs_hi (src1));
   3275  1.1  christos       amod1 (s, x, outf);
   3276  1.1  christos     }
   3277  1.1  christos   else if (HL == 1 && aop == 2 && aopcde == 3)
   3278  1.1  christos     {
   3279  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3280  1.1  christos       OUTS (outf, " = ");
   3281  1.1  christos       OUTS (outf, dregs_hi (src0));
   3282  1.1  christos       OUTS (outf, " - ");
   3283  1.1  christos       OUTS (outf, dregs_lo (src1));
   3284  1.1  christos       amod1 (s, x, outf);
   3285  1.1  christos     }
   3286  1.1  christos   else if (HL == 1 && aop == 3 && aopcde == 3)
   3287  1.1  christos     {
   3288  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3289  1.1  christos       OUTS (outf, " = ");
   3290  1.1  christos       OUTS (outf, dregs_hi (src0));
   3291  1.1  christos       OUTS (outf, " - ");
   3292  1.1  christos       OUTS (outf, dregs_hi (src1));
   3293  1.1  christos       amod1 (s, x, outf);
   3294  1.1  christos     }
   3295  1.1  christos   else if (HL == 0 && aop == 2 && aopcde == 2)
   3296  1.1  christos     {
   3297  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3298  1.1  christos       OUTS (outf, " = ");
   3299  1.1  christos       OUTS (outf, dregs_hi (src0));
   3300  1.1  christos       OUTS (outf, " + ");
   3301  1.1  christos       OUTS (outf, dregs_lo (src1));
   3302  1.1  christos       amod1 (s, x, outf);
   3303  1.1  christos     }
   3304  1.1  christos   else if (HL == 0 && aop == 1 && aopcde == 2)
   3305  1.1  christos     {
   3306  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3307  1.1  christos       OUTS (outf, " = ");
   3308  1.1  christos       OUTS (outf, dregs_lo (src0));
   3309  1.1  christos       OUTS (outf, " + ");
   3310  1.1  christos       OUTS (outf, dregs_hi (src1));
   3311  1.1  christos       amod1 (s, x, outf);
   3312  1.1  christos     }
   3313  1.1  christos   else if (HL == 0 && aop == 2 && aopcde == 3)
   3314  1.1  christos     {
   3315  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3316  1.1  christos       OUTS (outf, " = ");
   3317  1.1  christos       OUTS (outf, dregs_hi (src0));
   3318  1.1  christos       OUTS (outf, " - ");
   3319  1.1  christos       OUTS (outf, dregs_lo (src1));
   3320  1.1  christos       amod1 (s, x, outf);
   3321  1.1  christos     }
   3322  1.1  christos   else if (HL == 0 && aop == 3 && aopcde == 3)
   3323  1.1  christos     {
   3324  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3325  1.1  christos       OUTS (outf, " = ");
   3326  1.1  christos       OUTS (outf, dregs_hi (src0));
   3327  1.1  christos       OUTS (outf, " - ");
   3328  1.1  christos       OUTS (outf, dregs_hi (src1));
   3329  1.1  christos       amod1 (s, x, outf);
   3330  1.1  christos     }
   3331  1.1  christos   else if (HL == 0 && aop == 0 && aopcde == 2)
   3332  1.1  christos     {
   3333  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3334  1.1  christos       OUTS (outf, " = ");
   3335  1.1  christos       OUTS (outf, dregs_lo (src0));
   3336  1.1  christos       OUTS (outf, " + ");
   3337  1.1  christos       OUTS (outf, dregs_lo (src1));
   3338  1.1  christos       amod1 (s, x, outf);
   3339  1.1  christos     }
   3340  1.1  christos   else if (aop == 0 && aopcde == 9 && s == 1)
   3341  1.1  christos     {
   3342  1.1  christos       OUTS (outf, "A0 = ");
   3343  1.1  christos       OUTS (outf, dregs (src0));
   3344  1.1  christos     }
   3345  1.1  christos   else if (aop == 3 && aopcde == 11 && s == 0)
   3346  1.1  christos     OUTS (outf, "A0 -= A1");
   3347  1.1  christos 
   3348  1.1  christos   else if (aop == 3 && aopcde == 11 && s == 1)
   3349  1.1  christos     OUTS (outf, "A0 -= A1 (W32)");
   3350  1.1  christos 
   3351  1.1  christos   else if (aop == 1 && aopcde == 22 && HL == 1)
   3352  1.1  christos     {
   3353  1.1  christos       OUTS (outf, dregs (dst0));
   3354  1.1  christos       OUTS (outf, " = BYTEOP2P (");
   3355  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3356  1.1  christos       OUTS (outf, ":");
   3357  1.1  christos       OUTS (outf, imm5d (src0));
   3358  1.1  christos       OUTS (outf, ", ");
   3359  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3360  1.1  christos       OUTS (outf, ":");
   3361  1.1  christos       OUTS (outf, imm5d (src1));
   3362  1.1  christos       OUTS (outf, ") (TH");
   3363  1.1  christos       if (s == 1)
   3364  1.1  christos 	OUTS (outf, ", R)");
   3365  1.1  christos       else
   3366  1.1  christos 	OUTS (outf, ")");
   3367  1.1  christos     }
   3368  1.1  christos   else if (aop == 1 && aopcde == 22 && HL == 0)
   3369  1.1  christos     {
   3370  1.1  christos       OUTS (outf, dregs (dst0));
   3371  1.1  christos       OUTS (outf, " = BYTEOP2P (");
   3372  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3373  1.1  christos       OUTS (outf, ":");
   3374  1.1  christos       OUTS (outf, imm5d (src0));
   3375  1.1  christos       OUTS (outf, ", ");
   3376  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3377  1.1  christos       OUTS (outf, ":");
   3378  1.1  christos       OUTS (outf, imm5d (src1));
   3379  1.1  christos       OUTS (outf, ") (TL");
   3380  1.1  christos       if (s == 1)
   3381  1.1  christos 	OUTS (outf, ", R)");
   3382  1.1  christos       else
   3383  1.1  christos 	OUTS (outf, ")");
   3384  1.1  christos     }
   3385  1.1  christos   else if (aop == 0 && aopcde == 22 && HL == 1)
   3386  1.1  christos     {
   3387  1.1  christos       OUTS (outf, dregs (dst0));
   3388  1.1  christos       OUTS (outf, " = BYTEOP2P (");
   3389  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3390  1.1  christos       OUTS (outf, ":");
   3391  1.1  christos       OUTS (outf, imm5d (src0));
   3392  1.1  christos       OUTS (outf, ", ");
   3393  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3394  1.1  christos       OUTS (outf, ":");
   3395  1.1  christos       OUTS (outf, imm5d (src1));
   3396  1.1  christos       OUTS (outf, ") (RNDH");
   3397  1.1  christos       if (s == 1)
   3398  1.1  christos 	OUTS (outf, ", R)");
   3399  1.1  christos       else
   3400  1.1  christos 	OUTS (outf, ")");
   3401  1.1  christos     }
   3402  1.1  christos   else if (aop == 0 && aopcde == 22 && HL == 0)
   3403  1.1  christos     {
   3404  1.1  christos       OUTS (outf, dregs (dst0));
   3405  1.1  christos       OUTS (outf, " = BYTEOP2P (");
   3406  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3407  1.1  christos       OUTS (outf, ":");
   3408  1.1  christos       OUTS (outf, imm5d (src0));
   3409  1.1  christos       OUTS (outf, ", ");
   3410  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3411  1.1  christos       OUTS (outf, ":");
   3412  1.1  christos       OUTS (outf, imm5d (src1));
   3413  1.1  christos       OUTS (outf, ") (RNDL");
   3414  1.1  christos       if (s == 1)
   3415  1.1  christos 	OUTS (outf, ", R)");
   3416  1.1  christos       else
   3417  1.1  christos 	OUTS (outf, ")");
   3418  1.1  christos     }
   3419  1.1  christos   else if (aop == 0 && s == 0 && aopcde == 8)
   3420  1.1  christos     OUTS (outf, "A0 = 0");
   3421  1.1  christos 
   3422  1.1  christos   else if (aop == 0 && s == 1 && aopcde == 8)
   3423  1.1  christos     OUTS (outf, "A0 = A0 (S)");
   3424  1.1  christos 
   3425  1.1  christos   else if (aop == 1 && s == 0 && aopcde == 8)
   3426  1.1  christos     OUTS (outf, "A1 = 0");
   3427  1.1  christos 
   3428  1.1  christos   else if (aop == 1 && s == 1 && aopcde == 8)
   3429  1.1  christos     OUTS (outf, "A1 = A1 (S)");
   3430  1.1  christos 
   3431  1.1  christos   else if (aop == 2 && s == 0 && aopcde == 8)
   3432  1.1  christos     OUTS (outf, "A1 = A0 = 0");
   3433  1.1  christos 
   3434  1.1  christos   else if (aop == 2 && s == 1 && aopcde == 8)
   3435  1.1  christos     OUTS (outf, "A1 = A1 (S), A0 = A0 (S)");
   3436  1.1  christos 
   3437  1.1  christos   else if (aop == 3 && s == 0 && aopcde == 8)
   3438  1.1  christos     OUTS (outf, "A0 = A1");
   3439  1.1  christos 
   3440  1.1  christos   else if (aop == 3 && s == 1 && aopcde == 8)
   3441  1.1  christos     OUTS (outf, "A1 = A0");
   3442  1.1  christos 
   3443  1.1  christos   else if (aop == 1 && aopcde == 9 && s == 0)
   3444  1.1  christos     {
   3445  1.1  christos       OUTS (outf, "A0.X = ");
   3446  1.1  christos       OUTS (outf, dregs_lo (src0));
   3447  1.1  christos     }
   3448  1.1  christos   else if (aop == 1 && HL == 0 && aopcde == 11)
   3449  1.1  christos     {
   3450  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3451  1.1  christos       OUTS (outf, " = (A0 += A1)");
   3452  1.1  christos     }
   3453  1.1  christos   else if (aop == 3 && HL == 0 && aopcde == 16)
   3454  1.1  christos     OUTS (outf, "A1 = ABS A1, A0 = ABS A0");
   3455  1.1  christos 
   3456  1.1  christos   else if (aop == 0 && aopcde == 23 && HL == 1)
   3457  1.1  christos     {
   3458  1.1  christos       OUTS (outf, dregs (dst0));
   3459  1.1  christos       OUTS (outf, " = BYTEOP3P (");
   3460  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3461  1.1  christos       OUTS (outf, ":");
   3462  1.1  christos       OUTS (outf, imm5d (src0));
   3463  1.1  christos       OUTS (outf, ", ");
   3464  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3465  1.1  christos       OUTS (outf, ":");
   3466  1.1  christos       OUTS (outf, imm5d (src1));
   3467  1.1  christos       OUTS (outf, ") (HI");
   3468  1.1  christos       if (s == 1)
   3469  1.1  christos 	OUTS (outf, ", R)");
   3470  1.1  christos       else
   3471  1.1  christos 	OUTS (outf, ")");
   3472  1.1  christos     }
   3473  1.1  christos   else if (aop == 3 && aopcde == 9 && s == 0)
   3474  1.1  christos     {
   3475  1.1  christos       OUTS (outf, "A1.X = ");
   3476  1.1  christos       OUTS (outf, dregs_lo (src0));
   3477  1.1  christos     }
   3478  1.1  christos   else if (aop == 1 && HL == 1 && aopcde == 16)
   3479  1.1  christos     OUTS (outf, "A1 = ABS A1");
   3480  1.1  christos 
   3481  1.1  christos   else if (aop == 0 && HL == 1 && aopcde == 16)
   3482  1.1  christos     OUTS (outf, "A1 = ABS A0");
   3483  1.1  christos 
   3484  1.1  christos   else if (aop == 2 && aopcde == 9 && s == 1)
   3485  1.1  christos     {
   3486  1.1  christos       OUTS (outf, "A1 = ");
   3487  1.1  christos       OUTS (outf, dregs (src0));
   3488  1.1  christos     }
   3489  1.1  christos   else if (HL == 0 && aop == 3 && aopcde == 12)
   3490  1.1  christos     {
   3491  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3492  1.1  christos       OUTS (outf, " = ");
   3493  1.1  christos       OUTS (outf, dregs (src0));
   3494  1.1  christos       OUTS (outf, " (RND)");
   3495  1.1  christos     }
   3496  1.1  christos   else if (aop == 1 && HL == 0 && aopcde == 16)
   3497  1.1  christos     OUTS (outf, "A0 = ABS A1");
   3498  1.1  christos 
   3499  1.1  christos   else if (aop == 0 && HL == 0 && aopcde == 16)
   3500  1.1  christos     OUTS (outf, "A0 = ABS A0");
   3501  1.1  christos 
   3502  1.1  christos   else if (aop == 3 && HL == 0 && aopcde == 15)
   3503  1.1  christos     {
   3504  1.1  christos       OUTS (outf, dregs (dst0));
   3505  1.1  christos       OUTS (outf, " = -");
   3506  1.1  christos       OUTS (outf, dregs (src0));
   3507  1.1  christos       OUTS (outf, " (V)");
   3508  1.1  christos     }
   3509  1.1  christos   else if (aop == 3 && s == 1 && HL == 0 && aopcde == 7)
   3510  1.1  christos     {
   3511  1.1  christos       OUTS (outf, dregs (dst0));
   3512  1.1  christos       OUTS (outf, " = -");
   3513  1.1  christos       OUTS (outf, dregs (src0));
   3514  1.1  christos       OUTS (outf, " (S)");
   3515  1.1  christos     }
   3516  1.1  christos   else if (aop == 3 && s == 0 && HL == 0 && aopcde == 7)
   3517  1.1  christos     {
   3518  1.1  christos       OUTS (outf, dregs (dst0));
   3519  1.1  christos       OUTS (outf, " = -");
   3520  1.1  christos       OUTS (outf, dregs (src0));
   3521  1.1  christos       OUTS (outf, " (NS)");
   3522  1.1  christos     }
   3523  1.1  christos   else if (aop == 1 && HL == 1 && aopcde == 11)
   3524  1.1  christos     {
   3525  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3526  1.1  christos       OUTS (outf, " = (A0 += A1)");
   3527  1.1  christos     }
   3528  1.1  christos   else if (aop == 2 && aopcde == 11 && s == 0)
   3529  1.1  christos     OUTS (outf, "A0 += A1");
   3530  1.1  christos 
   3531  1.1  christos   else if (aop == 2 && aopcde == 11 && s == 1)
   3532  1.1  christos     OUTS (outf, "A0 += A1 (W32)");
   3533  1.1  christos 
   3534  1.1  christos   else if (aop == 3 && HL == 0 && aopcde == 14)
   3535  1.1  christos     OUTS (outf, "A1 = -A1, A0 = -A0");
   3536  1.1  christos 
   3537  1.1  christos   else if (HL == 1 && aop == 3 && aopcde == 12)
   3538  1.1  christos     {
   3539  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3540  1.1  christos       OUTS (outf, " = ");
   3541  1.1  christos       OUTS (outf, dregs (src0));
   3542  1.1  christos       OUTS (outf, " (RND)");
   3543  1.1  christos     }
   3544  1.1  christos   else if (aop == 0 && aopcde == 23 && HL == 0)
   3545  1.1  christos     {
   3546  1.1  christos       OUTS (outf, dregs (dst0));
   3547  1.1  christos       OUTS (outf, " = BYTEOP3P (");
   3548  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3549  1.1  christos       OUTS (outf, ":");
   3550  1.1  christos       OUTS (outf, imm5d (src0));
   3551  1.1  christos       OUTS (outf, ", ");
   3552  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3553  1.1  christos       OUTS (outf, ":");
   3554  1.1  christos       OUTS (outf, imm5d (src1));
   3555  1.1  christos       OUTS (outf, ") (LO");
   3556  1.1  christos       if (s == 1)
   3557  1.1  christos 	OUTS (outf, ", R)");
   3558  1.1  christos       else
   3559  1.1  christos 	OUTS (outf, ")");
   3560  1.1  christos     }
   3561  1.1  christos   else if (aop == 0 && HL == 0 && aopcde == 14)
   3562  1.1  christos     OUTS (outf, "A0 = -A0");
   3563  1.1  christos 
   3564  1.1  christos   else if (aop == 1 && HL == 0 && aopcde == 14)
   3565  1.1  christos     OUTS (outf, "A0 = -A1");
   3566  1.1  christos 
   3567  1.1  christos   else if (aop == 0 && HL == 1 && aopcde == 14)
   3568  1.1  christos     OUTS (outf, "A1 = -A0");
   3569  1.1  christos 
   3570  1.1  christos   else if (aop == 1 && HL == 1 && aopcde == 14)
   3571  1.1  christos     OUTS (outf, "A1 = -A1");
   3572  1.1  christos 
   3573  1.1  christos   else if (aop == 0 && aopcde == 12)
   3574  1.1  christos     {
   3575  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3576  1.1  christos       OUTS (outf, " = ");
   3577  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3578  1.1  christos       OUTS (outf, " = SIGN (");
   3579  1.1  christos       OUTS (outf, dregs_hi (src0));
   3580  1.1  christos       OUTS (outf, ") * ");
   3581  1.1  christos       OUTS (outf, dregs_hi (src1));
   3582  1.1  christos       OUTS (outf, " + SIGN (");
   3583  1.1  christos       OUTS (outf, dregs_lo (src0));
   3584  1.1  christos       OUTS (outf, ") * ");
   3585  1.1  christos       OUTS (outf, dregs_lo (src1));
   3586  1.1  christos     }
   3587  1.1  christos   else if (aop == 2 && aopcde == 0)
   3588  1.1  christos     {
   3589  1.1  christos       OUTS (outf, dregs (dst0));
   3590  1.1  christos       OUTS (outf, " = ");
   3591  1.1  christos       OUTS (outf, dregs (src0));
   3592  1.1  christos       OUTS (outf, " -|+ ");
   3593  1.1  christos       OUTS (outf, dregs (src1));
   3594  1.1  christos       amod0 (s, x, outf);
   3595  1.1  christos     }
   3596  1.1  christos   else if (aop == 1 && aopcde == 12)
   3597  1.1  christos     {
   3598  1.1  christos       OUTS (outf, dregs (dst1));
   3599  1.1  christos       OUTS (outf, " = A1.L + A1.H, ");
   3600  1.1  christos       OUTS (outf, dregs (dst0));
   3601  1.1  christos       OUTS (outf, " = A0.L + A0.H");
   3602  1.1  christos     }
   3603  1.1  christos   else if (aop == 2 && aopcde == 4)
   3604  1.1  christos     {
   3605  1.1  christos       OUTS (outf, dregs (dst1));
   3606  1.1  christos       OUTS (outf, " = ");
   3607  1.1  christos       OUTS (outf, dregs (src0));
   3608  1.1  christos       OUTS (outf, " + ");
   3609  1.1  christos       OUTS (outf, dregs (src1));
   3610  1.1  christos       OUTS (outf, ", ");
   3611  1.1  christos       OUTS (outf, dregs (dst0));
   3612  1.1  christos       OUTS (outf, " = ");
   3613  1.1  christos       OUTS (outf, dregs (src0));
   3614  1.1  christos       OUTS (outf, " - ");
   3615  1.1  christos       OUTS (outf, dregs (src1));
   3616  1.1  christos       amod1 (s, x, outf);
   3617  1.1  christos     }
   3618  1.1  christos   else if (HL == 0 && aopcde == 1)
   3619  1.1  christos     {
   3620  1.1  christos       OUTS (outf, dregs (dst1));
   3621  1.1  christos       OUTS (outf, " = ");
   3622  1.1  christos       OUTS (outf, dregs (src0));
   3623  1.1  christos       OUTS (outf, " +|+ ");
   3624  1.1  christos       OUTS (outf, dregs (src1));
   3625  1.1  christos       OUTS (outf, ", ");
   3626  1.1  christos       OUTS (outf, dregs (dst0));
   3627  1.1  christos       OUTS (outf, " = ");
   3628  1.1  christos       OUTS (outf, dregs (src0));
   3629  1.1  christos       OUTS (outf, " -|- ");
   3630  1.1  christos       OUTS (outf, dregs (src1));
   3631  1.1  christos       amod0amod2 (s, x, aop, outf);
   3632  1.1  christos     }
   3633  1.1  christos   else if (aop == 0 && aopcde == 11)
   3634  1.1  christos     {
   3635  1.1  christos       OUTS (outf, dregs (dst0));
   3636  1.1  christos       OUTS (outf, " = (A0 += A1)");
   3637  1.1  christos     }
   3638  1.1  christos   else if (aop == 0 && aopcde == 10)
   3639  1.1  christos     {
   3640  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3641  1.1  christos       OUTS (outf, " = A0.X");
   3642  1.1  christos     }
   3643  1.1  christos   else if (aop == 1 && aopcde == 10)
   3644  1.1  christos     {
   3645  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3646  1.1  christos       OUTS (outf, " = A1.X");
   3647  1.1  christos     }
   3648  1.1  christos   else if (aop == 1 && aopcde == 0)
   3649  1.1  christos     {
   3650  1.1  christos       OUTS (outf, dregs (dst0));
   3651  1.1  christos       OUTS (outf, " = ");
   3652  1.1  christos       OUTS (outf, dregs (src0));
   3653  1.1  christos       OUTS (outf, " +|- ");
   3654  1.1  christos       OUTS (outf, dregs (src1));
   3655  1.1  christos       amod0 (s, x, outf);
   3656  1.1  christos     }
   3657  1.1  christos   else if (aop == 3 && aopcde == 0)
   3658  1.1  christos     {
   3659  1.1  christos       OUTS (outf, dregs (dst0));
   3660  1.1  christos       OUTS (outf, " = ");
   3661  1.1  christos       OUTS (outf, dregs (src0));
   3662  1.1  christos       OUTS (outf, " -|- ");
   3663  1.1  christos       OUTS (outf, dregs (src1));
   3664  1.1  christos       amod0 (s, x, outf);
   3665  1.1  christos     }
   3666  1.1  christos   else if (aop == 1 && aopcde == 4)
   3667  1.1  christos     {
   3668  1.1  christos       OUTS (outf, dregs (dst0));
   3669  1.1  christos       OUTS (outf, " = ");
   3670  1.1  christos       OUTS (outf, dregs (src0));
   3671  1.1  christos       OUTS (outf, " - ");
   3672  1.1  christos       OUTS (outf, dregs (src1));
   3673  1.1  christos       amod1 (s, x, outf);
   3674  1.1  christos     }
   3675  1.1  christos   else if (aop == 0 && aopcde == 17)
   3676  1.1  christos     {
   3677  1.1  christos       OUTS (outf, dregs (dst1));
   3678  1.1  christos       OUTS (outf, " = A1 + A0, ");
   3679  1.1  christos       OUTS (outf, dregs (dst0));
   3680  1.1  christos       OUTS (outf, " = A1 - A0");
   3681  1.1  christos       amod1 (s, x, outf);
   3682  1.1  christos     }
   3683  1.1  christos   else if (aop == 1 && aopcde == 17)
   3684  1.1  christos     {
   3685  1.1  christos       OUTS (outf, dregs (dst1));
   3686  1.1  christos       OUTS (outf, " = A0 + A1, ");
   3687  1.1  christos       OUTS (outf, dregs (dst0));
   3688  1.1  christos       OUTS (outf, " = A0 - A1");
   3689  1.1  christos       amod1 (s, x, outf);
   3690  1.1  christos     }
   3691  1.1  christos   else if (aop == 0 && aopcde == 18)
   3692  1.1  christos     {
   3693  1.1  christos       OUTS (outf, "SAA (");
   3694  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3695  1.1  christos       OUTS (outf, ":");
   3696  1.1  christos       OUTS (outf, imm5d (src0));
   3697  1.1  christos       OUTS (outf, ", ");
   3698  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3699  1.1  christos       OUTS (outf, ":");
   3700  1.1  christos       OUTS (outf, imm5d (src1));
   3701  1.1  christos       OUTS (outf, ")");
   3702  1.1  christos       aligndir (s, outf);
   3703  1.1  christos     }
   3704  1.1  christos   else if (aop == 3 && aopcde == 18)
   3705  1.1  christos     OUTS (outf, "DISALGNEXCPT");
   3706  1.1  christos 
   3707  1.1  christos   else if (aop == 0 && aopcde == 20)
   3708  1.1  christos     {
   3709  1.1  christos       OUTS (outf, dregs (dst0));
   3710  1.1  christos       OUTS (outf, " = BYTEOP1P (");
   3711  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3712  1.1  christos       OUTS (outf, ":");
   3713  1.1  christos       OUTS (outf, imm5d (src0));
   3714  1.1  christos       OUTS (outf, ", ");
   3715  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3716  1.1  christos       OUTS (outf, ":");
   3717  1.1  christos       OUTS (outf, imm5d (src1));
   3718  1.1  christos       OUTS (outf, ")");
   3719  1.1  christos       aligndir (s, outf);
   3720  1.1  christos     }
   3721  1.1  christos   else if (aop == 1 && aopcde == 20)
   3722  1.1  christos     {
   3723  1.1  christos       OUTS (outf, dregs (dst0));
   3724  1.1  christos       OUTS (outf, " = BYTEOP1P (");
   3725  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3726  1.1  christos       OUTS (outf, ":");
   3727  1.1  christos       OUTS (outf, imm5d (src0));
   3728  1.1  christos       OUTS (outf, ", ");
   3729  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3730  1.1  christos       OUTS (outf, ":");
   3731  1.1  christos       OUTS (outf, imm5d (src1));
   3732  1.1  christos       OUTS (outf, ") (T");
   3733  1.1  christos       if (s == 1)
   3734  1.1  christos 	OUTS (outf, ", R)");
   3735  1.1  christos       else
   3736  1.1  christos 	OUTS (outf, ")");
   3737  1.1  christos     }
   3738  1.1  christos   else if (aop == 0 && aopcde == 21)
   3739  1.1  christos     {
   3740  1.1  christos       OUTS (outf, "(");
   3741  1.1  christos       OUTS (outf, dregs (dst1));
   3742  1.1  christos       OUTS (outf, ", ");
   3743  1.1  christos       OUTS (outf, dregs (dst0));
   3744  1.1  christos       OUTS (outf, ") = BYTEOP16P (");
   3745  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3746  1.1  christos       OUTS (outf, ":");
   3747  1.1  christos       OUTS (outf, imm5d (src0));
   3748  1.1  christos       OUTS (outf, ", ");
   3749  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3750  1.1  christos       OUTS (outf, ":");
   3751  1.1  christos       OUTS (outf, imm5d (src1));
   3752  1.1  christos       OUTS (outf, ")");
   3753  1.1  christos       aligndir (s, outf);
   3754  1.1  christos     }
   3755  1.1  christos   else if (aop == 1 && aopcde == 21)
   3756  1.1  christos     {
   3757  1.1  christos       OUTS (outf, "(");
   3758  1.1  christos       OUTS (outf, dregs (dst1));
   3759  1.1  christos       OUTS (outf, ", ");
   3760  1.1  christos       OUTS (outf, dregs (dst0));
   3761  1.1  christos       OUTS (outf, ") = BYTEOP16M (");
   3762  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3763  1.1  christos       OUTS (outf, ":");
   3764  1.1  christos       OUTS (outf, imm5d (src0));
   3765  1.1  christos       OUTS (outf, ", ");
   3766  1.1  christos       OUTS (outf, dregs (src1 + 1));
   3767  1.1  christos       OUTS (outf, ":");
   3768  1.1  christos       OUTS (outf, imm5d (src1));
   3769  1.1  christos       OUTS (outf, ")");
   3770  1.1  christos       aligndir (s, outf);
   3771  1.1  christos     }
   3772  1.1  christos   else if (aop == 2 && aopcde == 7)
   3773  1.1  christos     {
   3774  1.1  christos       OUTS (outf, dregs (dst0));
   3775  1.1  christos       OUTS (outf, " = ABS ");
   3776  1.1  christos       OUTS (outf, dregs (src0));
   3777  1.1  christos     }
   3778  1.1  christos   else if (aop == 1 && aopcde == 7)
   3779  1.1  christos     {
   3780  1.1  christos       OUTS (outf, dregs (dst0));
   3781  1.1  christos       OUTS (outf, " = MIN (");
   3782  1.1  christos       OUTS (outf, dregs (src0));
   3783  1.1  christos       OUTS (outf, ", ");
   3784  1.1  christos       OUTS (outf, dregs (src1));
   3785  1.1  christos       OUTS (outf, ")");
   3786  1.1  christos     }
   3787  1.1  christos   else if (aop == 0 && aopcde == 7)
   3788  1.1  christos     {
   3789  1.1  christos       OUTS (outf, dregs (dst0));
   3790  1.1  christos       OUTS (outf, " = MAX (");
   3791  1.1  christos       OUTS (outf, dregs (src0));
   3792  1.1  christos       OUTS (outf, ", ");
   3793  1.1  christos       OUTS (outf, dregs (src1));
   3794  1.1  christos       OUTS (outf, ")");
   3795  1.1  christos     }
   3796  1.1  christos   else if (aop == 2 && aopcde == 6)
   3797  1.1  christos     {
   3798  1.1  christos       OUTS (outf, dregs (dst0));
   3799  1.1  christos       OUTS (outf, " = ABS ");
   3800  1.1  christos       OUTS (outf, dregs (src0));
   3801  1.1  christos       OUTS (outf, " (V)");
   3802  1.1  christos     }
   3803  1.1  christos   else if (aop == 1 && aopcde == 6)
   3804  1.1  christos     {
   3805  1.1  christos       OUTS (outf, dregs (dst0));
   3806  1.1  christos       OUTS (outf, " = MIN (");
   3807  1.1  christos       OUTS (outf, dregs (src0));
   3808  1.1  christos       OUTS (outf, ", ");
   3809  1.1  christos       OUTS (outf, dregs (src1));
   3810  1.1  christos       OUTS (outf, ") (V)");
   3811  1.1  christos     }
   3812  1.1  christos   else if (aop == 0 && aopcde == 6)
   3813  1.1  christos     {
   3814  1.1  christos       OUTS (outf, dregs (dst0));
   3815  1.1  christos       OUTS (outf, " = MAX (");
   3816  1.1  christos       OUTS (outf, dregs (src0));
   3817  1.1  christos       OUTS (outf, ", ");
   3818  1.1  christos       OUTS (outf, dregs (src1));
   3819  1.1  christos       OUTS (outf, ") (V)");
   3820  1.1  christos     }
   3821  1.1  christos   else if (HL == 1 && aopcde == 1)
   3822  1.1  christos     {
   3823  1.1  christos       OUTS (outf, dregs (dst1));
   3824  1.1  christos       OUTS (outf, " = ");
   3825  1.1  christos       OUTS (outf, dregs (src0));
   3826  1.1  christos       OUTS (outf, " +|- ");
   3827  1.1  christos       OUTS (outf, dregs (src1));
   3828  1.1  christos       OUTS (outf, ", ");
   3829  1.1  christos       OUTS (outf, dregs (dst0));
   3830  1.1  christos       OUTS (outf, " = ");
   3831  1.1  christos       OUTS (outf, dregs (src0));
   3832  1.1  christos       OUTS (outf, " -|+ ");
   3833  1.1  christos       OUTS (outf, dregs (src1));
   3834  1.1  christos       amod0amod2 (s, x, aop, outf);
   3835  1.1  christos     }
   3836  1.1  christos   else if (aop == 0 && aopcde == 4)
   3837  1.1  christos     {
   3838  1.1  christos       OUTS (outf, dregs (dst0));
   3839  1.1  christos       OUTS (outf, " = ");
   3840  1.1  christos       OUTS (outf, dregs (src0));
   3841  1.1  christos       OUTS (outf, " + ");
   3842  1.1  christos       OUTS (outf, dregs (src1));
   3843  1.1  christos       amod1 (s, x, outf);
   3844  1.1  christos     }
   3845  1.1  christos   else if (aop == 0 && aopcde == 0)
   3846  1.1  christos     {
   3847  1.1  christos       OUTS (outf, dregs (dst0));
   3848  1.1  christos       OUTS (outf, " = ");
   3849  1.1  christos       OUTS (outf, dregs (src0));
   3850  1.1  christos       OUTS (outf, " +|+ ");
   3851  1.1  christos       OUTS (outf, dregs (src1));
   3852  1.1  christos       amod0 (s, x, outf);
   3853  1.1  christos     }
   3854  1.1  christos   else if (aop == 0 && aopcde == 24)
   3855  1.1  christos     {
   3856  1.1  christos       OUTS (outf, dregs (dst0));
   3857  1.1  christos       OUTS (outf, " = BYTEPACK (");
   3858  1.1  christos       OUTS (outf, dregs (src0));
   3859  1.1  christos       OUTS (outf, ", ");
   3860  1.1  christos       OUTS (outf, dregs (src1));
   3861  1.1  christos       OUTS (outf, ")");
   3862  1.1  christos     }
   3863  1.1  christos   else if (aop == 1 && aopcde == 24)
   3864  1.1  christos     {
   3865  1.1  christos       OUTS (outf, "(");
   3866  1.1  christos       OUTS (outf, dregs (dst1));
   3867  1.1  christos       OUTS (outf, ", ");
   3868  1.1  christos       OUTS (outf, dregs (dst0));
   3869  1.1  christos       OUTS (outf, ") = BYTEUNPACK ");
   3870  1.1  christos       OUTS (outf, dregs (src0 + 1));
   3871  1.1  christos       OUTS (outf, ":");
   3872  1.1  christos       OUTS (outf, imm5d (src0));
   3873  1.1  christos       aligndir (s, outf);
   3874  1.1  christos     }
   3875  1.1  christos   else if (aopcde == 13)
   3876  1.1  christos     {
   3877  1.1  christos       OUTS (outf, "(");
   3878  1.1  christos       OUTS (outf, dregs (dst1));
   3879  1.1  christos       OUTS (outf, ", ");
   3880  1.1  christos       OUTS (outf, dregs (dst0));
   3881  1.1  christos       OUTS (outf, ") = SEARCH ");
   3882  1.1  christos       OUTS (outf, dregs (src0));
   3883  1.1  christos       OUTS (outf, " (");
   3884  1.1  christos       searchmod (aop, outf);
   3885  1.1  christos       OUTS (outf, ")");
   3886  1.1  christos     }
   3887  1.1  christos   else
   3888  1.1  christos     return 0;
   3889  1.1  christos 
   3890  1.1  christos   return 4;
   3891  1.1  christos }
   3892  1.1  christos 
   3893  1.1  christos static int
   3894  1.1  christos decode_dsp32shift_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   3895  1.1  christos {
   3896  1.1  christos   /* dsp32shift
   3897  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   3898  1.1  christos      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
   3899  1.1  christos      |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
   3900  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   3901  1.1  christos   int HLs  = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
   3902  1.1  christos   int sop  = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
   3903  1.1  christos   int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
   3904  1.1  christos   int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
   3905  1.1  christos   int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
   3906  1.1  christos   int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
   3907  1.1  christos   const char *acc01 = (HLs & 1) == 0 ? "A0" : "A1";
   3908  1.1  christos 
   3909  1.1  christos   if (HLs == 0 && sop == 0 && sopcde == 0)
   3910  1.1  christos     {
   3911  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3912  1.1  christos       OUTS (outf, " = ASHIFT ");
   3913  1.1  christos       OUTS (outf, dregs_lo (src1));
   3914  1.1  christos       OUTS (outf, " BY ");
   3915  1.1  christos       OUTS (outf, dregs_lo (src0));
   3916  1.1  christos     }
   3917  1.1  christos   else if (HLs == 1 && sop == 0 && sopcde == 0)
   3918  1.1  christos     {
   3919  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3920  1.1  christos       OUTS (outf, " = ASHIFT ");
   3921  1.1  christos       OUTS (outf, dregs_hi (src1));
   3922  1.1  christos       OUTS (outf, " BY ");
   3923  1.1  christos       OUTS (outf, dregs_lo (src0));
   3924  1.1  christos     }
   3925  1.1  christos   else if (HLs == 2 && sop == 0 && sopcde == 0)
   3926  1.1  christos     {
   3927  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3928  1.1  christos       OUTS (outf, " = ASHIFT ");
   3929  1.1  christos       OUTS (outf, dregs_lo (src1));
   3930  1.1  christos       OUTS (outf, " BY ");
   3931  1.1  christos       OUTS (outf, dregs_lo (src0));
   3932  1.1  christos     }
   3933  1.1  christos   else if (HLs == 3 && sop == 0 && sopcde == 0)
   3934  1.1  christos     {
   3935  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3936  1.1  christos       OUTS (outf, " = ASHIFT ");
   3937  1.1  christos       OUTS (outf, dregs_hi (src1));
   3938  1.1  christos       OUTS (outf, " BY ");
   3939  1.1  christos       OUTS (outf, dregs_lo (src0));
   3940  1.1  christos     }
   3941  1.1  christos   else if (HLs == 0 && sop == 1 && sopcde == 0)
   3942  1.1  christos     {
   3943  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3944  1.1  christos       OUTS (outf, " = ASHIFT ");
   3945  1.1  christos       OUTS (outf, dregs_lo (src1));
   3946  1.1  christos       OUTS (outf, " BY ");
   3947  1.1  christos       OUTS (outf, dregs_lo (src0));
   3948  1.1  christos       OUTS (outf, " (S)");
   3949  1.1  christos     }
   3950  1.1  christos   else if (HLs == 1 && sop == 1 && sopcde == 0)
   3951  1.1  christos     {
   3952  1.1  christos       OUTS (outf, dregs_lo (dst0));
   3953  1.1  christos       OUTS (outf, " = ASHIFT ");
   3954  1.1  christos       OUTS (outf, dregs_hi (src1));
   3955  1.1  christos       OUTS (outf, " BY ");
   3956  1.1  christos       OUTS (outf, dregs_lo (src0));
   3957  1.1  christos       OUTS (outf, " (S)");
   3958  1.1  christos     }
   3959  1.1  christos   else if (HLs == 2 && sop == 1 && sopcde == 0)
   3960  1.1  christos     {
   3961  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3962  1.1  christos       OUTS (outf, " = ASHIFT ");
   3963  1.1  christos       OUTS (outf, dregs_lo (src1));
   3964  1.1  christos       OUTS (outf, " BY ");
   3965  1.1  christos       OUTS (outf, dregs_lo (src0));
   3966  1.1  christos       OUTS (outf, " (S)");
   3967  1.1  christos     }
   3968  1.1  christos   else if (HLs == 3 && sop == 1 && sopcde == 0)
   3969  1.1  christos     {
   3970  1.1  christos       OUTS (outf, dregs_hi (dst0));
   3971  1.1  christos       OUTS (outf, " = ASHIFT ");
   3972  1.1  christos       OUTS (outf, dregs_hi (src1));
   3973  1.1  christos       OUTS (outf, " BY ");
   3974  1.1  christos       OUTS (outf, dregs_lo (src0));
   3975  1.1  christos       OUTS (outf, " (S)");
   3976  1.1  christos     }
   3977  1.1  christos   else if (sop == 2 && sopcde == 0)
   3978  1.1  christos     {
   3979  1.1  christos       OUTS (outf, (HLs & 2) == 0 ? dregs_lo (dst0) : dregs_hi (dst0));
   3980  1.1  christos       OUTS (outf, " = LSHIFT ");
   3981  1.1  christos       OUTS (outf, (HLs & 1) == 0 ? dregs_lo (src1) : dregs_hi (src1));
   3982  1.1  christos       OUTS (outf, " BY ");
   3983  1.1  christos       OUTS (outf, dregs_lo (src0));
   3984  1.1  christos     }
   3985  1.1  christos   else if (sop == 0 && sopcde == 3)
   3986  1.1  christos     {
   3987  1.1  christos       OUTS (outf, acc01);
   3988  1.1  christos       OUTS (outf, " = ASHIFT ");
   3989  1.1  christos       OUTS (outf, acc01);
   3990  1.1  christos       OUTS (outf, " BY ");
   3991  1.1  christos       OUTS (outf, dregs_lo (src0));
   3992  1.1  christos     }
   3993  1.1  christos   else if (sop == 1 && sopcde == 3)
   3994  1.1  christos     {
   3995  1.1  christos       OUTS (outf, acc01);
   3996  1.1  christos       OUTS (outf, " = LSHIFT ");
   3997  1.1  christos       OUTS (outf, acc01);
   3998  1.1  christos       OUTS (outf, " BY ");
   3999  1.1  christos       OUTS (outf, dregs_lo (src0));
   4000  1.1  christos     }
   4001  1.1  christos   else if (sop == 2 && sopcde == 3)
   4002  1.1  christos     {
   4003  1.1  christos       OUTS (outf, acc01);
   4004  1.1  christos       OUTS (outf, " = ROT ");
   4005  1.1  christos       OUTS (outf, acc01);
   4006  1.1  christos       OUTS (outf, " BY ");
   4007  1.1  christos       OUTS (outf, dregs_lo (src0));
   4008  1.1  christos     }
   4009  1.1  christos   else if (sop == 3 && sopcde == 3)
   4010  1.1  christos     {
   4011  1.1  christos       OUTS (outf, dregs (dst0));
   4012  1.1  christos       OUTS (outf, " = ROT ");
   4013  1.1  christos       OUTS (outf, dregs (src1));
   4014  1.1  christos       OUTS (outf, " BY ");
   4015  1.1  christos       OUTS (outf, dregs_lo (src0));
   4016  1.1  christos     }
   4017  1.1  christos   else if (sop == 1 && sopcde == 1)
   4018  1.1  christos     {
   4019  1.1  christos       OUTS (outf, dregs (dst0));
   4020  1.1  christos       OUTS (outf, " = ASHIFT ");
   4021  1.1  christos       OUTS (outf, dregs (src1));
   4022  1.1  christos       OUTS (outf, " BY ");
   4023  1.1  christos       OUTS (outf, dregs_lo (src0));
   4024  1.1  christos       OUTS (outf, " (V, S)");
   4025  1.1  christos     }
   4026  1.1  christos   else if (sop == 0 && sopcde == 1)
   4027  1.1  christos     {
   4028  1.1  christos       OUTS (outf, dregs (dst0));
   4029  1.1  christos       OUTS (outf, " = ASHIFT ");
   4030  1.1  christos       OUTS (outf, dregs (src1));
   4031  1.1  christos       OUTS (outf, " BY ");
   4032  1.1  christos       OUTS (outf, dregs_lo (src0));
   4033  1.1  christos       OUTS (outf, " (V)");
   4034  1.1  christos     }
   4035  1.1  christos   else if (sop == 0 && sopcde == 2)
   4036  1.1  christos     {
   4037  1.1  christos       OUTS (outf, dregs (dst0));
   4038  1.1  christos       OUTS (outf, " = ASHIFT ");
   4039  1.1  christos       OUTS (outf, dregs (src1));
   4040  1.1  christos       OUTS (outf, " BY ");
   4041  1.1  christos       OUTS (outf, dregs_lo (src0));
   4042  1.1  christos     }
   4043  1.1  christos   else if (sop == 1 && sopcde == 2)
   4044  1.1  christos     {
   4045  1.1  christos       OUTS (outf, dregs (dst0));
   4046  1.1  christos       OUTS (outf, " = ASHIFT ");
   4047  1.1  christos       OUTS (outf, dregs (src1));
   4048  1.1  christos       OUTS (outf, " BY ");
   4049  1.1  christos       OUTS (outf, dregs_lo (src0));
   4050  1.1  christos       OUTS (outf, " (S)");
   4051  1.1  christos     }
   4052  1.1  christos   else if (sop == 2 && sopcde == 2)
   4053  1.1  christos     {
   4054  1.1  christos       OUTS (outf, dregs (dst0));
   4055  1.1  christos       OUTS (outf, " = LSHIFT ");
   4056  1.1  christos       OUTS (outf, dregs (src1));
   4057  1.1  christos       OUTS (outf, " BY ");
   4058  1.1  christos       OUTS (outf, dregs_lo (src0));
   4059  1.1  christos     }
   4060  1.1  christos   else if (sop == 3 && sopcde == 2)
   4061  1.1  christos     {
   4062  1.1  christos       OUTS (outf, dregs (dst0));
   4063  1.1  christos       OUTS (outf, " = ROT ");
   4064  1.1  christos       OUTS (outf, dregs (src1));
   4065  1.1  christos       OUTS (outf, " BY ");
   4066  1.1  christos       OUTS (outf, dregs_lo (src0));
   4067  1.1  christos     }
   4068  1.1  christos   else if (sop == 2 && sopcde == 1)
   4069  1.1  christos     {
   4070  1.1  christos       OUTS (outf, dregs (dst0));
   4071  1.1  christos       OUTS (outf, " = LSHIFT ");
   4072  1.1  christos       OUTS (outf, dregs (src1));
   4073  1.1  christos       OUTS (outf, " BY ");
   4074  1.1  christos       OUTS (outf, dregs_lo (src0));
   4075  1.1  christos       OUTS (outf, " (V)");
   4076  1.1  christos     }
   4077  1.1  christos   else if (sop == 0 && sopcde == 4)
   4078  1.1  christos     {
   4079  1.1  christos       OUTS (outf, dregs (dst0));
   4080  1.1  christos       OUTS (outf, " = PACK (");
   4081  1.1  christos       OUTS (outf, dregs_lo (src1));
   4082  1.1  christos       OUTS (outf, ", ");
   4083  1.1  christos       OUTS (outf, dregs_lo (src0));
   4084  1.1  christos       OUTS (outf, ")");
   4085  1.1  christos     }
   4086  1.1  christos   else if (sop == 1 && sopcde == 4)
   4087  1.1  christos     {
   4088  1.1  christos       OUTS (outf, dregs (dst0));
   4089  1.1  christos       OUTS (outf, " = PACK (");
   4090  1.1  christos       OUTS (outf, dregs_lo (src1));
   4091  1.1  christos       OUTS (outf, ", ");
   4092  1.1  christos       OUTS (outf, dregs_hi (src0));
   4093  1.1  christos       OUTS (outf, ")");
   4094  1.1  christos     }
   4095  1.1  christos   else if (sop == 2 && sopcde == 4)
   4096  1.1  christos     {
   4097  1.1  christos       OUTS (outf, dregs (dst0));
   4098  1.1  christos       OUTS (outf, " = PACK (");
   4099  1.1  christos       OUTS (outf, dregs_hi (src1));
   4100  1.1  christos       OUTS (outf, ", ");
   4101  1.1  christos       OUTS (outf, dregs_lo (src0));
   4102  1.1  christos       OUTS (outf, ")");
   4103  1.1  christos     }
   4104  1.1  christos   else if (sop == 3 && sopcde == 4)
   4105  1.1  christos     {
   4106  1.1  christos       OUTS (outf, dregs (dst0));
   4107  1.1  christos       OUTS (outf, " = PACK (");
   4108  1.1  christos       OUTS (outf, dregs_hi (src1));
   4109  1.1  christos       OUTS (outf, ", ");
   4110  1.1  christos       OUTS (outf, dregs_hi (src0));
   4111  1.1  christos       OUTS (outf, ")");
   4112  1.1  christos     }
   4113  1.1  christos   else if (sop == 0 && sopcde == 5)
   4114  1.1  christos     {
   4115  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4116  1.1  christos       OUTS (outf, " = SIGNBITS ");
   4117  1.1  christos       OUTS (outf, dregs (src1));
   4118  1.1  christos     }
   4119  1.1  christos   else if (sop == 1 && sopcde == 5)
   4120  1.1  christos     {
   4121  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4122  1.1  christos       OUTS (outf, " = SIGNBITS ");
   4123  1.1  christos       OUTS (outf, dregs_lo (src1));
   4124  1.1  christos     }
   4125  1.1  christos   else if (sop == 2 && sopcde == 5)
   4126  1.1  christos     {
   4127  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4128  1.1  christos       OUTS (outf, " = SIGNBITS ");
   4129  1.1  christos       OUTS (outf, dregs_hi (src1));
   4130  1.1  christos     }
   4131  1.1  christos   else if (sop == 0 && sopcde == 6)
   4132  1.1  christos     {
   4133  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4134  1.1  christos       OUTS (outf, " = SIGNBITS A0");
   4135  1.1  christos     }
   4136  1.1  christos   else if (sop == 1 && sopcde == 6)
   4137  1.1  christos     {
   4138  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4139  1.1  christos       OUTS (outf, " = SIGNBITS A1");
   4140  1.1  christos     }
   4141  1.1  christos   else if (sop == 3 && sopcde == 6)
   4142  1.1  christos     {
   4143  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4144  1.1  christos       OUTS (outf, " = ONES ");
   4145  1.1  christos       OUTS (outf, dregs (src1));
   4146  1.1  christos     }
   4147  1.1  christos   else if (sop == 0 && sopcde == 7)
   4148  1.1  christos     {
   4149  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4150  1.1  christos       OUTS (outf, " = EXPADJ (");
   4151  1.1  christos       OUTS (outf, dregs (src1));
   4152  1.1  christos       OUTS (outf, ", ");
   4153  1.1  christos       OUTS (outf, dregs_lo (src0));
   4154  1.1  christos       OUTS (outf, ")");
   4155  1.1  christos     }
   4156  1.1  christos   else if (sop == 1 && sopcde == 7)
   4157  1.1  christos     {
   4158  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4159  1.1  christos       OUTS (outf, " = EXPADJ (");
   4160  1.1  christos       OUTS (outf, dregs (src1));
   4161  1.1  christos       OUTS (outf, ", ");
   4162  1.1  christos       OUTS (outf, dregs_lo (src0));
   4163  1.1  christos       OUTS (outf, ") (V)");
   4164  1.1  christos     }
   4165  1.1  christos   else if (sop == 2 && sopcde == 7)
   4166  1.1  christos     {
   4167  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4168  1.1  christos       OUTS (outf, " = EXPADJ (");
   4169  1.1  christos       OUTS (outf, dregs_lo (src1));
   4170  1.1  christos       OUTS (outf, ", ");
   4171  1.1  christos       OUTS (outf, dregs_lo (src0));
   4172  1.1  christos       OUTS (outf, ")");
   4173  1.1  christos     }
   4174  1.1  christos   else if (sop == 3 && sopcde == 7)
   4175  1.1  christos     {
   4176  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4177  1.1  christos       OUTS (outf, " = EXPADJ (");
   4178  1.1  christos       OUTS (outf, dregs_hi (src1));
   4179  1.1  christos       OUTS (outf, ", ");
   4180  1.1  christos       OUTS (outf, dregs_lo (src0));
   4181  1.1  christos       OUTS (outf, ")");
   4182  1.1  christos     }
   4183  1.1  christos   else if (sop == 0 && sopcde == 8)
   4184  1.1  christos     {
   4185  1.1  christos       OUTS (outf, "BITMUX (");
   4186  1.1  christos       OUTS (outf, dregs (src0));
   4187  1.1  christos       OUTS (outf, ", ");
   4188  1.1  christos       OUTS (outf, dregs (src1));
   4189  1.1  christos       OUTS (outf, ", A0) (ASR)");
   4190  1.1  christos     }
   4191  1.1  christos   else if (sop == 1 && sopcde == 8)
   4192  1.1  christos     {
   4193  1.1  christos       OUTS (outf, "BITMUX (");
   4194  1.1  christos       OUTS (outf, dregs (src0));
   4195  1.1  christos       OUTS (outf, ", ");
   4196  1.1  christos       OUTS (outf, dregs (src1));
   4197  1.1  christos       OUTS (outf, ", A0) (ASL)");
   4198  1.1  christos     }
   4199  1.1  christos   else if (sop == 0 && sopcde == 9)
   4200  1.1  christos     {
   4201  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4202  1.1  christos       OUTS (outf, " = VIT_MAX (");
   4203  1.1  christos       OUTS (outf, dregs (src1));
   4204  1.1  christos       OUTS (outf, ") (ASL)");
   4205  1.1  christos     }
   4206  1.1  christos   else if (sop == 1 && sopcde == 9)
   4207  1.1  christos     {
   4208  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4209  1.1  christos       OUTS (outf, " = VIT_MAX (");
   4210  1.1  christos       OUTS (outf, dregs (src1));
   4211  1.1  christos       OUTS (outf, ") (ASR)");
   4212  1.1  christos     }
   4213  1.1  christos   else if (sop == 2 && sopcde == 9)
   4214  1.1  christos     {
   4215  1.1  christos       OUTS (outf, dregs (dst0));
   4216  1.1  christos       OUTS (outf, " = VIT_MAX (");
   4217  1.1  christos       OUTS (outf, dregs (src1));
   4218  1.1  christos       OUTS (outf, ", ");
   4219  1.1  christos       OUTS (outf, dregs (src0));
   4220  1.1  christos       OUTS (outf, ") (ASL)");
   4221  1.1  christos     }
   4222  1.1  christos   else if (sop == 3 && sopcde == 9)
   4223  1.1  christos     {
   4224  1.1  christos       OUTS (outf, dregs (dst0));
   4225  1.1  christos       OUTS (outf, " = VIT_MAX (");
   4226  1.1  christos       OUTS (outf, dregs (src1));
   4227  1.1  christos       OUTS (outf, ", ");
   4228  1.1  christos       OUTS (outf, dregs (src0));
   4229  1.1  christos       OUTS (outf, ") (ASR)");
   4230  1.1  christos     }
   4231  1.1  christos   else if (sop == 0 && sopcde == 10)
   4232  1.1  christos     {
   4233  1.1  christos       OUTS (outf, dregs (dst0));
   4234  1.1  christos       OUTS (outf, " = EXTRACT (");
   4235  1.1  christos       OUTS (outf, dregs (src1));
   4236  1.1  christos       OUTS (outf, ", ");
   4237  1.1  christos       OUTS (outf, dregs_lo (src0));
   4238  1.1  christos       OUTS (outf, ") (Z)");
   4239  1.1  christos     }
   4240  1.1  christos   else if (sop == 1 && sopcde == 10)
   4241  1.1  christos     {
   4242  1.1  christos       OUTS (outf, dregs (dst0));
   4243  1.1  christos       OUTS (outf, " = EXTRACT (");
   4244  1.1  christos       OUTS (outf, dregs (src1));
   4245  1.1  christos       OUTS (outf, ", ");
   4246  1.1  christos       OUTS (outf, dregs_lo (src0));
   4247  1.1  christos       OUTS (outf, ") (X)");
   4248  1.1  christos     }
   4249  1.1  christos   else if (sop == 2 && sopcde == 10)
   4250  1.1  christos     {
   4251  1.1  christos       OUTS (outf, dregs (dst0));
   4252  1.1  christos       OUTS (outf, " = DEPOSIT (");
   4253  1.1  christos       OUTS (outf, dregs (src1));
   4254  1.1  christos       OUTS (outf, ", ");
   4255  1.1  christos       OUTS (outf, dregs (src0));
   4256  1.1  christos       OUTS (outf, ")");
   4257  1.1  christos     }
   4258  1.1  christos   else if (sop == 3 && sopcde == 10)
   4259  1.1  christos     {
   4260  1.1  christos       OUTS (outf, dregs (dst0));
   4261  1.1  christos       OUTS (outf, " = DEPOSIT (");
   4262  1.1  christos       OUTS (outf, dregs (src1));
   4263  1.1  christos       OUTS (outf, ", ");
   4264  1.1  christos       OUTS (outf, dregs (src0));
   4265  1.1  christos       OUTS (outf, ") (X)");
   4266  1.1  christos     }
   4267  1.1  christos   else if (sop == 0 && sopcde == 11)
   4268  1.1  christos     {
   4269  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4270  1.1  christos       OUTS (outf, " = CC = BXORSHIFT (A0, ");
   4271  1.1  christos       OUTS (outf, dregs (src0));
   4272  1.1  christos       OUTS (outf, ")");
   4273  1.1  christos     }
   4274  1.1  christos   else if (sop == 1 && sopcde == 11)
   4275  1.1  christos     {
   4276  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4277  1.1  christos       OUTS (outf, " = CC = BXOR (A0, ");
   4278  1.1  christos       OUTS (outf, dregs (src0));
   4279  1.1  christos       OUTS (outf, ")");
   4280  1.1  christos     }
   4281  1.1  christos   else if (sop == 0 && sopcde == 12)
   4282  1.1  christos     OUTS (outf, "A0 = BXORSHIFT (A0, A1, CC)");
   4283  1.1  christos 
   4284  1.1  christos   else if (sop == 1 && sopcde == 12)
   4285  1.1  christos     {
   4286  1.1  christos       OUTS (outf, dregs_lo (dst0));
   4287  1.1  christos       OUTS (outf, " = CC = BXOR (A0, A1, CC)");
   4288  1.1  christos     }
   4289  1.1  christos   else if (sop == 0 && sopcde == 13)
   4290  1.1  christos     {
   4291  1.1  christos       OUTS (outf, dregs (dst0));
   4292  1.1  christos       OUTS (outf, " = ALIGN8 (");
   4293  1.1  christos       OUTS (outf, dregs (src1));
   4294  1.1  christos       OUTS (outf, ", ");
   4295  1.1  christos       OUTS (outf, dregs (src0));
   4296  1.1  christos       OUTS (outf, ")");
   4297  1.1  christos     }
   4298  1.1  christos   else if (sop == 1 && sopcde == 13)
   4299  1.1  christos     {
   4300  1.1  christos       OUTS (outf, dregs (dst0));
   4301  1.1  christos       OUTS (outf, " = ALIGN16 (");
   4302  1.1  christos       OUTS (outf, dregs (src1));
   4303  1.1  christos       OUTS (outf, ", ");
   4304  1.1  christos       OUTS (outf, dregs (src0));
   4305  1.1  christos       OUTS (outf, ")");
   4306  1.1  christos     }
   4307  1.1  christos   else if (sop == 2 && sopcde == 13)
   4308  1.1  christos     {
   4309  1.1  christos       OUTS (outf, dregs (dst0));
   4310  1.1  christos       OUTS (outf, " = ALIGN24 (");
   4311  1.1  christos       OUTS (outf, dregs (src1));
   4312  1.1  christos       OUTS (outf, ", ");
   4313  1.1  christos       OUTS (outf, dregs (src0));
   4314  1.1  christos       OUTS (outf, ")");
   4315  1.1  christos     }
   4316  1.1  christos   else
   4317  1.1  christos     return 0;
   4318  1.1  christos 
   4319  1.1  christos   return 4;
   4320  1.1  christos }
   4321  1.1  christos 
   4322  1.1  christos static int
   4323  1.1  christos decode_dsp32shiftimm_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   4324  1.1  christos {
   4325  1.1  christos   /* dsp32shiftimm
   4326  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   4327  1.1  christos      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
   4328  1.1  christos      |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
   4329  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   4330  1.1  christos   int src1     = ((iw1 >> DSP32ShiftImm_src1_bits) & DSP32ShiftImm_src1_mask);
   4331  1.1  christos   int sop      = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
   4332  1.1  christos   int bit8     = ((iw1 >> 8) & 0x1);
   4333  1.1  christos   int immag    = ((iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
   4334  1.1  christos   int newimmag = (-(iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
   4335  1.1  christos   int dst0     = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
   4336  1.1  christos   int sopcde   = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
   4337  1.1  christos   int HLs      = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
   4338  1.1  christos 
   4339  1.1  christos   if (sop == 0 && sopcde == 0)
   4340  1.1  christos     {
   4341  1.1  christos       OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
   4342  1.1  christos       OUTS (outf, " = ");
   4343  1.1  christos       OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
   4344  1.1  christos       OUTS (outf, " >>> ");
   4345  1.1  christos       OUTS (outf, uimm4 (newimmag));
   4346  1.1  christos     }
   4347  1.1  christos   else if (sop == 1 && sopcde == 0 && bit8 == 0)
   4348  1.1  christos     {
   4349  1.1  christos       OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
   4350  1.1  christos       OUTS (outf, " = ");
   4351  1.1  christos       OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
   4352  1.1  christos       OUTS (outf, " << ");
   4353  1.1  christos       OUTS (outf, uimm4 (immag));
   4354  1.1  christos       OUTS (outf, " (S)");
   4355  1.1  christos     }
   4356  1.1  christos   else if (sop == 1 && sopcde == 0 && bit8 == 1)
   4357  1.1  christos     {
   4358  1.1  christos       OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
   4359  1.1  christos       OUTS (outf, " = ");
   4360  1.1  christos       OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
   4361  1.1  christos       OUTS (outf, " >>> ");
   4362  1.1  christos       OUTS (outf, uimm4 (newimmag));
   4363  1.1  christos       OUTS (outf, " (S)");
   4364  1.1  christos     }
   4365  1.1  christos   else if (sop == 2 && sopcde == 0 && bit8 == 0)
   4366  1.1  christos     {
   4367  1.1  christos       OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
   4368  1.1  christos       OUTS (outf, " = ");
   4369  1.1  christos       OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
   4370  1.1  christos       OUTS (outf, " << ");
   4371  1.1  christos       OUTS (outf, uimm4 (immag));
   4372  1.1  christos     }
   4373  1.1  christos   else if (sop == 2 && sopcde == 0 && bit8 == 1)
   4374  1.1  christos     {
   4375  1.1  christos       OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
   4376  1.1  christos       OUTS (outf, " = ");
   4377  1.1  christos       OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
   4378  1.1  christos       OUTS (outf, " >> ");
   4379  1.1  christos       OUTS (outf, uimm4 (newimmag));
   4380  1.1  christos     }
   4381  1.1  christos   else if (sop == 2 && sopcde == 3 && HLs == 1)
   4382  1.1  christos     {
   4383  1.1  christos       OUTS (outf, "A1 = ROT A1 BY ");
   4384  1.1  christos       OUTS (outf, imm6 (immag));
   4385  1.1  christos     }
   4386  1.1  christos   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
   4387  1.1  christos     {
   4388  1.1  christos       OUTS (outf, "A0 = A0 << ");
   4389  1.1  christos       OUTS (outf, uimm5 (immag));
   4390  1.1  christos     }
   4391  1.1  christos   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
   4392  1.1  christos     {
   4393  1.1  christos       OUTS (outf, "A0 = A0 >>> ");
   4394  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4395  1.1  christos     }
   4396  1.1  christos   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
   4397  1.1  christos     {
   4398  1.1  christos       OUTS (outf, "A1 = A1 << ");
   4399  1.1  christos       OUTS (outf, uimm5 (immag));
   4400  1.1  christos     }
   4401  1.1  christos   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
   4402  1.1  christos     {
   4403  1.1  christos       OUTS (outf, "A1 = A1 >>> ");
   4404  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4405  1.1  christos     }
   4406  1.1  christos   else if (sop == 1 && sopcde == 3 && HLs == 0)
   4407  1.1  christos     {
   4408  1.1  christos       OUTS (outf, "A0 = A0 >> ");
   4409  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4410  1.1  christos     }
   4411  1.1  christos   else if (sop == 1 && sopcde == 3 && HLs == 1)
   4412  1.1  christos     {
   4413  1.1  christos       OUTS (outf, "A1 = A1 >> ");
   4414  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4415  1.1  christos     }
   4416  1.1  christos   else if (sop == 2 && sopcde == 3 && HLs == 0)
   4417  1.1  christos     {
   4418  1.1  christos       OUTS (outf, "A0 = ROT A0 BY ");
   4419  1.1  christos       OUTS (outf, imm6 (immag));
   4420  1.1  christos     }
   4421  1.1  christos   else if (sop == 1 && sopcde == 1 && bit8 == 0)
   4422  1.1  christos     {
   4423  1.1  christos       OUTS (outf, dregs (dst0));
   4424  1.1  christos       OUTS (outf, " = ");
   4425  1.1  christos       OUTS (outf, dregs (src1));
   4426  1.1  christos       OUTS (outf, " << ");
   4427  1.1  christos       OUTS (outf, uimm5 (immag));
   4428  1.1  christos       OUTS (outf, " (V, S)");
   4429  1.1  christos     }
   4430  1.1  christos   else if (sop == 1 && sopcde == 1 && bit8 == 1)
   4431  1.1  christos     {
   4432  1.1  christos       OUTS (outf, dregs (dst0));
   4433  1.1  christos       OUTS (outf, " = ");
   4434  1.1  christos       OUTS (outf, dregs (src1));
   4435  1.1  christos       OUTS (outf, " >>> ");
   4436  1.1  christos       OUTS (outf, imm5 (-immag));
   4437  1.1  christos       OUTS (outf, " (V, S)");
   4438  1.1  christos     }
   4439  1.1  christos   else if (sop == 2 && sopcde == 1 && bit8 == 1)
   4440  1.1  christos     {
   4441  1.1  christos       OUTS (outf, dregs (dst0));
   4442  1.1  christos       OUTS (outf, " = ");
   4443  1.1  christos       OUTS (outf, dregs (src1));
   4444  1.1  christos       OUTS (outf, " >> ");
   4445  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4446  1.1  christos       OUTS (outf, " (V)");
   4447  1.1  christos     }
   4448  1.1  christos   else if (sop == 2 && sopcde == 1 && bit8 == 0)
   4449  1.1  christos     {
   4450  1.1  christos       OUTS (outf, dregs (dst0));
   4451  1.1  christos       OUTS (outf, " = ");
   4452  1.1  christos       OUTS (outf, dregs (src1));
   4453  1.1  christos       OUTS (outf, " << ");
   4454  1.1  christos       OUTS (outf, imm5 (immag));
   4455  1.1  christos       OUTS (outf, " (V)");
   4456  1.1  christos     }
   4457  1.1  christos   else if (sop == 0 && sopcde == 1)
   4458  1.1  christos     {
   4459  1.1  christos       OUTS (outf, dregs (dst0));
   4460  1.1  christos       OUTS (outf, " = ");
   4461  1.1  christos       OUTS (outf, dregs (src1));
   4462  1.1  christos       OUTS (outf, " >>> ");
   4463  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4464  1.1  christos       OUTS (outf, " (V)");
   4465  1.1  christos     }
   4466  1.1  christos   else if (sop == 1 && sopcde == 2)
   4467  1.1  christos     {
   4468  1.1  christos       OUTS (outf, dregs (dst0));
   4469  1.1  christos       OUTS (outf, " = ");
   4470  1.1  christos       OUTS (outf, dregs (src1));
   4471  1.1  christos       OUTS (outf, " << ");
   4472  1.1  christos       OUTS (outf, uimm5 (immag));
   4473  1.1  christos       OUTS (outf, " (S)");
   4474  1.1  christos     }
   4475  1.1  christos   else if (sop == 2 && sopcde == 2 && bit8 == 1)
   4476  1.1  christos     {
   4477  1.1  christos       OUTS (outf, dregs (dst0));
   4478  1.1  christos       OUTS (outf, " = ");
   4479  1.1  christos       OUTS (outf, dregs (src1));
   4480  1.1  christos       OUTS (outf, " >> ");
   4481  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4482  1.1  christos     }
   4483  1.1  christos   else if (sop == 2 && sopcde == 2 && bit8 == 0)
   4484  1.1  christos     {
   4485  1.1  christos       OUTS (outf, dregs (dst0));
   4486  1.1  christos       OUTS (outf, " = ");
   4487  1.1  christos       OUTS (outf, dregs (src1));
   4488  1.1  christos       OUTS (outf, " << ");
   4489  1.1  christos       OUTS (outf, uimm5 (immag));
   4490  1.1  christos     }
   4491  1.1  christos   else if (sop == 3 && sopcde == 2)
   4492  1.1  christos     {
   4493  1.1  christos       OUTS (outf, dregs (dst0));
   4494  1.1  christos       OUTS (outf, " = ROT ");
   4495  1.1  christos       OUTS (outf, dregs (src1));
   4496  1.1  christos       OUTS (outf, " BY ");
   4497  1.1  christos       OUTS (outf, imm6 (immag));
   4498  1.1  christos     }
   4499  1.1  christos   else if (sop == 0 && sopcde == 2)
   4500  1.1  christos     {
   4501  1.1  christos       OUTS (outf, dregs (dst0));
   4502  1.1  christos       OUTS (outf, " = ");
   4503  1.1  christos       OUTS (outf, dregs (src1));
   4504  1.1  christos       OUTS (outf, " >>> ");
   4505  1.1  christos       OUTS (outf, uimm5 (newimmag));
   4506  1.1  christos     }
   4507  1.1  christos   else
   4508  1.1  christos     return 0;
   4509  1.1  christos 
   4510  1.1  christos   return 4;
   4511  1.1  christos }
   4512  1.1  christos 
   4513  1.1  christos static int
   4514  1.1  christos decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
   4515  1.1  christos {
   4516  1.1  christos   /* pseudoDEBUG
   4517  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   4518  1.1  christos      | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......|
   4519  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   4520  1.1  christos   int fn  = ((iw0 >> PseudoDbg_fn_bits) & PseudoDbg_fn_mask);
   4521  1.1  christos   int grp = ((iw0 >> PseudoDbg_grp_bits) & PseudoDbg_grp_mask);
   4522  1.1  christos   int reg = ((iw0 >> PseudoDbg_reg_bits) & PseudoDbg_reg_mask);
   4523  1.1  christos 
   4524  1.1  christos   if (parallel)
   4525  1.1  christos     return 0;
   4526  1.1  christos 
   4527  1.1  christos   if (reg == 0 && fn == 3)
   4528  1.1  christos     OUTS (outf, "DBG A0");
   4529  1.1  christos 
   4530  1.1  christos   else if (reg == 1 && fn == 3)
   4531  1.1  christos     OUTS (outf, "DBG A1");
   4532  1.1  christos 
   4533  1.1  christos   else if (reg == 3 && fn == 3)
   4534  1.1  christos     OUTS (outf, "ABORT");
   4535  1.1  christos 
   4536  1.1  christos   else if (reg == 4 && fn == 3)
   4537  1.1  christos     OUTS (outf, "HLT");
   4538  1.1  christos 
   4539  1.1  christos   else if (reg == 5 && fn == 3)
   4540  1.1  christos     OUTS (outf, "DBGHALT");
   4541  1.1  christos 
   4542  1.1  christos   else if (reg == 6 && fn == 3)
   4543  1.1  christos     {
   4544  1.1  christos       OUTS (outf, "DBGCMPLX (");
   4545  1.1  christos       OUTS (outf, dregs (grp));
   4546  1.1  christos       OUTS (outf, ")");
   4547  1.1  christos     }
   4548  1.1  christos   else if (reg == 7 && fn == 3)
   4549  1.1  christos     OUTS (outf, "DBG");
   4550  1.1  christos 
   4551  1.1  christos   else if (grp == 0 && fn == 2)
   4552  1.1  christos     {
   4553  1.1  christos       OUTS (outf, "OUTC ");
   4554  1.1  christos       OUTS (outf, dregs (reg));
   4555  1.1  christos     }
   4556  1.1  christos   else if (fn == 0)
   4557  1.1  christos     {
   4558  1.1  christos       OUTS (outf, "DBG ");
   4559  1.1  christos       OUTS (outf, allregs (reg, grp));
   4560  1.1  christos     }
   4561  1.1  christos   else if (fn == 1)
   4562  1.1  christos     {
   4563  1.1  christos       OUTS (outf, "PRNT ");
   4564  1.1  christos       OUTS (outf, allregs (reg, grp));
   4565  1.1  christos     }
   4566  1.1  christos   else
   4567  1.1  christos     return 0;
   4568  1.1  christos 
   4569  1.1  christos   return 2;
   4570  1.1  christos }
   4571  1.1  christos 
   4572  1.1  christos static int
   4573  1.1  christos decode_pseudoOChar_0 (TIword iw0, disassemble_info *outf)
   4574  1.1  christos {
   4575  1.1  christos   /* psedoOChar
   4576  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   4577  1.1  christos      | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................|
   4578  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   4579  1.1  christos   int ch = ((iw0 >> PseudoChr_ch_bits) & PseudoChr_ch_mask);
   4580  1.1  christos 
   4581  1.1  christos   if (parallel)
   4582  1.1  christos     return 0;
   4583  1.1  christos 
   4584  1.1  christos   OUTS (outf, "OUTC ");
   4585  1.1  christos   OUTS (outf, uimm8 (ch));
   4586  1.1  christos 
   4587  1.1  christos   return 2;
   4588  1.1  christos }
   4589  1.1  christos 
   4590  1.1  christos static int
   4591  1.1  christos decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
   4592  1.1  christos {
   4593  1.1  christos   /* pseudodbg_assert
   4594  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   4595  1.1  christos      | 1 | 1 | 1 | 1 | 0 | - | - | - | dbgop |.grp.......|.regtest...|
   4596  1.1  christos      |.expected......................................................|
   4597  1.1  christos      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   4598  1.1  christos   int expected = ((iw1 >> PseudoDbg_Assert_expected_bits) & PseudoDbg_Assert_expected_mask);
   4599  1.1  christos   int dbgop    = ((iw0 >> (PseudoDbg_Assert_dbgop_bits - 16)) & PseudoDbg_Assert_dbgop_mask);
   4600  1.1  christos   int grp      = ((iw0 >> (PseudoDbg_Assert_grp_bits - 16)) & PseudoDbg_Assert_grp_mask);
   4601  1.1  christos   int regtest  = ((iw0 >> (PseudoDbg_Assert_regtest_bits - 16)) & PseudoDbg_Assert_regtest_mask);
   4602  1.1  christos 
   4603  1.1  christos   if (parallel)
   4604  1.1  christos     return 0;
   4605  1.1  christos 
   4606  1.1  christos   if (dbgop == 0)
   4607  1.1  christos     {
   4608  1.1  christos       OUTS (outf, "DBGA (");
   4609  1.1  christos       OUTS (outf, regs_lo (regtest, grp));
   4610  1.1  christos       OUTS (outf, ", ");
   4611  1.1  christos       OUTS (outf, uimm16 (expected));
   4612  1.1  christos       OUTS (outf, ")");
   4613  1.1  christos     }
   4614  1.1  christos   else if (dbgop == 1)
   4615  1.1  christos     {
   4616  1.1  christos       OUTS (outf, "DBGA (");
   4617  1.1  christos       OUTS (outf, regs_hi (regtest, grp));
   4618  1.1  christos       OUTS (outf, ", ");
   4619  1.1  christos       OUTS (outf, uimm16 (expected));
   4620  1.1  christos       OUTS (outf, ")");
   4621  1.1  christos     }
   4622  1.1  christos   else if (dbgop == 2)
   4623  1.1  christos     {
   4624  1.1  christos       OUTS (outf, "DBGAL (");
   4625  1.1  christos       OUTS (outf, allregs (regtest, grp));
   4626  1.1  christos       OUTS (outf, ", ");
   4627  1.1  christos       OUTS (outf, uimm16 (expected));
   4628  1.1  christos       OUTS (outf, ")");
   4629  1.1  christos     }
   4630  1.1  christos   else if (dbgop == 3)
   4631  1.1  christos     {
   4632  1.1  christos       OUTS (outf, "DBGAH (");
   4633  1.1  christos       OUTS (outf, allregs (regtest, grp));
   4634  1.1  christos       OUTS (outf, ", ");
   4635  1.1  christos       OUTS (outf, uimm16 (expected));
   4636  1.1  christos       OUTS (outf, ")");
   4637  1.1  christos     }
   4638  1.1  christos   else
   4639  1.1  christos     return 0;
   4640  1.1  christos   return 4;
   4641  1.1  christos }
   4642  1.1  christos 
   4643  1.1  christos static int
   4644  1.1  christos _print_insn_bfin (bfd_vma pc, disassemble_info *outf)
   4645  1.1  christos {
   4646  1.1  christos   bfd_byte buf[4];
   4647  1.1  christos   TIword iw0;
   4648  1.1  christos   TIword iw1;
   4649  1.1  christos   int status;
   4650  1.1  christos   int rv = 0;
   4651  1.1  christos 
   4652  1.1  christos   status = (*outf->read_memory_func) (pc & ~0x1, buf, 2, outf);
   4653  1.1  christos   /* FIXME */
   4654  1.1  christos   (void) status;
   4655  1.1  christos   status = (*outf->read_memory_func) ((pc + 2) & ~0x1, buf + 2, 2, outf);
   4656  1.1  christos   /* FIXME */
   4657  1.1  christos   (void) status;
   4658  1.1  christos 
   4659  1.1  christos   iw0 = bfd_getl16 (buf);
   4660  1.1  christos   iw1 = bfd_getl16 (buf + 2);
   4661  1.1  christos 
   4662  1.1  christos   if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
   4663  1.1  christos     {
   4664  1.1  christos       if (parallel)
   4665  1.1  christos 	{
   4666  1.1  christos 	  OUTS (outf, "ILLEGAL");
   4667  1.1  christos 	  return 0;
   4668  1.1  christos 	}
   4669  1.1  christos       OUTS (outf, "MNOP");
   4670  1.1  christos       return 4;
   4671  1.1  christos     }
   4672  1.1  christos   else if ((iw0 & 0xff00) == 0x0000)
   4673  1.1  christos     rv = decode_ProgCtrl_0 (iw0, outf);
   4674  1.1  christos   else if ((iw0 & 0xffc0) == 0x0240)
   4675  1.1  christos     rv = decode_CaCTRL_0 (iw0, outf);
   4676  1.1  christos   else if ((iw0 & 0xff80) == 0x0100)
   4677  1.1  christos     rv = decode_PushPopReg_0 (iw0, outf);
   4678  1.1  christos   else if ((iw0 & 0xfe00) == 0x0400)
   4679  1.1  christos     rv = decode_PushPopMultiple_0 (iw0, outf);
   4680  1.1  christos   else if ((iw0 & 0xfe00) == 0x0600)
   4681  1.1  christos     rv = decode_ccMV_0 (iw0, outf);
   4682  1.1  christos   else if ((iw0 & 0xf800) == 0x0800)
   4683  1.1  christos     rv = decode_CCflag_0 (iw0, outf);
   4684  1.1  christos   else if ((iw0 & 0xffe0) == 0x0200)
   4685  1.1  christos     rv = decode_CC2dreg_0 (iw0, outf);
   4686  1.1  christos   else if ((iw0 & 0xff00) == 0x0300)
   4687  1.1  christos     rv = decode_CC2stat_0 (iw0, outf);
   4688  1.1  christos   else if ((iw0 & 0xf000) == 0x1000)
   4689  1.1  christos     rv = decode_BRCC_0 (iw0, pc, outf);
   4690  1.1  christos   else if ((iw0 & 0xf000) == 0x2000)
   4691  1.1  christos     rv = decode_UJUMP_0 (iw0, pc, outf);
   4692  1.1  christos   else if ((iw0 & 0xf000) == 0x3000)
   4693  1.1  christos     rv = decode_REGMV_0 (iw0, outf);
   4694  1.1  christos   else if ((iw0 & 0xfc00) == 0x4000)
   4695  1.1  christos     rv = decode_ALU2op_0 (iw0, outf);
   4696  1.1  christos   else if ((iw0 & 0xfe00) == 0x4400)
   4697  1.1  christos     rv = decode_PTR2op_0 (iw0, outf);
   4698  1.1  christos   else if ((iw0 & 0xf800) == 0x4800)
   4699  1.1  christos     rv = decode_LOGI2op_0 (iw0, outf);
   4700  1.1  christos   else if ((iw0 & 0xf000) == 0x5000)
   4701  1.1  christos     rv = decode_COMP3op_0 (iw0, outf);
   4702  1.1  christos   else if ((iw0 & 0xf800) == 0x6000)
   4703  1.1  christos     rv = decode_COMPI2opD_0 (iw0, outf);
   4704  1.1  christos   else if ((iw0 & 0xf800) == 0x6800)
   4705  1.1  christos     rv = decode_COMPI2opP_0 (iw0, outf);
   4706  1.1  christos   else if ((iw0 & 0xf000) == 0x8000)
   4707  1.1  christos     rv = decode_LDSTpmod_0 (iw0, outf);
   4708  1.1  christos   else if ((iw0 & 0xff60) == 0x9e60)
   4709  1.1  christos     rv = decode_dagMODim_0 (iw0, outf);
   4710  1.1  christos   else if ((iw0 & 0xfff0) == 0x9f60)
   4711  1.1  christos     rv = decode_dagMODik_0 (iw0, outf);
   4712  1.1  christos   else if ((iw0 & 0xfc00) == 0x9c00)
   4713  1.1  christos     rv = decode_dspLDST_0 (iw0, outf);
   4714  1.1  christos   else if ((iw0 & 0xf000) == 0x9000)
   4715  1.1  christos     rv = decode_LDST_0 (iw0, outf);
   4716  1.1  christos   else if ((iw0 & 0xfc00) == 0xb800)
   4717  1.1  christos     rv = decode_LDSTiiFP_0 (iw0, outf);
   4718  1.1  christos   else if ((iw0 & 0xe000) == 0xA000)
   4719  1.1  christos     rv = decode_LDSTii_0 (iw0, outf);
   4720  1.1  christos   else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
   4721  1.1  christos     rv = decode_LoopSetup_0 (iw0, iw1, pc, outf);
   4722  1.1  christos   else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
   4723  1.1  christos     rv = decode_LDIMMhalf_0 (iw0, iw1, outf);
   4724  1.1  christos   else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
   4725  1.1  christos     rv = decode_CALLa_0 (iw0, iw1, pc, outf);
   4726  1.1  christos   else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
   4727  1.1  christos     rv = decode_LDSTidxI_0 (iw0, iw1, outf);
   4728  1.1  christos   else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
   4729  1.1  christos     rv = decode_linkage_0 (iw0, iw1, outf);
   4730  1.1  christos   else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
   4731  1.1  christos     rv = decode_dsp32mac_0 (iw0, iw1, outf);
   4732  1.1  christos   else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
   4733  1.1  christos     rv = decode_dsp32mult_0 (iw0, iw1, outf);
   4734  1.1  christos   else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
   4735  1.1  christos     rv = decode_dsp32alu_0 (iw0, iw1, outf);
   4736  1.1  christos   else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
   4737  1.1  christos     rv = decode_dsp32shift_0 (iw0, iw1, outf);
   4738  1.1  christos   else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
   4739  1.1  christos     rv = decode_dsp32shiftimm_0 (iw0, iw1, outf);
   4740  1.1  christos   else if ((iw0 & 0xff00) == 0xf800)
   4741  1.1  christos     rv = decode_pseudoDEBUG_0 (iw0, outf);
   4742  1.1  christos   else if ((iw0 & 0xFF00) == 0xF900)
   4743  1.1  christos     rv = decode_pseudoOChar_0 (iw0, outf);
   4744  1.1  christos   else if ((iw0 & 0xFF00) == 0xf000 && (iw1 & 0x0000) == 0x0000)
   4745  1.1  christos     rv = decode_pseudodbg_assert_0 (iw0, iw1, outf);
   4746  1.1  christos 
   4747  1.1  christos   if (rv == 0)
   4748  1.1  christos     OUTS (outf, "ILLEGAL");
   4749  1.1  christos 
   4750  1.1  christos   return rv;
   4751  1.1  christos }
   4752  1.1  christos 
   4753  1.1  christos int
   4754  1.1  christos print_insn_bfin (bfd_vma pc, disassemble_info *outf)
   4755  1.1  christos {
   4756  1.1  christos   bfd_byte buf[2];
   4757  1.1  christos   unsigned short iw0;
   4758  1.1  christos   int status;
   4759  1.1  christos   int count = 0;
   4760  1.1  christos 
   4761  1.1  christos   status = (*outf->read_memory_func) (pc & ~0x01, buf, 2, outf);
   4762  1.1  christos   /* FIXME */
   4763  1.1  christos   (void) status;
   4764  1.1  christos   iw0 = bfd_getl16 (buf);
   4765  1.1  christos 
   4766  1.1  christos   count += _print_insn_bfin (pc, outf);
   4767  1.1  christos 
   4768  1.1  christos   /* Proper display of multiple issue instructions.  */
   4769  1.1  christos 
   4770  1.1  christos   if (count == 4 && (iw0 & 0xc000) == 0xc000 && (iw0 & BIT_MULTI_INS)
   4771  1.1  christos       && ((iw0 & 0xe800) != 0xe800 /* Not Linkage.  */ ))
   4772  1.1  christos     {
   4773  1.1  christos       int legal = 1;
   4774  1.1  christos       int len;
   4775  1.1  christos 
   4776  1.1  christos       parallel = 1;
   4777  1.1  christos       OUTS (outf, " || ");
   4778  1.1  christos       len = _print_insn_bfin (pc + 4, outf);
   4779  1.1  christos       OUTS (outf, " || ");
   4780  1.1  christos       if (len != 2)
   4781  1.1  christos 	legal = 0;
   4782  1.1  christos       len = _print_insn_bfin (pc + 6, outf);
   4783  1.1  christos       if (len != 2)
   4784  1.1  christos 	legal = 0;
   4785  1.1  christos 
   4786  1.1  christos       if (legal)
   4787  1.1  christos 	count = 8;
   4788  1.1  christos       else
   4789  1.1  christos 	{
   4790  1.1  christos 	  OUTS (outf, ";\t\t/* ILLEGAL PARALLEL INSTRUCTION */");
   4791  1.1  christos 	  comment = 1;
   4792  1.1  christos 	  count = 0;
   4793  1.1  christos 	}
   4794  1.1  christos       parallel = 0;
   4795  1.1  christos     }
   4796  1.1  christos 
   4797  1.1  christos   if (!comment)
   4798  1.1  christos     OUTS (outf, ";");
   4799  1.1  christos 
   4800  1.1  christos   if (count == 0)
   4801  1.1  christos     return 2;
   4802  1.1  christos 
   4803  1.1  christos   comment = 0;
   4804  1.1  christos 
   4805  1.1  christos   return count;
   4806  1.1  christos }
   4807