/* CPU data for ip2k.

THIS FILE IS MACHINE GENERATED WITH CGEN.

Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.

This file is part of the GNU Binutils and/or GDB, the GNU debugger.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

*/

#include "sysdep.h"
#include <stdio.h>
#include <stdarg.h>
#include "ansidecl.h"
#include "bfd.h"
#include "symcat.h"
#include "ip2k-desc.h"
#include "ip2k-opc.h"
#include "opintl.h"
#include "libiberty.h"
#include "xregex.h"

/* Attributes.  */

static const CGEN_ATTR_ENTRY bool_attr[] =
{
  { "#f", 0 },
  { "#t", 1 },
  { 0, 0 }
};

static const CGEN_ATTR_ENTRY MACH_attr[] =
{
  { "base", MACH_BASE },
  { "ip2022", MACH_IP2022 },
  { "ip2022ext", MACH_IP2022EXT },
  { "max", MACH_MAX },
  { 0, 0 }
};

static const CGEN_ATTR_ENTRY ISA_attr[] =
{
  { "ip2k", ISA_IP2K },
  { "max", ISA_MAX },
  { 0, 0 }
};

const CGEN_ATTR_TABLE ip2k_cgen_ifield_attr_table[] =
{
  { "MACH", & MACH_attr[0], & MACH_attr[0] },
  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
  { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
  { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
  { "RESERVED", &bool_attr[0], &bool_attr[0] },
  { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
  { "SIGNED", &bool_attr[0], &bool_attr[0] },
  { 0, 0, 0 }
};

const CGEN_ATTR_TABLE ip2k_cgen_hardware_attr_table[] =
{
  { "MACH", & MACH_attr[0], & MACH_attr[0] },
  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
  { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
  { "PC", &bool_attr[0], &bool_attr[0] },
  { "PROFILE", &bool_attr[0], &bool_attr[0] },
  { 0, 0, 0 }
};

const CGEN_ATTR_TABLE ip2k_cgen_operand_attr_table[] =
{
  { "MACH", & MACH_attr[0], & MACH_attr[0] },
  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
  { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
  { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
  { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
  { "SIGNED", &bool_attr[0], &bool_attr[0] },
  { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
  { "RELAX", &bool_attr[0], &bool_attr[0] },
  { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
  { 0, 0, 0 }
};

const CGEN_ATTR_TABLE ip2k_cgen_insn_attr_table[] =
{
  { "MACH", & MACH_attr[0], & MACH_attr[0] },
  { "ALIAS", &bool_attr[0], &bool_attr[0] },
  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
  { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
  { "COND-CTI", &bool_attr[0], &bool_attr[0] },
  { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
  { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
  { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
  { "RELAX", &bool_attr[0], &bool_attr[0] },
  { "NO-DIS", &bool_attr[0], &bool_attr[0] },
  { "PBB", &bool_attr[0], &bool_attr[0] },
  { "EXT-SKIP-INSN", &bool_attr[0], &bool_attr[0] },
  { "SKIPA", &bool_attr[0], &bool_attr[0] },
  { 0, 0, 0 }
};

/* Instruction set variants.  */

static const CGEN_ISA ip2k_cgen_isa_table[] = {
  { "ip2k", 16, 16, 16, 16 },
  { 0, 0, 0, 0, 0 }
};

/* Machine variants.  */

static const CGEN_MACH ip2k_cgen_mach_table[] = {
  { "ip2022", "ip2022", MACH_IP2022, 0 },
  { "ip2022ext", "ip2022ext", MACH_IP2022EXT, 0 },
  { 0, 0, 0, 0 }
};

static CGEN_KEYWORD_ENTRY ip2k_cgen_opval_register_names_entries[] =
{
  { "ADDRSEL", 2, {0, {0}}, 0, 0 },
  { "ADDRX", 3, {0, {0}}, 0, 0 },
  { "IPH", 4, {0, {0}}, 0, 0 },
  { "IPL", 5, {0, {0}}, 0, 0 },
  { "SPH", 6, {0, {0}}, 0, 0 },
  { "SPL", 7, {0, {0}}, 0, 0 },
  { "PCH", 8, {0, {0}}, 0, 0 },
  { "PCL", 9, {0, {0}}, 0, 0 },
  { "WREG", 10, {0, {0}}, 0, 0 },
  { "STATUS", 11, {0, {0}}, 0, 0 },
  { "DPH", 12, {0, {0}}, 0, 0 },
  { "DPL", 13, {0, {0}}, 0, 0 },
  { "SPDREG", 14, {0, {0}}, 0, 0 },
  { "MULH", 15, {0, {0}}, 0, 0 },
  { "ADDRH", 16, {0, {0}}, 0, 0 },
  { "ADDRL", 17, {0, {0}}, 0, 0 },
  { "DATAH", 18, {0, {0}}, 0, 0 },
  { "DATAL", 19, {0, {0}}, 0, 0 },
  { "INTVECH", 20, {0, {0}}, 0, 0 },
  { "INTVECL", 21, {0, {0}}, 0, 0 },
  { "INTSPD", 22, {0, {0}}, 0, 0 },
  { "INTF", 23, {0, {0}}, 0, 0 },
  { "INTE", 24, {0, {0}}, 0, 0 },
  { "INTED", 25, {0, {0}}, 0, 0 },
  { "FCFG", 26, {0, {0}}, 0, 0 },
  { "TCTRL", 27, {0, {0}}, 0, 0 },
  { "XCFG", 28, {0, {0}}, 0, 0 },
  { "EMCFG", 29, {0, {0}}, 0, 0 },
  { "IPCH", 30, {0, {0}}, 0, 0 },
  { "IPCL", 31, {0, {0}}, 0, 0 },
  { "RAIN", 32, {0, {0}}, 0, 0 },
  { "RAOUT", 33, {0, {0}}, 0, 0 },
  { "RADIR", 34, {0, {0}}, 0, 0 },
  { "LFSRH", 35, {0, {0}}, 0, 0 },
  { "RBIN", 36, {0, {0}}, 0, 0 },
  { "RBOUT", 37, {0, {0}}, 0, 0 },
  { "RBDIR", 38, {0, {0}}, 0, 0 },
  { "LFSRL", 39, {0, {0}}, 0, 0 },
  { "RCIN", 40, {0, {0}}, 0, 0 },
  { "RCOUT", 41, {0, {0}}, 0, 0 },
  { "RCDIR", 42, {0, {0}}, 0, 0 },
  { "LFSRA", 43, {0, {0}}, 0, 0 },
  { "RDIN", 44, {0, {0}}, 0, 0 },
  { "RDOUT", 45, {0, {0}}, 0, 0 },
  { "RDDIR", 46, {0, {0}}, 0, 0 },
  { "REIN", 48, {0, {0}}, 0, 0 },
  { "REOUT", 49, {0, {0}}, 0, 0 },
  { "REDIR", 50, {0, {0}}, 0, 0 },
  { "RFIN", 52, {0, {0}}, 0, 0 },
  { "RFOUT", 53, {0, {0}}, 0, 0 },
  { "RFDIR", 54, {0, {0}}, 0, 0 },
  { "RGOUT", 57, {0, {0}}, 0, 0 },
  { "RGDIR", 58, {0, {0}}, 0, 0 },
  { "RTTMR", 64, {0, {0}}, 0, 0 },
  { "RTCFG", 65, {0, {0}}, 0, 0 },
  { "T0TMR", 66, {0, {0}}, 0, 0 },
  { "T0CFG", 67, {0, {0}}, 0, 0 },
  { "T1CNTH", 68, {0, {0}}, 0, 0 },
  { "T1CNTL", 69, {0, {0}}, 0, 0 },
  { "T1CAP1H", 70, {0, {0}}, 0, 0 },
  { "T1CAP1L", 71, {0, {0}}, 0, 0 },
  { "T1CAP2H", 72, {0, {0}}, 0, 0 },
  { "T1CMP2H", 72, {0, {0}}, 0, 0 },
  { "T1CAP2L", 73, {0, {0}}, 0, 0 },
  { "T1CMP2L", 73, {0, {0}}, 0, 0 },
  { "T1CMP1H", 74, {0, {0}}, 0, 0 },
  { "T1CMP1L", 75, {0, {0}}, 0, 0 },
  { "T1CFG1H", 76, {0, {0}}, 0, 0 },
  { "T1CFG1L", 77, {0, {0}}, 0, 0 },
  { "T1CFG2H", 78, {0, {0}}, 0, 0 },
  { "T1CFG2L", 79, {0, {0}}, 0, 0 },
  { "ADCH", 80, {0, {0}}, 0, 0 },
  { "ADCL", 81, {0, {0}}, 0, 0 },
  { "ADCCFG", 82, {0, {0}}, 0, 0 },
  { "ADCTMR", 83, {0, {0}}, 0, 0 },
  { "T2CNTH", 84, {0, {0}}, 0, 0 },
  { "T2CNTL", 85, {0, {0}}, 0, 0 },
  { "T2CAP1H", 86, {0, {0}}, 0, 0 },
  { "T2CAP1L", 87, {0, {0}}, 0, 0 },
  { "T2CAP2H", 88, {0, {0}}, 0, 0 },
  { "T2CMP2H", 88, {0, {0}}, 0, 0 },
  { "T2CAP2L", 89, {0, {0}}, 0, 0 },
  { "T2CMP2L", 89, {0, {0}}, 0, 0 },
  { "T2CMP1H", 90, {0, {0}}, 0, 0 },
  { "T2CMP1L", 91, {0, {0}}, 0, 0 },
  { "T2CFG1H", 92, {0, {0}}, 0, 0 },
  { "T2CFG1L", 93, {0, {0}}, 0, 0 },
  { "T2CFG2H", 94, {0, {0}}, 0, 0 },
  { "T2CFG2L", 95, {0, {0}}, 0, 0 },
  { "S1TMRH", 96, {0, {0}}, 0, 0 },
  { "S1TMRL", 97, {0, {0}}, 0, 0 },
  { "S1TBUFH", 98, {0, {0}}, 0, 0 },
  { "S1TBUFL", 99, {0, {0}}, 0, 0 },
  { "S1TCFG", 100, {0, {0}}, 0, 0 },
  { "S1RCNT", 101, {0, {0}}, 0, 0 },
  { "S1RBUFH", 102, {0, {0}}, 0, 0 },
  { "S1RBUFL", 103, {0, {0}}, 0, 0 },
  { "S1RCFG", 104, {0, {0}}, 0, 0 },
  { "S1RSYNC", 105, {0, {0}}, 0, 0 },
  { "S1INTF", 106, {0, {0}}, 0, 0 },
  { "S1INTE", 107, {0, {0}}, 0, 0 },
  { "S1MODE", 108, {0, {0}}, 0, 0 },
  { "S1SMASK", 109, {0, {0}}, 0, 0 },
  { "PSPCFG", 110, {0, {0}}, 0, 0 },
  { "CMPCFG", 111, {0, {0}}, 0, 0 },
  { "S2TMRH", 112, {0, {0}}, 0, 0 },
  { "S2TMRL", 113, {0, {0}}, 0, 0 },
  { "S2TBUFH", 114, {0, {0}}, 0, 0 },
  { "S2TBUFL", 115, {0, {0}}, 0, 0 },
  { "S2TCFG", 116, {0, {0}}, 0, 0 },
  { "S2RCNT", 117, {0, {0}}, 0, 0 },
  { "S2RBUFH", 118, {0, {0}}, 0, 0 },
  { "S2RBUFL", 119, {0, {0}}, 0, 0 },
  { "S2RCFG", 120, {0, {0}}, 0, 0 },
  { "S2RSYNC", 121, {0, {0}}, 0, 0 },
  { "S2INTF", 122, {0, {0}}, 0, 0 },
  { "S2INTE", 123, {0, {0}}, 0, 0 },
  { "S2MODE", 124, {0, {0}}, 0, 0 },
  { "S2SMASK", 125, {0, {0}}, 0, 0 },
  { "CALLH", 126, {0, {0}}, 0, 0 },
  { "CALLL", 127, {0, {0}}, 0, 0 }
};

CGEN_KEYWORD ip2k_cgen_opval_register_names =
{
  & ip2k_cgen_opval_register_names_entries[0],
  121,
  0, 0, 0, 0, ""
};


/* The hardware table.  */

#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
#define A(a) (1 << CGEN_HW_##a)
#else
#define A(a) (1 << CGEN_HW_/**/a)
#endif

const CGEN_HW_ENTRY ip2k_cgen_hw_table[] =
{
  { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-spr", HW_H_SPR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-registers", HW_H_REGISTERS, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
  { "h-stack", HW_H_STACK, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-pabits", HW_H_PABITS, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-zbit", HW_H_ZBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-cbit", HW_H_CBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-dcbit", HW_H_DCBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
  { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { (1<<MACH_BASE) } } },
  { 0, 0, CGEN_ASM_NONE, 0, {0, {0}} }
};

#undef A


/* The instruction field table.  */

#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
#define A(a) (1 << CGEN_IFLD_##a)
#else
#define A(a) (1 << CGEN_IFLD_/**/a)
#endif

const CGEN_IFLD ip2k_cgen_ifld_table[] =
{
  { IP2K_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_IMM8, "f-imm8", 0, 16, 7, 8, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_REG, "f-reg", 0, 16, 8, 9, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } }  },
  { IP2K_F_ADDR16CJP, "f-addr16cjp", 0, 16, 12, 13, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } }  },
  { IP2K_F_DIR, "f-dir", 0, 16, 9, 1, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_BITNO, "f-bitno", 0, 16, 11, 3, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP3, "f-op3", 0, 16, 15, 3, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP4, "f-op4", 0, 16, 15, 4, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP4MID, "f-op4mid", 0, 16, 11, 4, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP6, "f-op6", 0, 16, 15, 6, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP8, "f-op8", 0, 16, 15, 8, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP6_10LOW, "f-op6-10low", 0, 16, 9, 10, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_OP6_7LOW, "f-op6-7low", 0, 16, 9, 7, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_RETI3, "f-reti3", 0, 16, 2, 3, { 0, { (1<<MACH_BASE) } }  },
  { IP2K_F_SKIPB, "f-skipb", 0, 16, 12, 1, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } }  },
  { IP2K_F_PAGE3, "f-page3", 0, 16, 2, 3, { 0, { (1<<MACH_BASE) } }  },
  { 0, 0, 0, 0, 0, 0, {0, {0}} }
};

#undef A



/* multi ifield declarations */



/* multi ifield definitions */


/* The operand table.  */

#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
#define A(a) (1 << CGEN_OPERAND_##a)
#else
#define A(a) (1 << CGEN_OPERAND_/**/a)
#endif
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
#define OPERAND(op) IP2K_OPERAND_##op
#else
#define OPERAND(op) IP2K_OPERAND_/**/op
#endif

const CGEN_OPERAND ip2k_cgen_operand_table[] =
{
/* pc: program counter */
  { "pc", IP2K_OPERAND_PC, HW_H_PC, 0, 0,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_NIL] } }, 
    { 0|A(SEM_ONLY), { (1<<MACH_BASE) } }  },
/* addr16cjp: 13-bit address */
  { "addr16cjp", IP2K_OPERAND_ADDR16CJP, HW_H_UINT, 12, 13,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_ADDR16CJP] } }, 
    { 0|A(ABS_ADDR), { (1<<MACH_BASE) } }  },
/* fr: register */
  { "fr", IP2K_OPERAND_FR, HW_H_REGISTERS, 8, 9,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_REG] } }, 
    { 0|A(ABS_ADDR), { (1<<MACH_BASE) } }  },
