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