Home | History | Annotate | Download | only in opcodes
      1 /* CPU data for mt.
      2 
      3 THIS FILE IS MACHINE GENERATED WITH CGEN.
      4 
      5 Copyright (C) 1996-2014 Free Software Foundation, Inc.
      6 
      7 This file is part of the GNU Binutils and/or GDB, the GNU debugger.
      8 
      9    This file is free software; you can redistribute it and/or modify
     10    it under the terms of the GNU General Public License as published by
     11    the Free Software Foundation; either version 3, or (at your option)
     12    any later version.
     13 
     14    It is distributed in the hope that it will be useful, but WITHOUT
     15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     17    License for more details.
     18 
     19    You should have received a copy of the GNU General Public License along
     20    with this program; if not, write to the Free Software Foundation, Inc.,
     21    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     22 
     23 */
     24 
     25 #include "sysdep.h"
     26 #include <stdio.h>
     27 #include <stdarg.h>
     28 #include "ansidecl.h"
     29 #include "bfd.h"
     30 #include "symcat.h"
     31 #include "mt-desc.h"
     32 #include "mt-opc.h"
     33 #include "opintl.h"
     34 #include "libiberty.h"
     35 #include "xregex.h"
     36 
     37 /* Attributes.  */
     38 
     39 static const CGEN_ATTR_ENTRY bool_attr[] =
     40 {
     41   { "#f", 0 },
     42   { "#t", 1 },
     43   { 0, 0 }
     44 };
     45 
     46 static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
     47 {
     48   { "base", MACH_BASE },
     49   { "ms1", MACH_MS1 },
     50   { "ms1_003", MACH_MS1_003 },
     51   { "ms2", MACH_MS2 },
     52   { "max", MACH_MAX },
     53   { 0, 0 }
     54 };
     55 
     56 static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
     57 {
     58   { "mt", ISA_MT },
     59   { "max", ISA_MAX },
     60   { 0, 0 }
     61 };
     62 
     63 const CGEN_ATTR_TABLE mt_cgen_ifield_attr_table[] =
     64 {
     65   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     66   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     67   { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
     68   { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
     69   { "RESERVED", &bool_attr[0], &bool_attr[0] },
     70   { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
     71   { "SIGNED", &bool_attr[0], &bool_attr[0] },
     72   { 0, 0, 0 }
     73 };
     74 
     75 const CGEN_ATTR_TABLE mt_cgen_hardware_attr_table[] =
     76 {
     77   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     78   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     79   { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
     80   { "PC", &bool_attr[0], &bool_attr[0] },
     81   { "PROFILE", &bool_attr[0], &bool_attr[0] },
     82   { 0, 0, 0 }
     83 };
     84 
     85 const CGEN_ATTR_TABLE mt_cgen_operand_attr_table[] =
     86 {
     87   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     88   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     89   { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
     90   { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
     91   { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
     92   { "SIGNED", &bool_attr[0], &bool_attr[0] },
     93   { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
     94   { "RELAX", &bool_attr[0], &bool_attr[0] },
     95   { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
     96   { 0, 0, 0 }
     97 };
     98 
     99 const CGEN_ATTR_TABLE mt_cgen_insn_attr_table[] =
    100 {
    101   { "MACH", & MACH_attr[0], & MACH_attr[0] },
    102   { "ALIAS", &bool_attr[0], &bool_attr[0] },
    103   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
    104   { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
    105   { "COND-CTI", &bool_attr[0], &bool_attr[0] },
    106   { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
    107   { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
    108   { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
    109   { "RELAXED", &bool_attr[0], &bool_attr[0] },
    110   { "NO-DIS", &bool_attr[0], &bool_attr[0] },
    111   { "PBB", &bool_attr[0], &bool_attr[0] },
    112   { "LOAD-DELAY", &bool_attr[0], &bool_attr[0] },
    113   { "MEMORY-ACCESS", &bool_attr[0], &bool_attr[0] },
    114   { "AL-INSN", &bool_attr[0], &bool_attr[0] },
    115   { "IO-INSN", &bool_attr[0], &bool_attr[0] },
    116   { "BR-INSN", &bool_attr[0], &bool_attr[0] },
    117   { "JAL-HAZARD", &bool_attr[0], &bool_attr[0] },
    118   { "USES-FRDR", &bool_attr[0], &bool_attr[0] },
    119   { "USES-FRDRRR", &bool_attr[0], &bool_attr[0] },
    120   { "USES-FRSR1", &bool_attr[0], &bool_attr[0] },
    121   { "USES-FRSR2", &bool_attr[0], &bool_attr[0] },
    122   { "SKIPA", &bool_attr[0], &bool_attr[0] },
    123   { 0, 0, 0 }
    124 };
    125 
    126 /* Instruction set variants.  */
    127 
    128 static const CGEN_ISA mt_cgen_isa_table[] = {
    129   { "mt", 32, 32, 32, 32 },
    130   { 0, 0, 0, 0, 0 }
    131 };
    132 
    133 /* Machine variants.  */
    134 
    135 static const CGEN_MACH mt_cgen_mach_table[] = {
    136   { "ms1", "ms1", MACH_MS1, 0 },
    137   { "ms1-003", "ms1-003", MACH_MS1_003, 0 },
    138   { "ms2", "ms2", MACH_MS2, 0 },
    139   { 0, 0, 0, 0 }
    140 };
    141 
    142 static CGEN_KEYWORD_ENTRY mt_cgen_opval_msys_syms_entries[] =
    143 {
    144   { "DUP", 1, {0, {{{0, 0}}}}, 0, 0 },
    145   { "XX", 0, {0, {{{0, 0}}}}, 0, 0 }
    146 };
    147 
    148 CGEN_KEYWORD mt_cgen_opval_msys_syms =
    149 {
    150   & mt_cgen_opval_msys_syms_entries[0],
    151   2,
    152   0, 0, 0, 0, ""
    153 };
    154 
    155 static CGEN_KEYWORD_ENTRY mt_cgen_opval_h_spr_entries[] =
    156 {
    157   { "R0", 0, {0, {{{0, 0}}}}, 0, 0 },
    158   { "R1", 1, {0, {{{0, 0}}}}, 0, 0 },
    159   { "R2", 2, {0, {{{0, 0}}}}, 0, 0 },
    160   { "R3", 3, {0, {{{0, 0}}}}, 0, 0 },
    161   { "R4", 4, {0, {{{0, 0}}}}, 0, 0 },
    162   { "R5", 5, {0, {{{0, 0}}}}, 0, 0 },
    163   { "R6", 6, {0, {{{0, 0}}}}, 0, 0 },
    164   { "R7", 7, {0, {{{0, 0}}}}, 0, 0 },
    165   { "R8", 8, {0, {{{0, 0}}}}, 0, 0 },
    166   { "R9", 9, {0, {{{0, 0}}}}, 0, 0 },
    167   { "R10", 10, {0, {{{0, 0}}}}, 0, 0 },
    168   { "R11", 11, {0, {{{0, 0}}}}, 0, 0 },
    169   { "R12", 12, {0, {{{0, 0}}}}, 0, 0 },
    170   { "fp", 12, {0, {{{0, 0}}}}, 0, 0 },
    171   { "R13", 13, {0, {{{0, 0}}}}, 0, 0 },
    172   { "sp", 13, {0, {{{0, 0}}}}, 0, 0 },
    173   { "R14", 14, {0, {{{0, 0}}}}, 0, 0 },
    174   { "ra", 14, {0, {{{0, 0}}}}, 0, 0 },
    175   { "R15", 15, {0, {{{0, 0}}}}, 0, 0 },
    176   { "ira", 15, {0, {{{0, 0}}}}, 0, 0 }
    177 };
    178 
    179 CGEN_KEYWORD mt_cgen_opval_h_spr =
    180 {
    181   & mt_cgen_opval_h_spr_entries[0],
    182   20,
    183   0, 0, 0, 0, ""
    184 };
    185 
    186 
    187 /* The hardware table.  */
    188 
    189 #define A(a) (1 << CGEN_HW_##a)
    190 
    191 const CGEN_HW_ENTRY mt_cgen_hw_table[] =
    192 {
    193   { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    194   { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    195   { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    196   { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    197   { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    198   { "h-spr", HW_H_SPR, CGEN_ASM_KEYWORD, (PTR) & mt_cgen_opval_h_spr, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    199   { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
    200   { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
    201 };
    202 
    203 #undef A
    204 
    205 
    206 /* The instruction field table.  */
    207 
    208 #define A(a) (1 << CGEN_IFLD_##a)
    209 
    210 const CGEN_IFLD mt_cgen_ifld_table[] =
    211 {
    212   { MT_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    213   { MT_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    214   { MT_F_MSYS, "f-msys", 0, 32, 31, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    215   { MT_F_OPC, "f-opc", 0, 32, 30, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    216   { MT_F_IMM, "f-imm", 0, 32, 24, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    217   { MT_F_UU24, "f-uu24", 0, 32, 23, 24, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    218   { MT_F_SR1, "f-sr1", 0, 32, 23, 4, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    219   { MT_F_SR2, "f-sr2", 0, 32, 19, 4, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    220   { MT_F_DR, "f-dr", 0, 32, 19, 4, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    221   { MT_F_DRRR, "f-drrr", 0, 32, 15, 4, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    222   { MT_F_IMM16U, "f-imm16u", 0, 32, 15, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    223   { MT_F_IMM16S, "f-imm16s", 0, 32, 15, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    224   { MT_F_IMM16A, "f-imm16a", 0, 32, 15, 16, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    225   { MT_F_UU4A, "f-uu4a", 0, 32, 19, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    226   { MT_F_UU4B, "f-uu4b", 0, 32, 23, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    227   { MT_F_UU12, "f-uu12", 0, 32, 11, 12, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    228   { MT_F_UU8, "f-uu8", 0, 32, 15, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    229   { MT_F_UU16, "f-uu16", 0, 32, 15, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    230   { MT_F_UU1, "f-uu1", 0, 32, 7, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    231   { MT_F_MSOPC, "f-msopc", 0, 32, 30, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    232   { MT_F_UU_26_25, "f-uu-26-25", 0, 32, 25, 26, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    233   { MT_F_MASK, "f-mask", 0, 32, 25, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    234   { MT_F_BANKADDR, "f-bankaddr", 0, 32, 25, 13, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    235   { MT_F_RDA, "f-rda", 0, 32, 25, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    236   { MT_F_UU_2_25, "f-uu-2-25", 0, 32, 25, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    237   { MT_F_RBBC, "f-rbbc", 0, 32, 25, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    238   { MT_F_PERM, "f-perm", 0, 32, 25, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    239   { MT_F_MODE, "f-mode", 0, 32, 25, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    240   { MT_F_UU_1_24, "f-uu-1-24", 0, 32, 24, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    241   { MT_F_WR, "f-wr", 0, 32, 24, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    242   { MT_F_FBINCR, "f-fbincr", 0, 32, 23, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    243   { MT_F_UU_2_23, "f-uu-2-23", 0, 32, 23, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    244   { MT_F_XMODE, "f-xmode", 0, 32, 23, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    245   { MT_F_A23, "f-a23", 0, 32, 23, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    246   { MT_F_MASK1, "f-mask1", 0, 32, 22, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    247   { MT_F_CR, "f-cr", 0, 32, 22, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    248   { MT_F_TYPE, "f-type", 0, 32, 21, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    249   { MT_F_INCAMT, "f-incamt", 0, 32, 19, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    250   { MT_F_CBS, "f-cbs", 0, 32, 19, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    251   { MT_F_UU_1_19, "f-uu-1-19", 0, 32, 19, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    252   { MT_F_BALL, "f-ball", 0, 32, 19, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    253   { MT_F_COLNUM, "f-colnum", 0, 32, 18, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    254   { MT_F_BRC, "f-brc", 0, 32, 18, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    255   { MT_F_INCR, "f-incr", 0, 32, 17, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    256   { MT_F_FBDISP, "f-fbdisp", 0, 32, 15, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    257   { MT_F_UU_4_15, "f-uu-4-15", 0, 32, 15, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    258   { MT_F_LENGTH, "f-length", 0, 32, 15, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    259   { MT_F_UU_1_15, "f-uu-1-15", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    260   { MT_F_RC, "f-rc", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    261   { MT_F_RCNUM, "f-rcnum", 0, 32, 14, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    262   { MT_F_ROWNUM, "f-rownum", 0, 32, 14, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    263   { MT_F_CBX, "f-cbx", 0, 32, 14, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    264   { MT_F_ID, "f-id", 0, 32, 14, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    265   { MT_F_SIZE, "f-size", 0, 32, 13, 14, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    266   { MT_F_ROWNUM1, "f-rownum1", 0, 32, 12, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    267   { MT_F_UU_3_11, "f-uu-3-11", 0, 32, 11, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    268   { MT_F_RC1, "f-rc1", 0, 32, 11, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    269   { MT_F_CCB, "f-ccb", 0, 32, 11, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    270   { MT_F_CBRB, "f-cbrb", 0, 32, 10, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    271   { MT_F_CDB, "f-cdb", 0, 32, 10, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    272   { MT_F_ROWNUM2, "f-rownum2", 0, 32, 9, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    273   { MT_F_CELL, "f-cell", 0, 32, 9, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    274   { MT_F_UU_3_9, "f-uu-3-9", 0, 32, 9, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    275   { MT_F_CONTNUM, "f-contnum", 0, 32, 8, 9, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    276   { MT_F_UU_1_6, "f-uu-1-6", 0, 32, 6, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    277   { MT_F_DUP, "f-dup", 0, 32, 6, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    278   { MT_F_RC2, "f-rc2", 0, 32, 6, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    279   { MT_F_CTXDISP, "f-ctxdisp", 0, 32, 5, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    280   { MT_F_IMM16L, "f-imm16l", 0, 32, 23, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    281   { MT_F_LOOPO, "f-loopo", 0, 32, 7, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    282   { MT_F_CB1SEL, "f-cb1sel", 0, 32, 25, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    283   { MT_F_CB2SEL, "f-cb2sel", 0, 32, 22, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    284   { MT_F_CB1INCR, "f-cb1incr", 0, 32, 19, 6, { 0|A(SIGNED), { { { (1<<MACH_BASE), 0 } } } }  },
    285   { MT_F_CB2INCR, "f-cb2incr", 0, 32, 13, 6, { 0|A(SIGNED), { { { (1<<MACH_BASE), 0 } } } }  },
    286   { MT_F_RC3, "f-rc3", 0, 32, 7, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    287   { MT_F_MSYSFRSR2, "f-msysfrsr2", 0, 32, 19, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    288   { MT_F_BRC2, "f-brc2", 0, 32, 14, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    289   { MT_F_BALL2, "f-ball2", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    290   { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
    291 };
    292 
    293 #undef A
    294 
    295 
    296 
    297 /* multi ifield declarations */
    298 
    299 
    300 
    301 /* multi ifield definitions */
    302 
    303 
    304 /* The operand table.  */
    305 
    306 #define A(a) (1 << CGEN_OPERAND_##a)
    307 #define OPERAND(op) MT_OPERAND_##op
    308 
    309 const CGEN_OPERAND mt_cgen_operand_table[] =
    310 {
    311 /* pc: program counter */
    312   { "pc", MT_OPERAND_PC, HW_H_PC, 0, 0,
    313     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_NIL] } },
    314     { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } }  },
    315 /* frsr1: register */
    316   { "frsr1", MT_OPERAND_FRSR1, HW_H_SPR, 23, 4,
    317     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_SR1] } },
    318     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    319 /* frsr2: register */
    320   { "frsr2", MT_OPERAND_FRSR2, HW_H_SPR, 19, 4,
    321     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_SR2] } },
    322     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    323 /* frdr: register */
    324   { "frdr", MT_OPERAND_FRDR, HW_H_SPR, 19, 4,
    325     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_DR] } },
    326     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    327 /* frdrrr: register */
    328   { "frdrrr", MT_OPERAND_FRDRRR, HW_H_SPR, 15, 4,
    329     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_DRRR] } },
    330     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    331 /* imm16: immediate value - sign extd */
    332   { "imm16", MT_OPERAND_IMM16, HW_H_SINT, 15, 16,
    333     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_IMM16S] } },
    334     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    335 /* imm16z: immediate value - zero extd */
    336   { "imm16z", MT_OPERAND_IMM16Z, HW_H_UINT, 15, 16,
    337     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_IMM16U] } },
    338     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    339 /* imm16o: immediate value */
    340   { "imm16o", MT_OPERAND_IMM16O, HW_H_UINT, 15, 16,
    341     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_IMM16S] } },
    342     { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    343 /* rc: rc */
    344   { "rc", MT_OPERAND_RC, HW_H_UINT, 15, 1,
    345     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RC] } },
    346     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    347 /* rcnum: rcnum */
    348   { "rcnum", MT_OPERAND_RCNUM, HW_H_UINT, 14, 3,
    349     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RCNUM] } },
    350     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    351 /* contnum: context number */
    352   { "contnum", MT_OPERAND_CONTNUM, HW_H_UINT, 8, 9,
    353     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CONTNUM] } },
    354     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    355 /* rbbc: omega network configuration */
    356   { "rbbc", MT_OPERAND_RBBC, HW_H_UINT, 25, 2,
    357     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RBBC] } },
    358     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    359 /* colnum: column number */
    360   { "colnum", MT_OPERAND_COLNUM, HW_H_UINT, 18, 3,
    361     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_COLNUM] } },
    362     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    363 /* rownum: row number */
    364   { "rownum", MT_OPERAND_ROWNUM, HW_H_UINT, 14, 3,
    365     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_ROWNUM] } },
    366     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    367 /* rownum1: row number */
    368   { "rownum1", MT_OPERAND_ROWNUM1, HW_H_UINT, 12, 3,
    369     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_ROWNUM1] } },
    370     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    371 /* rownum2: row number */
    372   { "rownum2", MT_OPERAND_ROWNUM2, HW_H_UINT, 9, 3,
    373     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_ROWNUM2] } },
    374     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    375 /* rc1: rc1 */
    376   { "rc1", MT_OPERAND_RC1, HW_H_UINT, 11, 1,
    377     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RC1] } },
    378     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    379 /* rc2: rc2 */
    380   { "rc2", MT_OPERAND_RC2, HW_H_UINT, 6, 1,
    381     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RC2] } },
    382     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    383 /* cbrb: data-bus orientation */
    384   { "cbrb", MT_OPERAND_CBRB, HW_H_UINT, 10, 1,
    385     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CBRB] } },
    386     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    387 /* cell: cell */
    388   { "cell", MT_OPERAND_CELL, HW_H_UINT, 9, 3,
    389     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CELL] } },
    390     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    391 /* dup: dup */
    392   { "dup", MT_OPERAND_DUP, HW_H_UINT, 6, 1,
    393     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_DUP] } },
    394     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    395 /* ctxdisp: context displacement */
    396   { "ctxdisp", MT_OPERAND_CTXDISP, HW_H_UINT, 5, 6,
    397     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CTXDISP] } },
    398     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    399 /* fbdisp: frame buffer displacement */
    400   { "fbdisp", MT_OPERAND_FBDISP, HW_H_UINT, 15, 6,
    401     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_FBDISP] } },
    402     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    403 /* type: type */
    404   { "type", MT_OPERAND_TYPE, HW_H_UINT, 21, 2,
    405     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_TYPE] } },
    406     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    407 /* mask: mask */
    408   { "mask", MT_OPERAND_MASK, HW_H_UINT, 25, 16,
    409     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_MASK] } },
    410     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    411 /* bankaddr: bank address */
    412   { "bankaddr", MT_OPERAND_BANKADDR, HW_H_UINT, 25, 13,
    413     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_BANKADDR] } },
    414     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    415 /* incamt: increment amount */
    416   { "incamt", MT_OPERAND_INCAMT, HW_H_UINT, 19, 8,
    417     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_INCAMT] } },
    418     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    419 /* xmode: xmode */
    420   { "xmode", MT_OPERAND_XMODE, HW_H_UINT, 23, 1,
    421     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_XMODE] } },
    422     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    423 /* mask1: mask1 */
    424   { "mask1", MT_OPERAND_MASK1, HW_H_UINT, 22, 3,
    425     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_MASK1] } },
    426     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    427 /* ball: b_all */
    428   { "ball", MT_OPERAND_BALL, HW_H_UINT, 19, 1,
    429     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_BALL] } },
    430     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    431 /* brc: b_r_c */
    432   { "brc", MT_OPERAND_BRC, HW_H_UINT, 18, 3,
    433     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_BRC] } },
    434     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    435 /* rda: rd */
    436   { "rda", MT_OPERAND_RDA, HW_H_UINT, 25, 1,
    437     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RDA] } },
    438     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    439 /* wr: wr */
    440   { "wr", MT_OPERAND_WR, HW_H_UINT, 24, 1,
    441     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_WR] } },
    442     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    443 /* ball2: b_all2 */
    444   { "ball2", MT_OPERAND_BALL2, HW_H_UINT, 15, 1,
    445     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_BALL2] } },
    446     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    447 /* brc2: b_r_c2 */
    448   { "brc2", MT_OPERAND_BRC2, HW_H_UINT, 14, 3,
    449     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_BRC2] } },
    450     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    451 /* perm: perm */
    452   { "perm", MT_OPERAND_PERM, HW_H_UINT, 25, 2,
    453     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_PERM] } },
    454     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    455 /* a23: a23 */
    456   { "a23", MT_OPERAND_A23, HW_H_UINT, 23, 1,
    457     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_A23] } },
    458     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    459 /* cr: c-r */
    460   { "cr", MT_OPERAND_CR, HW_H_UINT, 22, 3,
    461     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CR] } },
    462     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    463 /* cbs: cbs */
    464   { "cbs", MT_OPERAND_CBS, HW_H_UINT, 19, 2,
    465     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CBS] } },
    466     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    467 /* incr: incr */
    468   { "incr", MT_OPERAND_INCR, HW_H_UINT, 17, 6,
    469     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_INCR] } },
    470     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    471 /* length: length */
    472   { "length", MT_OPERAND_LENGTH, HW_H_UINT, 15, 3,
    473     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_LENGTH] } },
    474     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    475 /* cbx: cbx */
    476   { "cbx", MT_OPERAND_CBX, HW_H_UINT, 14, 3,
    477     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CBX] } },
    478     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    479 /* ccb: ccb */
    480   { "ccb", MT_OPERAND_CCB, HW_H_UINT, 11, 1,
    481     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CCB] } },
    482     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    483 /* cdb: cdb */
    484   { "cdb", MT_OPERAND_CDB, HW_H_UINT, 10, 1,
    485     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CDB] } },
    486     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    487 /* mode: mode */
    488   { "mode", MT_OPERAND_MODE, HW_H_UINT, 25, 2,
    489     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_MODE] } },
    490     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    491 /* id: i/d */
    492   { "id", MT_OPERAND_ID, HW_H_UINT, 14, 1,
    493     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_ID] } },
    494     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    495 /* size: size */
    496   { "size", MT_OPERAND_SIZE, HW_H_UINT, 13, 14,
    497     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_SIZE] } },
    498     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    499 /* fbincr: fb incr */
    500   { "fbincr", MT_OPERAND_FBINCR, HW_H_UINT, 23, 4,
    501     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_FBINCR] } },
    502     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    503 /* loopsize: immediate value */
    504   { "loopsize", MT_OPERAND_LOOPSIZE, HW_H_UINT, 7, 8,
    505     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_LOOPO] } },
    506     { 0|A(PCREL_ADDR), { { { (1<<MACH_MS2), 0 } } } }  },
    507 /* imm16l: immediate value */
    508   { "imm16l", MT_OPERAND_IMM16L, HW_H_UINT, 23, 16,
    509     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_IMM16L] } },
    510     { 0, { { { (1<<MACH_MS2), 0 } } } }  },
    511 /* rc3: rc3 */
    512   { "rc3", MT_OPERAND_RC3, HW_H_UINT, 7, 1,
    513     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_RC3] } },
    514     { 0, { { { (1<<MACH_MS2), 0 } } } }  },
    515 /* cb1sel: cb1sel */
    516   { "cb1sel", MT_OPERAND_CB1SEL, HW_H_UINT, 25, 3,
    517     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CB1SEL] } },
    518     { 0, { { { (1<<MACH_MS2), 0 } } } }  },
    519 /* cb2sel: cb2sel */
    520   { "cb2sel", MT_OPERAND_CB2SEL, HW_H_UINT, 22, 3,
    521     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CB2SEL] } },
    522     { 0, { { { (1<<MACH_MS2), 0 } } } }  },
    523 /* cb1incr: cb1incr */
    524   { "cb1incr", MT_OPERAND_CB1INCR, HW_H_SINT, 19, 6,
    525     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CB1INCR] } },
    526     { 0|A(SIGNED), { { { (1<<MACH_MS2), 0 } } } }  },
    527 /* cb2incr: cb2incr */
    528   { "cb2incr", MT_OPERAND_CB2INCR, HW_H_SINT, 13, 6,
    529     { 0, { (const PTR) &mt_cgen_ifld_table[MT_F_CB2INCR] } },
    530     { 0|A(SIGNED), { { { (1<<MACH_MS2), 0 } } } }  },
    531 /* sentinel */
    532   { 0, 0, 0, 0, 0,
    533     { 0, { (const PTR) 0 } },
    534     { 0, { { { (1<<MACH_BASE), 0 } } } } }
    535 };
    536 
    537 #undef A
    538 
    539 
    540 /* The instruction table.  */
    541 
    542 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
    543 #define A(a) (1 << CGEN_INSN_##a)
    544 
    545 static const CGEN_IBASE mt_cgen_insn_table[MAX_INSNS] =
    546 {
    547   /* Special null first entry.
    548      A `num' value of zero is thus invalid.
    549      Also, the special `invalid' insn resides here.  */
    550   { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    551 /* add $frdrrr,$frsr1,$frsr2 */
    552   {
    553     MT_INSN_ADD, "add", "add", 32,
    554     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    555   },
    556 /* addu $frdrrr,$frsr1,$frsr2 */
    557   {
    558     MT_INSN_ADDU, "addu", "addu", 32,
    559     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    560   },
    561 /* addi $frdr,$frsr1,#$imm16 */
    562   {
    563     MT_INSN_ADDI, "addi", "addi", 32,
    564     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    565   },
    566 /* addui $frdr,$frsr1,#$imm16z */
    567   {
    568     MT_INSN_ADDUI, "addui", "addui", 32,
    569     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    570   },
    571 /* sub $frdrrr,$frsr1,$frsr2 */
    572   {
    573     MT_INSN_SUB, "sub", "sub", 32,
    574     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    575   },
    576 /* subu $frdrrr,$frsr1,$frsr2 */
    577   {
    578     MT_INSN_SUBU, "subu", "subu", 32,
    579     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    580   },
    581 /* subi $frdr,$frsr1,#$imm16 */
    582   {
    583     MT_INSN_SUBI, "subi", "subi", 32,
    584     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    585   },
    586 /* subui $frdr,$frsr1,#$imm16z */
    587   {
    588     MT_INSN_SUBUI, "subui", "subui", 32,
    589     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    590   },
    591 /* mul $frdrrr,$frsr1,$frsr2 */
    592   {
    593     MT_INSN_MUL, "mul", "mul", 32,
    594     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    595   },
    596 /* muli $frdr,$frsr1,#$imm16 */
    597   {
    598     MT_INSN_MULI, "muli", "muli", 32,
    599     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    600   },
    601 /* and $frdrrr,$frsr1,$frsr2 */
    602   {
    603     MT_INSN_AND, "and", "and", 32,
    604     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    605   },
    606 /* andi $frdr,$frsr1,#$imm16z */
    607   {
    608     MT_INSN_ANDI, "andi", "andi", 32,
    609     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    610   },
    611 /* or $frdrrr,$frsr1,$frsr2 */
    612   {
    613     MT_INSN_OR, "or", "or", 32,
    614     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    615   },
    616 /* nop */
    617   {
    618     MT_INSN_NOP, "nop", "nop", 32,
    619     { 0, { { { (1<<MACH_BASE), 0 } } } }
    620   },
    621 /* ori $frdr,$frsr1,#$imm16z */
    622   {
    623     MT_INSN_ORI, "ori", "ori", 32,
    624     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    625   },
    626 /* xor $frdrrr,$frsr1,$frsr2 */
    627   {
    628     MT_INSN_XOR, "xor", "xor", 32,
    629     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    630   },
    631 /* xori $frdr,$frsr1,#$imm16z */
    632   {
    633     MT_INSN_XORI, "xori", "xori", 32,
    634     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    635   },
    636 /* nand $frdrrr,$frsr1,$frsr2 */
    637   {
    638     MT_INSN_NAND, "nand", "nand", 32,
    639     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    640   },
    641 /* nandi $frdr,$frsr1,#$imm16z */
    642   {
    643     MT_INSN_NANDI, "nandi", "nandi", 32,
    644     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    645   },
    646 /* nor $frdrrr,$frsr1,$frsr2 */
    647   {
    648     MT_INSN_NOR, "nor", "nor", 32,
    649     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    650   },
    651 /* nori $frdr,$frsr1,#$imm16z */
    652   {
    653     MT_INSN_NORI, "nori", "nori", 32,
    654     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    655   },
    656 /* xnor $frdrrr,$frsr1,$frsr2 */
    657   {
    658     MT_INSN_XNOR, "xnor", "xnor", 32,
    659     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    660   },
    661 /* xnori $frdr,$frsr1,#$imm16z */
    662   {
    663     MT_INSN_XNORI, "xnori", "xnori", 32,
    664     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    665   },
    666 /* ldui $frdr,#$imm16z */
    667   {
    668     MT_INSN_LDUI, "ldui", "ldui", 32,
    669     { 0|A(USES_FRDR)|A(AL_INSN), { { { (1<<MACH_BASE), 0 } } } }
    670   },
    671 /* lsl $frdrrr,$frsr1,$frsr2 */
    672   {
    673     MT_INSN_LSL, "lsl", "lsl", 32,
    674     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR), { { { (1<<MACH_BASE), 0 } } } }
    675   },
    676 /* lsli $frdr,$frsr1,#$imm16 */
    677   {
    678     MT_INSN_LSLI, "lsli", "lsli", 32,
    679     { 0|A(USES_FRSR1)|A(USES_FRDR), { { { (1<<MACH_BASE), 0 } } } }
    680   },
    681 /* lsr $frdrrr,$frsr1,$frsr2 */
    682   {
    683     MT_INSN_LSR, "lsr", "lsr", 32,
    684     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR), { { { (1<<MACH_BASE), 0 } } } }
    685   },
    686 /* lsri $frdr,$frsr1,#$imm16 */
    687   {
    688     MT_INSN_LSRI, "lsri", "lsri", 32,
    689     { 0|A(USES_FRSR1)|A(USES_FRDR), { { { (1<<MACH_BASE), 0 } } } }
    690   },
    691 /* asr $frdrrr,$frsr1,$frsr2 */
    692   {
    693     MT_INSN_ASR, "asr", "asr", 32,
    694     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR), { { { (1<<MACH_BASE), 0 } } } }
    695   },
    696 /* asri $frdr,$frsr1,#$imm16 */
    697   {
    698     MT_INSN_ASRI, "asri", "asri", 32,
    699     { 0|A(USES_FRSR1)|A(USES_FRDR), { { { (1<<MACH_BASE), 0 } } } }
    700   },
    701 /* brlt $frsr1,$frsr2,$imm16o */
    702   {
    703     MT_INSN_BRLT, "brlt", "brlt", 32,
    704     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(USES_FRDRRR)|A(DELAY_SLOT)|A(BR_INSN), { { { (1<<MACH_BASE), 0 } } } }
    705   },
    706 /* brle $frsr1,$frsr2,$imm16o */
    707   {
    708     MT_INSN_BRLE, "brle", "brle", 32,
    709     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(DELAY_SLOT)|A(BR_INSN), { { { (1<<MACH_BASE), 0 } } } }
    710   },
    711 /* breq $frsr1,$frsr2,$imm16o */
    712   {
    713     MT_INSN_BREQ, "breq", "breq", 32,
    714     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(DELAY_SLOT)|A(BR_INSN), { { { (1<<MACH_BASE), 0 } } } }
    715   },
    716 /* brne $frsr1,$frsr2,$imm16o */
    717   {
    718     MT_INSN_BRNE, "brne", "brne", 32,
    719     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(DELAY_SLOT)|A(BR_INSN), { { { (1<<MACH_BASE), 0 } } } }
    720   },
    721 /* jmp $imm16o */
    722   {
    723     MT_INSN_JMP, "jmp", "jmp", 32,
    724     { 0|A(BR_INSN)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } } } }
    725   },
    726 /* jal $frdrrr,$frsr1 */
    727   {
    728     MT_INSN_JAL, "jal", "jal", 32,
    729     { 0|A(JAL_HAZARD)|A(USES_FRSR1)|A(USES_FRDR)|A(BR_INSN)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } } } }
    730   },
    731 /* dbnz $frsr1,$imm16o */
    732   {
    733     MT_INSN_DBNZ, "dbnz", "dbnz", 32,
    734     { 0|A(USES_FRSR1)|A(DELAY_SLOT)|A(BR_INSN), { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    735   },
    736 /* ei */
    737   {
    738     MT_INSN_EI, "ei", "ei", 32,
    739     { 0, { { { (1<<MACH_BASE), 0 } } } }
    740   },
    741 /* di */
    742   {
    743     MT_INSN_DI, "di", "di", 32,
    744     { 0, { { { (1<<MACH_BASE), 0 } } } }
    745   },
    746 /* si $frdrrr */
    747   {
    748     MT_INSN_SI, "si", "si", 32,
    749     { 0|A(USES_FRDR)|A(BR_INSN)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } } } }
    750   },
    751 /* reti $frsr1 */
    752   {
    753     MT_INSN_RETI, "reti", "reti", 32,
    754     { 0|A(JAL_HAZARD)|A(USES_FRSR1)|A(BR_INSN)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } } } }
    755   },
    756 /* ldw $frdr,$frsr1,#$imm16 */
    757   {
    758     MT_INSN_LDW, "ldw", "ldw", 32,
    759     { 0|A(USES_FRSR1)|A(USES_FRDR)|A(MEMORY_ACCESS)|A(LOAD_DELAY), { { { (1<<MACH_BASE), 0 } } } }
    760   },
    761 /* stw $frsr2,$frsr1,#$imm16 */
    762   {
    763     MT_INSN_STW, "stw", "stw", 32,
    764     { 0|A(USES_FRSR2)|A(USES_FRSR1)|A(MEMORY_ACCESS), { { { (1<<MACH_BASE), 0 } } } }
    765   },
    766 /* break */
    767   {
    768     MT_INSN_BREAK, "break", "break", 32,
    769     { 0, { { { (1<<MACH_BASE), 0 } } } }
    770   },
    771 /* iflush */
    772   {
    773     MT_INSN_IFLUSH, "iflush", "iflush", 32,
    774     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    775   },
    776 /* ldctxt $frsr1,$frsr2,#$rc,#$rcnum,#$contnum */
    777   {
    778     MT_INSN_LDCTXT, "ldctxt", "ldctxt", 32,
    779     { 0, { { { (1<<MACH_MS1), 0 } } } }
    780   },
    781 /* ldfb $frsr1,$frsr2,#$imm16z */
    782   {
    783     MT_INSN_LDFB, "ldfb", "ldfb", 32,
    784     { 0, { { { (1<<MACH_MS1), 0 } } } }
    785   },
    786 /* stfb $frsr1,$frsr2,#$imm16z */
    787   {
    788     MT_INSN_STFB, "stfb", "stfb", 32,
    789     { 0, { { { (1<<MACH_MS1), 0 } } } }
    790   },
    791 /* fbcb $frsr1,#$rbbc,#$ball,#$brc,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    792   {
    793     MT_INSN_FBCB, "fbcb", "fbcb", 32,
    794     { 0, { { { (1<<MACH_MS1)|(1<<MACH_MS1_003), 0 } } } }
    795   },
    796 /* mfbcb $frsr1,#$rbbc,$frsr2,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    797   {
    798     MT_INSN_MFBCB, "mfbcb", "mfbcb", 32,
    799     { 0, { { { (1<<MACH_BASE), 0 } } } }
    800   },
    801 /* fbcci $frsr1,#$rbbc,#$ball,#$brc,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    802   {
    803     MT_INSN_FBCCI, "fbcci", "fbcci", 32,
    804     { 0, { { { (1<<MACH_BASE), 0 } } } }
    805   },
    806 /* fbrci $frsr1,#$rbbc,#$ball,#$brc,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    807   {
    808     MT_INSN_FBRCI, "fbrci", "fbrci", 32,
    809     { 0, { { { (1<<MACH_BASE), 0 } } } }
    810   },
    811 /* fbcri $frsr1,#$rbbc,#$ball,#$brc,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    812   {
    813     MT_INSN_FBCRI, "fbcri", "fbcri", 32,
    814     { 0, { { { (1<<MACH_BASE), 0 } } } }
    815   },
    816 /* fbrri $frsr1,#$rbbc,#$ball,#$brc,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    817   {
    818     MT_INSN_FBRRI, "fbrri", "fbrri", 32,
    819     { 0, { { { (1<<MACH_BASE), 0 } } } }
    820   },
    821 /* mfbcci $frsr1,#$rbbc,$frsr2,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    822   {
    823     MT_INSN_MFBCCI, "mfbcci", "mfbcci", 32,
    824     { 0, { { { (1<<MACH_BASE), 0 } } } }
    825   },
    826 /* mfbrci $frsr1,#$rbbc,$frsr2,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    827   {
    828     MT_INSN_MFBRCI, "mfbrci", "mfbrci", 32,
    829     { 0, { { { (1<<MACH_BASE), 0 } } } }
    830   },
    831 /* mfbcri $frsr1,#$rbbc,$frsr2,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    832   {
    833     MT_INSN_MFBCRI, "mfbcri", "mfbcri", 32,
    834     { 0, { { { (1<<MACH_BASE), 0 } } } }
    835   },
    836 /* mfbrri $frsr1,#$rbbc,$frsr2,#$fbdisp,#$cell,#$dup,#$ctxdisp */
    837   {
    838     MT_INSN_MFBRRI, "mfbrri", "mfbrri", 32,
    839     { 0, { { { (1<<MACH_BASE), 0 } } } }
    840   },
    841 /* fbcbdr $frsr1,#$rbbc,$frsr2,#$ball2,#$brc2,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    842   {
    843     MT_INSN_FBCBDR, "fbcbdr", "fbcbdr", 32,
    844     { 0, { { { (1<<MACH_BASE), 0 } } } }
    845   },
    846 /* rcfbcb #$rbbc,#$type,#$ball,#$brc,#$rownum,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    847   {
    848     MT_INSN_RCFBCB, "rcfbcb", "rcfbcb", 32,
    849     { 0, { { { (1<<MACH_BASE), 0 } } } }
    850   },
    851 /* mrcfbcb $frsr2,#$rbbc,#$type,#$rownum,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    852   {
    853     MT_INSN_MRCFBCB, "mrcfbcb", "mrcfbcb", 32,
    854     { 0, { { { (1<<MACH_BASE), 0 } } } }
    855   },
    856 /* cbcast #$mask,#$rc2,#$ctxdisp */
    857   {
    858     MT_INSN_CBCAST, "cbcast", "cbcast", 32,
    859     { 0, { { { (1<<MACH_BASE), 0 } } } }
    860   },
    861 /* dupcbcast #$mask,#$cell,#$rc2,#$ctxdisp */
    862   {
    863     MT_INSN_DUPCBCAST, "dupcbcast", "dupcbcast", 32,
    864     { 0, { { { (1<<MACH_BASE), 0 } } } }
    865   },
    866 /* wfbi #$bankaddr,#$rownum1,#$cell,#$dup,#$ctxdisp */
    867   {
    868     MT_INSN_WFBI, "wfbi", "wfbi", 32,
    869     { 0, { { { (1<<MACH_BASE), 0 } } } }
    870   },
    871 /* wfb $frsr1,$frsr2,#$fbdisp,#$rownum2,#$ctxdisp */
    872   {
    873     MT_INSN_WFB, "wfb", "wfb", 32,
    874     { 0, { { { (1<<MACH_BASE), 0 } } } }
    875   },
    876 /* rcrisc $frdrrr,#$rbbc,$frsr1,#$colnum,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    877   {
    878     MT_INSN_RCRISC, "rcrisc", "rcrisc", 32,
    879     { 0, { { { (1<<MACH_BASE), 0 } } } }
    880   },
    881 /* fbcbinc $frsr1,#$rbbc,#$incamt,#$rc1,#$cbrb,#$cell,#$dup,#$ctxdisp */
    882   {
    883     MT_INSN_FBCBINC, "fbcbinc", "fbcbinc", 32,
    884     { 0, { { { (1<<MACH_BASE), 0 } } } }
    885   },
    886 /* rcxmode $frsr2,#$rda,#$wr,#$xmode,#$mask1,#$fbdisp,#$rownum2,#$rc2,#$ctxdisp */
    887   {
    888     MT_INSN_RCXMODE, "rcxmode", "rcxmode", 32,
    889     { 0, { { { (1<<MACH_BASE), 0 } } } }
    890   },
    891 /* intlvr $frsr1,#$mode,$frsr2,#$id,#$size */
    892   {
    893     MT_INSN_INTERLEAVER, "interleaver", "intlvr", 32,
    894     { 0, { { { (1<<MACH_BASE), 0 } } } }
    895   },
    896 /* wfbinc #$rda,#$wr,#$fbincr,#$ball,#$colnum,#$length,#$rownum1,#$rownum2,#$dup,#$ctxdisp */
    897   {
    898     MT_INSN_WFBINC, "wfbinc", "wfbinc", 32,
    899     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    900   },
    901 /* mwfbinc $frsr2,#$rda,#$wr,#$fbincr,#$length,#$rownum1,#$rownum2,#$dup,#$ctxdisp */
    902   {
    903     MT_INSN_MWFBINC, "mwfbinc", "mwfbinc", 32,
    904     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    905   },
    906 /* wfbincr $frsr1,#$rda,#$wr,#$ball,#$colnum,#$length,#$rownum1,#$rownum2,#$dup,#$ctxdisp */
    907   {
    908     MT_INSN_WFBINCR, "wfbincr", "wfbincr", 32,
    909     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    910   },
    911 /* mwfbincr $frsr1,$frsr2,#$rda,#$wr,#$length,#$rownum1,#$rownum2,#$dup,#$ctxdisp */
    912   {
    913     MT_INSN_MWFBINCR, "mwfbincr", "mwfbincr", 32,
    914     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    915   },
    916 /* fbcbincs #$perm,#$a23,#$cr,#$cbs,#$incr,#$ccb,#$cdb,#$rownum2,#$dup,#$ctxdisp */
    917   {
    918     MT_INSN_FBCBINCS, "fbcbincs", "fbcbincs", 32,
    919     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    920   },
    921 /* mfbcbincs $frsr1,#$perm,#$cbs,#$incr,#$ccb,#$cdb,#$rownum2,#$dup,#$ctxdisp */
    922   {
    923     MT_INSN_MFBCBINCS, "mfbcbincs", "mfbcbincs", 32,
    924     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    925   },
    926 /* fbcbincrs $frsr1,#$perm,#$ball,#$colnum,#$cbx,#$ccb,#$cdb,#$rownum2,#$dup,#$ctxdisp */
    927   {
    928     MT_INSN_FBCBINCRS, "fbcbincrs", "fbcbincrs", 32,
    929     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    930   },
    931 /* mfbcbincrs $frsr1,$frsr2,#$perm,#$cbx,#$ccb,#$cdb,#$rownum2,#$dup,#$ctxdisp */
    932   {
    933     MT_INSN_MFBCBINCRS, "mfbcbincrs", "mfbcbincrs", 32,
    934     { 0, { { { (1<<MACH_MS1_003)|(1<<MACH_MS2), 0 } } } }
    935   },
    936 /* loop $frsr1,$loopsize */
    937   {
    938     MT_INSN_LOOP, "loop", "loop", 32,
    939     { 0|A(USES_FRSR1)|A(DELAY_SLOT), { { { (1<<MACH_MS2), 0 } } } }
    940   },
    941 /* loopi #$imm16l,$loopsize */
    942   {
    943     MT_INSN_LOOPI, "loopi", "loopi", 32,
    944     { 0|A(DELAY_SLOT), { { { (1<<MACH_MS2), 0 } } } }
    945   },
    946 /* dfbc #$cb1sel,#$cb2sel,#$cb1incr,#$cb2incr,#$rc3,#$rc2,#$ctxdisp */
    947   {
    948     MT_INSN_DFBC, "dfbc", "dfbc", 32,
    949     { 0, { { { (1<<MACH_MS2), 0 } } } }
    950   },
    951 /* dwfb #$cb1sel,#$cb2sel,#$cb1incr,#$cb2incr,#$rc2,#$ctxdisp */
    952   {
    953     MT_INSN_DWFB, "dwfb", "dwfb", 32,
    954     { 0, { { { (1<<MACH_MS2), 0 } } } }
    955   },
    956 /* fbwfb #$cb1sel,#$cb2sel,#$cb1incr,#$cb2incr,#$rc3,#$rc2,#$ctxdisp */
    957   {
    958     MT_INSN_FBWFB, "fbwfb", "fbwfb", 32,
    959     { 0, { { { (1<<MACH_MS2), 0 } } } }
    960   },
    961 /* dfbr #$cb1sel,#$cb2sel,$frsr2,#$length,#$rownum1,#$rownum2,#$rc2,#$ctxdisp */
    962   {
    963     MT_INSN_DFBR, "dfbr", "dfbr", 32,
    964     { 0|A(USES_FRSR2), { { { (1<<MACH_MS2), 0 } } } }
    965   },
    966 };
    967 
    968 #undef OP
    969 #undef A
    970 
    971 /* Initialize anything needed to be done once, before any cpu_open call.  */
    972 
    973 static void
    974 init_tables (void)
    975 {
    976 }
    977 
    978 static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
    979 static void build_hw_table      (CGEN_CPU_TABLE *);
    980 static void build_ifield_table  (CGEN_CPU_TABLE *);
    981 static void build_operand_table (CGEN_CPU_TABLE *);
    982 static void build_insn_table    (CGEN_CPU_TABLE *);
    983 static void mt_cgen_rebuild_tables (CGEN_CPU_TABLE *);
    984 
    985 /* Subroutine of mt_cgen_cpu_open to look up a mach via its bfd name.  */
    986 
    987 static const CGEN_MACH *
    988 lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
    989 {
    990   while (table->name)
    991     {
    992       if (strcmp (name, table->bfd_name) == 0)
    993 	return table;
    994       ++table;
    995     }
    996   abort ();
    997 }
    998 
    999 /* Subroutine of mt_cgen_cpu_open to build the hardware table.  */
   1000 
   1001 static void
   1002 build_hw_table (CGEN_CPU_TABLE *cd)
   1003 {
   1004   int i;
   1005   int machs = cd->machs;
   1006   const CGEN_HW_ENTRY *init = & mt_cgen_hw_table[0];
   1007   /* MAX_HW is only an upper bound on the number of selected entries.
   1008      However each entry is indexed by it's enum so there can be holes in
   1009      the table.  */
   1010   const CGEN_HW_ENTRY **selected =
   1011     (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
   1012 
   1013   cd->hw_table.init_entries = init;
   1014   cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
   1015   memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
   1016   /* ??? For now we just use machs to determine which ones we want.  */
   1017   for (i = 0; init[i].name != NULL; ++i)
   1018     if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
   1019 	& machs)
   1020       selected[init[i].type] = &init[i];
   1021   cd->hw_table.entries = selected;
   1022   cd->hw_table.num_entries = MAX_HW;
   1023 }
   1024 
   1025 /* Subroutine of mt_cgen_cpu_open to build the hardware table.  */
   1026 
   1027 static void
   1028 build_ifield_table (CGEN_CPU_TABLE *cd)
   1029 {
   1030   cd->ifld_table = & mt_cgen_ifld_table[0];
   1031 }
   1032 
   1033 /* Subroutine of mt_cgen_cpu_open to build the hardware table.  */
   1034 
   1035 static void
   1036 build_operand_table (CGEN_CPU_TABLE *cd)
   1037 {
   1038   int i;
   1039   int machs = cd->machs;
   1040   const CGEN_OPERAND *init = & mt_cgen_operand_table[0];
   1041   /* MAX_OPERANDS is only an upper bound on the number of selected entries.
   1042      However each entry is indexed by it's enum so there can be holes in
   1043      the table.  */
   1044   const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
   1045 
   1046   cd->operand_table.init_entries = init;
   1047   cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
   1048   memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
   1049   /* ??? For now we just use mach to determine which ones we want.  */
   1050   for (i = 0; init[i].name != NULL; ++i)
   1051     if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
   1052 	& machs)
   1053       selected[init[i].type] = &init[i];
   1054   cd->operand_table.entries = selected;
   1055   cd->operand_table.num_entries = MAX_OPERANDS;
   1056 }
   1057 
   1058 /* Subroutine of mt_cgen_cpu_open to build the hardware table.
   1059    ??? This could leave out insns not supported by the specified mach/isa,
   1060    but that would cause errors like "foo only supported by bar" to become
   1061    "unknown insn", so for now we include all insns and require the app to
   1062    do the checking later.
   1063    ??? On the other hand, parsing of such insns may require their hardware or
   1064    operand elements to be in the table [which they mightn't be].  */
   1065 
   1066 static void
   1067 build_insn_table (CGEN_CPU_TABLE *cd)
   1068 {
   1069   int i;
   1070   const CGEN_IBASE *ib = & mt_cgen_insn_table[0];
   1071   CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
   1072 
   1073   memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
   1074   for (i = 0; i < MAX_INSNS; ++i)
   1075     insns[i].base = &ib[i];
   1076   cd->insn_table.init_entries = insns;
   1077   cd->insn_table.entry_size = sizeof (CGEN_IBASE);
   1078   cd->insn_table.num_init_entries = MAX_INSNS;
   1079 }
   1080 
   1081 /* Subroutine of mt_cgen_cpu_open to rebuild the tables.  */
   1082 
   1083 static void
   1084 mt_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
   1085 {
   1086   int i;
   1087   CGEN_BITSET *isas = cd->isas;
   1088   unsigned int machs = cd->machs;
   1089 
   1090   cd->int_insn_p = CGEN_INT_INSN_P;
   1091 
   1092   /* Data derived from the isa spec.  */
   1093 #define UNSET (CGEN_SIZE_UNKNOWN + 1)
   1094   cd->default_insn_bitsize = UNSET;
   1095   cd->base_insn_bitsize = UNSET;
   1096   cd->min_insn_bitsize = 65535; /* Some ridiculously big number.  */
   1097   cd->max_insn_bitsize = 0;
   1098   for (i = 0; i < MAX_ISAS; ++i)
   1099     if (cgen_bitset_contains (isas, i))
   1100       {
   1101 	const CGEN_ISA *isa = & mt_cgen_isa_table[i];
   1102 
   1103 	/* Default insn sizes of all selected isas must be
   1104 	   equal or we set the result to 0, meaning "unknown".  */
   1105 	if (cd->default_insn_bitsize == UNSET)
   1106 	  cd->default_insn_bitsize = isa->default_insn_bitsize;
   1107 	else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
   1108 	  ; /* This is ok.  */
   1109 	else
   1110 	  cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
   1111 
   1112 	/* Base insn sizes of all selected isas must be equal
   1113 	   or we set the result to 0, meaning "unknown".  */
   1114 	if (cd->base_insn_bitsize == UNSET)
   1115 	  cd->base_insn_bitsize = isa->base_insn_bitsize;
   1116 	else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
   1117 	  ; /* This is ok.  */
   1118 	else
   1119 	  cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
   1120 
   1121 	/* Set min,max insn sizes.  */
   1122 	if (isa->min_insn_bitsize < cd->min_insn_bitsize)
   1123 	  cd->min_insn_bitsize = isa->min_insn_bitsize;
   1124 	if (isa->max_insn_bitsize > cd->max_insn_bitsize)
   1125 	  cd->max_insn_bitsize = isa->max_insn_bitsize;
   1126       }
   1127 
   1128   /* Data derived from the mach spec.  */
   1129   for (i = 0; i < MAX_MACHS; ++i)
   1130     if (((1 << i) & machs) != 0)
   1131       {
   1132 	const CGEN_MACH *mach = & mt_cgen_mach_table[i];
   1133 
   1134 	if (mach->insn_chunk_bitsize != 0)
   1135 	{
   1136 	  if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
   1137 	    {
   1138 	      fprintf (stderr, "mt_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
   1139 		       cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
   1140 	      abort ();
   1141 	    }
   1142 
   1143  	  cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
   1144 	}
   1145       }
   1146 
   1147   /* Determine which hw elements are used by MACH.  */
   1148   build_hw_table (cd);
   1149 
   1150   /* Build the ifield table.  */
   1151   build_ifield_table (cd);
   1152 
   1153   /* Determine which operands are used by MACH/ISA.  */
   1154   build_operand_table (cd);
   1155 
   1156   /* Build the instruction table.  */
   1157   build_insn_table (cd);
   1158 }
   1159 
   1160 /* Initialize a cpu table and return a descriptor.
   1161    It's much like opening a file, and must be the first function called.
   1162    The arguments are a set of (type/value) pairs, terminated with
   1163    CGEN_CPU_OPEN_END.
   1164 
   1165    Currently supported values:
   1166    CGEN_CPU_OPEN_ISAS:    bitmap of values in enum isa_attr
   1167    CGEN_CPU_OPEN_MACHS:   bitmap of values in enum mach_attr
   1168    CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
   1169    CGEN_CPU_OPEN_ENDIAN:  specify endian choice
   1170    CGEN_CPU_OPEN_END:     terminates arguments
   1171 
   1172    ??? Simultaneous multiple isas might not make sense, but it's not (yet)
   1173    precluded.  */
   1174 
   1175 CGEN_CPU_DESC
   1176 mt_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
   1177 {
   1178   CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
   1179   static int init_p;
   1180   CGEN_BITSET *isas = 0;  /* 0 = "unspecified" */
   1181   unsigned int machs = 0; /* 0 = "unspecified" */
   1182   enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
   1183   va_list ap;
   1184 
   1185   if (! init_p)
   1186     {
   1187       init_tables ();
   1188       init_p = 1;
   1189     }
   1190 
   1191   memset (cd, 0, sizeof (*cd));
   1192 
   1193   va_start (ap, arg_type);
   1194   while (arg_type != CGEN_CPU_OPEN_END)
   1195     {
   1196       switch (arg_type)
   1197 	{
   1198 	case CGEN_CPU_OPEN_ISAS :
   1199 	  isas = va_arg (ap, CGEN_BITSET *);
   1200 	  break;
   1201 	case CGEN_CPU_OPEN_MACHS :
   1202 	  machs = va_arg (ap, unsigned int);
   1203 	  break;
   1204 	case CGEN_CPU_OPEN_BFDMACH :
   1205 	  {
   1206 	    const char *name = va_arg (ap, const char *);
   1207 	    const CGEN_MACH *mach =
   1208 	      lookup_mach_via_bfd_name (mt_cgen_mach_table, name);
   1209 
   1210 	    machs |= 1 << mach->num;
   1211 	    break;
   1212 	  }
   1213 	case CGEN_CPU_OPEN_ENDIAN :
   1214 	  endian = va_arg (ap, enum cgen_endian);
   1215 	  break;
   1216 	default :
   1217 	  fprintf (stderr, "mt_cgen_cpu_open: unsupported argument `%d'\n",
   1218 		   arg_type);
   1219 	  abort (); /* ??? return NULL? */
   1220 	}
   1221       arg_type = va_arg (ap, enum cgen_cpu_open_arg);
   1222     }
   1223   va_end (ap);
   1224 
   1225   /* Mach unspecified means "all".  */
   1226   if (machs == 0)
   1227     machs = (1 << MAX_MACHS) - 1;
   1228   /* Base mach is always selected.  */
   1229   machs |= 1;
   1230   if (endian == CGEN_ENDIAN_UNKNOWN)
   1231     {
   1232       /* ??? If target has only one, could have a default.  */
   1233       fprintf (stderr, "mt_cgen_cpu_open: no endianness specified\n");
   1234       abort ();
   1235     }
   1236 
   1237   cd->isas = cgen_bitset_copy (isas);
   1238   cd->machs = machs;
   1239   cd->endian = endian;
   1240   /* FIXME: for the sparc case we can determine insn-endianness statically.
   1241      The worry here is where both data and insn endian can be independently
   1242      chosen, in which case this function will need another argument.
   1243      Actually, will want to allow for more arguments in the future anyway.  */
   1244   cd->insn_endian = endian;
   1245 
   1246   /* Table (re)builder.  */
   1247   cd->rebuild_tables = mt_cgen_rebuild_tables;
   1248   mt_cgen_rebuild_tables (cd);
   1249 
   1250   /* Default to not allowing signed overflow.  */
   1251   cd->signed_overflow_ok_p = 0;
   1252 
   1253   return (CGEN_CPU_DESC) cd;
   1254 }
   1255 
   1256 /* Cover fn to mt_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
   1257    MACH_NAME is the bfd name of the mach.  */
   1258 
   1259 CGEN_CPU_DESC
   1260 mt_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
   1261 {
   1262   return mt_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
   1263 			       CGEN_CPU_OPEN_ENDIAN, endian,
   1264 			       CGEN_CPU_OPEN_END);
   1265 }
   1266 
   1267 /* Close a cpu table.
   1268    ??? This can live in a machine independent file, but there's currently
   1269    no place to put this file (there's no libcgen).  libopcodes is the wrong
   1270    place as some simulator ports use this but they don't use libopcodes.  */
   1271 
   1272 void
   1273 mt_cgen_cpu_close (CGEN_CPU_DESC cd)
   1274 {
   1275   unsigned int i;
   1276   const CGEN_INSN *insns;
   1277 
   1278   if (cd->macro_insn_table.init_entries)
   1279     {
   1280       insns = cd->macro_insn_table.init_entries;
   1281       for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
   1282 	if (CGEN_INSN_RX ((insns)))
   1283 	  regfree (CGEN_INSN_RX (insns));
   1284     }
   1285 
   1286   if (cd->insn_table.init_entries)
   1287     {
   1288       insns = cd->insn_table.init_entries;
   1289       for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
   1290 	if (CGEN_INSN_RX (insns))
   1291 	  regfree (CGEN_INSN_RX (insns));
   1292     }
   1293 
   1294   if (cd->macro_insn_table.init_entries)
   1295     free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
   1296 
   1297   if (cd->insn_table.init_entries)
   1298     free ((CGEN_INSN *) cd->insn_table.init_entries);
   1299 
   1300   if (cd->hw_table.entries)
   1301     free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
   1302 
   1303   if (cd->operand_table.entries)
   1304     free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
   1305 
   1306   free (cd);
   1307 }
   1308 
   1309