/* lit8: 8-bit signed literal */
  { "lit8", IP2K_OPERAND_LIT8, HW_H_SINT, 7, 8,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* bitno: bit number */
  { "bitno", IP2K_OPERAND_BITNO, HW_H_UINT, 11, 3,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_BITNO] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* addr16p: page number */
  { "addr16p", IP2K_OPERAND_ADDR16P, HW_H_UINT, 2, 3,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_PAGE3] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* addr16h: high 8 bits of address */
  { "addr16h", IP2K_OPERAND_ADDR16H, HW_H_UINT, 7, 8,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* addr16l: low 8 bits of address */
  { "addr16l", IP2K_OPERAND_ADDR16L, HW_H_UINT, 7, 8,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* reti3: reti flags */
  { "reti3", IP2K_OPERAND_RETI3, HW_H_UINT, 2, 3,
    { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_RETI3] } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* pabits: page bits */
  { "pabits", IP2K_OPERAND_PABITS, HW_H_PABITS, 0, 0,
    { 0, { (const PTR) 0 } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* zbit: zero bit */
  { "zbit", IP2K_OPERAND_ZBIT, HW_H_ZBIT, 0, 0,
    { 0, { (const PTR) 0 } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* cbit: carry bit */
  { "cbit", IP2K_OPERAND_CBIT, HW_H_CBIT, 0, 0,
    { 0, { (const PTR) 0 } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* dcbit: digit carry bit */
  { "dcbit", IP2K_OPERAND_DCBIT, HW_H_DCBIT, 0, 0,
    { 0, { (const PTR) 0 } }, 
    { 0, { (1<<MACH_BASE) } }  },
/* sentinel */
  { 0, 0, 0, 0, 0,
    { 0, { (const PTR) 0 } },
    { 0, { 0 } } }
};

#undef A


/* The instruction table.  */

#define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
#define A(a) (1 << CGEN_INSN_##a)
#else
#define A(a) (1 << CGEN_INSN_/**/a)
#endif

static const CGEN_IBASE ip2k_cgen_insn_table[MAX_INSNS] =
{
  /* Special null first entry.
     A `num' value of zero is thus invalid.
     Also, the special `invalid' insn resides here.  */
  { 0, 0, 0, 0, {0, {0}} },
/* jmp $addr16cjp */
  {
    IP2K_INSN_JMP, "jmp", "jmp", 16,
    { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
  },
/* call $addr16cjp */
  {
    IP2K_INSN_CALL, "call", "call", 16,
    { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
  },
/* sb $fr,$bitno */
  {
    IP2K_INSN_SB, "sb", "sb", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* snb $fr,$bitno */
  {
    IP2K_INSN_SNB, "snb", "snb", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* setb $fr,$bitno */
  {
    IP2K_INSN_SETB, "setb", "setb", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* clrb $fr,$bitno */
  {
    IP2K_INSN_CLRB, "clrb", "clrb", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* xor W,#$lit8 */
  {
    IP2K_INSN_XORW_L, "xorw_l", "xor", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* and W,#$lit8 */
  {
    IP2K_INSN_ANDW_L, "andw_l", "and", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* or W,#$lit8 */
  {
    IP2K_INSN_ORW_L, "orw_l", "or", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* add W,#$lit8 */
  {
    IP2K_INSN_ADDW_L, "addw_l", "add", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* sub W,#$lit8 */
  {
    IP2K_INSN_SUBW_L, "subw_l", "sub", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* cmp W,#$lit8 */
  {
    IP2K_INSN_CMPW_L, "cmpw_l", "cmp", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* retw #$lit8 */
  {
    IP2K_INSN_RETW_L, "retw_l", "retw", 16,
    { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
  },
/* cse W,#$lit8 */
  {
    IP2K_INSN_CSEW_L, "csew_l", "cse", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* csne W,#$lit8 */
  {
    IP2K_INSN_CSNEW_L, "csnew_l", "csne", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* push #$lit8 */
  {
    IP2K_INSN_PUSH_L, "push_l", "push", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* muls W,#$lit8 */
  {
    IP2K_INSN_MULSW_L, "mulsw_l", "muls", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* mulu W,#$lit8 */
  {
    IP2K_INSN_MULUW_L, "muluw_l", "mulu", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* loadl #$lit8 */
  {
    IP2K_INSN_LOADL_L, "loadl_l", "loadl", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* loadh #$lit8 */
  {
    IP2K_INSN_LOADH_L, "loadh_l", "loadh", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* loadl $addr16l */
  {
    IP2K_INSN_LOADL_A, "loadl_a", "loadl", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* loadh $addr16h */
  {
    IP2K_INSN_LOADH_A, "loadh_a", "loadh", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* addc $fr,W */
  {
    IP2K_INSN_ADDCFR_W, "addcfr_w", "addc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* addc W,$fr */
  {
    IP2K_INSN_ADDCW_FR, "addcw_fr", "addc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* incsnz $fr */
  {
    IP2K_INSN_INCSNZ_FR, "incsnz_fr", "incsnz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* incsnz W,$fr */
  {
    IP2K_INSN_INCSNZW_FR, "incsnzw_fr", "incsnz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* muls W,$fr */
  {
    IP2K_INSN_MULSW_FR, "mulsw_fr", "muls", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* mulu W,$fr */
  {
    IP2K_INSN_MULUW_FR, "muluw_fr", "mulu", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* decsnz $fr */
  {
    IP2K_INSN_DECSNZ_FR, "decsnz_fr", "decsnz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* decsnz W,$fr */
  {
    IP2K_INSN_DECSNZW_FR, "decsnzw_fr", "decsnz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* subc W,$fr */
  {
    IP2K_INSN_SUBCW_FR, "subcw_fr", "subc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* subc $fr,W */
  {
    IP2K_INSN_SUBCFR_W, "subcfr_w", "subc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* pop $fr */
  {
    IP2K_INSN_POP_FR, "pop_fr", "pop", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* push $fr */
  {
    IP2K_INSN_PUSH_FR, "push_fr", "push", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* cse W,$fr */
  {
    IP2K_INSN_CSEW_FR, "csew_fr", "cse", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* csne W,$fr */
  {
    IP2K_INSN_CSNEW_FR, "csnew_fr", "csne", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* incsz $fr */
  {
    IP2K_INSN_INCSZ_FR, "incsz_fr", "incsz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* incsz W,$fr */
  {
    IP2K_INSN_INCSZW_FR, "incszw_fr", "incsz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* swap $fr */
  {
    IP2K_INSN_SWAP_FR, "swap_fr", "swap", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* swap W,$fr */
  {
    IP2K_INSN_SWAPW_FR, "swapw_fr", "swap", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* rl $fr */
  {
    IP2K_INSN_RL_FR, "rl_fr", "rl", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* rl W,$fr */
  {
    IP2K_INSN_RLW_FR, "rlw_fr", "rl", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* rr $fr */
  {
    IP2K_INSN_RR_FR, "rr_fr", "rr", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* rr W,$fr */
  {
    IP2K_INSN_RRW_FR, "rrw_fr", "rr", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* decsz $fr */
  {
    IP2K_INSN_DECSZ_FR, "decsz_fr", "decsz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* decsz W,$fr */
  {
    IP2K_INSN_DECSZW_FR, "decszw_fr", "decsz", 16,
    { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
  },
/* inc $fr */
  {
    IP2K_INSN_INC_FR, "inc_fr", "inc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* inc W,$fr */
  {
    IP2K_INSN_INCW_FR, "incw_fr", "inc", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* not $fr */
  {
    IP2K_INSN_NOT_FR, "not_fr", "not", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* not W,$fr */
  {
    IP2K_INSN_NOTW_FR, "notw_fr", "not", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* test $fr */
  {
    IP2K_INSN_TEST_FR, "test_fr", "test", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* mov W,#$lit8 */
  {
    IP2K_INSN_MOVW_L, "movw_l", "mov", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* mov $fr,W */
  {
    IP2K_INSN_MOVFR_W, "movfr_w", "mov", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* mov W,$fr */
  {
    IP2K_INSN_MOVW_FR, "movw_fr", "mov", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* add $fr,W */
  {
    IP2K_INSN_ADDFR_W, "addfr_w", "add", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* add W,$fr */
  {
    IP2K_INSN_ADDW_FR, "addw_fr", "add", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* xor $fr,W */
  {
    IP2K_INSN_XORFR_W, "xorfr_w", "xor", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* xor W,$fr */
  {
    IP2K_INSN_XORW_FR, "xorw_fr", "xor", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* and $fr,W */
  {
    IP2K_INSN_ANDFR_W, "andfr_w", "and", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* and W,$fr */
  {
    IP2K_INSN_ANDW_FR, "andw_fr", "and", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* or $fr,W */
  {
    IP2K_INSN_ORFR_W, "orfr_w", "or", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* or W,$fr */
  {
    IP2K_INSN_ORW_FR, "orw_fr", "or", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* dec $fr */
  {
    IP2K_INSN_DEC_FR, "dec_fr", "dec", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* dec W,$fr */
  {
    IP2K_INSN_DECW_FR, "decw_fr", "dec", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* sub $fr,W */
  {
    IP2K_INSN_SUBFR_W, "subfr_w", "sub", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* sub W,$fr */
  {
    IP2K_INSN_SUBW_FR, "subw_fr", "sub", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* clr $fr */
  {
    IP2K_INSN_CLR_FR, "clr_fr", "clr", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* cmp W,$fr */
  {
    IP2K_INSN_CMPW_FR, "cmpw_fr", "cmp", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* speed #$lit8 */
  {
    IP2K_INSN_SPEED, "speed", "speed", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* ireadi */
  {
    IP2K_INSN_IREADI, "ireadi", "ireadi", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* iwritei */
  {
    IP2K_INSN_IWRITEI, "iwritei", "iwritei", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* fread */
  {
    IP2K_INSN_FREAD, "fread", "fread", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* fwrite */
  {
    IP2K_INSN_FWRITE, "fwrite", "fwrite", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* iread */
  {
    IP2K_INSN_IREAD, "iread", "iread", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* iwrite */
  {
    IP2K_INSN_IWRITE, "iwrite", "iwrite", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* page $addr16p */
  {
    IP2K_INSN_PAGE, "page", "page", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* system */
  {
    IP2K_INSN_SYSTEM, "system", "system", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* reti #$reti3 */
  {
    IP2K_INSN_RETI, "reti", "reti", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* ret */
  {
    IP2K_INSN_RET, "ret", "ret", 16,
    { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
  },
/* int */
  {
    IP2K_INSN_INT, "int", "int", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* breakx */
  {
    IP2K_INSN_BREAKX, "breakx", "breakx", 16,
    { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
  },
/* cwdt */
  {
    IP2K_INSN_CWDT, "cwdt", "cwdt", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* ferase */
  {
    IP2K_INSN_FERASE, "ferase", "ferase", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* retnp */
  {
    IP2K_INSN_RETNP, "retnp", "retnp", 16,
    { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
  },
/* break */
  {
    IP2K_INSN_BREAK, "break", "break", 16,
    { 0, { (1<<MACH_BASE) } }
  },
/* nop */
  {
    IP2K_INSN_NOP, "nop", "nop", 16,
    { 0, { (1<<MACH_BASE) } }
  },
};

#undef OP
#undef A

/* Initialize anything needed to be done once, before any cpu_open call.  */
static void init_tables PARAMS ((void));

static void
init_tables ()
{
}

static const CGEN_MACH * lookup_mach_via_bfd_name
  PARAMS ((const CGEN_MACH *, const char *));
static void build_hw_table  PARAMS ((CGEN_CPU_TABLE *));
static void build_ifield_table  PARAMS ((CGEN_CPU_TABLE *));
static void build_operand_table PARAMS ((CGEN_CPU_TABLE *));
static void build_insn_table    PARAMS ((CGEN_CPU_TABLE *));
static void ip2k_cgen_rebuild_tables PARAMS ((CGEN_CPU_TABLE *));

/* Subroutine of ip2k_cgen_cpu_open to look up a mach via its bfd name.  */

static const CGEN_MACH *
lookup_mach_via_bfd_name (table, name)
     const CGEN_MACH *table;
     const char *name;
{
  while (table->name)
    {
      if (strcmp (name, table->bfd_name) == 0)
	return table;
      ++table;
    }
  abort ();
}

/* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */

static void
build_hw_table (cd)
     CGEN_CPU_TABLE *cd;
{
  int i;
  int machs = cd->machs;
  const CGEN_HW_ENTRY *init = & ip2k_cgen_hw_table[0];
  /* MAX_HW is only an upper bound on the number of selected entries.
     However each entry is indexed by it's enum so there can be holes in
     the table.  */
  const CGEN_HW_ENTRY **selected =
    (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));

  cd->hw_table.init_entries = init;
  cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
  memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
  /* ??? For now we just use machs to determine which ones we want.  */
  for (i = 0; init[i].name != NULL; ++i)
    if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
	& machs)
      selected[init[i].type] = &init[i];
  cd->hw_table.entries = selected;
  cd->hw_table.num_entries = MAX_HW;
}

/* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */

static void
build_ifield_table (cd)
     CGEN_CPU_TABLE *cd;
{
  cd->ifld_table = & ip2k_cgen_ifld_table[0];
}

/* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */

static void
build_operand_table (cd)
     CGEN_CPU_TABLE *cd;
{
  int i;
  int machs = cd->machs;
  const CGEN_OPERAND *init = & ip2k_cgen_operand_table[0];
  /* MAX_OPERANDS is only an upper bound on the number of selected entries.
     However each entry is indexed by it's enum so there can be holes in
     the table.  */
  const CGEN_OPERAND **selected =
    (const CGEN_OPERAND **) xmalloc (MAX_OPERANDS * sizeof (CGEN_OPERAND *));

  cd->operand_table.init_entries = init;
  cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
  memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
  /* ??? For now we just use mach to determine which ones we want.  */
  for (i = 0; init[i].name != NULL; ++i)
    if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
	& machs)
      selected[init[i].type] = &init[i];
  cd->operand_table.entries = selected;
  cd->operand_table.num_entries = MAX_OPERANDS;
}

/* Subroutine of ip2k_cgen_cpu_open to build the hardware table.
   ??? This could leave out insns not supported by the specified mach/isa,
   but that would cause errors like "foo only supported by bar" to become
   "unknown insn", so for now we include all insns and require the app to
   do the checking later.
   ??? On the other hand, parsing of such insns may require their hardware or
   operand elements to be in the table [which they mightn't be].  */

static void
build_insn_table (cd)
     CGEN_CPU_TABLE *cd;
{
  int i;
  const CGEN_IBASE *ib = & ip2k_cgen_insn_table[0];
  CGEN_INSN *insns = (CGEN_INSN *) xmalloc (MAX_INSNS * sizeof (CGEN_INSN));

  memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
  for (i = 0; i < MAX_INSNS; ++i)
    insns[i].base = &ib[i];
  cd->insn_table.init_entries = insns;
  cd->insn_table.entry_size = sizeof (CGEN_IBASE);
  cd->insn_table.num_init_entries = MAX_INSNS;
}

/* Subroutine of ip2k_cgen_cpu_open to rebuild the tables.  */

static void
ip2k_cgen_rebuild_tables (cd)
     CGEN_CPU_TABLE *cd;
{
  int i;
  unsigned int isas = cd->isas;
  unsigned int machs = cd->machs;

  cd->int_insn_p = CGEN_INT_INSN_P;

  /* Data derived from the isa spec.  */
#define UNSET (CGEN_SIZE_UNKNOWN + 1)
  cd->default_insn_bitsize = UNSET;
  cd->base_insn_bitsize = UNSET;
  cd->min_insn_bitsize = 65535; /* some ridiculously big number */
  cd->max_insn_bitsize = 0;
  for (i = 0; i < MAX_ISAS; ++i)
    if (((1 << i) & isas) != 0)
      {
	const CGEN_ISA *isa = & ip2k_cgen_isa_table[i];

	/* Default insn sizes of all selected isas must be
	   equal or we set the result to 0, meaning "unknown".  */
	if (cd->default_insn_bitsize == UNSET)
	  cd->default_insn_bitsize = isa->default_insn_bitsize;
	else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
	  ; /* this is ok */
	else
	  cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;

	/* Base insn sizes of all selected isas must be equal
	   or we set the result to 0, meaning "unknown".  */
	if (cd->base_insn_bitsize == UNSET)
	  cd->base_insn_bitsize = isa->base_insn_bitsize;
	else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
	  ; /* this is ok */
	else
	  cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;

	/* Set min,max insn sizes.  */
	if (isa->min_insn_bitsize < cd->min_insn_bitsize)
	  cd->min_insn_bitsize = isa->min_insn_bitsize;
	if (isa->max_insn_bitsize > cd->max_insn_bitsize)
	  cd->max_insn_bitsize = isa->max_insn_bitsize;
      }

  /* Data derived from the mach spec.  */
  for (i = 0; i < MAX_MACHS; ++i)
    if (((1 << i) & machs) != 0)
      {
	const CGEN_MACH *mach = & ip2k_cgen_mach_table[i];

	if (mach->insn_chunk_bitsize != 0)
	{
	  if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
	    {
	      fprintf (stderr, "ip2k_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
		       cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
	      abort ();
	    }

 	  cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
	}
      }

  /* Determine which hw elements are used by MACH.  */
  build_hw_table (cd);

  /* Build the ifield table.  */
  build_ifield_table (cd);

  /* Determine which operands are used by MACH/ISA.  */
  build_operand_table (cd);

  /* Build the instruction table.  */
  build_insn_table (cd);
}

/* Initialize a cpu table and return a descriptor.
   It's much like opening a file, and must be the first function called.
   The arguments are a set of (type/value) pairs, terminated with
   CGEN_CPU_OPEN_END.

   Currently supported values:
   CGEN_CPU_OPEN_ISAS:    bitmap of values in enum isa_attr
   CGEN_CPU_OPEN_MACHS:   bitmap of values in enum mach_attr
   CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
   CGEN_CPU_OPEN_ENDIAN:  specify endian choice
   CGEN_CPU_OPEN_END:     terminates arguments

   ??? Simultaneous multiple isas might not make sense, but it's not (yet)
   precluded.

   ??? We only support ISO C stdargs here, not K&R.
   Laziness, plus experiment to see if anything requires K&R - eventually
   K&R will no longer be supported - e.g. GDB is currently trying this.  */

CGEN_CPU_DESC
ip2k_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
{
  CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
  static int init_p;
  unsigned int isas = 0;  /* 0 = "unspecified" */
  unsigned int machs = 0; /* 0 = "unspecified" */
  enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
  va_list ap;

  if (! init_p)
    {
      init_tables ();
      init_p = 1;
    }

  memset (cd, 0, sizeof (*cd));

  va_start (ap, arg_type);
  while (arg_type != CGEN_CPU_OPEN_END)
    {
      switch (arg_type)
	{
	case CGEN_CPU_OPEN_ISAS :
	  isas = va_arg (ap, unsigned int);
	  break;
	case CGEN_CPU_OPEN_MACHS :
	  machs = va_arg (ap, unsigned int);
	  break;
	case CGEN_CPU_OPEN_BFDMACH :
	  {
	    const char *name = va_arg (ap, const char *);
	    const CGEN_MACH *mach =
	      lookup_mach_via_bfd_name (ip2k_cgen_mach_table, name);

	    machs |= 1 << mach->num;
	    break;
	  }
	case CGEN_CPU_OPEN_ENDIAN :
	  endian = va_arg (ap, enum cgen_endian);
	  break;
	default :
	  fprintf (stderr, "ip2k_cgen_cpu_open: unsupported argument `%d'\n",
		   arg_type);
	  abort (); /* ??? return NULL? */
	}
      arg_type = va_arg (ap, enum cgen_cpu_open_arg);
    }
  va_end (ap);

  /* mach unspecified means "all" */
  if (machs == 0)
    machs = (1 << MAX_MACHS) - 1;
  /* base mach is always selected */
  machs |= 1;
  /* isa unspecified means "all" */
  if (isas == 0)
    isas = (1 << MAX_ISAS) - 1;
  if (endian == CGEN_ENDIAN_UNKNOWN)
    {
      /* ??? If target has only one, could have a default.  */
      fprintf (stderr, "ip2k_cgen_cpu_open: no endianness specified\n");
      abort ();
    }

  cd->isas = isas;
  cd->machs = machs;
  cd->endian = endian;
  /* FIXME: for the sparc case we can determine insn-endianness statically.
     The worry here is where both data and insn endian can be independently
     chosen, in which case this function will need another argument.
     Actually, will want to allow for more arguments in the future anyway.  */
  cd->insn_endian = endian;

  /* Table (re)builder.  */
  cd->rebuild_tables = ip2k_cgen_rebuild_tables;
  ip2k_cgen_rebuild_tables (cd);

  /* Default to not allowing signed overflow.  */
  cd->signed_overflow_ok_p = 0;
  
  return (CGEN_CPU_DESC) cd;
}

/* Cover fn to ip2k_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
   MACH_NAME is the bfd name of the mach.  */

CGEN_CPU_DESC
ip2k_cgen_cpu_open_1 (mach_name, endian)
     const char *mach_name;
     enum cgen_endian endian;
{
  return ip2k_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
			       CGEN_CPU_OPEN_ENDIAN, endian,
			       CGEN_CPU_OPEN_END);
}

/* Close a cpu table.
   ??? This can live in a machine independent file, but there's currently
   no place to put this file (there's no libcgen).  libopcodes is the wrong
   place as some simulator ports use this but they don't use libopcodes.  */

void
ip2k_cgen_cpu_close (cd)
     CGEN_CPU_DESC cd;
{
  unsigned int i;
  const CGEN_INSN *insns;

  if (cd->macro_insn_table.init_entries)
    {
      insns = cd->macro_insn_table.init_entries;
      for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
	{
	  if (CGEN_INSN_RX ((insns)))
	    regfree (CGEN_INSN_RX (insns));
	}
    }

  if (cd->insn_table.init_entries)
    {
      insns = cd->insn_table.init_entries;
      for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
	{
	  if (CGEN_INSN_RX (insns))
	    regfree (CGEN_INSN_RX (insns));
	}
    }

  

  if (cd->macro_insn_table.init_entries)
    free ((CGEN_INSN *) cd->macro_insn_table.init_entries);

  if (cd->insn_table.init_entries)
    free ((CGEN_INSN *) cd->insn_table.init_entries);

  if (cd->hw_table.entries)
    free ((CGEN_HW_ENTRY *) cd->hw_table.entries);

  if (cd->operand_table.entries)
    free ((CGEN_HW_ENTRY *) cd->operand_table.entries);

  free (cd);
}

