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