Home | History | Annotate | Line # | Download | only in opcode
tic4x.h revision 1.1.1.2
      1      1.1     skrll /* Table of opcodes for the Texas Instruments TMS320C[34]X family.
      2      1.1     skrll 
      3  1.1.1.2  christos    Copyright (C) 2002, 2003, 2010 Free Software Foundation.
      4      1.1     skrll 
      5      1.1     skrll    Contributed by Michael P. Hayes (m.hayes (at) elec.canterbury.ac.nz)
      6      1.1     skrll 
      7      1.1     skrll    This program is free software; you can redistribute it and/or modify
      8      1.1     skrll    it under the terms of the GNU General Public License as published by
      9  1.1.1.2  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1     skrll    (at your option) any later version.
     11      1.1     skrll 
     12      1.1     skrll    This program is distributed in the hope that it will be useful,
     13      1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1     skrll    GNU General Public License for more details.
     16      1.1     skrll 
     17      1.1     skrll    You should have received a copy of the GNU General Public License
     18      1.1     skrll    along with this program; if not, write to the Free Software
     19  1.1.1.2  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20  1.1.1.2  christos    MA 02110-1301, USA.  */
     21      1.1     skrll 
     22      1.1     skrll #define IS_CPU_TIC3X(v) ((v) == 30 || (v) == 31 || (v) == 32 || (v) == 33)
     23      1.1     skrll #define IS_CPU_TIC4X(v) ((v) ==  0 || (v) == 40 || (v) == 44)
     24      1.1     skrll 
     25      1.1     skrll /* Define some bitfield extraction/insertion macros.  */
     26      1.1     skrll #define EXTR(inst, m, l)          ((inst) << (31 - (m)) >> (31 - ((m) - (l))))
     27      1.1     skrll #define EXTRU(inst, m, l)         EXTR ((unsigned long)(inst), (m), (l))
     28      1.1     skrll #define EXTRS(inst, m, l)         EXTR ((long)(inst), (m), (l))
     29      1.1     skrll #define INSERTU(inst, val, m, l)  (inst |= ((val) << (l)))
     30      1.1     skrll #define INSERTS(inst, val, m, l)  INSERTU (inst, ((val) & ((1 << ((m) - (l) + 1)) - 1)), m, l)
     31      1.1     skrll 
     32      1.1     skrll /* Define register numbers.  */
     33      1.1     skrll typedef enum
     34      1.1     skrll   {
     35      1.1     skrll     REG_R0, REG_R1, REG_R2, REG_R3,
     36      1.1     skrll     REG_R4, REG_R5, REG_R6, REG_R7,
     37      1.1     skrll     REG_AR0, REG_AR1, REG_AR2, REG_AR3,
     38      1.1     skrll     REG_AR4, REG_AR5, REG_AR6, REG_AR7,
     39      1.1     skrll     REG_DP, REG_IR0, REG_IR1, REG_BK,
     40      1.1     skrll     REG_SP, REG_ST, REG_DIE, REG_IIE,
     41      1.1     skrll     REG_IIF, REG_RS, REG_RE, REG_RC,
     42      1.1     skrll     REG_R8, REG_R9, REG_R10, REG_R11,
     43      1.1     skrll     REG_IVTP, REG_TVTP
     44      1.1     skrll   }
     45      1.1     skrll c4x_reg_t;
     46      1.1     skrll 
     47      1.1     skrll /* Note that the actual register numbers for IVTP is 0 and TVTP is 1.  */
     48      1.1     skrll 
     49      1.1     skrll #define REG_IE REG_DIE		/* C3x only */
     50      1.1     skrll #define REG_IF REG_IIE		/* C3x only */
     51      1.1     skrll #define REG_IOF REG_IIF		/* C3x only */
     52      1.1     skrll 
     53      1.1     skrll #define TIC3X_REG_MAX REG_RC
     54      1.1     skrll #define TIC4X_REG_MAX REG_TVTP
     55      1.1     skrll 
     56      1.1     skrll /* Register table size including C4x expansion regs.  */
     57      1.1     skrll #define REG_TABLE_SIZE (TIC4X_REG_MAX + 1)
     58      1.1     skrll 
     59      1.1     skrll struct tic4x_register
     60      1.1     skrll {
     61      1.1     skrll   char *        name;
     62      1.1     skrll   unsigned long regno;
     63      1.1     skrll };
     64      1.1     skrll 
     65      1.1     skrll typedef struct tic4x_register tic4x_register_t;
     66      1.1     skrll 
     67      1.1     skrll /* We could store register synonyms here.  */
     68      1.1     skrll static const tic4x_register_t tic3x_registers[] =
     69      1.1     skrll {
     70      1.1     skrll   {"f0",  REG_R0},
     71      1.1     skrll   {"r0",  REG_R0},
     72      1.1     skrll   {"f1",  REG_R1},
     73      1.1     skrll   {"r1",  REG_R1},
     74      1.1     skrll   {"f2",  REG_R2},
     75      1.1     skrll   {"r2",  REG_R2},
     76      1.1     skrll   {"f3",  REG_R3},
     77      1.1     skrll   {"r3",  REG_R3},
     78      1.1     skrll   {"f4",  REG_R4},
     79      1.1     skrll   {"r4",  REG_R4},
     80      1.1     skrll   {"f5",  REG_R5},
     81      1.1     skrll   {"r5",  REG_R5},
     82      1.1     skrll   {"f6",  REG_R6},
     83      1.1     skrll   {"r6",  REG_R6},
     84      1.1     skrll   {"f7",  REG_R7},
     85      1.1     skrll   {"r7",  REG_R7},
     86      1.1     skrll   {"ar0", REG_AR0},
     87      1.1     skrll   {"ar1", REG_AR1},
     88      1.1     skrll   {"ar2", REG_AR2},
     89      1.1     skrll   {"ar3", REG_AR3},
     90      1.1     skrll   {"ar4", REG_AR4},
     91      1.1     skrll   {"ar5", REG_AR5},
     92      1.1     skrll   {"ar6", REG_AR6},
     93      1.1     skrll   {"ar7", REG_AR7},
     94      1.1     skrll   {"dp",  REG_DP},
     95      1.1     skrll   {"ir0", REG_IR0},
     96      1.1     skrll   {"ir1", REG_IR1},
     97      1.1     skrll   {"bk",  REG_BK},
     98      1.1     skrll   {"sp",  REG_SP},
     99      1.1     skrll   {"st",  REG_ST},
    100      1.1     skrll   {"ie",  REG_IE},
    101      1.1     skrll   {"if",  REG_IF},
    102      1.1     skrll   {"iof", REG_IOF},
    103      1.1     skrll   {"rs",  REG_RS},
    104      1.1     skrll   {"re",  REG_RE},
    105      1.1     skrll   {"rc",  REG_RC},
    106      1.1     skrll   {"", 0}
    107      1.1     skrll };
    108      1.1     skrll 
    109      1.1     skrll const unsigned int tic3x_num_registers = (((sizeof tic3x_registers) / (sizeof tic3x_registers[0])) - 1);
    110      1.1     skrll 
    111      1.1     skrll /* Define C4x registers in addition to C3x registers.  */
    112      1.1     skrll static const tic4x_register_t tic4x_registers[] =
    113      1.1     skrll {
    114      1.1     skrll   {"die", REG_DIE},		/* Clobbers C3x REG_IE */
    115      1.1     skrll   {"iie", REG_IIE},		/* Clobbers C3x REG_IF */
    116      1.1     skrll   {"iif", REG_IIF},		/* Clobbers C3x REG_IOF */
    117      1.1     skrll   {"f8",  REG_R8},
    118      1.1     skrll   {"r8",  REG_R8},
    119      1.1     skrll   {"f9",  REG_R9},
    120      1.1     skrll   {"r9",  REG_R9},
    121      1.1     skrll   {"f10", REG_R10},
    122      1.1     skrll   {"r10", REG_R10},
    123      1.1     skrll   {"f11", REG_R11},
    124      1.1     skrll   {"r11", REG_R11},
    125      1.1     skrll   {"ivtp", REG_IVTP},
    126      1.1     skrll   {"tvtp", REG_TVTP},
    127      1.1     skrll   {"", 0}
    128      1.1     skrll };
    129      1.1     skrll 
    130      1.1     skrll const unsigned int tic4x_num_registers = (((sizeof tic4x_registers) / (sizeof tic4x_registers[0])) - 1);
    131      1.1     skrll 
    132      1.1     skrll struct tic4x_cond
    133      1.1     skrll {
    134      1.1     skrll   char *        name;
    135      1.1     skrll   unsigned long cond;
    136      1.1     skrll };
    137      1.1     skrll 
    138      1.1     skrll typedef struct tic4x_cond tic4x_cond_t;
    139      1.1     skrll 
    140      1.1     skrll /* Define conditional branch/load suffixes.  Put desired form for
    141      1.1     skrll    disassembler last.  */
    142      1.1     skrll static const tic4x_cond_t tic4x_conds[] =
    143      1.1     skrll {
    144      1.1     skrll   { "u",    0x00 },
    145      1.1     skrll   { "c",    0x01 }, { "lo",  0x01 },
    146      1.1     skrll   { "ls",   0x02 },
    147      1.1     skrll   { "hi",   0x03 },
    148      1.1     skrll   { "nc",   0x04 }, { "hs",  0x04 },
    149      1.1     skrll   { "z",    0x05 }, { "eq",  0x05 },
    150      1.1     skrll   { "nz",   0x06 }, { "ne",  0x06 },
    151      1.1     skrll   { "n",    0x07 }, { "l",   0x07 }, { "lt",  0x07 },
    152      1.1     skrll   { "le",   0x08 },
    153      1.1     skrll   { "p",    0x09 }, { "gt",  0x09 },
    154      1.1     skrll   { "nn",   0x0a }, { "ge",  0x0a },
    155      1.1     skrll   { "nv",   0x0c },
    156      1.1     skrll   { "v",    0x0d },
    157      1.1     skrll   { "nuf",  0x0e },
    158      1.1     skrll   { "uf",   0x0f },
    159      1.1     skrll   { "nlv",  0x10 },
    160      1.1     skrll   { "lv",   0x11 },
    161      1.1     skrll   { "nluf", 0x12 },
    162      1.1     skrll   { "luf",  0x13 },
    163      1.1     skrll   { "zuf",  0x14 },
    164      1.1     skrll   /* Dummy entry, not included in num_conds.  This
    165      1.1     skrll      lets code examine entry i+1 without checking
    166      1.1     skrll      if we've run off the end of the table.  */
    167      1.1     skrll   { "",      0x0}
    168      1.1     skrll };
    169      1.1     skrll 
    170      1.1     skrll const unsigned int tic4x_num_conds = (((sizeof tic4x_conds) / (sizeof tic4x_conds[0])) - 1);
    171      1.1     skrll 
    172      1.1     skrll struct tic4x_indirect
    173      1.1     skrll {
    174      1.1     skrll   char *        name;
    175      1.1     skrll   unsigned long modn;
    176      1.1     skrll };
    177      1.1     skrll 
    178      1.1     skrll typedef struct tic4x_indirect tic4x_indirect_t;
    179      1.1     skrll 
    180      1.1     skrll /* Define indirect addressing modes where:
    181      1.1     skrll    d displacement (signed)
    182      1.1     skrll    y ir0
    183      1.1     skrll    z ir1  */
    184      1.1     skrll 
    185      1.1     skrll static const tic4x_indirect_t tic4x_indirects[] =
    186      1.1     skrll {
    187      1.1     skrll   { "*+a(d)",   0x00 },
    188      1.1     skrll   { "*-a(d)",   0x01 },
    189      1.1     skrll   { "*++a(d)",  0x02 },
    190      1.1     skrll   { "*--a(d)",  0x03 },
    191      1.1     skrll   { "*a++(d)",  0x04 },
    192      1.1     skrll   { "*a--(d)",  0x05 },
    193      1.1     skrll   { "*a++(d)%", 0x06 },
    194      1.1     skrll   { "*a--(d)%", 0x07 },
    195      1.1     skrll   { "*+a(y)",   0x08 },
    196      1.1     skrll   { "*-a(y)",   0x09 },
    197      1.1     skrll   { "*++a(y)",  0x0a },
    198      1.1     skrll   { "*--a(y)",  0x0b },
    199      1.1     skrll   { "*a++(y)",  0x0c },
    200      1.1     skrll   { "*a--(y)",  0x0d },
    201      1.1     skrll   { "*a++(y)%", 0x0e },
    202      1.1     skrll   { "*a--(y)%", 0x0f },
    203      1.1     skrll   { "*+a(z)",   0x10 },
    204      1.1     skrll   { "*-a(z)",   0x11 },
    205      1.1     skrll   { "*++a(z)",  0x12 },
    206      1.1     skrll   { "*--a(z)",  0x13 },
    207      1.1     skrll   { "*a++(z)",  0x14 },
    208      1.1     skrll   { "*a--(z)",  0x15 },
    209      1.1     skrll   { "*a++(z)%", 0x16 },
    210      1.1     skrll   { "*a--(z)%", 0x17 },
    211      1.1     skrll   { "*a",       0x18 },
    212      1.1     skrll   { "*a++(y)b", 0x19 },
    213      1.1     skrll   /* Dummy entry, not included in num_indirects.  This
    214      1.1     skrll      lets code examine entry i+1 without checking
    215      1.1     skrll      if we've run off the end of the table.  */
    216      1.1     skrll   { "",      0x0}
    217      1.1     skrll };
    218      1.1     skrll 
    219      1.1     skrll #define TIC3X_MODN_MAX 0x19
    220      1.1     skrll 
    221      1.1     skrll const unsigned int tic4x_num_indirects = (((sizeof tic4x_indirects) / (sizeof tic4x_indirects[0])) - 1);
    222      1.1     skrll 
    223      1.1     skrll /* Instruction template.  */
    224      1.1     skrll struct tic4x_inst
    225      1.1     skrll {
    226      1.1     skrll   char *        name;
    227      1.1     skrll   unsigned long opcode;
    228      1.1     skrll   unsigned long opmask;
    229      1.1     skrll   char *        args;
    230      1.1     skrll   unsigned long oplevel;
    231      1.1     skrll };
    232      1.1     skrll 
    233      1.1     skrll typedef struct tic4x_inst tic4x_inst_t;
    234      1.1     skrll 
    235      1.1     skrll /* Opcode infix
    236      1.1     skrll    B  condition              16--20   U,C,Z,LO,HI, etc.
    237      1.1     skrll    C  condition              23--27   U,C,Z,LO,HI, etc.
    238      1.1     skrll 
    239      1.1     skrll    Arguments
    240      1.1     skrll    ,  required arg follows
    241      1.1     skrll    ;  optional arg follows
    242      1.1     skrll 
    243      1.1     skrll    Argument types             bits    [classes] - example
    244      1.1     skrll    -----------------------------------------------------------
    245      1.1     skrll    *  indirect (all)          0--15   [A,AB,AU,AF,A2,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - *+AR0(5), *++AR0(IR0)
    246      1.1     skrll    #  direct (for LDP)        0--15   [Z] - @start, start
    247      1.1     skrll    @  direct                  0--15   [A,AB,AU,AF,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - @start, start
    248      1.1     skrll    A  address register       22--24   [D] - AR0, AR7
    249      1.1     skrll    B  unsigned integer        0--23   [I,I2] - @start, start  (absolute on C3x, relative on C4x)
    250      1.1     skrll    C  indirect (disp - C4x)   0--7    [S,SC,S2,T,TC,T2,T2C] - *+AR0(5)
    251      1.1     skrll    E  register (all)          0--7    [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
    252      1.1     skrll    e  register (0-11)         0--7    [S,SC,S2] - R0, R7, R11
    253      1.1     skrll    F  short float immediate   0--15   [AF,B,BA,BB] - 3.5, 0e-3.5e-1
    254      1.1     skrll    G  register (all)          8--15   [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
    255      1.1     skrll    g  register (0-11)         0--7    [S,SC,S2] - R0, R7, R11
    256      1.1     skrll    H  register (0-7)         18--16   [LS,M,P,Q] - R0, R7
    257      1.1     skrll    I  indirect (no disp)      0--7    [S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
    258      1.1     skrll    i  indirect (enhanced)     0--7    [LL,LS,M,P,Q,QC] - *+AR0(1), R5
    259      1.1     skrll    J  indirect (no disp)      8--15   [LL,LS,P,Q,QC,S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
    260      1.1     skrll    j  indirect (enhanced)     8--15   [M] - *+AR0(1), R5
    261      1.1     skrll    K  register               19--21   [LL,M,Q,QC] - R0, R7
    262      1.1     skrll    L  register               22--24   [LL,LS,P,Q,QC] - R0, R7
    263      1.1     skrll    M  register (R2,R3)       22--22   [M] R2, R3
    264      1.1     skrll    N  register (R0,R1)       23--23   [M] R0, R1
    265      1.1     skrll    O  indirect(disp - C4x)    8--15   [S,SC,S2,T,TC,T2] - *+AR0(5)
    266      1.1     skrll    P  displacement (PC Rel)   0--15   [D,J,JS] - @start, start
    267      1.1     skrll    Q  register (all)          0--15   [A,AB,AU,A2,A3,AY,BA,BI,D,I2,J,JS] - R0, AR0, DP, SP
    268      1.1     skrll    q  register (0-11)         0--15   [AF,B,BB] - R0, R7, R11
    269      1.1     skrll    R  register (all)         16--20   [A,AB,AU,AF,A6,A7,R,T,TC] - R0, AR0, DP, SP
    270      1.1     skrll    r  register (0-11)        16--20   [B,BA,BB,BI,B6,B7,RF,S,SC] - R0, R1, R11
    271      1.1     skrll    S  short int immediate     0--15   [A,AB,AY,BI] - -5, 5
    272      1.1     skrll    T  integer (C4x)          16--20   [Z] - -5, 12
    273      1.1     skrll    U  unsigned integer        0--15   [AU,A3] - 0, 65535
    274      1.1     skrll    V  vector (C4x: 0--8)      0--4    [Z] - 25, 7
    275      1.1     skrll    W  short int (C4x)         0--7    [T,TC,T2,T2C] - -3, 5
    276      1.1     skrll    X  expansion reg (C4x)     0--4    [Z] - IVTP, TVTP
    277      1.1     skrll    Y  address reg (C4x)      16--20   [Z] - AR0, DP, SP, IR0
    278      1.1     skrll    Z  expansion reg (C4x)    16--20   [Z] - IVTP, TVTP
    279      1.1     skrll */
    280      1.1     skrll 
    281      1.1     skrll #define TIC4X_OPERANDS_MAX 7	/* Max number of operands for an inst.  */
    282      1.1     skrll #define TIC4X_NAME_MAX 16	/* Max number of chars in parallel name.  */
    283      1.1     skrll 
    284      1.1     skrll /* Define the instruction level */
    285      1.1     skrll #define OP_C3X   0x1   /* C30 support - supported by all */
    286      1.1     skrll #define OP_C4X   0x2   /* C40 support - C40, C44 */
    287      1.1     skrll #define OP_ENH   0x4   /* Class LL,LS,M,P,Q,QC enhancements. Argument type
    288      1.1     skrll                           I and J is enhanced in these classes - C31>=6.0,
    289      1.1     skrll                           C32>=2.0, C33 */
    290      1.1     skrll #define OP_LPWR  0x8   /* Low power support (LOPOWER, MAXSPEED) - C30>=7.0,
    291      1.1     skrll                           LC31, C31>=5.0, C32 */
    292      1.1     skrll #define OP_IDLE2 0x10  /* Idle2 support (IDLE2) - C30>=7.0, LC31, C31>=5.0,
    293      1.1     skrll                           C32, C33, C40>=5.0, C44 */
    294      1.1     skrll 
    295      1.1     skrll /* The following class definition is a classification scheme for
    296      1.1     skrll    putting instructions with similar type of arguments together. It
    297      1.1     skrll    simplifies the op-code definitions significantly, as we then only
    298      1.1     skrll    need to use the class macroes for 95% of the DSP's opcodes.
    299      1.1     skrll */
    300      1.1     skrll 
    301      1.1     skrll /* A: General 2-operand integer operations
    302      1.1     skrll    Syntax: <i> src, dst
    303      1.1     skrll       src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
    304      1.1     skrll       dst = Register (R)
    305      1.1     skrll    Instr: 15/8 - ABSI, ADDC, ADDI, ASH, CMPI, LDI, LSH, MPYI, NEGB, NEGI,
    306      1.1     skrll                 SUBB, SUBC, SUBI, SUBRB, SUBRI, C4x: LBn, LHn, LWLn, LWRn,
    307      1.1     skrll                 MBn, MHn, MPYSHI, MPYUHI
    308      1.1     skrll */
    309      1.1     skrll #define A_CLASS_INSN(name, opcode, level) \
    310      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \
    311      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
    312      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
    313      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "S,R", level }
    314      1.1     skrll 
    315      1.1     skrll /* AB: General 2-operand integer operation with condition
    316      1.1     skrll    Syntax: <i>c src, dst
    317      1.1     skrll        c   = Condition
    318      1.1     skrll        src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
    319      1.1     skrll        dst = Register (R)
    320      1.1     skrll    Instr: 1/0 - LDIc
    321      1.1     skrll */
    322      1.1     skrll #define AB_CLASS_INSN(name, opcode, level) \
    323      1.1     skrll   { name, opcode|0x40000000, 0xf0600000, "Q;R", level }, \
    324      1.1     skrll   { name, opcode|0x40200000, 0xf0600000, "@,R", level }, \
    325      1.1     skrll   { name, opcode|0x40400000, 0xf0600000, "*,R", level }, \
    326      1.1     skrll   { name, opcode|0x40600000, 0xf0600000, "S,R", level }
    327      1.1     skrll 
    328      1.1     skrll /* AU: General 2-operand unsigned integer operation
    329      1.1     skrll    Syntax: <i> src, dst
    330      1.1     skrll         src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
    331      1.1     skrll         dst = Register (R)
    332      1.1     skrll    Instr: 6/2 - AND, ANDN, NOT, OR, TSTB, XOR, C4x: LBUn, LHUn
    333      1.1     skrll */
    334      1.1     skrll #define AU_CLASS_INSN(name, opcode, level) \
    335      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \
    336      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
    337      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
    338      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "U,R", level }
    339      1.1     skrll 
    340      1.1     skrll /* AF: General 2-operand float to integer operation
    341      1.1     skrll    Syntax: <i> src, dst
    342      1.1     skrll         src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
    343      1.1     skrll         dst = Register (R)
    344      1.1     skrll    Instr: 1/0 - FIX
    345      1.1     skrll */
    346      1.1     skrll #define AF_CLASS_INSN(name, opcode, level) \
    347      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "q;R", level }, \
    348      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
    349      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
    350      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "F,R", level }
    351      1.1     skrll 
    352      1.1     skrll /* A2: Limited 1-operand (integer) operation
    353      1.1     skrll    Syntax: <i> src
    354      1.1     skrll        src = Register (Q), Indirect (*), None
    355      1.1     skrll    Instr: 1/0 - NOP
    356      1.1     skrll */
    357      1.1     skrll #define A2_CLASS_INSN(name, opcode, level) \
    358      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q", level }, \
    359      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*", level }, \
    360      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "" , level }
    361      1.1     skrll 
    362      1.1     skrll /* A3: General 1-operand unsigned integer operation
    363      1.1     skrll    Syntax: <i> src
    364      1.1     skrll         src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
    365      1.1     skrll    Instr: 1/0 - RPTS
    366      1.1     skrll */
    367      1.1     skrll #define A3_CLASS_INSN(name, opcode, level) \
    368      1.1     skrll   { name, opcode|0x00000000, 0xffff0000, "Q", level }, \
    369      1.1     skrll   { name, opcode|0x00200000, 0xffff0000, "@", level }, \
    370      1.1     skrll   { name, opcode|0x00400000, 0xffff0000, "*", level }, \
    371      1.1     skrll   { name, opcode|0x00600000, 0xffff0000, "U", level }
    372      1.1     skrll 
    373      1.1     skrll /* A6: Limited 2-operand integer operation
    374      1.1     skrll    Syntax: <i> src, dst
    375      1.1     skrll        src = Direct (@), Indirect (*)
    376      1.1     skrll        dst = Register (R)
    377      1.1     skrll    Instr: 1/1 - LDII, C4x: SIGI
    378      1.1     skrll */
    379      1.1     skrll #define A6_CLASS_INSN(name, opcode, level) \
    380      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
    381      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,R", level }
    382      1.1     skrll 
    383      1.1     skrll /* A7: Limited 2-operand integer store operation
    384      1.1     skrll    Syntax: <i> src, dst
    385      1.1     skrll        src = Register (R)
    386      1.1     skrll        dst = Direct (@), Indirect (*)
    387      1.1     skrll    Instr: 2/0 - STI, STII
    388      1.1     skrll */
    389      1.1     skrll #define A7_CLASS_INSN(name, opcode, level) \
    390      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "R,@", level }, \
    391      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "R,*", level }
    392      1.1     skrll 
    393      1.1     skrll /* AY: General 2-operand signed address load operation
    394      1.1     skrll    Syntax: <i> src, dst
    395      1.1     skrll         src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
    396      1.1     skrll         dst = Address register - ARx, IRx, DP, BK, SP (Y)
    397      1.1     skrll    Instr: 0/1 - C4x: LDA
    398      1.1     skrll    Note: Q and Y should *never* be the same register
    399      1.1     skrll */
    400      1.1     skrll #define AY_CLASS_INSN(name, opcode, level) \
    401      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q,Y", level }, \
    402      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,Y", level }, \
    403      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,Y", level }, \
    404      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "S,Y", level }
    405      1.1     skrll 
    406      1.1     skrll /* B: General 2-operand float operation
    407      1.1     skrll    Syntax: <i> src, dst
    408      1.1     skrll        src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
    409      1.1     skrll        dst = Register 0-11 (r)
    410      1.1     skrll    Instr: 12/2 - ABSF, ADDF, CMPF, LDE, LDF, LDM, MPYF, NEGF, NORM, RND,
    411      1.1     skrll                  SUBF, SUBRF, C4x: RSQRF, TOIEEE
    412      1.1     skrll */
    413      1.1     skrll #define B_CLASS_INSN(name, opcode, level) \
    414      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "q;r", level }, \
    415      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
    416      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
    417      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "F,r", level }
    418      1.1     skrll 
    419      1.1     skrll /* BA: General 2-operand integer to float operation
    420      1.1     skrll    Syntax: <i> src, dst
    421      1.1     skrll        src = Register (Q), Direct (@), Indirect (*), Float immediate (F)
    422      1.1     skrll        dst = Register 0-11 (r)
    423      1.1     skrll    Instr: 0/1 - C4x: CRCPF
    424      1.1     skrll */
    425      1.1     skrll #define BA_CLASS_INSN(name, opcode, level) \
    426      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \
    427      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
    428      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
    429      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "F,r", level }
    430      1.1     skrll 
    431      1.1     skrll /* BB: General 2-operand conditional float operation
    432      1.1     skrll    Syntax: <i>c src, dst
    433      1.1     skrll        c   = Condition
    434      1.1     skrll        src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
    435      1.1     skrll        dst = Register 0-11 (r)
    436      1.1     skrll    Instr: 1/0 - LDFc
    437      1.1     skrll */
    438      1.1     skrll #define BB_CLASS_INSN(name, opcode, level) \
    439      1.1     skrll   { name, opcode|0x40000000, 0xf0600000, "q;r", level }, \
    440      1.1     skrll   { name, opcode|0x40200000, 0xf0600000, "@,r", level }, \
    441      1.1     skrll   { name, opcode|0x40400000, 0xf0600000, "*,r", level }, \
    442      1.1     skrll   { name, opcode|0x40600000, 0xf0600000, "F,r", level }
    443      1.1     skrll 
    444      1.1     skrll /* BI: General 2-operand integer to float operation (yet different to BA)
    445      1.1     skrll    Syntax: <i> src, dst
    446      1.1     skrll        src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
    447      1.1     skrll        dst = Register 0-11 (r)
    448      1.1     skrll    Instr: 1/0 - FLOAT
    449      1.1     skrll */
    450      1.1     skrll #define BI_CLASS_INSN(name, opcode, level) \
    451      1.1     skrll   { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \
    452      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
    453      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
    454      1.1     skrll   { name, opcode|0x00600000, 0xffe00000, "S,r", level }
    455      1.1     skrll 
    456      1.1     skrll /* B6: Limited 2-operand float operation
    457      1.1     skrll    Syntax: <i> src, dst
    458      1.1     skrll        src = Direct (@), Indirect (*)
    459      1.1     skrll        dst = Register 0-11 (r)
    460      1.1     skrll    Instr: 1/1 - LDFI, C4x: FRIEEE
    461      1.1     skrll */
    462      1.1     skrll #define B6_CLASS_INSN(name, opcode, level) \
    463      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
    464      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "*,r", level }
    465      1.1     skrll 
    466      1.1     skrll /* B7: Limited 2-operand float store operation
    467      1.1     skrll    Syntax: <i> src, dst
    468      1.1     skrll        src = Register 0-11 (r)
    469      1.1     skrll        dst = Direct (@), Indirect (*)
    470      1.1     skrll    Instr: 2/0 - STF, STFI
    471      1.1     skrll */
    472      1.1     skrll #define B7_CLASS_INSN(name, opcode, level) \
    473      1.1     skrll   { name, opcode|0x00200000, 0xffe00000, "r,@", level }, \
    474      1.1     skrll   { name, opcode|0x00400000, 0xffe00000, "r,*", level }
    475      1.1     skrll 
    476      1.1     skrll /* D: Decrement and brach operations
    477      1.1     skrll    Syntax: <i>c ARn, dst
    478      1.1     skrll        c   = condition
    479      1.1     skrll        ARn = AR register 0-7 (A)
    480      1.1     skrll        dst = Register (Q), PC-relative (P)
    481      1.1     skrll    Instr: 2/0 - DBc, DBcD
    482      1.1     skrll    Alias: <name1> <name2>
    483      1.1     skrll */
    484      1.1     skrll #define D_CLASS_INSN(name1, name2, opcode, level) \
    485      1.1     skrll   { name1, opcode|0x00000000, 0xfe200000, "A,Q", level }, \
    486      1.1     skrll   { name1, opcode|0x02000000, 0xfe200000, "A,P", level }, \
    487      1.1     skrll   { name2, opcode|0x00000000, 0xfe200000, "A,Q", level }, \
    488      1.1     skrll   { name2, opcode|0x02000000, 0xfe200000, "A,P", level }
    489      1.1     skrll 
    490      1.1     skrll /* I: General branch operations
    491      1.1     skrll    Syntax: <i> dst
    492      1.1     skrll        dst = Address (B)
    493      1.1     skrll    Instr: 3/1 - BR, BRD, CALL, C4x: LAJ
    494      1.1     skrll */
    495      1.1     skrll 
    496      1.1     skrll /* I2: General branch operations (C4x addition)
    497      1.1     skrll    Syntax: <i> dst
    498      1.1     skrll        dst = Address (B), C4x: Register (Q)
    499      1.1     skrll    Instr: 2/0 - RPTB, RPTBD
    500      1.1     skrll */
    501      1.1     skrll 
    502      1.1     skrll /* J: General conditional branch operations
    503      1.1     skrll    Syntax: <i>c dst
    504      1.1     skrll        c   = Condition
    505      1.1     skrll        dst = Register (Q), PC-relative (P)
    506      1.1     skrll    Instr: 2/3 - Bc, BcD, C4x: BcAF, BcAT, LAJc
    507      1.1     skrll    Alias: <name1> <name2>
    508      1.1     skrll */
    509      1.1     skrll #define J_CLASS_INSN(name1, name2, opcode, level) \
    510      1.1     skrll   { name1, opcode|0x00000000, 0xffe00000, "Q", level }, \
    511      1.1     skrll   { name1, opcode|0x02000000, 0xffe00000, "P", level }, \
    512      1.1     skrll   { name2, opcode|0x00000000, 0xffe00000, "Q", level }, \
    513      1.1     skrll   { name2, opcode|0x02000000, 0xffe00000, "P", level }
    514      1.1     skrll 
    515      1.1     skrll /* JS: General conditional branch operations
    516      1.1     skrll    Syntax: <i>c dst
    517      1.1     skrll        c   = Condition
    518      1.1     skrll        dst = Register (Q), PC-relative (P)
    519      1.1     skrll    Instr: 1/1 - CALLc, C4X: LAJc
    520      1.1     skrll */
    521      1.1     skrll 
    522      1.1     skrll /* LL: Load-load parallell operation
    523      1.1     skrll    Syntax: <i> src2, dst2 || <i> src1, dst1
    524      1.1     skrll        src1 = Indirect 0,1,IR0,IR1 (J)
    525      1.1     skrll        dst1 = Register 0-7 (K)
    526      1.1     skrll        src2 = Indirect 0,1,IR0,IR1, ENH: Register (i)
    527      1.1     skrll        dst2 = Register 0-7 (L)
    528      1.1     skrll    Instr: 2/0 - LDF||LDF, LDI||LDI
    529      1.1     skrll    Alias: i||i, i1||i2, i2||i1
    530      1.1     skrll */
    531      1.1     skrll #define LL_CLASS_INSN(name, opcode, level) \
    532      1.1     skrll   { name "_"  name    , opcode, 0xfe000000, "i;L|J,K", level }, \
    533      1.1     skrll   { name "2_" name "1", opcode, 0xfe000000, "i;L|J,K", level }, \
    534      1.1     skrll   { name "1_" name "2", opcode, 0xfe000000, "J,K|i;L", level }
    535      1.1     skrll 
    536      1.1     skrll /* LS: Store-store parallell operation
    537      1.1     skrll    Syntax: <i> src2, dst2 || <i> src1, dst1
    538      1.1     skrll        src1 = Register 0-7 (H)
    539      1.1     skrll        dst1 = Indirect 0,1,IR0,IR1 (J)
    540      1.1     skrll        src2 = Register 0-7 (L)
    541      1.1     skrll        dst2 = Indirect 0,1,IR0,IR1, ENH: register (i)
    542      1.1     skrll    Instr: 2/0 - STF||STF, STI||STI
    543      1.1     skrll    Alias: i||i, i1||i2, i2||i1.
    544      1.1     skrll */
    545      1.1     skrll #define LS_CLASS_INSN(name, opcode, level) \
    546      1.1     skrll   { name "_"  name    , opcode, 0xfe000000, "L;i|H,J", level }, \
    547      1.1     skrll   { name "2_" name "1", opcode, 0xfe000000, "L;i|H,J", level }, \
    548      1.1     skrll   { name "1_" name "2", opcode, 0xfe000000, "H,J|L;i", level }
    549      1.1     skrll 
    550      1.1     skrll /* M: General multiply and add/sub operations
    551      1.1     skrll    Syntax: <ia> src3,src4,dst1 || <ib> src2,src1,dst2 [00] - Manual
    552      1.1     skrll            <ia> src3,src1,dst1 || <ib> src2,src4,dst2 [01] - Manual
    553      1.1     skrll            <ia> src1,src3,dst1 || <ib> src2,src4,dst2 [01]
    554      1.1     skrll            <ia> src1,src2,dst1 || <ib> src4,src3,dst2 [02] - Manual
    555      1.1     skrll            <ia> src3,src1,dst1 || <ib> src4,src2,dst2 [03] - Manual
    556      1.1     skrll            <ia> src1,src3,dst1 || <ib> src4,src2,dst2 [03]
    557      1.1     skrll        src1 = Register 0-7 (K)
    558      1.1     skrll        src2 = Register 0-7 (H)
    559      1.1     skrll        src3 = Indirect 0,1,IR0,IR1, ENH: register (j)
    560      1.1     skrll        src4 = Indirect 0,1,IR0,IR1, ENH: register (i)
    561      1.1     skrll        dst1 = Register 0-1 (N)
    562      1.1     skrll        dst2 = Register 2-3 (M)
    563      1.1     skrll    Instr: 4/0 - MPYF3||ADDF3, MPYF3||SUBF3, MPYI3||ADDI3, MPYI3||SUBI3
    564      1.1     skrll    Alias: a||b, a3||n, a||b3, a3||b3, b||a, b3||a, b||a3, b3||a3
    565      1.1     skrll */
    566      1.1     skrll #define M_CLASS_INSN(namea, nameb, opcode, level) \
    567      1.1     skrll   { namea "_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
    568      1.1     skrll   { namea "_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
    569      1.1     skrll   { namea "_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
    570      1.1     skrll   { namea "_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
    571      1.1     skrll   { namea "_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
    572      1.1     skrll   { namea "_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
    573      1.1     skrll   { namea "3_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
    574      1.1     skrll   { namea "3_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
    575      1.1     skrll   { namea "3_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
    576      1.1     skrll   { namea "3_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
    577      1.1     skrll   { namea "3_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
    578      1.1     skrll   { namea "3_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
    579      1.1     skrll   { namea "_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
    580      1.1     skrll   { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
    581      1.1     skrll   { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
    582      1.1     skrll   { namea "_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
    583      1.1     skrll   { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
    584      1.1     skrll   { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
    585      1.1     skrll   { namea "3_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
    586      1.1     skrll   { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
    587      1.1     skrll   { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
    588      1.1     skrll   { namea "3_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
    589      1.1     skrll   { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
    590      1.1     skrll   { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
    591      1.1     skrll   { nameb "_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
    592      1.1     skrll   { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
    593      1.1     skrll   { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
    594      1.1     skrll   { nameb "_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
    595      1.1     skrll   { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
    596      1.1     skrll   { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
    597      1.1     skrll   { nameb "3_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
    598      1.1     skrll   { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
    599      1.1     skrll   { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
    600      1.1     skrll   { nameb "3_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
    601      1.1     skrll   { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
    602      1.1     skrll   { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
    603      1.1     skrll   { nameb "_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
    604      1.1     skrll   { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
    605      1.1     skrll   { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
    606      1.1     skrll   { nameb "_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
    607      1.1     skrll   { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
    608      1.1     skrll   { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
    609      1.1     skrll   { nameb "3_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
    610      1.1     skrll   { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
    611      1.1     skrll   { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
    612      1.1     skrll   { nameb "3_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
    613      1.1     skrll   { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
    614      1.1     skrll   { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }
    615      1.1     skrll 
    616      1.1     skrll /* P: General 2-operand operation with parallell store
    617      1.1     skrll    Syntax: <ia> src2, dst1 || <ib> src3, dst2
    618      1.1     skrll        src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
    619      1.1     skrll        dst1 = Register 0-7 (L)
    620      1.1     skrll        src3 = Register 0-7 (H)
    621      1.1     skrll        dst2 = Indirect 0,1,IR0,IR1 (J)
    622      1.1     skrll    Instr: 9/2 - ABSF||STF, ABSI||STI, FIX||STI, FLOAT||STF, LDF||STF,
    623      1.1     skrll                 LDI||STI, NEGF||STF, NEGI||STI, NOT||STI, C4x: FRIEEE||STF,
    624      1.1     skrll                 TOIEEE||STF
    625      1.1     skrll    Alias: a||b, b||a
    626      1.1     skrll */
    627      1.1     skrll #define P_CLASS_INSN(namea, nameb, opcode, level) \
    628      1.1     skrll   { namea "_" nameb, opcode, 0xfe000000, "i;L|H,J", level }, \
    629      1.1     skrll   { nameb "_" namea, opcode, 0xfe000000, "H,J|i;L", level }
    630      1.1     skrll 
    631      1.1     skrll /* Q: General 3-operand operation with parallell store
    632      1.1     skrll    Syntax: <ia> src1, src2, dst1 || <ib> src3, dst2
    633      1.1     skrll        src1 = Register 0-7 (K)
    634      1.1     skrll        src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
    635      1.1     skrll        dst1 = Register 0-7 (L)
    636      1.1     skrll        src3 = Register 0-7 (H)
    637      1.1     skrll        dst2 = Indirect 0,1,IR0,IR1 (J)
    638      1.1     skrll    Instr: 4/0 - ASH3||STI, LSH3||STI, SUBF3||STF, SUBI3||STI
    639      1.1     skrll    Alias: a||b, b||a, a3||b, b||a3
    640      1.1     skrll */
    641      1.1     skrll #define Q_CLASS_INSN(namea, nameb, opcode, level) \
    642      1.1     skrll   { namea "_"  nameb    , opcode, 0xfe000000, "K,i;L|H,J", level }, \
    643      1.1     skrll   { nameb "_"  namea    , opcode, 0xfe000000, "H,J|K,i;L", level }, \
    644      1.1     skrll   { namea "3_" nameb    , opcode, 0xfe000000, "K,i;L|H,J", level }, \
    645      1.1     skrll   { nameb "_"  namea "3", opcode, 0xfe000000, "H,J|K,i;L", level }
    646      1.1     skrll 
    647      1.1     skrll /* QC: General commutative 3-operand operation with parallell store
    648      1.1     skrll    Syntax: <ia> src2, src1, dst1 || <ib> src3, dst2
    649      1.1     skrll            <ia> src1, src2, dst1 || <ib> src3, dst2 - Manual
    650      1.1     skrll        src1 = Register 0-7 (K)
    651      1.1     skrll        src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
    652      1.1     skrll        dst1 = Register 0-7 (L)
    653      1.1     skrll        src3 = Register 0-7 (H)
    654      1.1     skrll        dst2 = Indirect 0,1,IR0,IR1 (J)
    655      1.1     skrll    Instr: 7/0 - ADDF3||STF, ADDI3||STI, AND3||STI, MPYF3||STF, MPYI3||STI,
    656      1.1     skrll                 OR3||STI, XOR3||STI
    657      1.1     skrll    Alias: a||b, b||a, a3||b, b||a3
    658      1.1     skrll */
    659      1.1     skrll #define QC_CLASS_INSN(namea, nameb, opcode, level) \
    660      1.1     skrll   { namea "_"  nameb    , opcode, 0xfe000000, "i;K;L|H,J", level }, \
    661      1.1     skrll   { namea "_"  nameb    , opcode, 0xfe000000, "K;i;L|H,J", level }, \
    662      1.1     skrll   { nameb "_"  namea    , opcode, 0xfe000000, "H,J|i;K;L", level }, \
    663      1.1     skrll   { nameb "_"  namea    , opcode, 0xfe000000, "H,J|K;i;L", level }, \
    664      1.1     skrll   { namea "3_" nameb    , opcode, 0xfe000000, "i;K;L|H,J", level }, \
    665      1.1     skrll   { namea "3_" nameb    , opcode, 0xfe000000, "K;i;L|H,J", level }, \
    666      1.1     skrll   { nameb "_"  namea "3", opcode, 0xfe000000, "H,J|i;K;L", level }, \
    667      1.1     skrll   { nameb "_"  namea "3", opcode, 0xfe000000, "H,J|K;i;L", level }
    668      1.1     skrll 
    669      1.1     skrll /* R: General register integer operation
    670      1.1     skrll    Syntax: <i> dst
    671      1.1     skrll        dst = Register (R)
    672      1.1     skrll    Instr: 6/0 - POP, PUSH, ROL, ROLC, ROR, RORC
    673      1.1     skrll */
    674      1.1     skrll #define R_CLASS_INSN(name, opcode, level) \
    675      1.1     skrll   { name, opcode, 0xffe0ffff, "R", level }
    676      1.1     skrll 
    677      1.1     skrll /* RF: General register float operation
    678      1.1     skrll    Syntax: <i> dst
    679      1.1     skrll        dst = Register 0-11 (r)
    680      1.1     skrll    Instr: 2/0 - POPF, PUSHF
    681      1.1     skrll */
    682      1.1     skrll #define RF_CLASS_INSN(name, opcode, level) \
    683      1.1     skrll   { name, opcode, 0xffe0ffff, "r", level }
    684      1.1     skrll 
    685      1.1     skrll /* S: General 3-operand float operation
    686      1.1     skrll    Syntax: <i> src2, src1, dst
    687      1.1     skrll        src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
    688      1.1     skrll        src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    689      1.1     skrll        dst  = Register 0-11 (r)
    690      1.1     skrll    Instr: 1/0 - SUBF3
    691      1.1     skrll    Alias: i, i3
    692      1.1     skrll */
    693      1.1     skrll #define S_CLASS_INSN(name, opcode, level) \
    694      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "e,g;r", level  }, \
    695      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "e,J,r", level  }, \
    696      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,g;r", level  }, \
    697      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J,r", level  }, \
    698      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
    699      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \
    700      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level  }, \
    701      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level  }, \
    702      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level  }, \
    703      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level  }, \
    704      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
    705      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }
    706      1.1     skrll 
    707      1.1     skrll /* SC: General commutative 3-operand float operation
    708      1.1     skrll    Syntax: <i> src2, src1, dst - Manual
    709      1.1     skrll            <i> src1, src2, dst
    710      1.1     skrll        src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
    711      1.1     skrll        src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    712      1.1     skrll        dst  = Register 0-11 (r)
    713      1.1     skrll    Instr: 2/0 - ADDF3, MPYF3
    714      1.1     skrll    Alias: i, i3
    715      1.1     skrll */
    716      1.1     skrll #define SC_CLASS_INSN(name, opcode, level) \
    717      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "e,g;r", level  }, \
    718      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "e,J,r", level  }, \
    719      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,g;r", level  }, \
    720      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J,r", level  }, \
    721      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
    722      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \
    723      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \
    724      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level  }, \
    725      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level  }, \
    726      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level  }, \
    727      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level  }, \
    728      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \
    729      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
    730      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }
    731      1.1     skrll 
    732      1.1     skrll /* S2: General 3-operand float operation with 2 args
    733      1.1     skrll    Syntax: <i> src2, src1
    734      1.1     skrll        src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
    735      1.1     skrll        src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    736      1.1     skrll    Instr: 1/0 - CMPF3
    737      1.1     skrll    Alias: i, i3
    738      1.1     skrll */
    739      1.1     skrll #define S2_CLASS_INSN(name, opcode, level) \
    740      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "e,g", level  }, \
    741      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "e,J", level  }, \
    742      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,g", level  }, \
    743      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    744      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \
    745      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
    746      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "e,g", level  }, \
    747      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "e,J", level  }, \
    748      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,g", level  }, \
    749      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    750      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \
    751      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
    752      1.1     skrll 
    753      1.1     skrll /* T: General 3-operand integer operand
    754      1.1     skrll    Syntax: <i> src2, src1, dst
    755      1.1     skrll        src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
    756      1.1     skrll        src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    757      1.1     skrll        dst  = Register (R)
    758      1.1     skrll    Instr: 5/0 - ANDN3, ASH3, LSH3, SUBB3, SUBI3
    759      1.1     skrll    Alias: i, i3
    760      1.1     skrll */
    761      1.1     skrll #define T_CLASS_INSN(name, opcode, level) \
    762      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "E,G;R", level  }, \
    763      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "E,J,R", level  }, \
    764      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,G;R", level  }, \
    765      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J,R", level  }, \
    766      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
    767      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
    768      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
    769      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \
    770      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level  }, \
    771      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level  }, \
    772      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level  }, \
    773      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level  }, \
    774      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
    775      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
    776      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
    777      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }
    778      1.1     skrll 
    779      1.1     skrll /* TC: General commutative 3-operand integer operation
    780      1.1     skrll    Syntax: <i> src2, src1, dst
    781      1.1     skrll            <i> src1, src2, dst
    782      1.1     skrll        src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
    783      1.1     skrll        src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    784      1.1     skrll        dst  = Register (R)
    785      1.1     skrll    Instr: 6/2 - ADDC3, ADDI3, AND3, MPYI3, OR3, XOR3, C4x: MPYSHI, MPYUHI
    786      1.1     skrll    Alias: i, i3
    787      1.1     skrll */
    788      1.1     skrll #define TC_CLASS_INSN(name, opcode, level) \
    789      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "E,G;R", level  }, \
    790      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "E,J,R", level  }, \
    791      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,G;R", level  }, \
    792      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J,R", level  }, \
    793      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
    794      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \
    795      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
    796      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \
    797      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
    798      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \
    799      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \
    800      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level  }, \
    801      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level  }, \
    802      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level  }, \
    803      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level  }, \
    804      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
    805      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \
    806      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
    807      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \
    808      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
    809      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \
    810      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }
    811      1.1     skrll 
    812      1.1     skrll /* T2: General 3-operand integer operation with 2 args
    813      1.1     skrll    Syntax: <i> src2, src1
    814      1.1     skrll        src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
    815      1.1     skrll        src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
    816      1.1     skrll    Instr: 1/0 - CMPI3
    817      1.1     skrll    Alias: i, i3
    818      1.1     skrll */
    819      1.1     skrll #define T2_CLASS_INSN(name, opcode, level) \
    820      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "E,G", level  }, \
    821      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "E,J", level  }, \
    822      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,G", level  }, \
    823      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    824      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
    825      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
    826      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
    827      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
    828      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "E,G", level  }, \
    829      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "E,J", level  }, \
    830      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,G", level  }, \
    831      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    832      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
    833      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
    834      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
    835      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
    836      1.1     skrll 
    837      1.1     skrll /* T2C: General commutative 3-operand integer operation with 2 args
    838      1.1     skrll    Syntax: <i> src2, src1 - Manual
    839      1.1     skrll            <i> src1, src2
    840      1.1     skrll        src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
    841      1.1     skrll        src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (0)
    842      1.1     skrll    Instr: 1/0 - TSTB3
    843      1.1     skrll    Alias: i, i3
    844      1.1     skrll */
    845      1.1     skrll #define T2C_CLASS_INSN(name, opcode, level) \
    846      1.1     skrll   { name, opcode|0x20000000, 0xffe00000, "E,G", level  }, \
    847      1.1     skrll   { name, opcode|0x20200000, 0xffe00000, "E,J", level  }, \
    848      1.1     skrll   { name, opcode|0x20400000, 0xffe00000, "I,G", level  }, \
    849      1.1     skrll   { name, opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    850      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
    851      1.1     skrll   { name, opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \
    852      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
    853      1.1     skrll   { name, opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \
    854      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
    855      1.1     skrll   { name, opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \
    856      1.1     skrll   { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
    857      1.1     skrll   { name "3", opcode|0x20000000, 0xffe00000, "E,G", level  }, \
    858      1.1     skrll   { name "3", opcode|0x20200000, 0xffe00000, "E,J", level  }, \
    859      1.1     skrll   { name "3", opcode|0x20400000, 0xffe00000, "I,G", level  }, \
    860      1.1     skrll   { name "3", opcode|0x20600000, 0xffe00000, "I,J", level  }, \
    861      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
    862      1.1     skrll   { name "3", opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \
    863      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
    864      1.1     skrll   { name "3", opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \
    865      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
    866      1.1     skrll   { name "3", opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \
    867      1.1     skrll   { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
    868      1.1     skrll 
    869      1.1     skrll /* Z: Misc operations with or without arguments
    870      1.1     skrll    Syntax: <i> <arg1>,...
    871      1.1     skrll    Instr: 16 - RETIc, RETSc, SIGI(c3X), SWI, IDLE, IDLE2, RETIcD,
    872      1.1     skrll                TRAPc, LATc, LDEP, LDEHI, LDEPE, LDPK, STIK, LDP, IACK
    873      1.1     skrll */
    874      1.1     skrll 
    875      1.1     skrll 
    876      1.1     skrll /* Define tic4x opcodes for assembler and disassembler.  */
    877      1.1     skrll static const tic4x_inst_t tic4x_insts[] =
    878      1.1     skrll {
    879      1.1     skrll   /* Put synonyms after the desired forms in table so that they get
    880      1.1     skrll      overwritten in the lookup table.  The disassembler will thus
    881      1.1     skrll      print the `proper' mnemonics.  Note that the disassembler
    882      1.1     skrll      only decodes the 11 MSBs, so instructions like ldp @0x500 will
    883      1.1     skrll      be printed as ldiu 5, dp.  Note that with parallel instructions,
    884      1.1     skrll      the second part is executed before the first part, unless
    885      1.1     skrll      the sti1||sti2 form is used.  We also allow sti2||sti1
    886      1.1     skrll      which is equivalent to the default sti||sti form.
    887      1.1     skrll   */
    888      1.1     skrll   B_CLASS_INSN(  "absf",          0x00000000, OP_C3X   ),
    889      1.1     skrll   P_CLASS_INSN(  "absf",  "stf",  0xc8000000, OP_C3X   ),
    890      1.1     skrll   A_CLASS_INSN(  "absi",          0x00800000, OP_C3X   ),
    891      1.1     skrll   P_CLASS_INSN(  "absi",  "sti",  0xca000000, OP_C3X   ),
    892      1.1     skrll   A_CLASS_INSN(  "addc",          0x01000000, OP_C3X   ),
    893      1.1     skrll   TC_CLASS_INSN( "addc",          0x00000000, OP_C3X   ),
    894      1.1     skrll   B_CLASS_INSN(  "addf",          0x01800000, OP_C3X   ),
    895      1.1     skrll   SC_CLASS_INSN( "addf",          0x00800000, OP_C3X   ),
    896      1.1     skrll   QC_CLASS_INSN( "addf",  "stf",  0xcc000000, OP_C3X   ),
    897      1.1     skrll   A_CLASS_INSN(  "addi",          0x02000000, OP_C3X   ),
    898      1.1     skrll   TC_CLASS_INSN( "addi",          0x01000000, OP_C3X   ),
    899      1.1     skrll   QC_CLASS_INSN( "addi",  "sti",  0xce000000, OP_C3X   ),
    900      1.1     skrll   AU_CLASS_INSN( "and",           0x02800000, OP_C3X   ),
    901      1.1     skrll   TC_CLASS_INSN( "and",           0x01800000, OP_C3X   ),
    902      1.1     skrll   QC_CLASS_INSN( "and",   "sti",  0xd0000000, OP_C3X   ),
    903      1.1     skrll   AU_CLASS_INSN( "andn",          0x03000000, OP_C3X   ),
    904      1.1     skrll   T_CLASS_INSN(  "andn",          0x02000000, OP_C3X   ),
    905      1.1     skrll   A_CLASS_INSN(  "ash",           0x03800000, OP_C3X   ),
    906      1.1     skrll   T_CLASS_INSN(  "ash",           0x02800000, OP_C3X   ),
    907      1.1     skrll   Q_CLASS_INSN(  "ash",   "sti",  0xd2000000, OP_C3X   ),
    908      1.1     skrll   J_CLASS_INSN(  "bB",    "b",    0x68000000, OP_C3X   ),
    909      1.1     skrll   J_CLASS_INSN(  "bBd",   "bd",   0x68200000, OP_C3X   ),
    910      1.1     skrll   J_CLASS_INSN(  "bBaf",  "baf",  0x68a00000, OP_C4X   ),
    911      1.1     skrll   J_CLASS_INSN(  "bBat",  "bat",  0x68600000, OP_C4X   ),
    912      1.1     skrll   { "br",     0x60000000, 0xff000000, "B"   , OP_C3X   },  /* I_CLASS */
    913      1.1     skrll   { "brd",    0x61000000, 0xff000000, "B"   , OP_C3X   },  /* I_CLASS */
    914      1.1     skrll   { "call",   0x62000000, 0xff000000, "B"   , OP_C3X   },  /* I_CLASS */
    915      1.1     skrll   { "callB",  0x70000000, 0xffe00000, "Q"   , OP_C3X   },  /* JS_CLASS */
    916      1.1     skrll   { "callB",  0x72000000, 0xffe00000, "P"   , OP_C3X   },  /* JS_CLASS */
    917      1.1     skrll   B_CLASS_INSN(  "cmpf",          0x04000000, OP_C3X   ),
    918      1.1     skrll   S2_CLASS_INSN( "cmpf",          0x03000000, OP_C3X   ),
    919      1.1     skrll   A_CLASS_INSN(  "cmpi",          0x04800000, OP_C3X   ),
    920      1.1     skrll   T2_CLASS_INSN( "cmpi",          0x03800000, OP_C3X   ),
    921      1.1     skrll   D_CLASS_INSN(  "dbB",   "db",   0x6c000000, OP_C3X   ),
    922      1.1     skrll   D_CLASS_INSN(  "dbBd",  "dbd",  0x6c200000, OP_C3X   ),
    923      1.1     skrll   AF_CLASS_INSN( "fix",           0x05000000, OP_C3X   ),
    924      1.1     skrll   P_CLASS_INSN(  "fix",   "sti",  0xd4000000, OP_C3X   ),
    925      1.1     skrll   BI_CLASS_INSN( "float",         0x05800000, OP_C3X   ),
    926      1.1     skrll   P_CLASS_INSN(  "float", "stf",  0xd6000000, OP_C3X   ),
    927      1.1     skrll   B6_CLASS_INSN( "frieee",        0x1c000000, OP_C4X   ),
    928      1.1     skrll   P_CLASS_INSN(  "frieee","stf",  0xf2000000, OP_C4X   ),
    929      1.1     skrll   { "iack",   0x1b200000, 0xffe00000, "@"   , OP_C3X   },  /* Z_CLASS */
    930      1.1     skrll   { "iack",   0x1b400000, 0xffe00000, "*"   , OP_C3X   },  /* Z_CLASS */
    931      1.1     skrll   { "idle",   0x06000000, 0xffffffff, ""    , OP_C3X   },  /* Z_CLASS */
    932      1.1     skrll   { "idlez",  0x06000000, 0xffffffff, ""    , OP_C3X   },  /* Z_CLASS */
    933      1.1     skrll   { "idle2",  0x06000001, 0xffffffff, ""    , OP_IDLE2 },  /* Z_CLASS */
    934      1.1     skrll   { "laj",    0x63000000, 0xff000000, "B"   , OP_C4X   },  /* I_CLASS */
    935      1.1     skrll   { "lajB",   0x70200000, 0xffe00000, "Q"   , OP_C4X   },  /* JS_CLASS */
    936      1.1     skrll   { "lajB",   0x72200000, 0xffe00000, "P"   , OP_C4X   },  /* JS_CLASS */
    937      1.1     skrll   { "latB",   0x74800000, 0xffe00000, "V"   , OP_C4X   },  /* Z_CLASS */
    938      1.1     skrll   A_CLASS_INSN(  "lb0",           0xb0000000, OP_C4X   ),
    939      1.1     skrll   A_CLASS_INSN(  "lb1",           0xb0800000, OP_C4X   ),
    940      1.1     skrll   A_CLASS_INSN(  "lb2",           0xb1000000, OP_C4X   ),
    941      1.1     skrll   A_CLASS_INSN(  "lb3",           0xb1800000, OP_C4X   ),
    942      1.1     skrll   AU_CLASS_INSN( "lbu0",          0xb2000000, OP_C4X   ),
    943      1.1     skrll   AU_CLASS_INSN( "lbu1",          0xb2800000, OP_C4X   ),
    944      1.1     skrll   AU_CLASS_INSN( "lbu2",          0xb3000000, OP_C4X   ),
    945      1.1     skrll   AU_CLASS_INSN( "lbu3",          0xb3800000, OP_C4X   ),
    946      1.1     skrll   AY_CLASS_INSN( "lda",           0x1e800000, OP_C4X   ),
    947      1.1     skrll   B_CLASS_INSN(  "lde",           0x06800000, OP_C3X   ),
    948      1.1     skrll   { "ldep",   0x76000000, 0xffe00000, "X,R" , OP_C4X   },  /* Z_CLASS */
    949      1.1     skrll   B_CLASS_INSN(  "ldf",           0x07000000, OP_C3X   ),
    950      1.1     skrll   LL_CLASS_INSN( "ldf",           0xc4000000, OP_C3X   ),
    951      1.1     skrll   P_CLASS_INSN(  "ldf",   "stf",  0xd8000000, OP_C3X   ),
    952      1.1     skrll   BB_CLASS_INSN( "ldfC",          0x00000000, OP_C3X   ),
    953      1.1     skrll   B6_CLASS_INSN( "ldfi",          0x07800000, OP_C3X   ),
    954      1.1     skrll   { "ldhi",   0x1fe00000, 0xffe00000, "U,R" , OP_C4X   },  /* Z_CLASS */
    955      1.1     skrll   { "ldhi",   0x1fe00000, 0xffe00000, "#,R" , OP_C4X   },  /* Z_CLASS */
    956      1.1     skrll   A_CLASS_INSN(  "ldi",           0x08000000, OP_C3X   ),
    957      1.1     skrll   LL_CLASS_INSN( "ldi",           0xc6000000, OP_C3X   ),
    958      1.1     skrll   P_CLASS_INSN(  "ldi",   "sti",  0xda000000, OP_C3X   ),
    959      1.1     skrll   AB_CLASS_INSN( "ldiC",          0x10000000, OP_C3X   ),
    960      1.1     skrll   A6_CLASS_INSN( "ldii",          0x08800000, OP_C3X   ),
    961      1.1     skrll   { "ldp",    0x50700000, 0xffff0000, "#"   , OP_C3X   },  /* Z_CLASS - synonym for ldiu #,dp */
    962      1.1     skrll   B_CLASS_INSN(  "ldm",           0x09000000, OP_C3X   ),
    963      1.1     skrll   { "ldpe",   0x76800000, 0xffe00000, "Q,Z" , OP_C4X   },  /* Z_CLASS */
    964      1.1     skrll   { "ldpk",   0x1F700000, 0xffff0000, "#"   , OP_C4X   },  /* Z_CLASS */
    965      1.1     skrll   A_CLASS_INSN(  "lh0",           0xba000000, OP_C4X   ),
    966      1.1     skrll   A_CLASS_INSN(  "lh1",           0xba800000, OP_C4X   ),
    967      1.1     skrll   AU_CLASS_INSN( "lhu0",          0xbb000000, OP_C4X   ),
    968      1.1     skrll   AU_CLASS_INSN( "lhu1",          0xbb800000, OP_C4X   ),
    969      1.1     skrll   { "lopower", 0x10800001,0xffffffff, ""    , OP_LPWR  },  /* Z_CLASS */
    970      1.1     skrll   A_CLASS_INSN(  "lsh",           0x09800000, OP_C3X   ),
    971      1.1     skrll   T_CLASS_INSN(  "lsh",           0x04000000, OP_C3X   ),
    972      1.1     skrll   Q_CLASS_INSN(  "lsh",   "sti",  0xdc000000, OP_C3X   ),
    973      1.1     skrll   A_CLASS_INSN(  "lwl0",          0xb4000000, OP_C4X   ),
    974      1.1     skrll   A_CLASS_INSN(  "lwl1",          0xb4800000, OP_C4X   ),
    975      1.1     skrll   A_CLASS_INSN(  "lwl2",          0xb5000000, OP_C4X   ),
    976      1.1     skrll   A_CLASS_INSN(  "lwl3",          0xb5800000, OP_C4X   ),
    977      1.1     skrll   A_CLASS_INSN(  "lwr0",          0xb6000000, OP_C4X   ),
    978      1.1     skrll   A_CLASS_INSN(  "lwr1",          0xb6800000, OP_C4X   ),
    979      1.1     skrll   A_CLASS_INSN(  "lwr2",          0xb7000000, OP_C4X   ),
    980      1.1     skrll   A_CLASS_INSN(  "lwr3",          0xb7800000, OP_C4X   ),
    981      1.1     skrll   { "maxspeed",0x10800000,0xffffffff, ""    , OP_LPWR  },  /* Z_CLASS */
    982      1.1     skrll   A_CLASS_INSN(  "mb0",           0xb8000000, OP_C4X   ),
    983      1.1     skrll   A_CLASS_INSN(  "mb1",           0xb8800000, OP_C4X   ),
    984      1.1     skrll   A_CLASS_INSN(  "mb2",           0xb9000000, OP_C4X   ),
    985      1.1     skrll   A_CLASS_INSN(  "mb3",           0xb9800000, OP_C4X   ),
    986      1.1     skrll   A_CLASS_INSN(  "mh0",           0xbc000000, OP_C4X   ),
    987      1.1     skrll   A_CLASS_INSN(  "mh1",           0xbc800000, OP_C4X   ),
    988      1.1     skrll   A_CLASS_INSN(  "mh2",           0xbd000000, OP_C4X   ),
    989      1.1     skrll   A_CLASS_INSN(  "mh3",           0xbd800000, OP_C4X   ),
    990      1.1     skrll   B_CLASS_INSN(  "mpyf",          0x0a000000, OP_C3X   ),
    991      1.1     skrll   SC_CLASS_INSN( "mpyf",          0x04800000, OP_C3X   ),
    992      1.1     skrll   M_CLASS_INSN(  "mpyf",  "addf", 0x80000000, OP_C3X   ),
    993      1.1     skrll   QC_CLASS_INSN( "mpyf",  "stf",  0xde000000, OP_C3X   ),
    994      1.1     skrll   M_CLASS_INSN(  "mpyf",  "subf", 0x84000000, OP_C3X   ),
    995      1.1     skrll   A_CLASS_INSN(  "mpyi",          0x0a800000, OP_C3X   ),
    996      1.1     skrll   TC_CLASS_INSN( "mpyi",          0x05000000, OP_C3X   ),
    997      1.1     skrll   M_CLASS_INSN(  "mpyi",  "addi", 0x88000000, OP_C3X   ),
    998      1.1     skrll   QC_CLASS_INSN( "mpyi",  "sti",  0xe0000000, OP_C3X   ),
    999      1.1     skrll   M_CLASS_INSN(  "mpyi",  "subi", 0x8c000000, OP_C3X   ),
   1000      1.1     skrll   A_CLASS_INSN(  "mpyshi",        0x1d800000, OP_C4X   ),
   1001      1.1     skrll   TC_CLASS_INSN( "mpyshi",        0x28800000, OP_C4X   ),
   1002      1.1     skrll   A_CLASS_INSN(  "mpyuhi",        0x1e000000, OP_C4X   ),
   1003      1.1     skrll   TC_CLASS_INSN( "mpyuhi",        0x29000000, OP_C4X   ),
   1004      1.1     skrll   A_CLASS_INSN(  "negb",          0x0b000000, OP_C3X   ),
   1005      1.1     skrll   B_CLASS_INSN(  "negf",          0x0b800000, OP_C3X   ),
   1006      1.1     skrll   P_CLASS_INSN(  "negf",  "stf",  0xe2000000, OP_C3X   ),
   1007      1.1     skrll   A_CLASS_INSN(  "negi",          0x0c000000, OP_C3X   ),
   1008      1.1     skrll   P_CLASS_INSN(  "negi",  "sti",  0xe4000000, OP_C3X   ),
   1009      1.1     skrll   A2_CLASS_INSN( "nop",           0x0c800000, OP_C3X   ),
   1010      1.1     skrll   B_CLASS_INSN(  "norm",          0x0d000000, OP_C3X   ),
   1011      1.1     skrll   AU_CLASS_INSN( "not",           0x0d800000, OP_C3X   ),
   1012      1.1     skrll   P_CLASS_INSN(  "not",   "sti",  0xe6000000, OP_C3X   ),
   1013      1.1     skrll   AU_CLASS_INSN( "or",            0x10000000, OP_C3X   ),
   1014      1.1     skrll   TC_CLASS_INSN( "or",            0x05800000, OP_C3X   ),
   1015      1.1     skrll   QC_CLASS_INSN( "or",    "sti",  0xe8000000, OP_C3X   ),
   1016      1.1     skrll   R_CLASS_INSN(  "pop",           0x0e200000, OP_C3X   ),
   1017      1.1     skrll   RF_CLASS_INSN( "popf",          0x0ea00000, OP_C3X   ),
   1018      1.1     skrll   R_CLASS_INSN(  "push",          0x0f200000, OP_C3X   ),
   1019      1.1     skrll   RF_CLASS_INSN( "pushf",         0x0fa00000, OP_C3X   ),
   1020      1.1     skrll   BA_CLASS_INSN( "rcpf",          0x1d000000, OP_C4X   ),
   1021      1.1     skrll   { "retiB",  0x78000000, 0xffe00000, ""    , OP_C3X   },  /* Z_CLASS */
   1022      1.1     skrll   { "reti",   0x78000000, 0xffe00000, ""    , OP_C3X   },  /* Z_CLASS  - Alias for retiu */
   1023      1.1     skrll   { "retiBd", 0x78200000, 0xffe00000, ""    , OP_C4X   },  /* Z_CLASS */
   1024      1.1     skrll   { "retid",  0x78200000, 0xffe00000, ""    , OP_C4X   },  /* Z_CLASS - Alias for retiud */
   1025      1.1     skrll   { "retsB",  0x78800000, 0xffe00000, ""    , OP_C3X   },  /* Z_CLASS */
   1026      1.1     skrll   { "rets",   0x78800000, 0xffe00000, ""    , OP_C3X   },  /* Z_CLASS  - Alias for retsu */
   1027      1.1     skrll   B_CLASS_INSN(  "rnd",           0x11000000, OP_C3X   ),
   1028      1.1     skrll   R_CLASS_INSN(  "rol",           0x11e00001, OP_C3X   ),
   1029      1.1     skrll   R_CLASS_INSN(  "rolc",          0x12600001, OP_C3X   ),
   1030      1.1     skrll   R_CLASS_INSN(  "ror",           0x12e0ffff, OP_C3X   ),
   1031      1.1     skrll   R_CLASS_INSN(  "rorc",          0x1360ffff, OP_C3X   ),
   1032      1.1     skrll   { "rptb",   0x64000000, 0xff000000, "B"   , OP_C3X   },  /* I2_CLASS */
   1033      1.1     skrll   { "rptb",   0x79000000, 0xff000000, "Q"   , OP_C4X   },  /* I2_CLASS */
   1034      1.1     skrll   { "rptbd",  0x65000000, 0xff000000, "B"   , OP_C4X   },  /* I2_CLASS */
   1035      1.1     skrll   { "rptbd",  0x79800000, 0xff000000, "Q"   , OP_C4X   },  /* I2_CLASS */
   1036      1.1     skrll   A3_CLASS_INSN( "rpts",          0x139b0000, OP_C3X   ),
   1037      1.1     skrll   B_CLASS_INSN(  "rsqrf",         0x1c800000, OP_C4X   ),
   1038      1.1     skrll   { "sigi",   0x16000000, 0xffe00000, ""    , OP_C3X   },  /* Z_CLASS */
   1039      1.1     skrll   A6_CLASS_INSN( "sigi",          0x16000000, OP_C4X   ),
   1040      1.1     skrll   B7_CLASS_INSN( "stf",           0x14000000, OP_C3X   ),
   1041      1.1     skrll   LS_CLASS_INSN( "stf",           0xc0000000, OP_C3X   ),
   1042      1.1     skrll   B7_CLASS_INSN( "stfi",          0x14800000, OP_C3X   ),
   1043      1.1     skrll   A7_CLASS_INSN( "sti",           0x15000000, OP_C3X   ),
   1044      1.1     skrll   { "sti",    0x15000000, 0xffe00000, "T,@" , OP_C4X   },  /* Class A7 - Alias for stik */
   1045      1.1     skrll   { "sti",    0x15600000, 0xffe00000, "T,*" , OP_C4X   },  /* Class A7 */
   1046      1.1     skrll   LS_CLASS_INSN( "sti",           0xc2000000, OP_C3X   ),
   1047      1.1     skrll   A7_CLASS_INSN( "stii",          0x15800000, OP_C3X   ),
   1048      1.1     skrll   { "stik",   0x15000000, 0xffe00000, "T,@" , OP_C4X   },  /* Z_CLASS */
   1049      1.1     skrll   { "stik",   0x15600000, 0xffe00000, "T,*" , OP_C4X   },  /* Z_CLASS */
   1050      1.1     skrll   A_CLASS_INSN(  "subb",          0x16800000, OP_C3X   ),
   1051      1.1     skrll   T_CLASS_INSN(  "subb",          0x06000000, OP_C3X   ),
   1052      1.1     skrll   A_CLASS_INSN(  "subc",          0x17000000, OP_C3X   ),
   1053      1.1     skrll   B_CLASS_INSN(  "subf",          0x17800000, OP_C3X   ),
   1054      1.1     skrll   S_CLASS_INSN(  "subf",          0x06800000, OP_C3X   ),
   1055      1.1     skrll   Q_CLASS_INSN(  "subf",  "stf",  0xea000000, OP_C3X   ),
   1056      1.1     skrll   A_CLASS_INSN(  "subi",          0x18000000, OP_C3X   ),
   1057      1.1     skrll   T_CLASS_INSN(  "subi",          0x07000000, OP_C3X   ),
   1058      1.1     skrll   Q_CLASS_INSN(  "subi",  "sti",  0xec000000, OP_C3X   ),
   1059      1.1     skrll   A_CLASS_INSN(  "subrb",         0x18800000, OP_C3X   ),
   1060      1.1     skrll   B_CLASS_INSN(  "subrf",         0x19000000, OP_C3X   ),
   1061      1.1     skrll   A_CLASS_INSN(  "subri",         0x19800000, OP_C3X   ),
   1062      1.1     skrll   { "swi",    0x66000000, 0xffffffff, ""    , OP_C3X   },  /* Z_CLASS */
   1063      1.1     skrll   B_CLASS_INSN(  "toieee",        0x1b800000, OP_C4X   ),
   1064      1.1     skrll   P_CLASS_INSN(  "toieee","stf",  0xf0000000, OP_C4X   ),
   1065      1.1     skrll   { "trapB",  0x74000000, 0xffe00000, "V"   , OP_C3X   },  /* Z_CLASS */
   1066      1.1     skrll   { "trap",   0x74000000, 0xffe00000, "V"   , OP_C3X   },  /* Z_CLASS - Alias for trapu */
   1067      1.1     skrll   AU_CLASS_INSN( "tstb",          0x1a000000, OP_C3X   ),
   1068      1.1     skrll   T2C_CLASS_INSN("tstb",          0x07800000, OP_C3X   ),
   1069      1.1     skrll   AU_CLASS_INSN( "xor",           0x1a800000, OP_C3X   ),
   1070      1.1     skrll   TC_CLASS_INSN( "xor",           0x08000000, OP_C3X   ),
   1071      1.1     skrll   QC_CLASS_INSN( "xor",   "sti",  0xee000000, OP_C3X   ),
   1072      1.1     skrll 
   1073      1.1     skrll   /* Dummy entry, not included in tic4x_num_insts.  This
   1074      1.1     skrll      lets code examine entry i + 1 without checking
   1075      1.1     skrll      if we've run off the end of the table.  */
   1076      1.1     skrll   { "",      0x0, 0x00, "", 0 }
   1077      1.1     skrll };
   1078      1.1     skrll 
   1079      1.1     skrll const unsigned int tic4x_num_insts = (((sizeof tic4x_insts) / (sizeof tic4x_insts[0])) - 1);
   1080