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