Home | History | Annotate | Line # | Download | only in opcodes
ip2k-desc.c revision 1.1.1.7
      1  1.1.1.5  christos /* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
      2      1.1     skrll /* CPU data for ip2k.
      3      1.1     skrll 
      4      1.1     skrll THIS FILE IS MACHINE GENERATED WITH CGEN.
      5      1.1     skrll 
      6  1.1.1.7  christos Copyright (C) 1996-2020 Free Software Foundation, Inc.
      7      1.1     skrll 
      8      1.1     skrll This file is part of the GNU Binutils and/or GDB, the GNU debugger.
      9      1.1     skrll 
     10      1.1     skrll    This file is free software; you can redistribute it and/or modify
     11      1.1     skrll    it under the terms of the GNU General Public License as published by
     12      1.1     skrll    the Free Software Foundation; either version 3, or (at your option)
     13      1.1     skrll    any later version.
     14      1.1     skrll 
     15      1.1     skrll    It is distributed in the hope that it will be useful, but WITHOUT
     16      1.1     skrll    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     17      1.1     skrll    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     18      1.1     skrll    License for more details.
     19      1.1     skrll 
     20      1.1     skrll    You should have received a copy of the GNU General Public License along
     21      1.1     skrll    with this program; if not, write to the Free Software Foundation, Inc.,
     22      1.1     skrll    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     23      1.1     skrll 
     24      1.1     skrll */
     25      1.1     skrll 
     26      1.1     skrll #include "sysdep.h"
     27      1.1     skrll #include <stdio.h>
     28      1.1     skrll #include <stdarg.h>
     29      1.1     skrll #include "ansidecl.h"
     30      1.1     skrll #include "bfd.h"
     31      1.1     skrll #include "symcat.h"
     32      1.1     skrll #include "ip2k-desc.h"
     33      1.1     skrll #include "ip2k-opc.h"
     34      1.1     skrll #include "opintl.h"
     35      1.1     skrll #include "libiberty.h"
     36      1.1     skrll #include "xregex.h"
     37      1.1     skrll 
     38      1.1     skrll /* Attributes.  */
     39      1.1     skrll 
     40      1.1     skrll static const CGEN_ATTR_ENTRY bool_attr[] =
     41      1.1     skrll {
     42      1.1     skrll   { "#f", 0 },
     43      1.1     skrll   { "#t", 1 },
     44      1.1     skrll   { 0, 0 }
     45      1.1     skrll };
     46      1.1     skrll 
     47      1.1     skrll static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
     48      1.1     skrll {
     49      1.1     skrll   { "base", MACH_BASE },
     50      1.1     skrll   { "ip2022", MACH_IP2022 },
     51      1.1     skrll   { "ip2022ext", MACH_IP2022EXT },
     52      1.1     skrll   { "max", MACH_MAX },
     53      1.1     skrll   { 0, 0 }
     54      1.1     skrll };
     55      1.1     skrll 
     56      1.1     skrll static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
     57      1.1     skrll {
     58      1.1     skrll   { "ip2k", ISA_IP2K },
     59      1.1     skrll   { "max", ISA_MAX },
     60      1.1     skrll   { 0, 0 }
     61      1.1     skrll };
     62      1.1     skrll 
     63      1.1     skrll const CGEN_ATTR_TABLE ip2k_cgen_ifield_attr_table[] =
     64      1.1     skrll {
     65      1.1     skrll   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     66      1.1     skrll   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     67      1.1     skrll   { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
     68      1.1     skrll   { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
     69      1.1     skrll   { "RESERVED", &bool_attr[0], &bool_attr[0] },
     70      1.1     skrll   { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
     71      1.1     skrll   { "SIGNED", &bool_attr[0], &bool_attr[0] },
     72      1.1     skrll   { 0, 0, 0 }
     73      1.1     skrll };
     74      1.1     skrll 
     75      1.1     skrll const CGEN_ATTR_TABLE ip2k_cgen_hardware_attr_table[] =
     76      1.1     skrll {
     77      1.1     skrll   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     78      1.1     skrll   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     79      1.1     skrll   { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
     80      1.1     skrll   { "PC", &bool_attr[0], &bool_attr[0] },
     81      1.1     skrll   { "PROFILE", &bool_attr[0], &bool_attr[0] },
     82      1.1     skrll   { 0, 0, 0 }
     83      1.1     skrll };
     84      1.1     skrll 
     85      1.1     skrll const CGEN_ATTR_TABLE ip2k_cgen_operand_attr_table[] =
     86      1.1     skrll {
     87      1.1     skrll   { "MACH", & MACH_attr[0], & MACH_attr[0] },
     88      1.1     skrll   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
     89      1.1     skrll   { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
     90      1.1     skrll   { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
     91      1.1     skrll   { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
     92      1.1     skrll   { "SIGNED", &bool_attr[0], &bool_attr[0] },
     93      1.1     skrll   { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
     94      1.1     skrll   { "RELAX", &bool_attr[0], &bool_attr[0] },
     95      1.1     skrll   { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
     96      1.1     skrll   { 0, 0, 0 }
     97      1.1     skrll };
     98      1.1     skrll 
     99      1.1     skrll const CGEN_ATTR_TABLE ip2k_cgen_insn_attr_table[] =
    100      1.1     skrll {
    101      1.1     skrll   { "MACH", & MACH_attr[0], & MACH_attr[0] },
    102      1.1     skrll   { "ALIAS", &bool_attr[0], &bool_attr[0] },
    103      1.1     skrll   { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
    104      1.1     skrll   { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
    105      1.1     skrll   { "COND-CTI", &bool_attr[0], &bool_attr[0] },
    106      1.1     skrll   { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
    107      1.1     skrll   { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
    108      1.1     skrll   { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
    109      1.1     skrll   { "RELAXED", &bool_attr[0], &bool_attr[0] },
    110      1.1     skrll   { "NO-DIS", &bool_attr[0], &bool_attr[0] },
    111      1.1     skrll   { "PBB", &bool_attr[0], &bool_attr[0] },
    112      1.1     skrll   { "EXT-SKIP-INSN", &bool_attr[0], &bool_attr[0] },
    113      1.1     skrll   { "SKIPA", &bool_attr[0], &bool_attr[0] },
    114      1.1     skrll   { 0, 0, 0 }
    115      1.1     skrll };
    116      1.1     skrll 
    117      1.1     skrll /* Instruction set variants.  */
    118      1.1     skrll 
    119      1.1     skrll static const CGEN_ISA ip2k_cgen_isa_table[] = {
    120      1.1     skrll   { "ip2k", 16, 16, 16, 16 },
    121      1.1     skrll   { 0, 0, 0, 0, 0 }
    122      1.1     skrll };
    123      1.1     skrll 
    124      1.1     skrll /* Machine variants.  */
    125      1.1     skrll 
    126      1.1     skrll static const CGEN_MACH ip2k_cgen_mach_table[] = {
    127      1.1     skrll   { "ip2022", "ip2022", MACH_IP2022, 0 },
    128      1.1     skrll   { "ip2022ext", "ip2022ext", MACH_IP2022EXT, 0 },
    129      1.1     skrll   { 0, 0, 0, 0 }
    130      1.1     skrll };
    131      1.1     skrll 
    132      1.1     skrll static CGEN_KEYWORD_ENTRY ip2k_cgen_opval_register_names_entries[] =
    133      1.1     skrll {
    134      1.1     skrll   { "ADDRSEL", 2, {0, {{{0, 0}}}}, 0, 0 },
    135      1.1     skrll   { "ADDRX", 3, {0, {{{0, 0}}}}, 0, 0 },
    136      1.1     skrll   { "IPH", 4, {0, {{{0, 0}}}}, 0, 0 },
    137      1.1     skrll   { "IPL", 5, {0, {{{0, 0}}}}, 0, 0 },
    138      1.1     skrll   { "SPH", 6, {0, {{{0, 0}}}}, 0, 0 },
    139      1.1     skrll   { "SPL", 7, {0, {{{0, 0}}}}, 0, 0 },
    140      1.1     skrll   { "PCH", 8, {0, {{{0, 0}}}}, 0, 0 },
    141      1.1     skrll   { "PCL", 9, {0, {{{0, 0}}}}, 0, 0 },
    142      1.1     skrll   { "WREG", 10, {0, {{{0, 0}}}}, 0, 0 },
    143      1.1     skrll   { "STATUS", 11, {0, {{{0, 0}}}}, 0, 0 },
    144      1.1     skrll   { "DPH", 12, {0, {{{0, 0}}}}, 0, 0 },
    145      1.1     skrll   { "DPL", 13, {0, {{{0, 0}}}}, 0, 0 },
    146      1.1     skrll   { "SPDREG", 14, {0, {{{0, 0}}}}, 0, 0 },
    147      1.1     skrll   { "MULH", 15, {0, {{{0, 0}}}}, 0, 0 },
    148      1.1     skrll   { "ADDRH", 16, {0, {{{0, 0}}}}, 0, 0 },
    149      1.1     skrll   { "ADDRL", 17, {0, {{{0, 0}}}}, 0, 0 },
    150      1.1     skrll   { "DATAH", 18, {0, {{{0, 0}}}}, 0, 0 },
    151      1.1     skrll   { "DATAL", 19, {0, {{{0, 0}}}}, 0, 0 },
    152      1.1     skrll   { "INTVECH", 20, {0, {{{0, 0}}}}, 0, 0 },
    153      1.1     skrll   { "INTVECL", 21, {0, {{{0, 0}}}}, 0, 0 },
    154      1.1     skrll   { "INTSPD", 22, {0, {{{0, 0}}}}, 0, 0 },
    155      1.1     skrll   { "INTF", 23, {0, {{{0, 0}}}}, 0, 0 },
    156      1.1     skrll   { "INTE", 24, {0, {{{0, 0}}}}, 0, 0 },
    157      1.1     skrll   { "INTED", 25, {0, {{{0, 0}}}}, 0, 0 },
    158      1.1     skrll   { "FCFG", 26, {0, {{{0, 0}}}}, 0, 0 },
    159      1.1     skrll   { "TCTRL", 27, {0, {{{0, 0}}}}, 0, 0 },
    160      1.1     skrll   { "XCFG", 28, {0, {{{0, 0}}}}, 0, 0 },
    161      1.1     skrll   { "EMCFG", 29, {0, {{{0, 0}}}}, 0, 0 },
    162      1.1     skrll   { "IPCH", 30, {0, {{{0, 0}}}}, 0, 0 },
    163      1.1     skrll   { "IPCL", 31, {0, {{{0, 0}}}}, 0, 0 },
    164      1.1     skrll   { "RAIN", 32, {0, {{{0, 0}}}}, 0, 0 },
    165      1.1     skrll   { "RAOUT", 33, {0, {{{0, 0}}}}, 0, 0 },
    166      1.1     skrll   { "RADIR", 34, {0, {{{0, 0}}}}, 0, 0 },
    167      1.1     skrll   { "LFSRH", 35, {0, {{{0, 0}}}}, 0, 0 },
    168      1.1     skrll   { "RBIN", 36, {0, {{{0, 0}}}}, 0, 0 },
    169      1.1     skrll   { "RBOUT", 37, {0, {{{0, 0}}}}, 0, 0 },
    170      1.1     skrll   { "RBDIR", 38, {0, {{{0, 0}}}}, 0, 0 },
    171      1.1     skrll   { "LFSRL", 39, {0, {{{0, 0}}}}, 0, 0 },
    172      1.1     skrll   { "RCIN", 40, {0, {{{0, 0}}}}, 0, 0 },
    173      1.1     skrll   { "RCOUT", 41, {0, {{{0, 0}}}}, 0, 0 },
    174      1.1     skrll   { "RCDIR", 42, {0, {{{0, 0}}}}, 0, 0 },
    175      1.1     skrll   { "LFSRA", 43, {0, {{{0, 0}}}}, 0, 0 },
    176      1.1     skrll   { "RDIN", 44, {0, {{{0, 0}}}}, 0, 0 },
    177      1.1     skrll   { "RDOUT", 45, {0, {{{0, 0}}}}, 0, 0 },
    178      1.1     skrll   { "RDDIR", 46, {0, {{{0, 0}}}}, 0, 0 },
    179      1.1     skrll   { "REIN", 48, {0, {{{0, 0}}}}, 0, 0 },
    180      1.1     skrll   { "REOUT", 49, {0, {{{0, 0}}}}, 0, 0 },
    181      1.1     skrll   { "REDIR", 50, {0, {{{0, 0}}}}, 0, 0 },
    182      1.1     skrll   { "RFIN", 52, {0, {{{0, 0}}}}, 0, 0 },
    183      1.1     skrll   { "RFOUT", 53, {0, {{{0, 0}}}}, 0, 0 },
    184      1.1     skrll   { "RFDIR", 54, {0, {{{0, 0}}}}, 0, 0 },
    185      1.1     skrll   { "RGOUT", 57, {0, {{{0, 0}}}}, 0, 0 },
    186      1.1     skrll   { "RGDIR", 58, {0, {{{0, 0}}}}, 0, 0 },
    187      1.1     skrll   { "RTTMR", 64, {0, {{{0, 0}}}}, 0, 0 },
    188      1.1     skrll   { "RTCFG", 65, {0, {{{0, 0}}}}, 0, 0 },
    189      1.1     skrll   { "T0TMR", 66, {0, {{{0, 0}}}}, 0, 0 },
    190      1.1     skrll   { "T0CFG", 67, {0, {{{0, 0}}}}, 0, 0 },
    191      1.1     skrll   { "T1CNTH", 68, {0, {{{0, 0}}}}, 0, 0 },
    192      1.1     skrll   { "T1CNTL", 69, {0, {{{0, 0}}}}, 0, 0 },
    193      1.1     skrll   { "T1CAP1H", 70, {0, {{{0, 0}}}}, 0, 0 },
    194      1.1     skrll   { "T1CAP1L", 71, {0, {{{0, 0}}}}, 0, 0 },
    195      1.1     skrll   { "T1CAP2H", 72, {0, {{{0, 0}}}}, 0, 0 },
    196      1.1     skrll   { "T1CMP2H", 72, {0, {{{0, 0}}}}, 0, 0 },
    197      1.1     skrll   { "T1CAP2L", 73, {0, {{{0, 0}}}}, 0, 0 },
    198      1.1     skrll   { "T1CMP2L", 73, {0, {{{0, 0}}}}, 0, 0 },
    199      1.1     skrll   { "T1CMP1H", 74, {0, {{{0, 0}}}}, 0, 0 },
    200      1.1     skrll   { "T1CMP1L", 75, {0, {{{0, 0}}}}, 0, 0 },
    201      1.1     skrll   { "T1CFG1H", 76, {0, {{{0, 0}}}}, 0, 0 },
    202      1.1     skrll   { "T1CFG1L", 77, {0, {{{0, 0}}}}, 0, 0 },
    203      1.1     skrll   { "T1CFG2H", 78, {0, {{{0, 0}}}}, 0, 0 },
    204      1.1     skrll   { "T1CFG2L", 79, {0, {{{0, 0}}}}, 0, 0 },
    205      1.1     skrll   { "ADCH", 80, {0, {{{0, 0}}}}, 0, 0 },
    206      1.1     skrll   { "ADCL", 81, {0, {{{0, 0}}}}, 0, 0 },
    207      1.1     skrll   { "ADCCFG", 82, {0, {{{0, 0}}}}, 0, 0 },
    208      1.1     skrll   { "ADCTMR", 83, {0, {{{0, 0}}}}, 0, 0 },
    209      1.1     skrll   { "T2CNTH", 84, {0, {{{0, 0}}}}, 0, 0 },
    210      1.1     skrll   { "T2CNTL", 85, {0, {{{0, 0}}}}, 0, 0 },
    211      1.1     skrll   { "T2CAP1H", 86, {0, {{{0, 0}}}}, 0, 0 },
    212      1.1     skrll   { "T2CAP1L", 87, {0, {{{0, 0}}}}, 0, 0 },
    213      1.1     skrll   { "T2CAP2H", 88, {0, {{{0, 0}}}}, 0, 0 },
    214      1.1     skrll   { "T2CMP2H", 88, {0, {{{0, 0}}}}, 0, 0 },
    215      1.1     skrll   { "T2CAP2L", 89, {0, {{{0, 0}}}}, 0, 0 },
    216      1.1     skrll   { "T2CMP2L", 89, {0, {{{0, 0}}}}, 0, 0 },
    217      1.1     skrll   { "T2CMP1H", 90, {0, {{{0, 0}}}}, 0, 0 },
    218      1.1     skrll   { "T2CMP1L", 91, {0, {{{0, 0}}}}, 0, 0 },
    219      1.1     skrll   { "T2CFG1H", 92, {0, {{{0, 0}}}}, 0, 0 },
    220      1.1     skrll   { "T2CFG1L", 93, {0, {{{0, 0}}}}, 0, 0 },
    221      1.1     skrll   { "T2CFG2H", 94, {0, {{{0, 0}}}}, 0, 0 },
    222      1.1     skrll   { "T2CFG2L", 95, {0, {{{0, 0}}}}, 0, 0 },
    223      1.1     skrll   { "S1TMRH", 96, {0, {{{0, 0}}}}, 0, 0 },
    224      1.1     skrll   { "S1TMRL", 97, {0, {{{0, 0}}}}, 0, 0 },
    225      1.1     skrll   { "S1TBUFH", 98, {0, {{{0, 0}}}}, 0, 0 },
    226      1.1     skrll   { "S1TBUFL", 99, {0, {{{0, 0}}}}, 0, 0 },
    227      1.1     skrll   { "S1TCFG", 100, {0, {{{0, 0}}}}, 0, 0 },
    228      1.1     skrll   { "S1RCNT", 101, {0, {{{0, 0}}}}, 0, 0 },
    229      1.1     skrll   { "S1RBUFH", 102, {0, {{{0, 0}}}}, 0, 0 },
    230      1.1     skrll   { "S1RBUFL", 103, {0, {{{0, 0}}}}, 0, 0 },
    231      1.1     skrll   { "S1RCFG", 104, {0, {{{0, 0}}}}, 0, 0 },
    232      1.1     skrll   { "S1RSYNC", 105, {0, {{{0, 0}}}}, 0, 0 },
    233      1.1     skrll   { "S1INTF", 106, {0, {{{0, 0}}}}, 0, 0 },
    234      1.1     skrll   { "S1INTE", 107, {0, {{{0, 0}}}}, 0, 0 },
    235      1.1     skrll   { "S1MODE", 108, {0, {{{0, 0}}}}, 0, 0 },
    236      1.1     skrll   { "S1SMASK", 109, {0, {{{0, 0}}}}, 0, 0 },
    237      1.1     skrll   { "PSPCFG", 110, {0, {{{0, 0}}}}, 0, 0 },
    238      1.1     skrll   { "CMPCFG", 111, {0, {{{0, 0}}}}, 0, 0 },
    239      1.1     skrll   { "S2TMRH", 112, {0, {{{0, 0}}}}, 0, 0 },
    240      1.1     skrll   { "S2TMRL", 113, {0, {{{0, 0}}}}, 0, 0 },
    241      1.1     skrll   { "S2TBUFH", 114, {0, {{{0, 0}}}}, 0, 0 },
    242      1.1     skrll   { "S2TBUFL", 115, {0, {{{0, 0}}}}, 0, 0 },
    243      1.1     skrll   { "S2TCFG", 116, {0, {{{0, 0}}}}, 0, 0 },
    244      1.1     skrll   { "S2RCNT", 117, {0, {{{0, 0}}}}, 0, 0 },
    245      1.1     skrll   { "S2RBUFH", 118, {0, {{{0, 0}}}}, 0, 0 },
    246      1.1     skrll   { "S2RBUFL", 119, {0, {{{0, 0}}}}, 0, 0 },
    247      1.1     skrll   { "S2RCFG", 120, {0, {{{0, 0}}}}, 0, 0 },
    248      1.1     skrll   { "S2RSYNC", 121, {0, {{{0, 0}}}}, 0, 0 },
    249      1.1     skrll   { "S2INTF", 122, {0, {{{0, 0}}}}, 0, 0 },
    250      1.1     skrll   { "S2INTE", 123, {0, {{{0, 0}}}}, 0, 0 },
    251      1.1     skrll   { "S2MODE", 124, {0, {{{0, 0}}}}, 0, 0 },
    252      1.1     skrll   { "S2SMASK", 125, {0, {{{0, 0}}}}, 0, 0 },
    253      1.1     skrll   { "CALLH", 126, {0, {{{0, 0}}}}, 0, 0 },
    254      1.1     skrll   { "CALLL", 127, {0, {{{0, 0}}}}, 0, 0 }
    255      1.1     skrll };
    256      1.1     skrll 
    257      1.1     skrll CGEN_KEYWORD ip2k_cgen_opval_register_names =
    258      1.1     skrll {
    259      1.1     skrll   & ip2k_cgen_opval_register_names_entries[0],
    260      1.1     skrll   121,
    261      1.1     skrll   0, 0, 0, 0, ""
    262      1.1     skrll };
    263      1.1     skrll 
    264      1.1     skrll 
    265      1.1     skrll /* The hardware table.  */
    266      1.1     skrll 
    267      1.1     skrll #define A(a) (1 << CGEN_HW_##a)
    268      1.1     skrll 
    269      1.1     skrll const CGEN_HW_ENTRY ip2k_cgen_hw_table[] =
    270      1.1     skrll {
    271      1.1     skrll   { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    272      1.1     skrll   { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    273      1.1     skrll   { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    274      1.1     skrll   { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    275      1.1     skrll   { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    276      1.1     skrll   { "h-spr", HW_H_SPR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    277      1.1     skrll   { "h-registers", HW_H_REGISTERS, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
    278      1.1     skrll   { "h-stack", HW_H_STACK, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    279      1.1     skrll   { "h-pabits", HW_H_PABITS, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    280      1.1     skrll   { "h-zbit", HW_H_ZBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    281      1.1     skrll   { "h-cbit", HW_H_CBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    282      1.1     skrll   { "h-dcbit", HW_H_DCBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    283      1.1     skrll   { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
    284      1.1     skrll   { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
    285      1.1     skrll };
    286      1.1     skrll 
    287      1.1     skrll #undef A
    288      1.1     skrll 
    289      1.1     skrll 
    290      1.1     skrll /* The instruction field table.  */
    291      1.1     skrll 
    292      1.1     skrll #define A(a) (1 << CGEN_IFLD_##a)
    293      1.1     skrll 
    294      1.1     skrll const CGEN_IFLD ip2k_cgen_ifld_table[] =
    295      1.1     skrll {
    296      1.1     skrll   { IP2K_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    297      1.1     skrll   { IP2K_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    298      1.1     skrll   { IP2K_F_IMM8, "f-imm8", 0, 16, 7, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    299      1.1     skrll   { IP2K_F_REG, "f-reg", 0, 16, 8, 9, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    300      1.1     skrll   { IP2K_F_ADDR16CJP, "f-addr16cjp", 0, 16, 12, 13, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    301      1.1     skrll   { IP2K_F_DIR, "f-dir", 0, 16, 9, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    302      1.1     skrll   { IP2K_F_BITNO, "f-bitno", 0, 16, 11, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    303      1.1     skrll   { IP2K_F_OP3, "f-op3", 0, 16, 15, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    304      1.1     skrll   { IP2K_F_OP4, "f-op4", 0, 16, 15, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    305      1.1     skrll   { IP2K_F_OP4MID, "f-op4mid", 0, 16, 11, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    306      1.1     skrll   { IP2K_F_OP6, "f-op6", 0, 16, 15, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    307      1.1     skrll   { IP2K_F_OP8, "f-op8", 0, 16, 15, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    308      1.1     skrll   { IP2K_F_OP6_10LOW, "f-op6-10low", 0, 16, 9, 10, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    309      1.1     skrll   { IP2K_F_OP6_7LOW, "f-op6-7low", 0, 16, 9, 7, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    310      1.1     skrll   { IP2K_F_RETI3, "f-reti3", 0, 16, 2, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    311      1.1     skrll   { IP2K_F_SKIPB, "f-skipb", 0, 16, 12, 1, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    312      1.1     skrll   { IP2K_F_PAGE3, "f-page3", 0, 16, 2, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    313      1.1     skrll   { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
    314      1.1     skrll };
    315      1.1     skrll 
    316      1.1     skrll #undef A
    317      1.1     skrll 
    318      1.1     skrll 
    319      1.1     skrll 
    320      1.1     skrll /* multi ifield declarations */
    321      1.1     skrll 
    322      1.1     skrll 
    323      1.1     skrll 
    324      1.1     skrll /* multi ifield definitions */
    325      1.1     skrll 
    326      1.1     skrll 
    327      1.1     skrll /* The operand table.  */
    328      1.1     skrll 
    329      1.1     skrll #define A(a) (1 << CGEN_OPERAND_##a)
    330      1.1     skrll #define OPERAND(op) IP2K_OPERAND_##op
    331      1.1     skrll 
    332      1.1     skrll const CGEN_OPERAND ip2k_cgen_operand_table[] =
    333      1.1     skrll {
    334      1.1     skrll /* pc: program counter */
    335      1.1     skrll   { "pc", IP2K_OPERAND_PC, HW_H_PC, 0, 0,
    336  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_NIL] } },
    337      1.1     skrll     { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } }  },
    338      1.1     skrll /* addr16cjp: 13-bit address */
    339      1.1     skrll   { "addr16cjp", IP2K_OPERAND_ADDR16CJP, HW_H_UINT, 12, 13,
    340  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_ADDR16CJP] } },
    341      1.1     skrll     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    342      1.1     skrll /* fr: register */
    343      1.1     skrll   { "fr", IP2K_OPERAND_FR, HW_H_REGISTERS, 8, 9,
    344  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_REG] } },
    345      1.1     skrll     { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
    346      1.1     skrll /* lit8: 8-bit signed literal */
    347      1.1     skrll   { "lit8", IP2K_OPERAND_LIT8, HW_H_SINT, 7, 8,
    348  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
    349      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    350      1.1     skrll /* bitno: bit number */
    351      1.1     skrll   { "bitno", IP2K_OPERAND_BITNO, HW_H_UINT, 11, 3,
    352  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_BITNO] } },
    353      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    354      1.1     skrll /* addr16p: page number */
    355      1.1     skrll   { "addr16p", IP2K_OPERAND_ADDR16P, HW_H_UINT, 2, 3,
    356  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_PAGE3] } },
    357      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    358      1.1     skrll /* addr16h: high 8 bits of address */
    359      1.1     skrll   { "addr16h", IP2K_OPERAND_ADDR16H, HW_H_UINT, 7, 8,
    360  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
    361      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    362      1.1     skrll /* addr16l: low 8 bits of address */
    363      1.1     skrll   { "addr16l", IP2K_OPERAND_ADDR16L, HW_H_UINT, 7, 8,
    364  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
    365      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    366      1.1     skrll /* reti3: reti flags */
    367      1.1     skrll   { "reti3", IP2K_OPERAND_RETI3, HW_H_UINT, 2, 3,
    368  1.1.1.3  christos     { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_RETI3] } },
    369      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    370      1.1     skrll /* pabits: page bits */
    371      1.1     skrll   { "pabits", IP2K_OPERAND_PABITS, HW_H_PABITS, 0, 0,
    372  1.1.1.3  christos     { 0, { (const PTR) 0 } },
    373      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    374      1.1     skrll /* zbit: zero bit */
    375      1.1     skrll   { "zbit", IP2K_OPERAND_ZBIT, HW_H_ZBIT, 0, 0,
    376  1.1.1.3  christos     { 0, { (const PTR) 0 } },
    377      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    378      1.1     skrll /* cbit: carry bit */
    379      1.1     skrll   { "cbit", IP2K_OPERAND_CBIT, HW_H_CBIT, 0, 0,
    380  1.1.1.3  christos     { 0, { (const PTR) 0 } },
    381      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    382      1.1     skrll /* dcbit: digit carry bit */
    383      1.1     skrll   { "dcbit", IP2K_OPERAND_DCBIT, HW_H_DCBIT, 0, 0,
    384  1.1.1.3  christos     { 0, { (const PTR) 0 } },
    385      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }  },
    386      1.1     skrll /* sentinel */
    387      1.1     skrll   { 0, 0, 0, 0, 0,
    388      1.1     skrll     { 0, { (const PTR) 0 } },
    389      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } } }
    390      1.1     skrll };
    391      1.1     skrll 
    392      1.1     skrll #undef A
    393      1.1     skrll 
    394      1.1     skrll 
    395      1.1     skrll /* The instruction table.  */
    396      1.1     skrll 
    397      1.1     skrll #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
    398      1.1     skrll #define A(a) (1 << CGEN_INSN_##a)
    399      1.1     skrll 
    400      1.1     skrll static const CGEN_IBASE ip2k_cgen_insn_table[MAX_INSNS] =
    401      1.1     skrll {
    402      1.1     skrll   /* Special null first entry.
    403      1.1     skrll      A `num' value of zero is thus invalid.
    404      1.1     skrll      Also, the special `invalid' insn resides here.  */
    405      1.1     skrll   { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
    406      1.1     skrll /* jmp $addr16cjp */
    407      1.1     skrll   {
    408      1.1     skrll     IP2K_INSN_JMP, "jmp", "jmp", 16,
    409      1.1     skrll     { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
    410      1.1     skrll   },
    411      1.1     skrll /* call $addr16cjp */
    412      1.1     skrll   {
    413      1.1     skrll     IP2K_INSN_CALL, "call", "call", 16,
    414      1.1     skrll     { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
    415      1.1     skrll   },
    416      1.1     skrll /* sb $fr,$bitno */
    417      1.1     skrll   {
    418      1.1     skrll     IP2K_INSN_SB, "sb", "sb", 16,
    419      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    420      1.1     skrll   },
    421      1.1     skrll /* snb $fr,$bitno */
    422      1.1     skrll   {
    423      1.1     skrll     IP2K_INSN_SNB, "snb", "snb", 16,
    424      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    425      1.1     skrll   },
    426      1.1     skrll /* setb $fr,$bitno */
    427      1.1     skrll   {
    428      1.1     skrll     IP2K_INSN_SETB, "setb", "setb", 16,
    429      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    430      1.1     skrll   },
    431      1.1     skrll /* clrb $fr,$bitno */
    432      1.1     skrll   {
    433      1.1     skrll     IP2K_INSN_CLRB, "clrb", "clrb", 16,
    434      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    435      1.1     skrll   },
    436      1.1     skrll /* xor W,#$lit8 */
    437      1.1     skrll   {
    438      1.1     skrll     IP2K_INSN_XORW_L, "xorw_l", "xor", 16,
    439      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    440      1.1     skrll   },
    441      1.1     skrll /* and W,#$lit8 */
    442      1.1     skrll   {
    443      1.1     skrll     IP2K_INSN_ANDW_L, "andw_l", "and", 16,
    444      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    445      1.1     skrll   },
    446      1.1     skrll /* or W,#$lit8 */
    447      1.1     skrll   {
    448      1.1     skrll     IP2K_INSN_ORW_L, "orw_l", "or", 16,
    449      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    450      1.1     skrll   },
    451      1.1     skrll /* add W,#$lit8 */
    452      1.1     skrll   {
    453      1.1     skrll     IP2K_INSN_ADDW_L, "addw_l", "add", 16,
    454      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    455      1.1     skrll   },
    456      1.1     skrll /* sub W,#$lit8 */
    457      1.1     skrll   {
    458      1.1     skrll     IP2K_INSN_SUBW_L, "subw_l", "sub", 16,
    459      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    460      1.1     skrll   },
    461      1.1     skrll /* cmp W,#$lit8 */
    462      1.1     skrll   {
    463      1.1     skrll     IP2K_INSN_CMPW_L, "cmpw_l", "cmp", 16,
    464      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    465      1.1     skrll   },
    466      1.1     skrll /* retw #$lit8 */
    467      1.1     skrll   {
    468      1.1     skrll     IP2K_INSN_RETW_L, "retw_l", "retw", 16,
    469      1.1     skrll     { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
    470      1.1     skrll   },
    471      1.1     skrll /* cse W,#$lit8 */
    472      1.1     skrll   {
    473      1.1     skrll     IP2K_INSN_CSEW_L, "csew_l", "cse", 16,
    474      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    475      1.1     skrll   },
    476      1.1     skrll /* csne W,#$lit8 */
    477      1.1     skrll   {
    478      1.1     skrll     IP2K_INSN_CSNEW_L, "csnew_l", "csne", 16,
    479      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    480      1.1     skrll   },
    481      1.1     skrll /* push #$lit8 */
    482      1.1     skrll   {
    483      1.1     skrll     IP2K_INSN_PUSH_L, "push_l", "push", 16,
    484      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    485      1.1     skrll   },
    486      1.1     skrll /* muls W,#$lit8 */
    487      1.1     skrll   {
    488      1.1     skrll     IP2K_INSN_MULSW_L, "mulsw_l", "muls", 16,
    489      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    490      1.1     skrll   },
    491      1.1     skrll /* mulu W,#$lit8 */
    492      1.1     skrll   {
    493      1.1     skrll     IP2K_INSN_MULUW_L, "muluw_l", "mulu", 16,
    494      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    495      1.1     skrll   },
    496      1.1     skrll /* loadl #$lit8 */
    497      1.1     skrll   {
    498      1.1     skrll     IP2K_INSN_LOADL_L, "loadl_l", "loadl", 16,
    499      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    500      1.1     skrll   },
    501      1.1     skrll /* loadh #$lit8 */
    502      1.1     skrll   {
    503      1.1     skrll     IP2K_INSN_LOADH_L, "loadh_l", "loadh", 16,
    504      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    505      1.1     skrll   },
    506      1.1     skrll /* loadl $addr16l */
    507      1.1     skrll   {
    508      1.1     skrll     IP2K_INSN_LOADL_A, "loadl_a", "loadl", 16,
    509      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    510      1.1     skrll   },
    511      1.1     skrll /* loadh $addr16h */
    512      1.1     skrll   {
    513      1.1     skrll     IP2K_INSN_LOADH_A, "loadh_a", "loadh", 16,
    514      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    515      1.1     skrll   },
    516      1.1     skrll /* addc $fr,W */
    517      1.1     skrll   {
    518      1.1     skrll     IP2K_INSN_ADDCFR_W, "addcfr_w", "addc", 16,
    519      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    520      1.1     skrll   },
    521      1.1     skrll /* addc W,$fr */
    522      1.1     skrll   {
    523      1.1     skrll     IP2K_INSN_ADDCW_FR, "addcw_fr", "addc", 16,
    524      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    525      1.1     skrll   },
    526      1.1     skrll /* incsnz $fr */
    527      1.1     skrll   {
    528      1.1     skrll     IP2K_INSN_INCSNZ_FR, "incsnz_fr", "incsnz", 16,
    529      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    530      1.1     skrll   },
    531      1.1     skrll /* incsnz W,$fr */
    532      1.1     skrll   {
    533      1.1     skrll     IP2K_INSN_INCSNZW_FR, "incsnzw_fr", "incsnz", 16,
    534      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    535      1.1     skrll   },
    536      1.1     skrll /* muls W,$fr */
    537      1.1     skrll   {
    538      1.1     skrll     IP2K_INSN_MULSW_FR, "mulsw_fr", "muls", 16,
    539      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    540      1.1     skrll   },
    541      1.1     skrll /* mulu W,$fr */
    542      1.1     skrll   {
    543      1.1     skrll     IP2K_INSN_MULUW_FR, "muluw_fr", "mulu", 16,
    544      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    545      1.1     skrll   },
    546      1.1     skrll /* decsnz $fr */
    547      1.1     skrll   {
    548      1.1     skrll     IP2K_INSN_DECSNZ_FR, "decsnz_fr", "decsnz", 16,
    549      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    550      1.1     skrll   },
    551      1.1     skrll /* decsnz W,$fr */
    552      1.1     skrll   {
    553      1.1     skrll     IP2K_INSN_DECSNZW_FR, "decsnzw_fr", "decsnz", 16,
    554      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    555      1.1     skrll   },
    556      1.1     skrll /* subc W,$fr */
    557      1.1     skrll   {
    558      1.1     skrll     IP2K_INSN_SUBCW_FR, "subcw_fr", "subc", 16,
    559      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    560      1.1     skrll   },
    561      1.1     skrll /* subc $fr,W */
    562      1.1     skrll   {
    563      1.1     skrll     IP2K_INSN_SUBCFR_W, "subcfr_w", "subc", 16,
    564      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    565      1.1     skrll   },
    566      1.1     skrll /* pop $fr */
    567      1.1     skrll   {
    568      1.1     skrll     IP2K_INSN_POP_FR, "pop_fr", "pop", 16,
    569      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    570      1.1     skrll   },
    571      1.1     skrll /* push $fr */
    572      1.1     skrll   {
    573      1.1     skrll     IP2K_INSN_PUSH_FR, "push_fr", "push", 16,
    574      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    575      1.1     skrll   },
    576      1.1     skrll /* cse W,$fr */
    577      1.1     skrll   {
    578      1.1     skrll     IP2K_INSN_CSEW_FR, "csew_fr", "cse", 16,
    579      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    580      1.1     skrll   },
    581      1.1     skrll /* csne W,$fr */
    582      1.1     skrll   {
    583      1.1     skrll     IP2K_INSN_CSNEW_FR, "csnew_fr", "csne", 16,
    584      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    585      1.1     skrll   },
    586      1.1     skrll /* incsz $fr */
    587      1.1     skrll   {
    588      1.1     skrll     IP2K_INSN_INCSZ_FR, "incsz_fr", "incsz", 16,
    589      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    590      1.1     skrll   },
    591      1.1     skrll /* incsz W,$fr */
    592      1.1     skrll   {
    593      1.1     skrll     IP2K_INSN_INCSZW_FR, "incszw_fr", "incsz", 16,
    594      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    595      1.1     skrll   },
    596      1.1     skrll /* swap $fr */
    597      1.1     skrll   {
    598      1.1     skrll     IP2K_INSN_SWAP_FR, "swap_fr", "swap", 16,
    599      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    600      1.1     skrll   },
    601      1.1     skrll /* swap W,$fr */
    602      1.1     skrll   {
    603      1.1     skrll     IP2K_INSN_SWAPW_FR, "swapw_fr", "swap", 16,
    604      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    605      1.1     skrll   },
    606      1.1     skrll /* rl $fr */
    607      1.1     skrll   {
    608      1.1     skrll     IP2K_INSN_RL_FR, "rl_fr", "rl", 16,
    609      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    610      1.1     skrll   },
    611      1.1     skrll /* rl W,$fr */
    612      1.1     skrll   {
    613      1.1     skrll     IP2K_INSN_RLW_FR, "rlw_fr", "rl", 16,
    614      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    615      1.1     skrll   },
    616      1.1     skrll /* rr $fr */
    617      1.1     skrll   {
    618      1.1     skrll     IP2K_INSN_RR_FR, "rr_fr", "rr", 16,
    619      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    620      1.1     skrll   },
    621      1.1     skrll /* rr W,$fr */
    622      1.1     skrll   {
    623      1.1     skrll     IP2K_INSN_RRW_FR, "rrw_fr", "rr", 16,
    624      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    625      1.1     skrll   },
    626      1.1     skrll /* decsz $fr */
    627      1.1     skrll   {
    628      1.1     skrll     IP2K_INSN_DECSZ_FR, "decsz_fr", "decsz", 16,
    629      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    630      1.1     skrll   },
    631      1.1     skrll /* decsz W,$fr */
    632      1.1     skrll   {
    633      1.1     skrll     IP2K_INSN_DECSZW_FR, "decszw_fr", "decsz", 16,
    634      1.1     skrll     { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
    635      1.1     skrll   },
    636      1.1     skrll /* inc $fr */
    637      1.1     skrll   {
    638      1.1     skrll     IP2K_INSN_INC_FR, "inc_fr", "inc", 16,
    639      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    640      1.1     skrll   },
    641      1.1     skrll /* inc W,$fr */
    642      1.1     skrll   {
    643      1.1     skrll     IP2K_INSN_INCW_FR, "incw_fr", "inc", 16,
    644      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    645      1.1     skrll   },
    646      1.1     skrll /* not $fr */
    647      1.1     skrll   {
    648      1.1     skrll     IP2K_INSN_NOT_FR, "not_fr", "not", 16,
    649      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    650      1.1     skrll   },
    651      1.1     skrll /* not W,$fr */
    652      1.1     skrll   {
    653      1.1     skrll     IP2K_INSN_NOTW_FR, "notw_fr", "not", 16,
    654      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    655      1.1     skrll   },
    656      1.1     skrll /* test $fr */
    657      1.1     skrll   {
    658      1.1     skrll     IP2K_INSN_TEST_FR, "test_fr", "test", 16,
    659      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    660      1.1     skrll   },
    661      1.1     skrll /* mov W,#$lit8 */
    662      1.1     skrll   {
    663      1.1     skrll     IP2K_INSN_MOVW_L, "movw_l", "mov", 16,
    664      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    665      1.1     skrll   },
    666      1.1     skrll /* mov $fr,W */
    667      1.1     skrll   {
    668      1.1     skrll     IP2K_INSN_MOVFR_W, "movfr_w", "mov", 16,
    669      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    670      1.1     skrll   },
    671      1.1     skrll /* mov W,$fr */
    672      1.1     skrll   {
    673      1.1     skrll     IP2K_INSN_MOVW_FR, "movw_fr", "mov", 16,
    674      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    675      1.1     skrll   },
    676      1.1     skrll /* add $fr,W */
    677      1.1     skrll   {
    678      1.1     skrll     IP2K_INSN_ADDFR_W, "addfr_w", "add", 16,
    679      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    680      1.1     skrll   },
    681      1.1     skrll /* add W,$fr */
    682      1.1     skrll   {
    683      1.1     skrll     IP2K_INSN_ADDW_FR, "addw_fr", "add", 16,
    684      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    685      1.1     skrll   },
    686      1.1     skrll /* xor $fr,W */
    687      1.1     skrll   {
    688      1.1     skrll     IP2K_INSN_XORFR_W, "xorfr_w", "xor", 16,
    689      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    690      1.1     skrll   },
    691      1.1     skrll /* xor W,$fr */
    692      1.1     skrll   {
    693      1.1     skrll     IP2K_INSN_XORW_FR, "xorw_fr", "xor", 16,
    694      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    695      1.1     skrll   },
    696      1.1     skrll /* and $fr,W */
    697      1.1     skrll   {
    698      1.1     skrll     IP2K_INSN_ANDFR_W, "andfr_w", "and", 16,
    699      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    700      1.1     skrll   },
    701      1.1     skrll /* and W,$fr */
    702      1.1     skrll   {
    703      1.1     skrll     IP2K_INSN_ANDW_FR, "andw_fr", "and", 16,
    704      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    705      1.1     skrll   },
    706      1.1     skrll /* or $fr,W */
    707      1.1     skrll   {
    708      1.1     skrll     IP2K_INSN_ORFR_W, "orfr_w", "or", 16,
    709      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    710      1.1     skrll   },
    711      1.1     skrll /* or W,$fr */
    712      1.1     skrll   {
    713      1.1     skrll     IP2K_INSN_ORW_FR, "orw_fr", "or", 16,
    714      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    715      1.1     skrll   },
    716      1.1     skrll /* dec $fr */
    717      1.1     skrll   {
    718      1.1     skrll     IP2K_INSN_DEC_FR, "dec_fr", "dec", 16,
    719      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    720      1.1     skrll   },
    721      1.1     skrll /* dec W,$fr */
    722      1.1     skrll   {
    723      1.1     skrll     IP2K_INSN_DECW_FR, "decw_fr", "dec", 16,
    724      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    725      1.1     skrll   },
    726      1.1     skrll /* sub $fr,W */
    727      1.1     skrll   {
    728      1.1     skrll     IP2K_INSN_SUBFR_W, "subfr_w", "sub", 16,
    729      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    730      1.1     skrll   },
    731      1.1     skrll /* sub W,$fr */
    732      1.1     skrll   {
    733      1.1     skrll     IP2K_INSN_SUBW_FR, "subw_fr", "sub", 16,
    734      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    735      1.1     skrll   },
    736      1.1     skrll /* clr $fr */
    737      1.1     skrll   {
    738      1.1     skrll     IP2K_INSN_CLR_FR, "clr_fr", "clr", 16,
    739      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    740      1.1     skrll   },
    741      1.1     skrll /* cmp W,$fr */
    742      1.1     skrll   {
    743      1.1     skrll     IP2K_INSN_CMPW_FR, "cmpw_fr", "cmp", 16,
    744      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    745      1.1     skrll   },
    746      1.1     skrll /* speed #$lit8 */
    747      1.1     skrll   {
    748      1.1     skrll     IP2K_INSN_SPEED, "speed", "speed", 16,
    749      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    750      1.1     skrll   },
    751      1.1     skrll /* ireadi */
    752      1.1     skrll   {
    753      1.1     skrll     IP2K_INSN_IREADI, "ireadi", "ireadi", 16,
    754      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    755      1.1     skrll   },
    756      1.1     skrll /* iwritei */
    757      1.1     skrll   {
    758      1.1     skrll     IP2K_INSN_IWRITEI, "iwritei", "iwritei", 16,
    759      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    760      1.1     skrll   },
    761      1.1     skrll /* fread */
    762      1.1     skrll   {
    763      1.1     skrll     IP2K_INSN_FREAD, "fread", "fread", 16,
    764      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    765      1.1     skrll   },
    766      1.1     skrll /* fwrite */
    767      1.1     skrll   {
    768      1.1     skrll     IP2K_INSN_FWRITE, "fwrite", "fwrite", 16,
    769      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    770      1.1     skrll   },
    771      1.1     skrll /* iread */
    772      1.1     skrll   {
    773      1.1     skrll     IP2K_INSN_IREAD, "iread", "iread", 16,
    774      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    775      1.1     skrll   },
    776      1.1     skrll /* iwrite */
    777      1.1     skrll   {
    778      1.1     skrll     IP2K_INSN_IWRITE, "iwrite", "iwrite", 16,
    779      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    780      1.1     skrll   },
    781      1.1     skrll /* page $addr16p */
    782      1.1     skrll   {
    783      1.1     skrll     IP2K_INSN_PAGE, "page", "page", 16,
    784      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    785      1.1     skrll   },
    786      1.1     skrll /* system */
    787      1.1     skrll   {
    788      1.1     skrll     IP2K_INSN_SYSTEM, "system", "system", 16,
    789      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    790      1.1     skrll   },
    791      1.1     skrll /* reti #$reti3 */
    792      1.1     skrll   {
    793      1.1     skrll     IP2K_INSN_RETI, "reti", "reti", 16,
    794      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    795      1.1     skrll   },
    796      1.1     skrll /* ret */
    797      1.1     skrll   {
    798      1.1     skrll     IP2K_INSN_RET, "ret", "ret", 16,
    799      1.1     skrll     { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
    800      1.1     skrll   },
    801      1.1     skrll /* int */
    802      1.1     skrll   {
    803      1.1     skrll     IP2K_INSN_INT, "int", "int", 16,
    804      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    805      1.1     skrll   },
    806      1.1     skrll /* breakx */
    807      1.1     skrll   {
    808      1.1     skrll     IP2K_INSN_BREAKX, "breakx", "breakx", 16,
    809      1.1     skrll     { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
    810      1.1     skrll   },
    811      1.1     skrll /* cwdt */
    812      1.1     skrll   {
    813      1.1     skrll     IP2K_INSN_CWDT, "cwdt", "cwdt", 16,
    814      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    815      1.1     skrll   },
    816      1.1     skrll /* ferase */
    817      1.1     skrll   {
    818      1.1     skrll     IP2K_INSN_FERASE, "ferase", "ferase", 16,
    819      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    820      1.1     skrll   },
    821      1.1     skrll /* retnp */
    822      1.1     skrll   {
    823      1.1     skrll     IP2K_INSN_RETNP, "retnp", "retnp", 16,
    824      1.1     skrll     { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
    825      1.1     skrll   },
    826      1.1     skrll /* break */
    827      1.1     skrll   {
    828      1.1     skrll     IP2K_INSN_BREAK, "break", "break", 16,
    829      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    830      1.1     skrll   },
    831      1.1     skrll /* nop */
    832      1.1     skrll   {
    833      1.1     skrll     IP2K_INSN_NOP, "nop", "nop", 16,
    834      1.1     skrll     { 0, { { { (1<<MACH_BASE), 0 } } } }
    835      1.1     skrll   },
    836      1.1     skrll };
    837      1.1     skrll 
    838      1.1     skrll #undef OP
    839      1.1     skrll #undef A
    840      1.1     skrll 
    841      1.1     skrll /* Initialize anything needed to be done once, before any cpu_open call.  */
    842      1.1     skrll 
    843      1.1     skrll static void
    844      1.1     skrll init_tables (void)
    845      1.1     skrll {
    846      1.1     skrll }
    847      1.1     skrll 
    848  1.1.1.6  christos #ifndef opcodes_error_handler
    849  1.1.1.6  christos #define opcodes_error_handler(...) \
    850  1.1.1.6  christos   fprintf (stderr, __VA_ARGS__); fputc ('\n', stderr)
    851  1.1.1.6  christos #endif
    852  1.1.1.6  christos 
    853      1.1     skrll static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
    854      1.1     skrll static void build_hw_table      (CGEN_CPU_TABLE *);
    855      1.1     skrll static void build_ifield_table  (CGEN_CPU_TABLE *);
    856      1.1     skrll static void build_operand_table (CGEN_CPU_TABLE *);
    857      1.1     skrll static void build_insn_table    (CGEN_CPU_TABLE *);
    858      1.1     skrll static void ip2k_cgen_rebuild_tables (CGEN_CPU_TABLE *);
    859      1.1     skrll 
    860      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to look up a mach via its bfd name.  */
    861      1.1     skrll 
    862      1.1     skrll static const CGEN_MACH *
    863      1.1     skrll lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
    864      1.1     skrll {
    865      1.1     skrll   while (table->name)
    866      1.1     skrll     {
    867      1.1     skrll       if (strcmp (name, table->bfd_name) == 0)
    868      1.1     skrll 	return table;
    869      1.1     skrll       ++table;
    870      1.1     skrll     }
    871  1.1.1.5  christos   return NULL;
    872      1.1     skrll }
    873      1.1     skrll 
    874      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */
    875      1.1     skrll 
    876      1.1     skrll static void
    877      1.1     skrll build_hw_table (CGEN_CPU_TABLE *cd)
    878      1.1     skrll {
    879      1.1     skrll   int i;
    880      1.1     skrll   int machs = cd->machs;
    881      1.1     skrll   const CGEN_HW_ENTRY *init = & ip2k_cgen_hw_table[0];
    882      1.1     skrll   /* MAX_HW is only an upper bound on the number of selected entries.
    883      1.1     skrll      However each entry is indexed by it's enum so there can be holes in
    884      1.1     skrll      the table.  */
    885      1.1     skrll   const CGEN_HW_ENTRY **selected =
    886      1.1     skrll     (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
    887      1.1     skrll 
    888      1.1     skrll   cd->hw_table.init_entries = init;
    889      1.1     skrll   cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
    890      1.1     skrll   memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
    891      1.1     skrll   /* ??? For now we just use machs to determine which ones we want.  */
    892      1.1     skrll   for (i = 0; init[i].name != NULL; ++i)
    893      1.1     skrll     if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
    894      1.1     skrll 	& machs)
    895      1.1     skrll       selected[init[i].type] = &init[i];
    896      1.1     skrll   cd->hw_table.entries = selected;
    897      1.1     skrll   cd->hw_table.num_entries = MAX_HW;
    898      1.1     skrll }
    899      1.1     skrll 
    900      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */
    901      1.1     skrll 
    902      1.1     skrll static void
    903      1.1     skrll build_ifield_table (CGEN_CPU_TABLE *cd)
    904      1.1     skrll {
    905      1.1     skrll   cd->ifld_table = & ip2k_cgen_ifld_table[0];
    906      1.1     skrll }
    907      1.1     skrll 
    908      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table.  */
    909      1.1     skrll 
    910      1.1     skrll static void
    911      1.1     skrll build_operand_table (CGEN_CPU_TABLE *cd)
    912      1.1     skrll {
    913      1.1     skrll   int i;
    914      1.1     skrll   int machs = cd->machs;
    915      1.1     skrll   const CGEN_OPERAND *init = & ip2k_cgen_operand_table[0];
    916      1.1     skrll   /* MAX_OPERANDS is only an upper bound on the number of selected entries.
    917      1.1     skrll      However each entry is indexed by it's enum so there can be holes in
    918      1.1     skrll      the table.  */
    919      1.1     skrll   const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
    920      1.1     skrll 
    921      1.1     skrll   cd->operand_table.init_entries = init;
    922      1.1     skrll   cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
    923      1.1     skrll   memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
    924      1.1     skrll   /* ??? For now we just use mach to determine which ones we want.  */
    925      1.1     skrll   for (i = 0; init[i].name != NULL; ++i)
    926      1.1     skrll     if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
    927      1.1     skrll 	& machs)
    928      1.1     skrll       selected[init[i].type] = &init[i];
    929      1.1     skrll   cd->operand_table.entries = selected;
    930      1.1     skrll   cd->operand_table.num_entries = MAX_OPERANDS;
    931      1.1     skrll }
    932      1.1     skrll 
    933      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table.
    934      1.1     skrll    ??? This could leave out insns not supported by the specified mach/isa,
    935      1.1     skrll    but that would cause errors like "foo only supported by bar" to become
    936      1.1     skrll    "unknown insn", so for now we include all insns and require the app to
    937      1.1     skrll    do the checking later.
    938      1.1     skrll    ??? On the other hand, parsing of such insns may require their hardware or
    939      1.1     skrll    operand elements to be in the table [which they mightn't be].  */
    940      1.1     skrll 
    941      1.1     skrll static void
    942      1.1     skrll build_insn_table (CGEN_CPU_TABLE *cd)
    943      1.1     skrll {
    944      1.1     skrll   int i;
    945      1.1     skrll   const CGEN_IBASE *ib = & ip2k_cgen_insn_table[0];
    946      1.1     skrll   CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
    947      1.1     skrll 
    948      1.1     skrll   memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
    949      1.1     skrll   for (i = 0; i < MAX_INSNS; ++i)
    950      1.1     skrll     insns[i].base = &ib[i];
    951      1.1     skrll   cd->insn_table.init_entries = insns;
    952      1.1     skrll   cd->insn_table.entry_size = sizeof (CGEN_IBASE);
    953      1.1     skrll   cd->insn_table.num_init_entries = MAX_INSNS;
    954      1.1     skrll }
    955      1.1     skrll 
    956      1.1     skrll /* Subroutine of ip2k_cgen_cpu_open to rebuild the tables.  */
    957      1.1     skrll 
    958      1.1     skrll static void
    959      1.1     skrll ip2k_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
    960      1.1     skrll {
    961      1.1     skrll   int i;
    962      1.1     skrll   CGEN_BITSET *isas = cd->isas;
    963      1.1     skrll   unsigned int machs = cd->machs;
    964      1.1     skrll 
    965      1.1     skrll   cd->int_insn_p = CGEN_INT_INSN_P;
    966      1.1     skrll 
    967      1.1     skrll   /* Data derived from the isa spec.  */
    968      1.1     skrll #define UNSET (CGEN_SIZE_UNKNOWN + 1)
    969      1.1     skrll   cd->default_insn_bitsize = UNSET;
    970      1.1     skrll   cd->base_insn_bitsize = UNSET;
    971      1.1     skrll   cd->min_insn_bitsize = 65535; /* Some ridiculously big number.  */
    972      1.1     skrll   cd->max_insn_bitsize = 0;
    973      1.1     skrll   for (i = 0; i < MAX_ISAS; ++i)
    974      1.1     skrll     if (cgen_bitset_contains (isas, i))
    975      1.1     skrll       {
    976      1.1     skrll 	const CGEN_ISA *isa = & ip2k_cgen_isa_table[i];
    977      1.1     skrll 
    978      1.1     skrll 	/* Default insn sizes of all selected isas must be
    979      1.1     skrll 	   equal or we set the result to 0, meaning "unknown".  */
    980      1.1     skrll 	if (cd->default_insn_bitsize == UNSET)
    981      1.1     skrll 	  cd->default_insn_bitsize = isa->default_insn_bitsize;
    982      1.1     skrll 	else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
    983      1.1     skrll 	  ; /* This is ok.  */
    984      1.1     skrll 	else
    985      1.1     skrll 	  cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
    986      1.1     skrll 
    987      1.1     skrll 	/* Base insn sizes of all selected isas must be equal
    988      1.1     skrll 	   or we set the result to 0, meaning "unknown".  */
    989      1.1     skrll 	if (cd->base_insn_bitsize == UNSET)
    990      1.1     skrll 	  cd->base_insn_bitsize = isa->base_insn_bitsize;
    991      1.1     skrll 	else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
    992      1.1     skrll 	  ; /* This is ok.  */
    993      1.1     skrll 	else
    994      1.1     skrll 	  cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
    995      1.1     skrll 
    996      1.1     skrll 	/* Set min,max insn sizes.  */
    997      1.1     skrll 	if (isa->min_insn_bitsize < cd->min_insn_bitsize)
    998      1.1     skrll 	  cd->min_insn_bitsize = isa->min_insn_bitsize;
    999      1.1     skrll 	if (isa->max_insn_bitsize > cd->max_insn_bitsize)
   1000      1.1     skrll 	  cd->max_insn_bitsize = isa->max_insn_bitsize;
   1001      1.1     skrll       }
   1002      1.1     skrll 
   1003      1.1     skrll   /* Data derived from the mach spec.  */
   1004      1.1     skrll   for (i = 0; i < MAX_MACHS; ++i)
   1005      1.1     skrll     if (((1 << i) & machs) != 0)
   1006      1.1     skrll       {
   1007      1.1     skrll 	const CGEN_MACH *mach = & ip2k_cgen_mach_table[i];
   1008      1.1     skrll 
   1009      1.1     skrll 	if (mach->insn_chunk_bitsize != 0)
   1010      1.1     skrll 	{
   1011      1.1     skrll 	  if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
   1012      1.1     skrll 	    {
   1013  1.1.1.6  christos 	      opcodes_error_handler
   1014  1.1.1.6  christos 		(/* xgettext:c-format */
   1015  1.1.1.6  christos 		 _("internal error: ip2k_cgen_rebuild_tables: "
   1016  1.1.1.6  christos 		   "conflicting insn-chunk-bitsize values: `%d' vs. `%d'"),
   1017  1.1.1.6  christos 		 cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
   1018      1.1     skrll 	      abort ();
   1019      1.1     skrll 	    }
   1020      1.1     skrll 
   1021      1.1     skrll  	  cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
   1022      1.1     skrll 	}
   1023      1.1     skrll       }
   1024      1.1     skrll 
   1025      1.1     skrll   /* Determine which hw elements are used by MACH.  */
   1026      1.1     skrll   build_hw_table (cd);
   1027      1.1     skrll 
   1028      1.1     skrll   /* Build the ifield table.  */
   1029      1.1     skrll   build_ifield_table (cd);
   1030      1.1     skrll 
   1031      1.1     skrll   /* Determine which operands are used by MACH/ISA.  */
   1032      1.1     skrll   build_operand_table (cd);
   1033      1.1     skrll 
   1034      1.1     skrll   /* Build the instruction table.  */
   1035      1.1     skrll   build_insn_table (cd);
   1036      1.1     skrll }
   1037      1.1     skrll 
   1038      1.1     skrll /* Initialize a cpu table and return a descriptor.
   1039      1.1     skrll    It's much like opening a file, and must be the first function called.
   1040      1.1     skrll    The arguments are a set of (type/value) pairs, terminated with
   1041      1.1     skrll    CGEN_CPU_OPEN_END.
   1042      1.1     skrll 
   1043      1.1     skrll    Currently supported values:
   1044      1.1     skrll    CGEN_CPU_OPEN_ISAS:    bitmap of values in enum isa_attr
   1045      1.1     skrll    CGEN_CPU_OPEN_MACHS:   bitmap of values in enum mach_attr
   1046      1.1     skrll    CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
   1047      1.1     skrll    CGEN_CPU_OPEN_ENDIAN:  specify endian choice
   1048      1.1     skrll    CGEN_CPU_OPEN_END:     terminates arguments
   1049      1.1     skrll 
   1050      1.1     skrll    ??? Simultaneous multiple isas might not make sense, but it's not (yet)
   1051  1.1.1.2  christos    precluded.  */
   1052      1.1     skrll 
   1053      1.1     skrll CGEN_CPU_DESC
   1054      1.1     skrll ip2k_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
   1055      1.1     skrll {
   1056      1.1     skrll   CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
   1057      1.1     skrll   static int init_p;
   1058      1.1     skrll   CGEN_BITSET *isas = 0;  /* 0 = "unspecified" */
   1059      1.1     skrll   unsigned int machs = 0; /* 0 = "unspecified" */
   1060      1.1     skrll   enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
   1061      1.1     skrll   va_list ap;
   1062      1.1     skrll 
   1063      1.1     skrll   if (! init_p)
   1064      1.1     skrll     {
   1065      1.1     skrll       init_tables ();
   1066      1.1     skrll       init_p = 1;
   1067      1.1     skrll     }
   1068      1.1     skrll 
   1069      1.1     skrll   memset (cd, 0, sizeof (*cd));
   1070      1.1     skrll 
   1071      1.1     skrll   va_start (ap, arg_type);
   1072      1.1     skrll   while (arg_type != CGEN_CPU_OPEN_END)
   1073      1.1     skrll     {
   1074      1.1     skrll       switch (arg_type)
   1075      1.1     skrll 	{
   1076      1.1     skrll 	case CGEN_CPU_OPEN_ISAS :
   1077      1.1     skrll 	  isas = va_arg (ap, CGEN_BITSET *);
   1078      1.1     skrll 	  break;
   1079      1.1     skrll 	case CGEN_CPU_OPEN_MACHS :
   1080      1.1     skrll 	  machs = va_arg (ap, unsigned int);
   1081      1.1     skrll 	  break;
   1082      1.1     skrll 	case CGEN_CPU_OPEN_BFDMACH :
   1083      1.1     skrll 	  {
   1084      1.1     skrll 	    const char *name = va_arg (ap, const char *);
   1085      1.1     skrll 	    const CGEN_MACH *mach =
   1086      1.1     skrll 	      lookup_mach_via_bfd_name (ip2k_cgen_mach_table, name);
   1087      1.1     skrll 
   1088  1.1.1.5  christos 	    if (mach != NULL)
   1089  1.1.1.5  christos 	      machs |= 1 << mach->num;
   1090      1.1     skrll 	    break;
   1091      1.1     skrll 	  }
   1092      1.1     skrll 	case CGEN_CPU_OPEN_ENDIAN :
   1093      1.1     skrll 	  endian = va_arg (ap, enum cgen_endian);
   1094      1.1     skrll 	  break;
   1095      1.1     skrll 	default :
   1096  1.1.1.6  christos 	  opcodes_error_handler
   1097  1.1.1.6  christos 	    (/* xgettext:c-format */
   1098  1.1.1.6  christos 	     _("internal error: ip2k_cgen_cpu_open: "
   1099  1.1.1.6  christos 	       "unsupported argument `%d'"),
   1100  1.1.1.6  christos 	     arg_type);
   1101      1.1     skrll 	  abort (); /* ??? return NULL? */
   1102      1.1     skrll 	}
   1103      1.1     skrll       arg_type = va_arg (ap, enum cgen_cpu_open_arg);
   1104      1.1     skrll     }
   1105      1.1     skrll   va_end (ap);
   1106      1.1     skrll 
   1107      1.1     skrll   /* Mach unspecified means "all".  */
   1108      1.1     skrll   if (machs == 0)
   1109      1.1     skrll     machs = (1 << MAX_MACHS) - 1;
   1110      1.1     skrll   /* Base mach is always selected.  */
   1111      1.1     skrll   machs |= 1;
   1112      1.1     skrll   if (endian == CGEN_ENDIAN_UNKNOWN)
   1113      1.1     skrll     {
   1114      1.1     skrll       /* ??? If target has only one, could have a default.  */
   1115  1.1.1.6  christos       opcodes_error_handler
   1116  1.1.1.6  christos 	(/* xgettext:c-format */
   1117  1.1.1.6  christos 	 _("internal error: ip2k_cgen_cpu_open: no endianness specified"));
   1118      1.1     skrll       abort ();
   1119      1.1     skrll     }
   1120      1.1     skrll 
   1121      1.1     skrll   cd->isas = cgen_bitset_copy (isas);
   1122      1.1     skrll   cd->machs = machs;
   1123      1.1     skrll   cd->endian = endian;
   1124      1.1     skrll   /* FIXME: for the sparc case we can determine insn-endianness statically.
   1125      1.1     skrll      The worry here is where both data and insn endian can be independently
   1126      1.1     skrll      chosen, in which case this function will need another argument.
   1127      1.1     skrll      Actually, will want to allow for more arguments in the future anyway.  */
   1128      1.1     skrll   cd->insn_endian = endian;
   1129      1.1     skrll 
   1130      1.1     skrll   /* Table (re)builder.  */
   1131      1.1     skrll   cd->rebuild_tables = ip2k_cgen_rebuild_tables;
   1132      1.1     skrll   ip2k_cgen_rebuild_tables (cd);
   1133      1.1     skrll 
   1134      1.1     skrll   /* Default to not allowing signed overflow.  */
   1135      1.1     skrll   cd->signed_overflow_ok_p = 0;
   1136  1.1.1.3  christos 
   1137      1.1     skrll   return (CGEN_CPU_DESC) cd;
   1138      1.1     skrll }
   1139      1.1     skrll 
   1140      1.1     skrll /* Cover fn to ip2k_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
   1141      1.1     skrll    MACH_NAME is the bfd name of the mach.  */
   1142      1.1     skrll 
   1143      1.1     skrll CGEN_CPU_DESC
   1144      1.1     skrll ip2k_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
   1145      1.1     skrll {
   1146      1.1     skrll   return ip2k_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
   1147      1.1     skrll 			       CGEN_CPU_OPEN_ENDIAN, endian,
   1148      1.1     skrll 			       CGEN_CPU_OPEN_END);
   1149      1.1     skrll }
   1150      1.1     skrll 
   1151      1.1     skrll /* Close a cpu table.
   1152      1.1     skrll    ??? This can live in a machine independent file, but there's currently
   1153      1.1     skrll    no place to put this file (there's no libcgen).  libopcodes is the wrong
   1154      1.1     skrll    place as some simulator ports use this but they don't use libopcodes.  */
   1155      1.1     skrll 
   1156      1.1     skrll void
   1157      1.1     skrll ip2k_cgen_cpu_close (CGEN_CPU_DESC cd)
   1158      1.1     skrll {
   1159      1.1     skrll   unsigned int i;
   1160      1.1     skrll   const CGEN_INSN *insns;
   1161      1.1     skrll 
   1162      1.1     skrll   if (cd->macro_insn_table.init_entries)
   1163      1.1     skrll     {
   1164      1.1     skrll       insns = cd->macro_insn_table.init_entries;
   1165      1.1     skrll       for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
   1166      1.1     skrll 	if (CGEN_INSN_RX ((insns)))
   1167      1.1     skrll 	  regfree (CGEN_INSN_RX (insns));
   1168      1.1     skrll     }
   1169      1.1     skrll 
   1170      1.1     skrll   if (cd->insn_table.init_entries)
   1171      1.1     skrll     {
   1172      1.1     skrll       insns = cd->insn_table.init_entries;
   1173      1.1     skrll       for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
   1174      1.1     skrll 	if (CGEN_INSN_RX (insns))
   1175      1.1     skrll 	  regfree (CGEN_INSN_RX (insns));
   1176  1.1.1.3  christos     }
   1177      1.1     skrll 
   1178      1.1     skrll   if (cd->macro_insn_table.init_entries)
   1179      1.1     skrll     free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
   1180      1.1     skrll 
   1181      1.1     skrll   if (cd->insn_table.init_entries)
   1182      1.1     skrll     free ((CGEN_INSN *) cd->insn_table.init_entries);
   1183      1.1     skrll 
   1184      1.1     skrll   if (cd->hw_table.entries)
   1185      1.1     skrll     free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
   1186      1.1     skrll 
   1187      1.1     skrll   if (cd->operand_table.entries)
   1188      1.1     skrll     free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
   1189      1.1     skrll 
   1190      1.1     skrll   free (cd);
   1191      1.1     skrll }
   1192      1.1     skrll 
   1193