Home | History | Annotate | Line # | Download | only in opcode
      1   1.1  christos /* tic30.h -- Header file for TI TMS320C30 opcode table
      2  1.11  christos    Copyright (C) 1998-2024 Free Software Foundation, Inc.
      3   1.1  christos    Contributed by Steven Haworth (steve (at) pm.cse.rmit.edu.au)
      4   1.1  christos 
      5   1.1  christos    This file is part of GDB, GAS, and the GNU binutils.
      6   1.1  christos 
      7   1.1  christos    GDB, GAS, and the GNU binutils are free software; you can redistribute
      8   1.1  christos    them and/or modify them under the terms of the GNU General Public
      9   1.1  christos    License as published by the Free Software Foundation; either version 3,
     10   1.1  christos    or (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    GDB, GAS, and the GNU binutils are distributed in the hope that they
     13   1.1  christos    will be useful, but WITHOUT ANY WARRANTY; without even the implied
     14   1.1  christos    warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     15   1.1  christos    the GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this file; see the file COPYING3.  If not, write to the Free
     19   1.1  christos    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     20   1.1  christos    02110-1301, USA.  */
     21   1.1  christos 
     22   1.1  christos /* FIXME: The opcode table should be in opcodes/tic30-opc.c, not in a
     23   1.1  christos    header file.  */
     24   1.1  christos 
     25   1.1  christos #ifndef _TMS320_H_
     26   1.1  christos #define _TMS320_H_
     27   1.1  christos 
     28   1.1  christos struct _register
     29   1.1  christos {
     30   1.6  christos   const char *name;
     31   1.1  christos   unsigned char opcode;
     32   1.1  christos   unsigned char regtype;
     33   1.1  christos };
     34   1.1  christos 
     35   1.1  christos typedef struct _register reg;
     36   1.1  christos 
     37   1.1  christos #define REG_Rn    0x01
     38   1.1  christos #define REG_ARn   0x02
     39   1.1  christos #define REG_DP    0x03
     40   1.1  christos #define REG_OTHER 0x04
     41   1.1  christos 
     42   1.1  christos static const reg tic30_regtab[] = {
     43   1.1  christos   { "r0", 0x00, REG_Rn },
     44   1.1  christos   { "r1", 0x01, REG_Rn },
     45   1.1  christos   { "r2", 0x02, REG_Rn },
     46   1.1  christos   { "r3", 0x03, REG_Rn },
     47   1.1  christos   { "r4", 0x04, REG_Rn },
     48   1.1  christos   { "r5", 0x05, REG_Rn },
     49   1.1  christos   { "r6", 0x06, REG_Rn },
     50   1.1  christos   { "r7", 0x07, REG_Rn },
     51   1.1  christos   { "ar0",0x08, REG_ARn },
     52   1.1  christos   { "ar1",0x09, REG_ARn },
     53   1.1  christos   { "ar2",0x0A, REG_ARn },
     54   1.1  christos   { "ar3",0x0B, REG_ARn },
     55   1.1  christos   { "ar4",0x0C, REG_ARn },
     56   1.1  christos   { "ar5",0x0D, REG_ARn },
     57   1.1  christos   { "ar6",0x0E, REG_ARn },
     58   1.1  christos   { "ar7",0x0F, REG_ARn },
     59   1.1  christos   { "dp", 0x10, REG_DP },
     60   1.1  christos   { "ir0",0x11, REG_OTHER },
     61   1.1  christos   { "ir1",0x12, REG_OTHER },
     62   1.1  christos   { "bk", 0x13, REG_OTHER },
     63   1.1  christos   { "sp", 0x14, REG_OTHER },
     64   1.1  christos   { "st", 0x15, REG_OTHER },
     65   1.1  christos   { "ie", 0x16, REG_OTHER },
     66   1.1  christos   { "if", 0x17, REG_OTHER },
     67   1.1  christos   { "iof",0x18, REG_OTHER },
     68   1.1  christos   { "rs", 0x19, REG_OTHER },
     69   1.1  christos   { "re", 0x1A, REG_OTHER },
     70   1.1  christos   { "rc", 0x1B, REG_OTHER },
     71   1.1  christos   { "R0", 0x00, REG_Rn },
     72   1.1  christos   { "R1", 0x01, REG_Rn },
     73   1.1  christos   { "R2", 0x02, REG_Rn },
     74   1.1  christos   { "R3", 0x03, REG_Rn },
     75   1.1  christos   { "R4", 0x04, REG_Rn },
     76   1.1  christos   { "R5", 0x05, REG_Rn },
     77   1.1  christos   { "R6", 0x06, REG_Rn },
     78   1.1  christos   { "R7", 0x07, REG_Rn },
     79   1.1  christos   { "AR0",0x08, REG_ARn },
     80   1.1  christos   { "AR1",0x09, REG_ARn },
     81   1.1  christos   { "AR2",0x0A, REG_ARn },
     82   1.1  christos   { "AR3",0x0B, REG_ARn },
     83   1.1  christos   { "AR4",0x0C, REG_ARn },
     84   1.1  christos   { "AR5",0x0D, REG_ARn },
     85   1.1  christos   { "AR6",0x0E, REG_ARn },
     86   1.1  christos   { "AR7",0x0F, REG_ARn },
     87   1.1  christos   { "DP", 0x10, REG_DP },
     88   1.1  christos   { "IR0",0x11, REG_OTHER },
     89   1.1  christos   { "IR1",0x12, REG_OTHER },
     90   1.1  christos   { "BK", 0x13, REG_OTHER },
     91   1.1  christos   { "SP", 0x14, REG_OTHER },
     92   1.1  christos   { "ST", 0x15, REG_OTHER },
     93   1.1  christos   { "IE", 0x16, REG_OTHER },
     94   1.1  christos   { "IF", 0x17, REG_OTHER },
     95   1.1  christos   { "IOF",0x18, REG_OTHER },
     96   1.1  christos   { "RS", 0x19, REG_OTHER },
     97   1.1  christos   { "RE", 0x1A, REG_OTHER },
     98   1.1  christos   { "RC", 0x1B, REG_OTHER },
     99   1.1  christos   { "",   0, 0 }
    100   1.1  christos };
    101   1.1  christos 
    102   1.1  christos static const reg *const tic30_regtab_end
    103   1.1  christos   = tic30_regtab + sizeof(tic30_regtab)/sizeof(tic30_regtab[0]);
    104   1.1  christos 
    105   1.1  christos /* Indirect Addressing Modes Modification Fields */
    106   1.1  christos /* Indirect Addressing with Displacement */
    107   1.1  christos #define PreDisp_Add        0x00
    108   1.1  christos #define PreDisp_Sub        0x01
    109   1.1  christos #define PreDisp_Add_Mod    0x02
    110   1.1  christos #define PreDisp_Sub_Mod    0x03
    111   1.1  christos #define PostDisp_Add_Mod   0x04
    112   1.1  christos #define PostDisp_Sub_Mod   0x05
    113   1.1  christos #define PostDisp_Add_Circ  0x06
    114   1.1  christos #define PostDisp_Sub_Circ  0x07
    115   1.1  christos /* Indirect Addressing with Index Register IR0 */
    116   1.1  christos #define PreIR0_Add         0x08
    117   1.1  christos #define PreIR0_Sub         0x09
    118   1.1  christos #define PreIR0_Add_Mod     0x0A
    119   1.1  christos #define PreIR0_Sub_Mod     0x0B
    120   1.1  christos #define PostIR0_Add_Mod    0x0C
    121   1.1  christos #define PostIR0_Sub_Mod    0x0D
    122   1.1  christos #define PostIR0_Add_Circ   0x0E
    123   1.1  christos #define PostIR0_Sub_Circ   0x0F
    124   1.1  christos /* Indirect Addressing with Index Register IR1 */
    125   1.1  christos #define PreIR1_Add         0x10
    126   1.1  christos #define PreIR1_Sub         0x11
    127   1.1  christos #define PreIR1_Add_Mod     0x12
    128   1.1  christos #define PreIR1_Sub_Mod     0x13
    129   1.1  christos #define PostIR1_Add_Mod    0x14
    130   1.1  christos #define PostIR1_Sub_Mod    0x15
    131   1.1  christos #define PostIR1_Add_Circ   0x16
    132   1.1  christos #define PostIR1_Sub_Circ   0x17
    133   1.1  christos /* Indirect Addressing (Special Cases) */
    134   1.1  christos #define IndirectOnly       0x18
    135   1.1  christos #define PostIR0_Add_BitRev 0x19
    136   1.1  christos 
    137   1.1  christos typedef struct {
    138   1.6  christos   const char *syntax;
    139   1.1  christos   unsigned char modfield;
    140   1.1  christos   unsigned char displacement;
    141   1.1  christos } ind_addr_type;
    142   1.1  christos 
    143   1.1  christos #define IMPLIED_DISP  0x01
    144   1.1  christos #define DISP_REQUIRED 0x02
    145   1.1  christos #define NO_DISP       0x03
    146   1.1  christos 
    147   1.1  christos static const ind_addr_type tic30_indaddr_tab[] = {
    148   1.1  christos   { "*+ar",       PreDisp_Add,        IMPLIED_DISP },
    149   1.1  christos   { "*-ar",       PreDisp_Sub,        IMPLIED_DISP },
    150   1.1  christos   { "*++ar",      PreDisp_Add_Mod,    IMPLIED_DISP },
    151   1.1  christos   { "*--ar",      PreDisp_Sub_Mod,    IMPLIED_DISP },
    152   1.1  christos   { "*ar++",      PostDisp_Add_Mod,   IMPLIED_DISP },
    153   1.1  christos   { "*ar--",      PostDisp_Sub_Mod,   IMPLIED_DISP },
    154   1.1  christos   { "*ar++%",     PostDisp_Add_Circ,  IMPLIED_DISP },
    155   1.1  christos   { "*ar--%",     PostDisp_Sub_Circ,  IMPLIED_DISP },
    156   1.1  christos   { "*+ar()",     PreDisp_Add,        DISP_REQUIRED },
    157   1.1  christos   { "*-ar()",     PreDisp_Sub,        DISP_REQUIRED },
    158   1.1  christos   { "*++ar()",    PreDisp_Add_Mod,    DISP_REQUIRED },
    159   1.1  christos   { "*--ar()",    PreDisp_Sub_Mod,    DISP_REQUIRED },
    160   1.1  christos   { "*ar++()",    PostDisp_Add_Mod,   DISP_REQUIRED },
    161   1.1  christos   { "*ar--()",    PostDisp_Sub_Mod,   DISP_REQUIRED },
    162   1.1  christos   { "*ar++()%",   PostDisp_Add_Circ,  DISP_REQUIRED },
    163   1.1  christos   { "*ar--()%",   PostDisp_Sub_Circ,  DISP_REQUIRED },
    164   1.1  christos   { "*+ar(ir0)",  PreIR0_Add,         NO_DISP },
    165   1.1  christos   { "*-ar(ir0)",  PreIR0_Sub,         NO_DISP },
    166   1.1  christos   { "*++ar(ir0)", PreIR0_Add_Mod,     NO_DISP },
    167   1.1  christos   { "*--ar(ir0)", PreIR0_Sub_Mod,     NO_DISP },
    168   1.1  christos   { "*ar++(ir0)", PostIR0_Add_Mod,    NO_DISP },
    169   1.1  christos   { "*ar--(ir0)", PostIR0_Sub_Mod,    NO_DISP },
    170   1.1  christos   { "*ar++(ir0)%",PostIR0_Add_Circ,   NO_DISP },
    171   1.1  christos   { "*ar--(ir0)%",PostIR0_Sub_Circ,   NO_DISP },
    172   1.1  christos   { "*+ar(ir1)",  PreIR1_Add,         NO_DISP },
    173   1.1  christos   { "*-ar(ir1)",  PreIR1_Sub,         NO_DISP },
    174   1.1  christos   { "*++ar(ir1)", PreIR1_Add_Mod,     NO_DISP },
    175   1.1  christos   { "*--ar(ir1)", PreIR1_Sub_Mod,     NO_DISP },
    176   1.1  christos   { "*ar++(ir1)", PostIR1_Add_Mod,    NO_DISP },
    177   1.1  christos   { "*ar--(ir1)", PostIR1_Sub_Mod,    NO_DISP },
    178   1.1  christos   { "*ar++(ir1)%",PostIR1_Add_Circ,   NO_DISP },
    179   1.1  christos   { "*ar--(ir1)%",PostIR1_Sub_Circ,   NO_DISP },
    180   1.1  christos   { "*ar",        IndirectOnly,       NO_DISP },
    181   1.1  christos   { "*ar++(ir0)b",PostIR0_Add_BitRev, NO_DISP },
    182   1.1  christos   { "",           0,0 }
    183   1.1  christos };
    184   1.1  christos 
    185   1.1  christos static const ind_addr_type *const tic30_indaddrtab_end
    186   1.1  christos   = tic30_indaddr_tab + sizeof(tic30_indaddr_tab)/sizeof(tic30_indaddr_tab[0]);
    187   1.1  christos 
    188   1.1  christos /* Possible operand types */
    189   1.1  christos /* Register types */
    190   1.1  christos #define Rn       0x0001
    191   1.1  christos #define ARn      0x0002
    192   1.1  christos #define DPReg    0x0004
    193   1.1  christos #define OtherReg 0x0008
    194   1.1  christos /* Addressing mode types */
    195   1.1  christos #define Direct   0x0010
    196   1.1  christos #define Indirect 0x0020
    197   1.1  christos #define Imm16    0x0040
    198   1.1  christos #define Disp     0x0080
    199   1.1  christos #define Imm24    0x0100
    200   1.1  christos #define Abs24    0x0200
    201   1.1  christos /* 3 operand addressing mode types */
    202   1.1  christos #define op3T1    0x0400
    203   1.1  christos #define op3T2    0x0800
    204   1.1  christos /* Interrupt vector */
    205   1.1  christos #define IVector  0x1000
    206   1.1  christos /* Not required */
    207   1.1  christos #define NotReq   0x2000
    208   1.1  christos 
    209   1.1  christos #define GAddr1   Rn | Direct | Indirect | Imm16
    210   1.1  christos #define GAddr2   GAddr1 | AllReg
    211   1.1  christos #define TAddr1   op3T1 | Rn | Indirect
    212   1.1  christos #define TAddr2   op3T2 | Rn | Indirect
    213   1.1  christos #define Reg      Rn | ARn
    214   1.1  christos #define AllReg   Reg | DPReg | OtherReg
    215   1.1  christos 
    216   1.1  christos typedef struct _template
    217   1.1  christos {
    218   1.6  christos   const char *name;
    219   1.1  christos   unsigned int operands; /* how many operands */
    220   1.1  christos   unsigned int base_opcode; /* base_opcode is the fundamental opcode byte */
    221   1.1  christos   /* the bits in opcode_modifier are used to generate the final opcode from
    222   1.1  christos      the base_opcode.  These bits also are used to detect alternate forms of
    223   1.1  christos      the same instruction */
    224   1.1  christos   unsigned int opcode_modifier;
    225   1.1  christos 
    226   1.1  christos   /* opcode_modifier bits: */
    227   1.1  christos #define AddressMode 0x00600000
    228   1.1  christos #define PCRel       0x02000000
    229   1.1  christos #define StackOp     0x001F0000
    230   1.1  christos #define Rotate      StackOp
    231   1.1  christos 
    232   1.1  christos   /* operand_types[i] describes the type of operand i.  This is made
    233   1.1  christos      by OR'ing together all of the possible type masks.  (e.g.
    234   1.1  christos      'operand_types[i] = Reg|Imm' specifies that operand i can be
    235   1.1  christos      either a register or an immediate operand */
    236   1.1  christos   unsigned int operand_types[3];
    237   1.1  christos   /* This defines the number type of an immediate argument to an instruction. */
    238   1.1  christos   int imm_arg_type;
    239   1.1  christos #define Imm_None  0
    240   1.1  christos #define Imm_Float 1
    241   1.1  christos #define Imm_SInt  2
    242   1.1  christos #define Imm_UInt  3
    243   1.1  christos }
    244   1.1  christos insn_template;
    245   1.1  christos 
    246   1.1  christos static const insn_template tic30_optab[] = {
    247   1.1  christos   { "absf"   ,2,0x00000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    248   1.1  christos   { "absi"   ,2,0x00800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    249   1.1  christos   { "addc"   ,2,0x01000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    250   1.1  christos   { "addc3"  ,3,0x20000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    251   1.1  christos   { "addf"   ,2,0x01800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    252   1.1  christos   { "addf3"  ,3,0x20800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None },
    253   1.1  christos   { "addi"   ,2,0x02000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    254   1.1  christos   { "addi3"  ,3,0x21000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    255   1.1  christos   { "and"    ,2,0x02800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    256   1.1  christos   { "and3"   ,3,0x21800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    257   1.1  christos   { "andn"   ,2,0x03000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    258   1.1  christos   { "andn3"  ,3,0x22000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    259   1.1  christos   { "ash"    ,2,0x03800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    260   1.1  christos   { "ash3"   ,3,0x22800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    261   1.1  christos   { "b"      ,1,0x68000000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    262   1.1  christos   { "bu"     ,1,0x68000000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    263   1.1  christos   { "blo"    ,1,0x68010000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    264   1.1  christos   { "bls"    ,1,0x68020000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    265   1.1  christos   { "bhi"    ,1,0x68030000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    266   1.1  christos   { "bhs"    ,1,0x68040000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    267   1.1  christos   { "beq"    ,1,0x68050000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    268   1.1  christos   { "bne"    ,1,0x68060000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    269   1.1  christos   { "blt"    ,1,0x68070000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    270   1.1  christos   { "ble"    ,1,0x68080000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    271   1.1  christos   { "bgt"    ,1,0x68090000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    272   1.1  christos   { "bge"    ,1,0x680A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    273   1.1  christos   { "bz"     ,1,0x68050000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    274   1.1  christos   { "bnz"    ,1,0x68060000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    275   1.1  christos   { "bp"     ,1,0x68090000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    276   1.1  christos   { "bn"     ,1,0x68070000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    277   1.1  christos   { "bnn"    ,1,0x680A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    278   1.1  christos   { "bnv"    ,1,0x680C0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    279   1.1  christos   { "bv"     ,1,0x680D0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    280   1.1  christos   { "bnuf"   ,1,0x680E0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    281   1.1  christos   { "buf"    ,1,0x680F0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    282   1.1  christos   { "bnc"    ,1,0x68040000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    283   1.1  christos   { "bc"     ,1,0x68010000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    284   1.1  christos   { "bnlv"   ,1,0x68100000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    285   1.1  christos   { "blv"    ,1,0x68110000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    286   1.1  christos   { "bnluf"  ,1,0x68120000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    287   1.1  christos   { "bluf"   ,1,0x68130000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    288   1.1  christos   { "bzuf"   ,1,0x68140000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    289   1.1  christos   { "bd"     ,1,0x68200000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    290   1.1  christos   { "bud"    ,1,0x68200000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    291   1.1  christos   { "blod"   ,1,0x68210000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    292   1.1  christos   { "blsd"   ,1,0x68220000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    293   1.1  christos   { "bhid"   ,1,0x68230000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    294   1.1  christos   { "bhsd"   ,1,0x68240000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    295   1.1  christos   { "beqd"   ,1,0x68250000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    296   1.1  christos   { "bned"   ,1,0x68260000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    297   1.1  christos   { "bltd"   ,1,0x68270000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    298   1.1  christos   { "bled"   ,1,0x68280000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    299   1.1  christos   { "bgtd"   ,1,0x68290000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    300   1.1  christos   { "bged"   ,1,0x682A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    301   1.1  christos   { "bzd"    ,1,0x68250000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    302   1.1  christos   { "bnzd"   ,1,0x68260000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    303   1.1  christos   { "bpd"    ,1,0x68290000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    304   1.1  christos   { "bnd"    ,1,0x68270000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    305   1.1  christos   { "bnnd"   ,1,0x682A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    306   1.1  christos   { "bnvd"   ,1,0x682C0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    307   1.1  christos   { "bvd"    ,1,0x682D0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    308   1.1  christos   { "bnufd"  ,1,0x682E0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    309   1.1  christos   { "bufd"   ,1,0x682F0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    310   1.1  christos   { "bncd"   ,1,0x68240000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    311   1.1  christos   { "bcd"    ,1,0x68210000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    312   1.1  christos   { "bnlvd"  ,1,0x68300000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    313   1.1  christos   { "blvd"   ,1,0x68310000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    314   1.1  christos   { "bnlufd" ,1,0x68320000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    315   1.1  christos   { "blufd"  ,1,0x68330000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    316   1.1  christos   { "bzufd"  ,1,0x68340000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_None },
    317   1.1  christos   { "br"     ,1,0x60000000,0,           { Imm24, 0, 0 }, Imm_UInt },
    318   1.1  christos   { "brd"    ,1,0x61000000,0,           { Imm24, 0, 0 }, Imm_UInt },
    319   1.1  christos   { "call"   ,1,0x62000000,0,           { Imm24, 0, 0 }, Imm_UInt },
    320   1.1  christos   { "callu"  ,1,0x70000000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    321   1.1  christos   { "calllo" ,1,0x70010000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    322   1.1  christos   { "callls" ,1,0x70020000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    323   1.1  christos   { "callhi" ,1,0x70030000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    324   1.1  christos   { "callhs" ,1,0x70040000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    325   1.1  christos   { "calleq" ,1,0x70050000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    326   1.1  christos   { "callne" ,1,0x70060000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    327   1.1  christos   { "calllt" ,1,0x70070000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    328   1.1  christos   { "callle" ,1,0x70080000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    329   1.1  christos   { "callgt" ,1,0x70090000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    330   1.1  christos   { "callge" ,1,0x700A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    331   1.1  christos   { "callz"  ,1,0x70050000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    332   1.1  christos   { "callnz" ,1,0x70060000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    333   1.1  christos   { "callp"  ,1,0x70090000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    334   1.1  christos   { "calln"  ,1,0x70070000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    335   1.1  christos   { "callnn" ,1,0x700A0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    336   1.1  christos   { "callnv" ,1,0x700C0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    337   1.1  christos   { "callv"  ,1,0x700D0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    338   1.1  christos   { "callnuf",1,0x700E0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    339   1.1  christos   { "calluf" ,1,0x700F0000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    340   1.1  christos   { "callnc" ,1,0x70040000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    341   1.1  christos   { "callc"  ,1,0x70010000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    342   1.1  christos   { "callnlv",1,0x70100000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    343   1.1  christos   { "calllv" ,1,0x70110000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    344   1.1  christos   { "callnluf",1,0x70120000,PCRel,      { AllReg|Disp, 0, 0 }, Imm_UInt },
    345   1.1  christos   { "callluf",1,0x70130000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    346   1.1  christos   { "callzuf",1,0x70140000,PCRel,       { AllReg|Disp, 0, 0 }, Imm_UInt },
    347   1.1  christos   { "cmpf"   ,2,0x04000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    348   1.1  christos   { "cmpf3"  ,2,0x23000000,AddressMode, { TAddr1, TAddr2, 0 }, Imm_None },
    349   1.1  christos   { "cmpi"   ,2,0x04800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    350   1.1  christos   { "cmpi3"  ,2,0x23800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None },
    351   1.1  christos   { "db"     ,2,0x6C000000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    352   1.1  christos   { "dbu"    ,2,0x6C000000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    353   1.1  christos   { "dblo"   ,2,0x6C010000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    354   1.1  christos   { "dbls"   ,2,0x6C020000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    355   1.1  christos   { "dbhi"   ,2,0x6C030000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    356   1.1  christos   { "dbhs"   ,2,0x6C040000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    357   1.1  christos   { "dbeq"   ,2,0x6C050000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    358   1.1  christos   { "dbne"   ,2,0x6C060000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    359   1.1  christos   { "dblt"   ,2,0x6C070000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    360   1.1  christos   { "dble"   ,2,0x6C080000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    361   1.1  christos   { "dbgt"   ,2,0x6C090000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    362   1.1  christos   { "dbge"   ,2,0x6C0A0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    363   1.1  christos   { "dbz"    ,2,0x6C050000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    364   1.1  christos   { "dbnz"   ,2,0x6C060000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    365   1.1  christos   { "dbp"    ,2,0x6C090000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    366   1.1  christos   { "dbn"    ,2,0x6C070000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    367   1.1  christos   { "dbnn"   ,2,0x6C0A0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    368   1.1  christos   { "dbnv"   ,2,0x6C0C0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    369   1.1  christos   { "dbv"    ,2,0x6C0D0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    370   1.1  christos   { "dbnuf"  ,2,0x6C0E0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    371   1.1  christos   { "dbuf"   ,2,0x6C0F0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    372   1.1  christos   { "dbnc"   ,2,0x6C040000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    373   1.1  christos   { "dbc"    ,2,0x6C010000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    374   1.1  christos   { "dbnlv"  ,2,0x6C100000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    375   1.1  christos   { "dblv"   ,2,0x6C110000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    376   1.1  christos   { "dbnluf" ,2,0x6C120000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    377   1.1  christos   { "dbluf"  ,2,0x6C130000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    378   1.1  christos   { "dbzuf"  ,2,0x6C140000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    379   1.1  christos   { "dbd"    ,2,0x6C200000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    380   1.1  christos   { "dbud"   ,2,0x6C200000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    381   1.1  christos   { "dblod"  ,2,0x6C210000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    382   1.1  christos   { "dblsd"  ,2,0x6C220000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    383   1.1  christos   { "dbhid"  ,2,0x6C230000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    384   1.1  christos   { "dbhsd"  ,2,0x6C240000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    385   1.1  christos   { "dbeqd"  ,2,0x6C250000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    386   1.1  christos   { "dbned"  ,2,0x6C260000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    387   1.1  christos   { "dbltd"  ,2,0x6C270000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    388   1.1  christos   { "dbled"  ,2,0x6C280000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    389   1.1  christos   { "dbgtd"  ,2,0x6C290000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    390   1.1  christos   { "dbged"  ,2,0x6C2A0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    391   1.1  christos   { "dbzd"   ,2,0x6C250000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    392   1.1  christos   { "dbnzd"  ,2,0x6C260000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    393   1.1  christos   { "dbpd"   ,2,0x6C290000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    394   1.1  christos   { "dbnd"   ,2,0x6C270000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    395   1.1  christos   { "dbnnd"  ,2,0x6C2A0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    396   1.1  christos   { "dbnvd"  ,2,0x6C2C0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    397   1.1  christos   { "dbvd"   ,2,0x6C2D0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    398   1.1  christos   { "dbnufd" ,2,0x6C2E0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    399   1.1  christos   { "dbufd"  ,2,0x6C2F0000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    400   1.1  christos   { "dbncd"  ,2,0x6C240000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    401   1.1  christos   { "dbcd"   ,2,0x6C210000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    402   1.1  christos   { "dbnlvd" ,2,0x6C300000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    403   1.1  christos   { "dblvd"  ,2,0x6C310000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    404   1.1  christos   { "dbnlufd",2,0x6C320000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    405   1.1  christos   { "dblufd" ,2,0x6C330000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    406   1.1  christos   { "dbzufd" ,2,0x6C340000,PCRel,       { ARn, AllReg|Disp, 0 }, Imm_None },
    407   1.1  christos   { "fix"    ,2,0x05000000,AddressMode, { GAddr1, AllReg, 0 }, Imm_Float },
    408   1.1  christos   { "float"  ,2,0x05800000,AddressMode, { GAddr2, Rn, 0 }, Imm_SInt },
    409   1.1  christos   { "iack"   ,1,0x1B000000,AddressMode, { Direct|Indirect, 0, 0 }, Imm_None },
    410   1.1  christos   { "idle"   ,0,0x06000000,0,           { 0, 0, 0 }, Imm_None },
    411   1.1  christos   { "idle2"  ,0,0x06000001,0,           { 0, 0, 0 }, Imm_None }, /* LC31 Only */
    412   1.1  christos   { "lde"    ,2,0x06800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    413   1.1  christos   { "ldf"    ,2,0x07000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    414   1.1  christos   { "ldfu"   ,2,0x40000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    415   1.1  christos   { "ldflo"  ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    416   1.1  christos   { "ldfls"  ,2,0x41000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    417   1.1  christos   { "ldfhi"  ,2,0x41800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    418   1.1  christos   { "ldfhs"  ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    419   1.1  christos   { "ldfeq"  ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    420   1.1  christos   { "ldfne"  ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    421   1.1  christos   { "ldflt"  ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    422   1.1  christos   { "ldfle"  ,2,0x44000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    423   1.1  christos   { "ldfgt"  ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    424   1.1  christos   { "ldfge"  ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    425   1.1  christos   { "ldfz"   ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    426   1.1  christos   { "ldfnz"  ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    427   1.1  christos   { "ldfp"   ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    428   1.1  christos   { "ldfn"   ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    429   1.1  christos   { "ldfnn"  ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    430   1.1  christos   { "ldfnv"  ,2,0x46000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    431   1.1  christos   { "ldfv"   ,2,0x46800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    432   1.1  christos   { "ldfnuf" ,2,0x47000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    433   1.1  christos   { "ldfuf"  ,2,0x47800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    434   1.1  christos   { "ldfnc"  ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    435   1.1  christos   { "ldfc"   ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    436   1.1  christos   { "ldfnlv" ,2,0x48000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    437   1.1  christos   { "ldflv"  ,2,0x48800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    438   1.1  christos   { "ldfnluf",2,0x49000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    439   1.1  christos   { "ldfluf" ,2,0x49800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    440   1.1  christos   { "ldfzuf" ,2,0x4A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    441   1.1  christos   { "ldfi"   ,2,0x07800000,AddressMode, { Direct|Indirect, Rn, 0 }, Imm_None },
    442   1.1  christos   { "ldi"    ,2,0x08000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    443   1.1  christos   { "ldiu"   ,2,0x50000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    444   1.1  christos   { "ldilo"  ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    445   1.1  christos   { "ldils"  ,2,0x51000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    446   1.1  christos   { "ldihi"  ,2,0x51800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    447   1.1  christos   { "ldihs"  ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    448   1.1  christos   { "ldieq"  ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    449   1.1  christos   { "ldine"  ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    450   1.1  christos   { "ldilt"  ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    451   1.1  christos   { "ldile"  ,2,0x54000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    452   1.1  christos   { "ldigt"  ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    453   1.1  christos   { "ldige"  ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    454   1.1  christos   { "ldiz"   ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    455   1.1  christos   { "ldinz"  ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    456   1.1  christos   { "ldip"   ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    457   1.1  christos   { "ldin"   ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    458   1.1  christos   { "ldinn"  ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    459   1.1  christos   { "ldinv"  ,2,0x56000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    460   1.1  christos   { "ldiv"   ,2,0x56800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    461   1.1  christos   { "ldinuf" ,2,0x57000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    462   1.1  christos   { "ldiuf"  ,2,0x57800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    463   1.1  christos   { "ldinc"  ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    464   1.1  christos   { "ldic"   ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    465   1.1  christos   { "ldinlv" ,2,0x58000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    466   1.1  christos   { "ldilv"  ,2,0x58800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    467   1.1  christos   { "ldinluf",2,0x59000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    468   1.1  christos   { "ldiluf" ,2,0x59800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    469   1.1  christos   { "ldizuf" ,2,0x5A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    470   1.1  christos   { "ldii"   ,2,0x08800000,AddressMode, { Direct|Indirect, AllReg, 0 }, Imm_None },
    471   1.1  christos   { "ldm"    ,2,0x09000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    472   1.1  christos   { "ldp"    ,2,0x08700000,0,           { Abs24|Direct, DPReg|NotReq, 0 }, Imm_UInt },
    473   1.1  christos   { "lopower",0,0x10800001,0,           { 0, 0, 0 }, Imm_None }, /* LC31 Only */
    474   1.1  christos   { "lsh"    ,2,0x09800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    475   1.1  christos   { "lsh3"   ,3,0x24000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    476   1.1  christos   { "maxspeed",0,0x10800000,0,          { 0, 0, 0 }, Imm_None }, /* LC31 Only */
    477   1.1  christos   { "mpyf"   ,2,0x0A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    478   1.1  christos   { "mpyf3"  ,3,0x24800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None },
    479   1.1  christos   { "mpyi"   ,2,0x0A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    480   1.1  christos   { "mpyi3"  ,3,0x25000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    481   1.1  christos   { "negb"   ,2,0x0B000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    482   1.1  christos   { "negf"   ,2,0x0B800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    483   1.1  christos   { "negi"   ,2,0x0C000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    484   1.1  christos   { "nop"    ,1,0x0C800000,AddressMode, { AllReg|Indirect|NotReq, 0, 0 }, Imm_None },
    485   1.1  christos   { "norm"   ,2,0x0D000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, /*Check another source*/
    486   1.1  christos   { "not"    ,2,0x0D800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    487   1.1  christos   { "or"     ,2,0x10000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    488   1.1  christos   { "or3"    ,3,0x25800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    489   1.1  christos   { "pop"    ,1,0x0E200000,StackOp,     { AllReg, 0, 0 }, Imm_None },
    490   1.1  christos   { "popf"   ,1,0x0EA00000,StackOp,     { Rn, 0, 0 }, Imm_None },
    491   1.1  christos   { "push"   ,1,0x0F200000,StackOp,     { AllReg, 0, 0 }, Imm_None },
    492   1.1  christos   { "pushf"  ,1,0x0FA00000,StackOp,     { Rn, 0, 0 }, Imm_None },
    493   1.1  christos   { "reti"   ,0,0x78000000,0,           { 0, 0, 0 }, Imm_None },
    494   1.1  christos   { "retiu"  ,0,0x78000000,0,           { 0, 0, 0 }, Imm_None },
    495   1.1  christos   { "retilo" ,0,0x78010000,0,           { 0, 0, 0 }, Imm_None },
    496   1.1  christos   { "retils" ,0,0x78020000,0,           { 0, 0, 0 }, Imm_None },
    497   1.1  christos   { "retihi" ,0,0x78030000,0,           { 0, 0, 0 }, Imm_None },
    498   1.1  christos   { "retihs" ,0,0x78040000,0,           { 0, 0, 0 }, Imm_None },
    499   1.1  christos   { "retieq" ,0,0x78050000,0,           { 0, 0, 0 }, Imm_None },
    500   1.1  christos   { "retine" ,0,0x78060000,0,           { 0, 0, 0 }, Imm_None },
    501   1.1  christos   { "retilt" ,0,0x78070000,0,           { 0, 0, 0 }, Imm_None },
    502   1.1  christos   { "retile" ,0,0x78080000,0,           { 0, 0, 0 }, Imm_None },
    503   1.1  christos   { "retigt" ,0,0x78090000,0,           { 0, 0, 0 }, Imm_None },
    504   1.1  christos   { "retige" ,0,0x780A0000,0,           { 0, 0, 0 }, Imm_None },
    505   1.1  christos   { "retiz"  ,0,0x78050000,0,           { 0, 0, 0 }, Imm_None },
    506   1.1  christos   { "retinz" ,0,0x78060000,0,           { 0, 0, 0 }, Imm_None },
    507   1.1  christos   { "retip"  ,0,0x78090000,0,           { 0, 0, 0 }, Imm_None },
    508   1.1  christos   { "retin"  ,0,0x78070000,0,           { 0, 0, 0 }, Imm_None },
    509   1.1  christos   { "retinn" ,0,0x780A0000,0,           { 0, 0, 0 }, Imm_None },
    510   1.1  christos   { "retinv" ,0,0x780C0000,0,           { 0, 0, 0 }, Imm_None },
    511   1.1  christos   { "retiv"  ,0,0x780D0000,0,           { 0, 0, 0 }, Imm_None },
    512   1.1  christos   { "retinuf",0,0x780E0000,0,           { 0, 0, 0 }, Imm_None },
    513   1.1  christos   { "retiuf" ,0,0x780F0000,0,           { 0, 0, 0 }, Imm_None },
    514   1.1  christos   { "retinc" ,0,0x78040000,0,           { 0, 0, 0 }, Imm_None },
    515   1.1  christos   { "retic"  ,0,0x78010000,0,           { 0, 0, 0 }, Imm_None },
    516   1.1  christos   { "retinlv",0,0x78100000,0,           { 0, 0, 0 }, Imm_None },
    517   1.1  christos   { "retilv" ,0,0x78110000,0,           { 0, 0, 0 }, Imm_None },
    518   1.1  christos   { "retinluf",0,0x78120000,0,          { 0, 0, 0 }, Imm_None },
    519   1.1  christos   { "retiluf",0,0x78130000,0,           { 0, 0, 0 }, Imm_None },
    520   1.1  christos   { "retizuf",0,0x78140000,0,           { 0, 0, 0 }, Imm_None },
    521   1.1  christos   { "rets"   ,0,0x78800000,0,           { 0, 0, 0 }, Imm_None },
    522   1.1  christos   { "retsu"  ,0,0x78800000,0,           { 0, 0, 0 }, Imm_None },
    523   1.1  christos   { "retslo" ,0,0x78810000,0,           { 0, 0, 0 }, Imm_None },
    524   1.1  christos   { "retsls" ,0,0x78820000,0,           { 0, 0, 0 }, Imm_None },
    525   1.1  christos   { "retshi" ,0,0x78830000,0,           { 0, 0, 0 }, Imm_None },
    526   1.1  christos   { "retshs" ,0,0x78840000,0,           { 0, 0, 0 }, Imm_None },
    527   1.1  christos   { "retseq" ,0,0x78850000,0,           { 0, 0, 0 }, Imm_None },
    528   1.1  christos   { "retsne" ,0,0x78860000,0,           { 0, 0, 0 }, Imm_None },
    529   1.1  christos   { "retslt" ,0,0x78870000,0,           { 0, 0, 0 }, Imm_None },
    530   1.1  christos   { "retsle" ,0,0x78880000,0,           { 0, 0, 0 }, Imm_None },
    531   1.1  christos   { "retsgt" ,0,0x78890000,0,           { 0, 0, 0 }, Imm_None },
    532   1.1  christos   { "retsge" ,0,0x788A0000,0,           { 0, 0, 0 }, Imm_None },
    533   1.1  christos   { "retsz"  ,0,0x78850000,0,           { 0, 0, 0 }, Imm_None },
    534   1.1  christos   { "retsnz" ,0,0x78860000,0,           { 0, 0, 0 }, Imm_None },
    535   1.1  christos   { "retsp"  ,0,0x78890000,0,           { 0, 0, 0 }, Imm_None },
    536   1.1  christos   { "retsn"  ,0,0x78870000,0,           { 0, 0, 0 }, Imm_None },
    537   1.1  christos   { "retsnn" ,0,0x788A0000,0,           { 0, 0, 0 }, Imm_None },
    538   1.1  christos   { "retsnv" ,0,0x788C0000,0,           { 0, 0, 0 }, Imm_None },
    539   1.1  christos   { "retsv"  ,0,0x788D0000,0,           { 0, 0, 0 }, Imm_None },
    540   1.1  christos   { "retsnuf",0,0x788E0000,0,           { 0, 0, 0 }, Imm_None },
    541   1.1  christos   { "retsuf" ,0,0x788F0000,0,           { 0, 0, 0 }, Imm_None },
    542   1.1  christos   { "retsnc" ,0,0x78840000,0,           { 0, 0, 0 }, Imm_None },
    543   1.1  christos   { "retsc"  ,0,0x78810000,0,           { 0, 0, 0 }, Imm_None },
    544   1.1  christos   { "retsnlv",0,0x78900000,0,           { 0, 0, 0 }, Imm_None },
    545   1.1  christos   { "retslv" ,0,0x78910000,0,           { 0, 0, 0 }, Imm_None },
    546   1.1  christos   { "retsnluf",0,0x78920000,0,          { 0, 0, 0 }, Imm_None },
    547   1.1  christos   { "retsluf",0,0x78930000,0,           { 0, 0, 0 }, Imm_None },
    548   1.1  christos   { "retszuf",0,0x78940000,0,           { 0, 0, 0 }, Imm_None },
    549   1.1  christos   { "rnd"    ,2,0x11000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    550   1.1  christos   { "rol"    ,1,0x11E00001,Rotate,      { AllReg, 0, 0 }, Imm_None },
    551   1.1  christos   { "rolc"   ,1,0x12600001,Rotate,      { AllReg, 0, 0 }, Imm_None },
    552   1.1  christos   { "ror"    ,1,0x12E0FFFF,Rotate,      { AllReg, 0, 0 }, Imm_None },
    553   1.1  christos   { "rorc"   ,1,0x1360FFFF,Rotate,      { AllReg, 0, 0 }, Imm_None },
    554   1.1  christos   { "rptb"   ,1,0x64000000,0,           { Imm24, 0, 0 }, Imm_UInt },
    555   1.1  christos   { "rpts"   ,1,0x139B0000,AddressMode, { GAddr2, 0, 0 }, Imm_UInt },
    556   1.1  christos   { "sigi"   ,0,0x16000000,0,           { 0, 0, 0 }, Imm_None },
    557   1.1  christos   { "stf"    ,2,0x14000000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float },
    558   1.1  christos   { "stfi"   ,2,0x14800000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float },
    559   1.1  christos   { "sti"    ,2,0x15000000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt },
    560   1.1  christos   { "stii"   ,2,0x15800000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt },
    561   1.1  christos   { "subb"   ,2,0x16800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    562   1.1  christos   { "subb3"  ,3,0x26000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    563   1.1  christos   { "subc"   ,2,0x17000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    564   1.1  christos   { "subf"   ,2,0x17800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    565   1.1  christos   { "subf3"  ,3,0x26800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None },
    566   1.1  christos   { "subi"   ,2,0x18000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    567   1.1  christos   { "subi3"  ,3,0x27000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    568   1.1  christos   { "subrb"  ,2,0x18800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    569   1.1  christos   { "subrf"  ,2,0x19000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float },
    570   1.1  christos   { "subri"  ,2,0x19800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt },
    571   1.1  christos   { "swi"    ,0,0x66000000,0,           { 0, 0, 0 }, Imm_None },
    572   1.1  christos   { "trap"   ,1,0x74800020,0,           { IVector, 0, 0 }, Imm_None },
    573   1.1  christos   { "trapu"  ,1,0x74800020,0,           { IVector, 0, 0 }, Imm_None },
    574   1.1  christos   { "traplo" ,1,0x74810020,0,           { IVector, 0, 0 }, Imm_None },
    575   1.1  christos   { "trapls" ,1,0x74820020,0,           { IVector, 0, 0 }, Imm_None },
    576   1.1  christos   { "traphi" ,1,0x74830020,0,           { IVector, 0, 0 }, Imm_None },
    577   1.1  christos   { "traphs" ,1,0x74840020,0,           { IVector, 0, 0 }, Imm_None },
    578   1.1  christos   { "trapeq" ,1,0x74850020,0,           { IVector, 0, 0 }, Imm_None },
    579   1.1  christos   { "trapne" ,1,0x74860020,0,           { IVector, 0, 0 }, Imm_None },
    580   1.1  christos   { "traplt" ,1,0x74870020,0,           { IVector, 0, 0 }, Imm_None },
    581   1.1  christos   { "traple" ,1,0x74880020,0,           { IVector, 0, 0 }, Imm_None },
    582   1.1  christos   { "trapgt" ,1,0x74890020,0,           { IVector, 0, 0 }, Imm_None },
    583   1.1  christos   { "trapge" ,1,0x748A0020,0,           { IVector, 0, 0 }, Imm_None },
    584   1.1  christos   { "trapz"  ,1,0x74850020,0,           { IVector, 0, 0 }, Imm_None },
    585   1.1  christos   { "trapnz" ,1,0x74860020,0,           { IVector, 0, 0 }, Imm_None },
    586   1.1  christos   { "trapp"  ,1,0x74890020,0,           { IVector, 0, 0 }, Imm_None },
    587   1.1  christos   { "trapn"  ,1,0x74870020,0,           { IVector, 0, 0 }, Imm_None },
    588   1.1  christos   { "trapnn" ,1,0x748A0020,0,           { IVector, 0, 0 }, Imm_None },
    589   1.1  christos   { "trapnv" ,1,0x748C0020,0,           { IVector, 0, 0 }, Imm_None },
    590   1.1  christos   { "trapv"  ,1,0x748D0020,0,           { IVector, 0, 0 }, Imm_None },
    591   1.1  christos   { "trapnuf",1,0x748E0020,0,           { IVector, 0, 0 }, Imm_None },
    592   1.1  christos   { "trapuf" ,1,0x748F0020,0,           { IVector, 0, 0 }, Imm_None },
    593   1.1  christos   { "trapnc" ,1,0x74840020,0,           { IVector, 0, 0 }, Imm_None },
    594   1.1  christos   { "trapc"  ,1,0x74810020,0,           { IVector, 0, 0 }, Imm_None },
    595   1.1  christos   { "trapnlv",1,0x74900020,0,           { IVector, 0, 0 }, Imm_None },
    596   1.1  christos   { "traplv" ,1,0x74910020,0,           { IVector, 0, 0 }, Imm_None },
    597   1.1  christos   { "trapnluf",1,0x74920020,0,          { IVector, 0, 0 }, Imm_None },
    598   1.1  christos   { "trapluf",1,0x74930020,0,           { IVector, 0, 0 }, Imm_None },
    599   1.1  christos   { "trapzuf",1,0x74940020,0,           { IVector, 0, 0 }, Imm_None },
    600   1.1  christos   { "tstb"   ,2,0x1A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    601   1.1  christos   { "tstb3"  ,2,0x27800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None },
    602   1.1  christos   { "xor"    ,2,0x1A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt },
    603   1.1  christos   { "xor3"   ,3,0x28000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None },
    604   1.1  christos   { ""       ,0,0x00000000,0,           { 0, 0, 0 }, 0 }
    605   1.1  christos };
    606   1.1  christos 
    607   1.1  christos static const insn_template *const tic30_optab_end =
    608   1.1  christos   tic30_optab + sizeof(tic30_optab)/sizeof(tic30_optab[0]);
    609   1.1  christos 
    610   1.1  christos typedef struct {
    611   1.6  christos   const char *name;
    612   1.1  christos   unsigned int operands_1;
    613   1.1  christos   unsigned int operands_2;
    614   1.1  christos   unsigned int base_opcode;
    615   1.1  christos   unsigned int operand_types[2][3];
    616   1.1  christos   /* Which operand fits into which part of the final opcode word. */
    617   1.1  christos   int oporder;
    618   1.1  christos } partemplate;
    619   1.1  christos 
    620   1.1  christos /* oporder defines - not very descriptive. */
    621   1.1  christos #define OO_4op1   0
    622   1.1  christos #define OO_4op2   1
    623   1.1  christos #define OO_4op3   2
    624   1.1  christos #define OO_5op1   3
    625   1.1  christos #define OO_5op2   4
    626   1.1  christos #define OO_PField 5
    627   1.1  christos 
    628   1.1  christos static const partemplate tic30_paroptab[] = {
    629   1.1  christos   { "q_absf_stf",   2,2,0xC8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    630   1.1  christos 	OO_4op1 },
    631   1.1  christos   { "q_absi_sti",   2,2,0xCA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    632   1.1  christos 	OO_4op1 },
    633   1.1  christos   { "q_addf3_stf",  3,2,0xCC000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    634   1.1  christos 	OO_5op1 },
    635   1.1  christos   { "q_addi3_sti",  3,2,0xCE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    636   1.1  christos 	OO_5op1 },
    637   1.1  christos   { "q_and3_sti",   3,2,0xD0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    638   1.1  christos 	OO_5op1 },
    639   1.1  christos   { "q_ash3_sti",   3,2,0xD2000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } },
    640   1.1  christos 	OO_5op2 },
    641   1.1  christos   { "q_fix_sti",    2,2,0xD4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    642   1.1  christos 	OO_4op1 },
    643   1.1  christos   { "q_float_stf",  2,2,0xD6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    644   1.1  christos 	OO_4op1 },
    645   1.1  christos   { "q_ldf_ldf",    2,2,0xC4000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } },
    646   1.1  christos 	OO_4op2 },
    647   1.1  christos   { "q_ldf_stf",    2,2,0xD8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    648   1.1  christos 	OO_4op1 },
    649   1.1  christos   { "q_ldi_ldi",    2,2,0xC6000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } },
    650   1.1  christos 	OO_4op2 },
    651   1.1  christos   { "q_ldi_sti",    2,2,0xDA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    652   1.1  christos 	OO_4op1 },
    653   1.1  christos   { "q_lsh3_sti",   3,2,0xDC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } },
    654   1.1  christos 	OO_5op2 },
    655   1.1  christos   { "q_mpyf3_addf3",3,3,0x80000000, { { Rn | Indirect, Rn | Indirect, Rn },
    656   1.1  christos  	                              { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField },
    657   1.1  christos   { "q_mpyf3_stf",  3,2,0xDE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    658   1.1  christos 	OO_5op1 },
    659   1.1  christos   { "q_mpyf3_subf3",3,3,0x84000000, { { Rn | Indirect, Rn | Indirect, Rn },
    660   1.1  christos 	                              { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField },
    661   1.1  christos   { "q_mpyi3_addi3",3,3,0x88000000, { { Rn | Indirect, Rn | Indirect, Rn },
    662   1.1  christos 	                              { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField },
    663   1.1  christos   { "q_mpyi3_sti",  3,2,0xE0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    664   1.1  christos 	OO_5op1 },
    665   1.1  christos   { "q_mpyi3_subi3",3,3,0x8C000000, { { Rn | Indirect, Rn | Indirect, Rn },
    666   1.1  christos 	                              { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField },
    667   1.1  christos   { "q_negf_stf",   2,2,0xE2000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    668   1.1  christos 	OO_4op1 },
    669   1.1  christos   { "q_negi_sti",   2,2,0xE4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    670   1.1  christos 	OO_4op1 },
    671   1.1  christos   { "q_not_sti",    2,2,0xE6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } },
    672   1.1  christos 	OO_4op1 },
    673   1.1  christos   { "q_or3_sti",    3,2,0xE8000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    674   1.1  christos 	OO_5op1 },
    675   1.1  christos   { "q_stf_stf",    2,2,0xC0000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } },
    676   1.1  christos 	OO_4op3 },
    677   1.1  christos   { "q_sti_sti",    2,2,0xC2000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } },
    678   1.1  christos 	OO_4op3 },
    679   1.1  christos   { "q_subf3_stf",  3,2,0xEA000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } },
    680   1.1  christos 	OO_5op2 },
    681   1.1  christos   { "q_subi3_sti",  3,2,0xEC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } },
    682   1.1  christos 	OO_5op2 },
    683   1.1  christos   { "q_xor3_sti",   3,2,0xEE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } },
    684   1.1  christos 	OO_5op1 },
    685   1.1  christos   { "",             0,0,0x00000000, { { 0, 0, 0 }, { 0, 0, 0 } }, 0 }
    686   1.1  christos };
    687   1.1  christos 
    688   1.1  christos static const partemplate *const tic30_paroptab_end =
    689   1.1  christos   tic30_paroptab + sizeof(tic30_paroptab)/sizeof(tic30_paroptab[0]);
    690   1.1  christos 
    691   1.1  christos #endif
    692