00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "sysdep.h"
00030 #include <stdio.h>
00031 #include <stdarg.h>
00032 #include "ansidecl.h"
00033 #include "bfd.h"
00034 #include "symcat.h"
00035 #include "ip2k-desc.h"
00036 #include "ip2k-opc.h"
00037 #include "opintl.h"
00038 #include "libiberty.h"
00039 #include "xregex.h"
00040
00041
00042
00043 static const CGEN_ATTR_ENTRY bool_attr[] =
00044 {
00045 { "#f", 0 },
00046 { "#t", 1 },
00047 { 0, 0 }
00048 };
00049
00050 static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
00051 {
00052 { "base", MACH_BASE },
00053 { "ip2022", MACH_IP2022 },
00054 { "ip2022ext", MACH_IP2022EXT },
00055 { "max", MACH_MAX },
00056 { 0, 0 }
00057 };
00058
00059 static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
00060 {
00061 { "ip2k", ISA_IP2K },
00062 { "max", ISA_MAX },
00063 { 0, 0 }
00064 };
00065
00066 const CGEN_ATTR_TABLE ip2k_cgen_ifield_attr_table[] =
00067 {
00068 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00069 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00070 { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
00071 { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
00072 { "RESERVED", &bool_attr[0], &bool_attr[0] },
00073 { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
00074 { "SIGNED", &bool_attr[0], &bool_attr[0] },
00075 { 0, 0, 0 }
00076 };
00077
00078 const CGEN_ATTR_TABLE ip2k_cgen_hardware_attr_table[] =
00079 {
00080 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00081 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00082 { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
00083 { "PC", &bool_attr[0], &bool_attr[0] },
00084 { "PROFILE", &bool_attr[0], &bool_attr[0] },
00085 { 0, 0, 0 }
00086 };
00087
00088 const CGEN_ATTR_TABLE ip2k_cgen_operand_attr_table[] =
00089 {
00090 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00091 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00092 { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
00093 { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
00094 { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
00095 { "SIGNED", &bool_attr[0], &bool_attr[0] },
00096 { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
00097 { "RELAX", &bool_attr[0], &bool_attr[0] },
00098 { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
00099 { 0, 0, 0 }
00100 };
00101
00102 const CGEN_ATTR_TABLE ip2k_cgen_insn_attr_table[] =
00103 {
00104 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00105 { "ALIAS", &bool_attr[0], &bool_attr[0] },
00106 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00107 { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
00108 { "COND-CTI", &bool_attr[0], &bool_attr[0] },
00109 { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
00110 { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
00111 { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
00112 { "RELAXED", &bool_attr[0], &bool_attr[0] },
00113 { "NO-DIS", &bool_attr[0], &bool_attr[0] },
00114 { "PBB", &bool_attr[0], &bool_attr[0] },
00115 { "EXT-SKIP-INSN", &bool_attr[0], &bool_attr[0] },
00116 { "SKIPA", &bool_attr[0], &bool_attr[0] },
00117 { 0, 0, 0 }
00118 };
00119
00120
00121
00122 static const CGEN_ISA ip2k_cgen_isa_table[] = {
00123 { "ip2k", 16, 16, 16, 16 },
00124 { 0, 0, 0, 0, 0 }
00125 };
00126
00127
00128
00129 static const CGEN_MACH ip2k_cgen_mach_table[] = {
00130 { "ip2022", "ip2022", MACH_IP2022, 0 },
00131 { "ip2022ext", "ip2022ext", MACH_IP2022EXT, 0 },
00132 { 0, 0, 0, 0 }
00133 };
00134
00135 static CGEN_KEYWORD_ENTRY ip2k_cgen_opval_register_names_entries[] =
00136 {
00137 { "ADDRSEL", 2, {0, {0}}, 0, 0 },
00138 { "ADDRX", 3, {0, {0}}, 0, 0 },
00139 { "IPH", 4, {0, {0}}, 0, 0 },
00140 { "IPL", 5, {0, {0}}, 0, 0 },
00141 { "SPH", 6, {0, {0}}, 0, 0 },
00142 { "SPL", 7, {0, {0}}, 0, 0 },
00143 { "PCH", 8, {0, {0}}, 0, 0 },
00144 { "PCL", 9, {0, {0}}, 0, 0 },
00145 { "WREG", 10, {0, {0}}, 0, 0 },
00146 { "STATUS", 11, {0, {0}}, 0, 0 },
00147 { "DPH", 12, {0, {0}}, 0, 0 },
00148 { "DPL", 13, {0, {0}}, 0, 0 },
00149 { "SPDREG", 14, {0, {0}}, 0, 0 },
00150 { "MULH", 15, {0, {0}}, 0, 0 },
00151 { "ADDRH", 16, {0, {0}}, 0, 0 },
00152 { "ADDRL", 17, {0, {0}}, 0, 0 },
00153 { "DATAH", 18, {0, {0}}, 0, 0 },
00154 { "DATAL", 19, {0, {0}}, 0, 0 },
00155 { "INTVECH", 20, {0, {0}}, 0, 0 },
00156 { "INTVECL", 21, {0, {0}}, 0, 0 },
00157 { "INTSPD", 22, {0, {0}}, 0, 0 },
00158 { "INTF", 23, {0, {0}}, 0, 0 },
00159 { "INTE", 24, {0, {0}}, 0, 0 },
00160 { "INTED", 25, {0, {0}}, 0, 0 },
00161 { "FCFG", 26, {0, {0}}, 0, 0 },
00162 { "TCTRL", 27, {0, {0}}, 0, 0 },
00163 { "XCFG", 28, {0, {0}}, 0, 0 },
00164 { "EMCFG", 29, {0, {0}}, 0, 0 },
00165 { "IPCH", 30, {0, {0}}, 0, 0 },
00166 { "IPCL", 31, {0, {0}}, 0, 0 },
00167 { "RAIN", 32, {0, {0}}, 0, 0 },
00168 { "RAOUT", 33, {0, {0}}, 0, 0 },
00169 { "RADIR", 34, {0, {0}}, 0, 0 },
00170 { "LFSRH", 35, {0, {0}}, 0, 0 },
00171 { "RBIN", 36, {0, {0}}, 0, 0 },
00172 { "RBOUT", 37, {0, {0}}, 0, 0 },
00173 { "RBDIR", 38, {0, {0}}, 0, 0 },
00174 { "LFSRL", 39, {0, {0}}, 0, 0 },
00175 { "RCIN", 40, {0, {0}}, 0, 0 },
00176 { "RCOUT", 41, {0, {0}}, 0, 0 },
00177 { "RCDIR", 42, {0, {0}}, 0, 0 },
00178 { "LFSRA", 43, {0, {0}}, 0, 0 },
00179 { "RDIN", 44, {0, {0}}, 0, 0 },
00180 { "RDOUT", 45, {0, {0}}, 0, 0 },
00181 { "RDDIR", 46, {0, {0}}, 0, 0 },
00182 { "REIN", 48, {0, {0}}, 0, 0 },
00183 { "REOUT", 49, {0, {0}}, 0, 0 },
00184 { "REDIR", 50, {0, {0}}, 0, 0 },
00185 { "RFIN", 52, {0, {0}}, 0, 0 },
00186 { "RFOUT", 53, {0, {0}}, 0, 0 },
00187 { "RFDIR", 54, {0, {0}}, 0, 0 },
00188 { "RGOUT", 57, {0, {0}}, 0, 0 },
00189 { "RGDIR", 58, {0, {0}}, 0, 0 },
00190 { "RTTMR", 64, {0, {0}}, 0, 0 },
00191 { "RTCFG", 65, {0, {0}}, 0, 0 },
00192 { "T0TMR", 66, {0, {0}}, 0, 0 },
00193 { "T0CFG", 67, {0, {0}}, 0, 0 },
00194 { "T1CNTH", 68, {0, {0}}, 0, 0 },
00195 { "T1CNTL", 69, {0, {0}}, 0, 0 },
00196 { "T1CAP1H", 70, {0, {0}}, 0, 0 },
00197 { "T1CAP1L", 71, {0, {0}}, 0, 0 },
00198 { "T1CAP2H", 72, {0, {0}}, 0, 0 },
00199 { "T1CMP2H", 72, {0, {0}}, 0, 0 },
00200 { "T1CAP2L", 73, {0, {0}}, 0, 0 },
00201 { "T1CMP2L", 73, {0, {0}}, 0, 0 },
00202 { "T1CMP1H", 74, {0, {0}}, 0, 0 },
00203 { "T1CMP1L", 75, {0, {0}}, 0, 0 },
00204 { "T1CFG1H", 76, {0, {0}}, 0, 0 },
00205 { "T1CFG1L", 77, {0, {0}}, 0, 0 },
00206 { "T1CFG2H", 78, {0, {0}}, 0, 0 },
00207 { "T1CFG2L", 79, {0, {0}}, 0, 0 },
00208 { "ADCH", 80, {0, {0}}, 0, 0 },
00209 { "ADCL", 81, {0, {0}}, 0, 0 },
00210 { "ADCCFG", 82, {0, {0}}, 0, 0 },
00211 { "ADCTMR", 83, {0, {0}}, 0, 0 },
00212 { "T2CNTH", 84, {0, {0}}, 0, 0 },
00213 { "T2CNTL", 85, {0, {0}}, 0, 0 },
00214 { "T2CAP1H", 86, {0, {0}}, 0, 0 },
00215 { "T2CAP1L", 87, {0, {0}}, 0, 0 },
00216 { "T2CAP2H", 88, {0, {0}}, 0, 0 },
00217 { "T2CMP2H", 88, {0, {0}}, 0, 0 },
00218 { "T2CAP2L", 89, {0, {0}}, 0, 0 },
00219 { "T2CMP2L", 89, {0, {0}}, 0, 0 },
00220 { "T2CMP1H", 90, {0, {0}}, 0, 0 },
00221 { "T2CMP1L", 91, {0, {0}}, 0, 0 },
00222 { "T2CFG1H", 92, {0, {0}}, 0, 0 },
00223 { "T2CFG1L", 93, {0, {0}}, 0, 0 },
00224 { "T2CFG2H", 94, {0, {0}}, 0, 0 },
00225 { "T2CFG2L", 95, {0, {0}}, 0, 0 },
00226 { "S1TMRH", 96, {0, {0}}, 0, 0 },
00227 { "S1TMRL", 97, {0, {0}}, 0, 0 },
00228 { "S1TBUFH", 98, {0, {0}}, 0, 0 },
00229 { "S1TBUFL", 99, {0, {0}}, 0, 0 },
00230 { "S1TCFG", 100, {0, {0}}, 0, 0 },
00231 { "S1RCNT", 101, {0, {0}}, 0, 0 },
00232 { "S1RBUFH", 102, {0, {0}}, 0, 0 },
00233 { "S1RBUFL", 103, {0, {0}}, 0, 0 },
00234 { "S1RCFG", 104, {0, {0}}, 0, 0 },
00235 { "S1RSYNC", 105, {0, {0}}, 0, 0 },
00236 { "S1INTF", 106, {0, {0}}, 0, 0 },
00237 { "S1INTE", 107, {0, {0}}, 0, 0 },
00238 { "S1MODE", 108, {0, {0}}, 0, 0 },
00239 { "S1SMASK", 109, {0, {0}}, 0, 0 },
00240 { "PSPCFG", 110, {0, {0}}, 0, 0 },
00241 { "CMPCFG", 111, {0, {0}}, 0, 0 },
00242 { "S2TMRH", 112, {0, {0}}, 0, 0 },
00243 { "S2TMRL", 113, {0, {0}}, 0, 0 },
00244 { "S2TBUFH", 114, {0, {0}}, 0, 0 },
00245 { "S2TBUFL", 115, {0, {0}}, 0, 0 },
00246 { "S2TCFG", 116, {0, {0}}, 0, 0 },
00247 { "S2RCNT", 117, {0, {0}}, 0, 0 },
00248 { "S2RBUFH", 118, {0, {0}}, 0, 0 },
00249 { "S2RBUFL", 119, {0, {0}}, 0, 0 },
00250 { "S2RCFG", 120, {0, {0}}, 0, 0 },
00251 { "S2RSYNC", 121, {0, {0}}, 0, 0 },
00252 { "S2INTF", 122, {0, {0}}, 0, 0 },
00253 { "S2INTE", 123, {0, {0}}, 0, 0 },
00254 { "S2MODE", 124, {0, {0}}, 0, 0 },
00255 { "S2SMASK", 125, {0, {0}}, 0, 0 },
00256 { "CALLH", 126, {0, {0}}, 0, 0 },
00257 { "CALLL", 127, {0, {0}}, 0, 0 }
00258 };
00259
00260 CGEN_KEYWORD ip2k_cgen_opval_register_names =
00261 {
00262 & ip2k_cgen_opval_register_names_entries[0],
00263 121,
00264 0, 0, 0, 0, ""
00265 };
00266
00267
00268
00269
00270 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00271 #define A(a) (1 << CGEN_HW_##a)
00272 #else
00273 #define A(a) (1 << CGEN_HW_a)
00274 #endif
00275
00276 const CGEN_HW_ENTRY ip2k_cgen_hw_table[] =
00277 {
00278 { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00279 { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00280 { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00281 { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00282 { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00283 { "h-spr", HW_H_SPR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00284 { "h-registers", HW_H_REGISTERS, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00285 { "h-stack", HW_H_STACK, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00286 { "h-pabits", HW_H_PABITS, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00287 { "h-zbit", HW_H_ZBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00288 { "h-cbit", HW_H_CBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00289 { "h-dcbit", HW_H_DCBIT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00290 { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { (1<<MACH_BASE) } } },
00291 { 0, 0, CGEN_ASM_NONE, 0, {0, {0}} }
00292 };
00293
00294 #undef A
00295
00296
00297
00298
00299 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00300 #define A(a) (1 << CGEN_IFLD_##a)
00301 #else
00302 #define A(a) (1 << CGEN_IFLD_a)
00303 #endif
00304
00305 const CGEN_IFLD ip2k_cgen_ifld_table[] =
00306 {
00307 { IP2K_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } } },
00308 { IP2K_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } } },
00309 { IP2K_F_IMM8, "f-imm8", 0, 16, 7, 8, { 0, { (1<<MACH_BASE) } } },
00310 { IP2K_F_REG, "f-reg", 0, 16, 8, 9, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00311 { IP2K_F_ADDR16CJP, "f-addr16cjp", 0, 16, 12, 13, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00312 { IP2K_F_DIR, "f-dir", 0, 16, 9, 1, { 0, { (1<<MACH_BASE) } } },
00313 { IP2K_F_BITNO, "f-bitno", 0, 16, 11, 3, { 0, { (1<<MACH_BASE) } } },
00314 { IP2K_F_OP3, "f-op3", 0, 16, 15, 3, { 0, { (1<<MACH_BASE) } } },
00315 { IP2K_F_OP4, "f-op4", 0, 16, 15, 4, { 0, { (1<<MACH_BASE) } } },
00316 { IP2K_F_OP4MID, "f-op4mid", 0, 16, 11, 4, { 0, { (1<<MACH_BASE) } } },
00317 { IP2K_F_OP6, "f-op6", 0, 16, 15, 6, { 0, { (1<<MACH_BASE) } } },
00318 { IP2K_F_OP8, "f-op8", 0, 16, 15, 8, { 0, { (1<<MACH_BASE) } } },
00319 { IP2K_F_OP6_10LOW, "f-op6-10low", 0, 16, 9, 10, { 0, { (1<<MACH_BASE) } } },
00320 { IP2K_F_OP6_7LOW, "f-op6-7low", 0, 16, 9, 7, { 0, { (1<<MACH_BASE) } } },
00321 { IP2K_F_RETI3, "f-reti3", 0, 16, 2, 3, { 0, { (1<<MACH_BASE) } } },
00322 { IP2K_F_SKIPB, "f-skipb", 0, 16, 12, 1, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00323 { IP2K_F_PAGE3, "f-page3", 0, 16, 2, 3, { 0, { (1<<MACH_BASE) } } },
00324 { 0, 0, 0, 0, 0, 0, {0, {0}} }
00325 };
00326
00327 #undef A
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00341 #define A(a) (1 << CGEN_OPERAND_##a)
00342 #else
00343 #define A(a) (1 << CGEN_OPERAND_a)
00344 #endif
00345 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00346 #define OPERAND(op) IP2K_OPERAND_##op
00347 #else
00348 #define OPERAND(op) IP2K_OPERAND_op
00349 #endif
00350
00351 const CGEN_OPERAND ip2k_cgen_operand_table[] =
00352 {
00353
00354 { "pc", IP2K_OPERAND_PC, HW_H_PC, 0, 0,
00355 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_NIL] } },
00356 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00357
00358 { "addr16cjp", IP2K_OPERAND_ADDR16CJP, HW_H_UINT, 12, 13,
00359 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_ADDR16CJP] } },
00360 { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00361
00362 { "fr", IP2K_OPERAND_FR, HW_H_REGISTERS, 8, 9,
00363 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_REG] } },
00364 { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00365
00366 { "lit8", IP2K_OPERAND_LIT8, HW_H_SINT, 7, 8,
00367 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
00368 { 0, { (1<<MACH_BASE) } } },
00369
00370 { "bitno", IP2K_OPERAND_BITNO, HW_H_UINT, 11, 3,
00371 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_BITNO] } },
00372 { 0, { (1<<MACH_BASE) } } },
00373
00374 { "addr16p", IP2K_OPERAND_ADDR16P, HW_H_UINT, 2, 3,
00375 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_PAGE3] } },
00376 { 0, { (1<<MACH_BASE) } } },
00377
00378 { "addr16h", IP2K_OPERAND_ADDR16H, HW_H_UINT, 7, 8,
00379 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
00380 { 0, { (1<<MACH_BASE) } } },
00381
00382 { "addr16l", IP2K_OPERAND_ADDR16L, HW_H_UINT, 7, 8,
00383 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
00384 { 0, { (1<<MACH_BASE) } } },
00385
00386 { "reti3", IP2K_OPERAND_RETI3, HW_H_UINT, 2, 3,
00387 { 0, { (const PTR) &ip2k_cgen_ifld_table[IP2K_F_RETI3] } },
00388 { 0, { (1<<MACH_BASE) } } },
00389
00390 { "pabits", IP2K_OPERAND_PABITS, HW_H_PABITS, 0, 0,
00391 { 0, { (const PTR) 0 } },
00392 { 0, { (1<<MACH_BASE) } } },
00393
00394 { "zbit", IP2K_OPERAND_ZBIT, HW_H_ZBIT, 0, 0,
00395 { 0, { (const PTR) 0 } },
00396 { 0, { (1<<MACH_BASE) } } },
00397
00398 { "cbit", IP2K_OPERAND_CBIT, HW_H_CBIT, 0, 0,
00399 { 0, { (const PTR) 0 } },
00400 { 0, { (1<<MACH_BASE) } } },
00401
00402 { "dcbit", IP2K_OPERAND_DCBIT, HW_H_DCBIT, 0, 0,
00403 { 0, { (const PTR) 0 } },
00404 { 0, { (1<<MACH_BASE) } } },
00405
00406 { 0, 0, 0, 0, 0,
00407 { 0, { (const PTR) 0 } },
00408 { 0, { 0 } } }
00409 };
00410
00411 #undef A
00412
00413
00414
00415
00416 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00417 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00418 #define A(a) (1 << CGEN_INSN_##a)
00419 #else
00420 #define A(a) (1 << CGEN_INSN_a)
00421 #endif
00422
00423 static const CGEN_IBASE ip2k_cgen_insn_table[MAX_INSNS] =
00424 {
00425
00426
00427
00428 { 0, 0, 0, 0, {0, {0}} },
00429
00430 {
00431 IP2K_INSN_JMP, "jmp", "jmp", 16,
00432 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
00433 },
00434
00435 {
00436 IP2K_INSN_CALL, "call", "call", 16,
00437 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
00438 },
00439
00440 {
00441 IP2K_INSN_SB, "sb", "sb", 16,
00442 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00443 },
00444
00445 {
00446 IP2K_INSN_SNB, "snb", "snb", 16,
00447 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00448 },
00449
00450 {
00451 IP2K_INSN_SETB, "setb", "setb", 16,
00452 { 0, { (1<<MACH_BASE) } }
00453 },
00454
00455 {
00456 IP2K_INSN_CLRB, "clrb", "clrb", 16,
00457 { 0, { (1<<MACH_BASE) } }
00458 },
00459
00460 {
00461 IP2K_INSN_XORW_L, "xorw_l", "xor", 16,
00462 { 0, { (1<<MACH_BASE) } }
00463 },
00464
00465 {
00466 IP2K_INSN_ANDW_L, "andw_l", "and", 16,
00467 { 0, { (1<<MACH_BASE) } }
00468 },
00469
00470 {
00471 IP2K_INSN_ORW_L, "orw_l", "or", 16,
00472 { 0, { (1<<MACH_BASE) } }
00473 },
00474
00475 {
00476 IP2K_INSN_ADDW_L, "addw_l", "add", 16,
00477 { 0, { (1<<MACH_BASE) } }
00478 },
00479
00480 {
00481 IP2K_INSN_SUBW_L, "subw_l", "sub", 16,
00482 { 0, { (1<<MACH_BASE) } }
00483 },
00484
00485 {
00486 IP2K_INSN_CMPW_L, "cmpw_l", "cmp", 16,
00487 { 0, { (1<<MACH_BASE) } }
00488 },
00489
00490 {
00491 IP2K_INSN_RETW_L, "retw_l", "retw", 16,
00492 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
00493 },
00494
00495 {
00496 IP2K_INSN_CSEW_L, "csew_l", "cse", 16,
00497 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00498 },
00499
00500 {
00501 IP2K_INSN_CSNEW_L, "csnew_l", "csne", 16,
00502 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00503 },
00504
00505 {
00506 IP2K_INSN_PUSH_L, "push_l", "push", 16,
00507 { 0, { (1<<MACH_BASE) } }
00508 },
00509
00510 {
00511 IP2K_INSN_MULSW_L, "mulsw_l", "muls", 16,
00512 { 0, { (1<<MACH_BASE) } }
00513 },
00514
00515 {
00516 IP2K_INSN_MULUW_L, "muluw_l", "mulu", 16,
00517 { 0, { (1<<MACH_BASE) } }
00518 },
00519
00520 {
00521 IP2K_INSN_LOADL_L, "loadl_l", "loadl", 16,
00522 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00523 },
00524
00525 {
00526 IP2K_INSN_LOADH_L, "loadh_l", "loadh", 16,
00527 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00528 },
00529
00530 {
00531 IP2K_INSN_LOADL_A, "loadl_a", "loadl", 16,
00532 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00533 },
00534
00535 {
00536 IP2K_INSN_LOADH_A, "loadh_a", "loadh", 16,
00537 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00538 },
00539
00540 {
00541 IP2K_INSN_ADDCFR_W, "addcfr_w", "addc", 16,
00542 { 0, { (1<<MACH_BASE) } }
00543 },
00544
00545 {
00546 IP2K_INSN_ADDCW_FR, "addcw_fr", "addc", 16,
00547 { 0, { (1<<MACH_BASE) } }
00548 },
00549
00550 {
00551 IP2K_INSN_INCSNZ_FR, "incsnz_fr", "incsnz", 16,
00552 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00553 },
00554
00555 {
00556 IP2K_INSN_INCSNZW_FR, "incsnzw_fr", "incsnz", 16,
00557 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00558 },
00559
00560 {
00561 IP2K_INSN_MULSW_FR, "mulsw_fr", "muls", 16,
00562 { 0, { (1<<MACH_BASE) } }
00563 },
00564
00565 {
00566 IP2K_INSN_MULUW_FR, "muluw_fr", "mulu", 16,
00567 { 0, { (1<<MACH_BASE) } }
00568 },
00569
00570 {
00571 IP2K_INSN_DECSNZ_FR, "decsnz_fr", "decsnz", 16,
00572 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00573 },
00574
00575 {
00576 IP2K_INSN_DECSNZW_FR, "decsnzw_fr", "decsnz", 16,
00577 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00578 },
00579
00580 {
00581 IP2K_INSN_SUBCW_FR, "subcw_fr", "subc", 16,
00582 { 0, { (1<<MACH_BASE) } }
00583 },
00584
00585 {
00586 IP2K_INSN_SUBCFR_W, "subcfr_w", "subc", 16,
00587 { 0, { (1<<MACH_BASE) } }
00588 },
00589
00590 {
00591 IP2K_INSN_POP_FR, "pop_fr", "pop", 16,
00592 { 0, { (1<<MACH_BASE) } }
00593 },
00594
00595 {
00596 IP2K_INSN_PUSH_FR, "push_fr", "push", 16,
00597 { 0, { (1<<MACH_BASE) } }
00598 },
00599
00600 {
00601 IP2K_INSN_CSEW_FR, "csew_fr", "cse", 16,
00602 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00603 },
00604
00605 {
00606 IP2K_INSN_CSNEW_FR, "csnew_fr", "csne", 16,
00607 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00608 },
00609
00610 {
00611 IP2K_INSN_INCSZ_FR, "incsz_fr", "incsz", 16,
00612 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00613 },
00614
00615 {
00616 IP2K_INSN_INCSZW_FR, "incszw_fr", "incsz", 16,
00617 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00618 },
00619
00620 {
00621 IP2K_INSN_SWAP_FR, "swap_fr", "swap", 16,
00622 { 0, { (1<<MACH_BASE) } }
00623 },
00624
00625 {
00626 IP2K_INSN_SWAPW_FR, "swapw_fr", "swap", 16,
00627 { 0, { (1<<MACH_BASE) } }
00628 },
00629
00630 {
00631 IP2K_INSN_RL_FR, "rl_fr", "rl", 16,
00632 { 0, { (1<<MACH_BASE) } }
00633 },
00634
00635 {
00636 IP2K_INSN_RLW_FR, "rlw_fr", "rl", 16,
00637 { 0, { (1<<MACH_BASE) } }
00638 },
00639
00640 {
00641 IP2K_INSN_RR_FR, "rr_fr", "rr", 16,
00642 { 0, { (1<<MACH_BASE) } }
00643 },
00644
00645 {
00646 IP2K_INSN_RRW_FR, "rrw_fr", "rr", 16,
00647 { 0, { (1<<MACH_BASE) } }
00648 },
00649
00650 {
00651 IP2K_INSN_DECSZ_FR, "decsz_fr", "decsz", 16,
00652 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00653 },
00654
00655 {
00656 IP2K_INSN_DECSZW_FR, "decszw_fr", "decsz", 16,
00657 { 0|A(SKIP_CTI), { (1<<MACH_BASE) } }
00658 },
00659
00660 {
00661 IP2K_INSN_INC_FR, "inc_fr", "inc", 16,
00662 { 0, { (1<<MACH_BASE) } }
00663 },
00664
00665 {
00666 IP2K_INSN_INCW_FR, "incw_fr", "inc", 16,
00667 { 0, { (1<<MACH_BASE) } }
00668 },
00669
00670 {
00671 IP2K_INSN_NOT_FR, "not_fr", "not", 16,
00672 { 0, { (1<<MACH_BASE) } }
00673 },
00674
00675 {
00676 IP2K_INSN_NOTW_FR, "notw_fr", "not", 16,
00677 { 0, { (1<<MACH_BASE) } }
00678 },
00679
00680 {
00681 IP2K_INSN_TEST_FR, "test_fr", "test", 16,
00682 { 0, { (1<<MACH_BASE) } }
00683 },
00684
00685 {
00686 IP2K_INSN_MOVW_L, "movw_l", "mov", 16,
00687 { 0, { (1<<MACH_BASE) } }
00688 },
00689
00690 {
00691 IP2K_INSN_MOVFR_W, "movfr_w", "mov", 16,
00692 { 0, { (1<<MACH_BASE) } }
00693 },
00694
00695 {
00696 IP2K_INSN_MOVW_FR, "movw_fr", "mov", 16,
00697 { 0, { (1<<MACH_BASE) } }
00698 },
00699
00700 {
00701 IP2K_INSN_ADDFR_W, "addfr_w", "add", 16,
00702 { 0, { (1<<MACH_BASE) } }
00703 },
00704
00705 {
00706 IP2K_INSN_ADDW_FR, "addw_fr", "add", 16,
00707 { 0, { (1<<MACH_BASE) } }
00708 },
00709
00710 {
00711 IP2K_INSN_XORFR_W, "xorfr_w", "xor", 16,
00712 { 0, { (1<<MACH_BASE) } }
00713 },
00714
00715 {
00716 IP2K_INSN_XORW_FR, "xorw_fr", "xor", 16,
00717 { 0, { (1<<MACH_BASE) } }
00718 },
00719
00720 {
00721 IP2K_INSN_ANDFR_W, "andfr_w", "and", 16,
00722 { 0, { (1<<MACH_BASE) } }
00723 },
00724
00725 {
00726 IP2K_INSN_ANDW_FR, "andw_fr", "and", 16,
00727 { 0, { (1<<MACH_BASE) } }
00728 },
00729
00730 {
00731 IP2K_INSN_ORFR_W, "orfr_w", "or", 16,
00732 { 0, { (1<<MACH_BASE) } }
00733 },
00734
00735 {
00736 IP2K_INSN_ORW_FR, "orw_fr", "or", 16,
00737 { 0, { (1<<MACH_BASE) } }
00738 },
00739
00740 {
00741 IP2K_INSN_DEC_FR, "dec_fr", "dec", 16,
00742 { 0, { (1<<MACH_BASE) } }
00743 },
00744
00745 {
00746 IP2K_INSN_DECW_FR, "decw_fr", "dec", 16,
00747 { 0, { (1<<MACH_BASE) } }
00748 },
00749
00750 {
00751 IP2K_INSN_SUBFR_W, "subfr_w", "sub", 16,
00752 { 0, { (1<<MACH_BASE) } }
00753 },
00754
00755 {
00756 IP2K_INSN_SUBW_FR, "subw_fr", "sub", 16,
00757 { 0, { (1<<MACH_BASE) } }
00758 },
00759
00760 {
00761 IP2K_INSN_CLR_FR, "clr_fr", "clr", 16,
00762 { 0, { (1<<MACH_BASE) } }
00763 },
00764
00765 {
00766 IP2K_INSN_CMPW_FR, "cmpw_fr", "cmp", 16,
00767 { 0, { (1<<MACH_BASE) } }
00768 },
00769
00770 {
00771 IP2K_INSN_SPEED, "speed", "speed", 16,
00772 { 0, { (1<<MACH_BASE) } }
00773 },
00774
00775 {
00776 IP2K_INSN_IREADI, "ireadi", "ireadi", 16,
00777 { 0, { (1<<MACH_BASE) } }
00778 },
00779
00780 {
00781 IP2K_INSN_IWRITEI, "iwritei", "iwritei", 16,
00782 { 0, { (1<<MACH_BASE) } }
00783 },
00784
00785 {
00786 IP2K_INSN_FREAD, "fread", "fread", 16,
00787 { 0, { (1<<MACH_BASE) } }
00788 },
00789
00790 {
00791 IP2K_INSN_FWRITE, "fwrite", "fwrite", 16,
00792 { 0, { (1<<MACH_BASE) } }
00793 },
00794
00795 {
00796 IP2K_INSN_IREAD, "iread", "iread", 16,
00797 { 0, { (1<<MACH_BASE) } }
00798 },
00799
00800 {
00801 IP2K_INSN_IWRITE, "iwrite", "iwrite", 16,
00802 { 0, { (1<<MACH_BASE) } }
00803 },
00804
00805 {
00806 IP2K_INSN_PAGE, "page", "page", 16,
00807 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00808 },
00809
00810 {
00811 IP2K_INSN_SYSTEM, "system", "system", 16,
00812 { 0, { (1<<MACH_BASE) } }
00813 },
00814
00815 {
00816 IP2K_INSN_RETI, "reti", "reti", 16,
00817 { 0, { (1<<MACH_BASE) } }
00818 },
00819
00820 {
00821 IP2K_INSN_RET, "ret", "ret", 16,
00822 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
00823 },
00824
00825 {
00826 IP2K_INSN_INT, "int", "int", 16,
00827 { 0, { (1<<MACH_BASE) } }
00828 },
00829
00830 {
00831 IP2K_INSN_BREAKX, "breakx", "breakx", 16,
00832 { 0|A(EXT_SKIP_INSN), { (1<<MACH_BASE) } }
00833 },
00834
00835 {
00836 IP2K_INSN_CWDT, "cwdt", "cwdt", 16,
00837 { 0, { (1<<MACH_BASE) } }
00838 },
00839
00840 {
00841 IP2K_INSN_FERASE, "ferase", "ferase", 16,
00842 { 0, { (1<<MACH_BASE) } }
00843 },
00844
00845 {
00846 IP2K_INSN_RETNP, "retnp", "retnp", 16,
00847 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
00848 },
00849
00850 {
00851 IP2K_INSN_BREAK, "break", "break", 16,
00852 { 0, { (1<<MACH_BASE) } }
00853 },
00854
00855 {
00856 IP2K_INSN_NOP, "nop", "nop", 16,
00857 { 0, { (1<<MACH_BASE) } }
00858 },
00859 };
00860
00861 #undef OP
00862 #undef A
00863
00864
00865 static void init_tables PARAMS ((void));
00866
00867 static void
00868 init_tables ()
00869 {
00870 }
00871
00872 static const CGEN_MACH * lookup_mach_via_bfd_name
00873 PARAMS ((const CGEN_MACH *, const char *));
00874 static void build_hw_table PARAMS ((CGEN_CPU_TABLE *));
00875 static void build_ifield_table PARAMS ((CGEN_CPU_TABLE *));
00876 static void build_operand_table PARAMS ((CGEN_CPU_TABLE *));
00877 static void build_insn_table PARAMS ((CGEN_CPU_TABLE *));
00878 static void ip2k_cgen_rebuild_tables PARAMS ((CGEN_CPU_TABLE *));
00879
00880
00881
00882 static const CGEN_MACH *
00883 lookup_mach_via_bfd_name (table, name)
00884 const CGEN_MACH *table;
00885 const char *name;
00886 {
00887 while (table->name)
00888 {
00889 if (strcmp (name, table->bfd_name) == 0)
00890 return table;
00891 ++table;
00892 }
00893 abort ();
00894 }
00895
00896
00897
00898 static void
00899 build_hw_table (cd)
00900 CGEN_CPU_TABLE *cd;
00901 {
00902 int i;
00903 int machs = cd->machs;
00904 const CGEN_HW_ENTRY *init = & ip2k_cgen_hw_table[0];
00905
00906
00907
00908 const CGEN_HW_ENTRY **selected =
00909 (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
00910
00911 cd->hw_table.init_entries = init;
00912 cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
00913 memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
00914
00915 for (i = 0; init[i].name != NULL; ++i)
00916 if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
00917 & machs)
00918 selected[init[i].type] = &init[i];
00919 cd->hw_table.entries = selected;
00920 cd->hw_table.num_entries = MAX_HW;
00921 }
00922
00923
00924
00925 static void
00926 build_ifield_table (cd)
00927 CGEN_CPU_TABLE *cd;
00928 {
00929 cd->ifld_table = & ip2k_cgen_ifld_table[0];
00930 }
00931
00932
00933
00934 static void
00935 build_operand_table (cd)
00936 CGEN_CPU_TABLE *cd;
00937 {
00938 int i;
00939 int machs = cd->machs;
00940 const CGEN_OPERAND *init = & ip2k_cgen_operand_table[0];
00941
00942
00943
00944 const CGEN_OPERAND **selected =
00945 (const CGEN_OPERAND **) xmalloc (MAX_OPERANDS * sizeof (CGEN_OPERAND *));
00946
00947 cd->operand_table.init_entries = init;
00948 cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
00949 memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
00950
00951 for (i = 0; init[i].name != NULL; ++i)
00952 if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
00953 & machs)
00954 selected[init[i].type] = &init[i];
00955 cd->operand_table.entries = selected;
00956 cd->operand_table.num_entries = MAX_OPERANDS;
00957 }
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967 static void
00968 build_insn_table (cd)
00969 CGEN_CPU_TABLE *cd;
00970 {
00971 int i;
00972 const CGEN_IBASE *ib = & ip2k_cgen_insn_table[0];
00973 CGEN_INSN *insns = (CGEN_INSN *) xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
00974
00975 memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
00976 for (i = 0; i < MAX_INSNS; ++i)
00977 insns[i].base = &ib[i];
00978 cd->insn_table.init_entries = insns;
00979 cd->insn_table.entry_size = sizeof (CGEN_IBASE);
00980 cd->insn_table.num_init_entries = MAX_INSNS;
00981 }
00982
00983
00984
00985 static void
00986 ip2k_cgen_rebuild_tables (cd)
00987 CGEN_CPU_TABLE *cd;
00988 {
00989 int i;
00990 unsigned int isas = cd->isas;
00991 unsigned int machs = cd->machs;
00992
00993 cd->int_insn_p = CGEN_INT_INSN_P;
00994
00995
00996 #define UNSET (CGEN_SIZE_UNKNOWN + 1)
00997 cd->default_insn_bitsize = UNSET;
00998 cd->base_insn_bitsize = UNSET;
00999 cd->min_insn_bitsize = 65535;
01000 cd->max_insn_bitsize = 0;
01001 for (i = 0; i < MAX_ISAS; ++i)
01002 if (((1 << i) & isas) != 0)
01003 {
01004 const CGEN_ISA *isa = & ip2k_cgen_isa_table[i];
01005
01006
01007
01008 if (cd->default_insn_bitsize == UNSET)
01009 cd->default_insn_bitsize = isa->default_insn_bitsize;
01010 else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
01011 ;
01012 else
01013 cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
01014
01015
01016
01017 if (cd->base_insn_bitsize == UNSET)
01018 cd->base_insn_bitsize = isa->base_insn_bitsize;
01019 else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
01020 ;
01021 else
01022 cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
01023
01024
01025 if (isa->min_insn_bitsize < cd->min_insn_bitsize)
01026 cd->min_insn_bitsize = isa->min_insn_bitsize;
01027 if (isa->max_insn_bitsize > cd->max_insn_bitsize)
01028 cd->max_insn_bitsize = isa->max_insn_bitsize;
01029 }
01030
01031
01032 for (i = 0; i < MAX_MACHS; ++i)
01033 if (((1 << i) & machs) != 0)
01034 {
01035 const CGEN_MACH *mach = & ip2k_cgen_mach_table[i];
01036
01037 if (mach->insn_chunk_bitsize != 0)
01038 {
01039 if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
01040 {
01041 fprintf (stderr, "ip2k_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
01042 cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
01043 abort ();
01044 }
01045
01046 cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
01047 }
01048 }
01049
01050
01051 build_hw_table (cd);
01052
01053
01054 build_ifield_table (cd);
01055
01056
01057 build_operand_table (cd);
01058
01059
01060 build_insn_table (cd);
01061 }
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082 CGEN_CPU_DESC
01083 ip2k_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
01084 {
01085 CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
01086 static int init_p;
01087 unsigned int isas = 0;
01088 unsigned int machs = 0;
01089 enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
01090 va_list ap;
01091
01092 if (! init_p)
01093 {
01094 init_tables ();
01095 init_p = 1;
01096 }
01097
01098 memset (cd, 0, sizeof (*cd));
01099
01100 va_start (ap, arg_type);
01101 while (arg_type != CGEN_CPU_OPEN_END)
01102 {
01103 switch (arg_type)
01104 {
01105 case CGEN_CPU_OPEN_ISAS :
01106 isas = va_arg (ap, unsigned int);
01107 break;
01108 case CGEN_CPU_OPEN_MACHS :
01109 machs = va_arg (ap, unsigned int);
01110 break;
01111 case CGEN_CPU_OPEN_BFDMACH :
01112 {
01113 const char *name = va_arg (ap, const char *);
01114 const CGEN_MACH *mach =
01115 lookup_mach_via_bfd_name (ip2k_cgen_mach_table, name);
01116
01117 machs |= 1 << mach->num;
01118 break;
01119 }
01120 case CGEN_CPU_OPEN_ENDIAN :
01121 endian = va_arg (ap, enum cgen_endian);
01122 break;
01123 default :
01124 fprintf (stderr, "ip2k_cgen_cpu_open: unsupported argument `%d'\n",
01125 arg_type);
01126 abort ();
01127 }
01128 arg_type = va_arg (ap, enum cgen_cpu_open_arg);
01129 }
01130 va_end (ap);
01131
01132
01133 if (machs == 0)
01134 machs = (1 << MAX_MACHS) - 1;
01135
01136 machs |= 1;
01137
01138 if (isas == 0)
01139 isas = (1 << MAX_ISAS) - 1;
01140 if (endian == CGEN_ENDIAN_UNKNOWN)
01141 {
01142
01143 fprintf (stderr, "ip2k_cgen_cpu_open: no endianness specified\n");
01144 abort ();
01145 }
01146
01147 cd->isas = isas;
01148 cd->machs = machs;
01149 cd->endian = endian;
01150
01151
01152
01153
01154 cd->insn_endian = endian;
01155
01156
01157 cd->rebuild_tables = ip2k_cgen_rebuild_tables;
01158 ip2k_cgen_rebuild_tables (cd);
01159
01160
01161 cd->signed_overflow_ok_p = 0;
01162
01163 return (CGEN_CPU_DESC) cd;
01164 }
01165
01166
01167
01168
01169 CGEN_CPU_DESC
01170 ip2k_cgen_cpu_open_1 (mach_name, endian)
01171 const char *mach_name;
01172 enum cgen_endian endian;
01173 {
01174 return ip2k_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
01175 CGEN_CPU_OPEN_ENDIAN, endian,
01176 CGEN_CPU_OPEN_END);
01177 }
01178
01179
01180
01181
01182
01183
01184 void
01185 ip2k_cgen_cpu_close (cd)
01186 CGEN_CPU_DESC cd;
01187 {
01188 unsigned int i;
01189 const CGEN_INSN *insns;
01190
01191 if (cd->macro_insn_table.init_entries)
01192 {
01193 insns = cd->macro_insn_table.init_entries;
01194 for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
01195 {
01196 if (CGEN_INSN_RX ((insns)))
01197 regfree (CGEN_INSN_RX (insns));
01198 }
01199 }
01200
01201 if (cd->insn_table.init_entries)
01202 {
01203 insns = cd->insn_table.init_entries;
01204 for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
01205 {
01206 if (CGEN_INSN_RX (insns))
01207 regfree (CGEN_INSN_RX (insns));
01208 }
01209 }
01210
01211
01212
01213 if (cd->macro_insn_table.init_entries)
01214 free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
01215
01216 if (cd->insn_table.init_entries)
01217 free ((CGEN_INSN *) cd->insn_table.init_entries);
01218
01219 if (cd->hw_table.entries)
01220 free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
01221
01222 if (cd->operand_table.entries)
01223 free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
01224
01225 free (cd);
01226 }
01227