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 "xstormy16-desc.h"
00036 #include "xstormy16-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 { "xstormy16", MACH_XSTORMY16 },
00054 { "max", MACH_MAX },
00055 { 0, 0 }
00056 };
00057
00058 static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
00059 {
00060 { "xstormy16", ISA_XSTORMY16 },
00061 { "max", ISA_MAX },
00062 { 0, 0 }
00063 };
00064
00065 const CGEN_ATTR_TABLE xstormy16_cgen_ifield_attr_table[] =
00066 {
00067 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00068 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00069 { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
00070 { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
00071 { "RESERVED", &bool_attr[0], &bool_attr[0] },
00072 { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
00073 { "SIGNED", &bool_attr[0], &bool_attr[0] },
00074 { 0, 0, 0 }
00075 };
00076
00077 const CGEN_ATTR_TABLE xstormy16_cgen_hardware_attr_table[] =
00078 {
00079 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00080 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00081 { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
00082 { "PC", &bool_attr[0], &bool_attr[0] },
00083 { "PROFILE", &bool_attr[0], &bool_attr[0] },
00084 { 0, 0, 0 }
00085 };
00086
00087 const CGEN_ATTR_TABLE xstormy16_cgen_operand_attr_table[] =
00088 {
00089 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00090 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00091 { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
00092 { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
00093 { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
00094 { "SIGNED", &bool_attr[0], &bool_attr[0] },
00095 { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
00096 { "RELAX", &bool_attr[0], &bool_attr[0] },
00097 { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
00098 { 0, 0, 0 }
00099 };
00100
00101 const CGEN_ATTR_TABLE xstormy16_cgen_insn_attr_table[] =
00102 {
00103 { "MACH", & MACH_attr[0], & MACH_attr[0] },
00104 { "ALIAS", &bool_attr[0], &bool_attr[0] },
00105 { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
00106 { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
00107 { "COND-CTI", &bool_attr[0], &bool_attr[0] },
00108 { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
00109 { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
00110 { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
00111 { "RELAXED", &bool_attr[0], &bool_attr[0] },
00112 { "NO-DIS", &bool_attr[0], &bool_attr[0] },
00113 { "PBB", &bool_attr[0], &bool_attr[0] },
00114 { 0, 0, 0 }
00115 };
00116
00117
00118
00119 static const CGEN_ISA xstormy16_cgen_isa_table[] = {
00120 { "xstormy16", 32, 32, 16, 32 },
00121 { 0, 0, 0, 0, 0 }
00122 };
00123
00124
00125
00126 static const CGEN_MACH xstormy16_cgen_mach_table[] = {
00127 { "xstormy16", "xstormy16", MACH_XSTORMY16, 16 },
00128 { 0, 0, 0, 0 }
00129 };
00130
00131 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_names_entries[] =
00132 {
00133 { "r0", 0, {0, {0}}, 0, 0 },
00134 { "r1", 1, {0, {0}}, 0, 0 },
00135 { "r2", 2, {0, {0}}, 0, 0 },
00136 { "r3", 3, {0, {0}}, 0, 0 },
00137 { "r4", 4, {0, {0}}, 0, 0 },
00138 { "r5", 5, {0, {0}}, 0, 0 },
00139 { "r6", 6, {0, {0}}, 0, 0 },
00140 { "r7", 7, {0, {0}}, 0, 0 },
00141 { "r8", 8, {0, {0}}, 0, 0 },
00142 { "r9", 9, {0, {0}}, 0, 0 },
00143 { "r10", 10, {0, {0}}, 0, 0 },
00144 { "r11", 11, {0, {0}}, 0, 0 },
00145 { "r12", 12, {0, {0}}, 0, 0 },
00146 { "r13", 13, {0, {0}}, 0, 0 },
00147 { "r14", 14, {0, {0}}, 0, 0 },
00148 { "r15", 15, {0, {0}}, 0, 0 },
00149 { "psw", 14, {0, {0}}, 0, 0 },
00150 { "sp", 15, {0, {0}}, 0, 0 }
00151 };
00152
00153 CGEN_KEYWORD xstormy16_cgen_opval_gr_names =
00154 {
00155 & xstormy16_cgen_opval_gr_names_entries[0],
00156 18,
00157 0, 0, 0, 0, ""
00158 };
00159
00160 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_Rb_names_entries[] =
00161 {
00162 { "r8", 0, {0, {0}}, 0, 0 },
00163 { "r9", 1, {0, {0}}, 0, 0 },
00164 { "r10", 2, {0, {0}}, 0, 0 },
00165 { "r11", 3, {0, {0}}, 0, 0 },
00166 { "r12", 4, {0, {0}}, 0, 0 },
00167 { "r13", 5, {0, {0}}, 0, 0 },
00168 { "r14", 6, {0, {0}}, 0, 0 },
00169 { "r15", 7, {0, {0}}, 0, 0 },
00170 { "psw", 6, {0, {0}}, 0, 0 },
00171 { "sp", 7, {0, {0}}, 0, 0 }
00172 };
00173
00174 CGEN_KEYWORD xstormy16_cgen_opval_gr_Rb_names =
00175 {
00176 & xstormy16_cgen_opval_gr_Rb_names_entries[0],
00177 10,
00178 0, 0, 0, 0, ""
00179 };
00180
00181 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_branchcond_entries[] =
00182 {
00183 { "ge", 0, {0, {0}}, 0, 0 },
00184 { "nc", 1, {0, {0}}, 0, 0 },
00185 { "lt", 2, {0, {0}}, 0, 0 },
00186 { "c", 3, {0, {0}}, 0, 0 },
00187 { "gt", 4, {0, {0}}, 0, 0 },
00188 { "hi", 5, {0, {0}}, 0, 0 },
00189 { "le", 6, {0, {0}}, 0, 0 },
00190 { "ls", 7, {0, {0}}, 0, 0 },
00191 { "pl", 8, {0, {0}}, 0, 0 },
00192 { "nv", 9, {0, {0}}, 0, 0 },
00193 { "mi", 10, {0, {0}}, 0, 0 },
00194 { "v", 11, {0, {0}}, 0, 0 },
00195 { "nz.b", 12, {0, {0}}, 0, 0 },
00196 { "nz", 13, {0, {0}}, 0, 0 },
00197 { "z.b", 14, {0, {0}}, 0, 0 },
00198 { "z", 15, {0, {0}}, 0, 0 }
00199 };
00200
00201 CGEN_KEYWORD xstormy16_cgen_opval_h_branchcond =
00202 {
00203 & xstormy16_cgen_opval_h_branchcond_entries[0],
00204 16,
00205 0, 0, 0, 0, ""
00206 };
00207
00208 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_wordsize_entries[] =
00209 {
00210 { ".b", 0, {0, {0}}, 0, 0 },
00211 { ".w", 1, {0, {0}}, 0, 0 },
00212 { "", 1, {0, {0}}, 0, 0 }
00213 };
00214
00215 CGEN_KEYWORD xstormy16_cgen_opval_h_wordsize =
00216 {
00217 & xstormy16_cgen_opval_h_wordsize_entries[0],
00218 3,
00219 0, 0, 0, 0, ""
00220 };
00221
00222
00223
00224
00225 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00226 #define A(a) (1 << CGEN_HW_##a)
00227 #else
00228 #define A(a) (1 << CGEN_HW_a)
00229 #endif
00230
00231 const CGEN_HW_ENTRY xstormy16_cgen_hw_table[] =
00232 {
00233 { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00234 { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00235 { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00236 { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00237 { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
00238 { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PC), { (1<<MACH_BASE) } } },
00239 { "h-gr", HW_H_GR, CGEN_ASM_KEYWORD, (PTR) & xstormy16_cgen_opval_gr_names, { 0, { (1<<MACH_BASE) } } },
00240 { "h-Rb", HW_H_RB, CGEN_ASM_KEYWORD, (PTR) & xstormy16_cgen_opval_gr_Rb_names, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00241 { "h-Rbj", HW_H_RBJ, CGEN_ASM_KEYWORD, (PTR) & xstormy16_cgen_opval_gr_Rb_names, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00242 { "h-Rpsw", HW_H_RPSW, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00243 { "h-z8", HW_H_Z8, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00244 { "h-z16", HW_H_Z16, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00245 { "h-cy", HW_H_CY, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00246 { "h-hc", HW_H_HC, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00247 { "h-ov", HW_H_OV, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00248 { "h-pt", HW_H_PT, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00249 { "h-s", HW_H_S, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { (1<<MACH_BASE) } } },
00250 { "h-branchcond", HW_H_BRANCHCOND, CGEN_ASM_KEYWORD, (PTR) & xstormy16_cgen_opval_h_branchcond, { 0, { (1<<MACH_BASE) } } },
00251 { "h-wordsize", HW_H_WORDSIZE, CGEN_ASM_KEYWORD, (PTR) & xstormy16_cgen_opval_h_wordsize, { 0, { (1<<MACH_BASE) } } },
00252 { 0, 0, CGEN_ASM_NONE, 0, {0, {0}} }
00253 };
00254
00255 #undef A
00256
00257
00258
00259
00260 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00261 #define A(a) (1 << CGEN_IFLD_##a)
00262 #else
00263 #define A(a) (1 << CGEN_IFLD_a)
00264 #endif
00265
00266 const CGEN_IFLD xstormy16_cgen_ifld_table[] =
00267 {
00268 { XSTORMY16_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } } },
00269 { XSTORMY16_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { (1<<MACH_BASE) } } },
00270 { XSTORMY16_F_RD, "f-Rd", 0, 32, 12, 4, { 0, { (1<<MACH_BASE) } } },
00271 { XSTORMY16_F_RDM, "f-Rdm", 0, 32, 13, 3, { 0, { (1<<MACH_BASE) } } },
00272 { XSTORMY16_F_RM, "f-Rm", 0, 32, 4, 3, { 0, { (1<<MACH_BASE) } } },
00273 { XSTORMY16_F_RS, "f-Rs", 0, 32, 8, 4, { 0, { (1<<MACH_BASE) } } },
00274 { XSTORMY16_F_RB, "f-Rb", 0, 32, 17, 3, { 0, { (1<<MACH_BASE) } } },
00275 { XSTORMY16_F_RBJ, "f-Rbj", 0, 32, 11, 1, { 0, { (1<<MACH_BASE) } } },
00276 { XSTORMY16_F_OP1, "f-op1", 0, 32, 0, 4, { 0, { (1<<MACH_BASE) } } },
00277 { XSTORMY16_F_OP2, "f-op2", 0, 32, 4, 4, { 0, { (1<<MACH_BASE) } } },
00278 { XSTORMY16_F_OP2A, "f-op2a", 0, 32, 4, 3, { 0, { (1<<MACH_BASE) } } },
00279 { XSTORMY16_F_OP2M, "f-op2m", 0, 32, 7, 1, { 0, { (1<<MACH_BASE) } } },
00280 { XSTORMY16_F_OP3, "f-op3", 0, 32, 8, 4, { 0, { (1<<MACH_BASE) } } },
00281 { XSTORMY16_F_OP3A, "f-op3a", 0, 32, 8, 2, { 0, { (1<<MACH_BASE) } } },
00282 { XSTORMY16_F_OP3B, "f-op3b", 0, 32, 8, 3, { 0, { (1<<MACH_BASE) } } },
00283 { XSTORMY16_F_OP4, "f-op4", 0, 32, 12, 4, { 0, { (1<<MACH_BASE) } } },
00284 { XSTORMY16_F_OP4M, "f-op4m", 0, 32, 12, 1, { 0, { (1<<MACH_BASE) } } },
00285 { XSTORMY16_F_OP4B, "f-op4b", 0, 32, 15, 1, { 0, { (1<<MACH_BASE) } } },
00286 { XSTORMY16_F_OP5, "f-op5", 0, 32, 16, 4, { 0, { (1<<MACH_BASE) } } },
00287 { XSTORMY16_F_OP5A, "f-op5a", 0, 32, 16, 1, { 0, { (1<<MACH_BASE) } } },
00288 { XSTORMY16_F_OP, "f-op", 0, 32, 0, 16, { 0, { (1<<MACH_BASE) } } },
00289 { XSTORMY16_F_IMM2, "f-imm2", 0, 32, 10, 2, { 0, { (1<<MACH_BASE) } } },
00290 { XSTORMY16_F_IMM3, "f-imm3", 0, 32, 4, 3, { 0, { (1<<MACH_BASE) } } },
00291 { XSTORMY16_F_IMM3B, "f-imm3b", 0, 32, 17, 3, { 0, { (1<<MACH_BASE) } } },
00292 { XSTORMY16_F_IMM4, "f-imm4", 0, 32, 8, 4, { 0, { (1<<MACH_BASE) } } },
00293 { XSTORMY16_F_IMM8, "f-imm8", 0, 32, 8, 8, { 0, { (1<<MACH_BASE) } } },
00294 { XSTORMY16_F_IMM12, "f-imm12", 0, 32, 20, 12, { 0, { (1<<MACH_BASE) } } },
00295 { XSTORMY16_F_IMM16, "f-imm16", 0, 32, 16, 16, { 0|A(SIGN_OPT), { (1<<MACH_BASE) } } },
00296 { XSTORMY16_F_LMEM8, "f-lmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00297 { XSTORMY16_F_HMEM8, "f-hmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00298 { XSTORMY16_F_REL8_2, "f-rel8-2", 0, 32, 8, 8, { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00299 { XSTORMY16_F_REL8_4, "f-rel8-4", 0, 32, 8, 8, { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00300 { XSTORMY16_F_REL12, "f-rel12", 0, 32, 20, 12, { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00301 { XSTORMY16_F_REL12A, "f-rel12a", 0, 32, 4, 11, { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00302 { XSTORMY16_F_ABS24_1, "f-abs24-1", 0, 32, 8, 8, { 0, { (1<<MACH_BASE) } } },
00303 { XSTORMY16_F_ABS24_2, "f-abs24-2", 0, 32, 16, 16, { 0, { (1<<MACH_BASE) } } },
00304 { XSTORMY16_F_ABS24, "f-abs24", 0, 0, 0, 0,{ 0|A(ABS_ADDR)|A(VIRTUAL), { (1<<MACH_BASE) } } },
00305 { 0, 0, 0, 0, 0, 0, {0, {0}} }
00306 };
00307
00308 #undef A
00309
00310
00311
00312
00313
00314 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD [];
00315
00316
00317
00318
00319 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD [] =
00320 {
00321 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_ABS24_1] } },
00322 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_ABS24_2] } },
00323 { 0, { (const PTR) 0 } }
00324 };
00325
00326
00327
00328 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00329 #define A(a) (1 << CGEN_OPERAND_##a)
00330 #else
00331 #define A(a) (1 << CGEN_OPERAND_a)
00332 #endif
00333 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00334 #define OPERAND(op) XSTORMY16_OPERAND_##op
00335 #else
00336 #define OPERAND(op) XSTORMY16_OPERAND_op
00337 #endif
00338
00339 const CGEN_OPERAND xstormy16_cgen_operand_table[] =
00340 {
00341
00342 { "pc", XSTORMY16_OPERAND_PC, HW_H_PC, 0, 0,
00343 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_NIL] } },
00344 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00345
00346 { "psw-z8", XSTORMY16_OPERAND_PSW_Z8, HW_H_Z8, 0, 0,
00347 { 0, { (const PTR) 0 } },
00348 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00349
00350 { "psw-z16", XSTORMY16_OPERAND_PSW_Z16, HW_H_Z16, 0, 0,
00351 { 0, { (const PTR) 0 } },
00352 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00353
00354 { "psw-cy", XSTORMY16_OPERAND_PSW_CY, HW_H_CY, 0, 0,
00355 { 0, { (const PTR) 0 } },
00356 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00357
00358 { "psw-hc", XSTORMY16_OPERAND_PSW_HC, HW_H_HC, 0, 0,
00359 { 0, { (const PTR) 0 } },
00360 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00361
00362 { "psw-ov", XSTORMY16_OPERAND_PSW_OV, HW_H_OV, 0, 0,
00363 { 0, { (const PTR) 0 } },
00364 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00365
00366 { "psw-pt", XSTORMY16_OPERAND_PSW_PT, HW_H_PT, 0, 0,
00367 { 0, { (const PTR) 0 } },
00368 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00369
00370 { "psw-s", XSTORMY16_OPERAND_PSW_S, HW_H_S, 0, 0,
00371 { 0, { (const PTR) 0 } },
00372 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00373
00374 { "Rd", XSTORMY16_OPERAND_RD, HW_H_GR, 12, 4,
00375 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RD] } },
00376 { 0, { (1<<MACH_BASE) } } },
00377
00378 { "Rdm", XSTORMY16_OPERAND_RDM, HW_H_GR, 13, 3,
00379 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RDM] } },
00380 { 0, { (1<<MACH_BASE) } } },
00381
00382 { "Rm", XSTORMY16_OPERAND_RM, HW_H_GR, 4, 3,
00383 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RM] } },
00384 { 0, { (1<<MACH_BASE) } } },
00385
00386 { "Rs", XSTORMY16_OPERAND_RS, HW_H_GR, 8, 4,
00387 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RS] } },
00388 { 0, { (1<<MACH_BASE) } } },
00389
00390 { "Rb", XSTORMY16_OPERAND_RB, HW_H_RB, 17, 3,
00391 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RB] } },
00392 { 0, { (1<<MACH_BASE) } } },
00393
00394 { "Rbj", XSTORMY16_OPERAND_RBJ, HW_H_RBJ, 11, 1,
00395 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_RBJ] } },
00396 { 0, { (1<<MACH_BASE) } } },
00397
00398 { "bcond2", XSTORMY16_OPERAND_BCOND2, HW_H_BRANCHCOND, 4, 4,
00399 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_OP2] } },
00400 { 0, { (1<<MACH_BASE) } } },
00401
00402 { "ws2", XSTORMY16_OPERAND_WS2, HW_H_WORDSIZE, 7, 1,
00403 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_OP2M] } },
00404 { 0, { (1<<MACH_BASE) } } },
00405
00406 { "bcond5", XSTORMY16_OPERAND_BCOND5, HW_H_BRANCHCOND, 16, 4,
00407 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_OP5] } },
00408 { 0, { (1<<MACH_BASE) } } },
00409
00410 { "imm2", XSTORMY16_OPERAND_IMM2, HW_H_UINT, 10, 2,
00411 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM2] } },
00412 { 0, { (1<<MACH_BASE) } } },
00413
00414 { "imm3", XSTORMY16_OPERAND_IMM3, HW_H_UINT, 4, 3,
00415 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM3] } },
00416 { 0, { (1<<MACH_BASE) } } },
00417
00418 { "imm3b", XSTORMY16_OPERAND_IMM3B, HW_H_UINT, 17, 3,
00419 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM3B] } },
00420 { 0, { (1<<MACH_BASE) } } },
00421
00422 { "imm4", XSTORMY16_OPERAND_IMM4, HW_H_UINT, 8, 4,
00423 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM4] } },
00424 { 0, { (1<<MACH_BASE) } } },
00425
00426 { "imm8", XSTORMY16_OPERAND_IMM8, HW_H_UINT, 8, 8,
00427 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM8] } },
00428 { 0, { (1<<MACH_BASE) } } },
00429
00430 { "imm8small", XSTORMY16_OPERAND_IMM8SMALL, HW_H_UINT, 8, 8,
00431 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM8] } },
00432 { 0, { (1<<MACH_BASE) } } },
00433
00434 { "imm12", XSTORMY16_OPERAND_IMM12, HW_H_SINT, 20, 12,
00435 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM12] } },
00436 { 0, { (1<<MACH_BASE) } } },
00437
00438 { "imm16", XSTORMY16_OPERAND_IMM16, HW_H_UINT, 16, 16,
00439 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_IMM16] } },
00440 { 0|A(SIGN_OPT), { (1<<MACH_BASE) } } },
00441
00442 { "lmem8", XSTORMY16_OPERAND_LMEM8, HW_H_UINT, 8, 8,
00443 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_LMEM8] } },
00444 { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00445
00446 { "hmem8", XSTORMY16_OPERAND_HMEM8, HW_H_UINT, 8, 8,
00447 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_HMEM8] } },
00448 { 0|A(ABS_ADDR), { (1<<MACH_BASE) } } },
00449
00450 { "rel8-2", XSTORMY16_OPERAND_REL8_2, HW_H_UINT, 8, 8,
00451 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_REL8_2] } },
00452 { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00453
00454 { "rel8-4", XSTORMY16_OPERAND_REL8_4, HW_H_UINT, 8, 8,
00455 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_REL8_4] } },
00456 { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00457
00458 { "rel12", XSTORMY16_OPERAND_REL12, HW_H_UINT, 20, 12,
00459 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_REL12] } },
00460 { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00461
00462 { "rel12a", XSTORMY16_OPERAND_REL12A, HW_H_UINT, 4, 11,
00463 { 0, { (const PTR) &xstormy16_cgen_ifld_table[XSTORMY16_F_REL12A] } },
00464 { 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
00465
00466 { "abs24", XSTORMY16_OPERAND_ABS24, HW_H_UINT, 8, 24,
00467 { 2, { (const PTR) &XSTORMY16_F_ABS24_MULTI_IFIELD[0] } },
00468 { 0|A(ABS_ADDR)|A(VIRTUAL), { (1<<MACH_BASE) } } },
00469
00470 { "psw", XSTORMY16_OPERAND_PSW, HW_H_GR, 0, 0,
00471 { 0, { (const PTR) 0 } },
00472 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00473
00474 { "Rpsw", XSTORMY16_OPERAND_RPSW, HW_H_RPSW, 0, 0,
00475 { 0, { (const PTR) 0 } },
00476 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00477
00478 { "sp", XSTORMY16_OPERAND_SP, HW_H_GR, 0, 0,
00479 { 0, { (const PTR) 0 } },
00480 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00481
00482 { "R0", XSTORMY16_OPERAND_R0, HW_H_GR, 0, 0,
00483 { 0, { (const PTR) 0 } },
00484 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00485
00486 { "R1", XSTORMY16_OPERAND_R1, HW_H_GR, 0, 0,
00487 { 0, { (const PTR) 0 } },
00488 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00489
00490 { "R2", XSTORMY16_OPERAND_R2, HW_H_GR, 0, 0,
00491 { 0, { (const PTR) 0 } },
00492 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00493
00494 { "R8", XSTORMY16_OPERAND_R8, HW_H_GR, 0, 0,
00495 { 0, { (const PTR) 0 } },
00496 { 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
00497
00498 { 0, 0, 0, 0, 0,
00499 { 0, { (const PTR) 0 } },
00500 { 0, { 0 } } }
00501 };
00502
00503 #undef A
00504
00505
00506
00507
00508 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00509 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00510 #define A(a) (1 << CGEN_INSN_##a)
00511 #else
00512 #define A(a) (1 << CGEN_INSN_a)
00513 #endif
00514
00515 static const CGEN_IBASE xstormy16_cgen_insn_table[MAX_INSNS] =
00516 {
00517
00518
00519
00520 { 0, 0, 0, 0, {0, {0}} },
00521
00522 {
00523 XSTORMY16_INSN_MOVLMEMIMM, "movlmemimm", "mov", 32,
00524 { 0, { (1<<MACH_BASE) } }
00525 },
00526
00527 {
00528 XSTORMY16_INSN_MOVHMEMIMM, "movhmemimm", "mov", 32,
00529 { 0, { (1<<MACH_BASE) } }
00530 },
00531
00532 {
00533 XSTORMY16_INSN_MOVLGRMEM, "movlgrmem", "mov", 16,
00534 { 0, { (1<<MACH_BASE) } }
00535 },
00536
00537 {
00538 XSTORMY16_INSN_MOVHGRMEM, "movhgrmem", "mov", 16,
00539 { 0, { (1<<MACH_BASE) } }
00540 },
00541
00542 {
00543 XSTORMY16_INSN_MOVLMEMGR, "movlmemgr", "mov", 16,
00544 { 0, { (1<<MACH_BASE) } }
00545 },
00546
00547 {
00548 XSTORMY16_INSN_MOVHMEMGR, "movhmemgr", "mov", 16,
00549 { 0, { (1<<MACH_BASE) } }
00550 },
00551
00552 {
00553 XSTORMY16_INSN_MOVGRGRI, "movgrgri", "mov", 16,
00554 { 0, { (1<<MACH_BASE) } }
00555 },
00556
00557 {
00558 XSTORMY16_INSN_MOVGRGRIPOSTINC, "movgrgripostinc", "mov", 16,
00559 { 0, { (1<<MACH_BASE) } }
00560 },
00561
00562 {
00563 XSTORMY16_INSN_MOVGRGRIPREDEC, "movgrgripredec", "mov", 16,
00564 { 0, { (1<<MACH_BASE) } }
00565 },
00566
00567 {
00568 XSTORMY16_INSN_MOVGRIGR, "movgrigr", "mov", 16,
00569 { 0, { (1<<MACH_BASE) } }
00570 },
00571
00572 {
00573 XSTORMY16_INSN_MOVGRIPOSTINCGR, "movgripostincgr", "mov", 16,
00574 { 0, { (1<<MACH_BASE) } }
00575 },
00576
00577 {
00578 XSTORMY16_INSN_MOVGRIPREDECGR, "movgripredecgr", "mov", 16,
00579 { 0, { (1<<MACH_BASE) } }
00580 },
00581
00582 {
00583 XSTORMY16_INSN_MOVGRGRII, "movgrgrii", "mov", 32,
00584 { 0, { (1<<MACH_BASE) } }
00585 },
00586
00587 {
00588 XSTORMY16_INSN_MOVGRGRIIPOSTINC, "movgrgriipostinc", "mov", 32,
00589 { 0, { (1<<MACH_BASE) } }
00590 },
00591
00592 {
00593 XSTORMY16_INSN_MOVGRGRIIPREDEC, "movgrgriipredec", "mov", 32,
00594 { 0, { (1<<MACH_BASE) } }
00595 },
00596
00597 {
00598 XSTORMY16_INSN_MOVGRIIGR, "movgriigr", "mov", 32,
00599 { 0, { (1<<MACH_BASE) } }
00600 },
00601
00602 {
00603 XSTORMY16_INSN_MOVGRIIPOSTINCGR, "movgriipostincgr", "mov", 32,
00604 { 0, { (1<<MACH_BASE) } }
00605 },
00606
00607 {
00608 XSTORMY16_INSN_MOVGRIIPREDECGR, "movgriipredecgr", "mov", 32,
00609 { 0, { (1<<MACH_BASE) } }
00610 },
00611
00612 {
00613 XSTORMY16_INSN_MOVGRGR, "movgrgr", "mov", 16,
00614 { 0, { (1<<MACH_BASE) } }
00615 },
00616
00617 {
00618 XSTORMY16_INSN_MOVWIMM8, "movwimm8", "mov.w", 16,
00619 { 0, { (1<<MACH_BASE) } }
00620 },
00621
00622 {
00623 XSTORMY16_INSN_MOVWGRIMM8, "movwgrimm8", "mov.w", 16,
00624 { 0, { (1<<MACH_BASE) } }
00625 },
00626
00627 {
00628 XSTORMY16_INSN_MOVWGRIMM16, "movwgrimm16", "mov.w", 32,
00629 { 0, { (1<<MACH_BASE) } }
00630 },
00631
00632 {
00633 XSTORMY16_INSN_MOVLOWGR, "movlowgr", "mov.b", 16,
00634 { 0, { (1<<MACH_BASE) } }
00635 },
00636
00637 {
00638 XSTORMY16_INSN_MOVHIGHGR, "movhighgr", "mov.b", 16,
00639 { 0, { (1<<MACH_BASE) } }
00640 },
00641
00642 {
00643 XSTORMY16_INSN_MOVFGRGRI, "movfgrgri", "movf", 16,
00644 { 0, { (1<<MACH_BASE) } }
00645 },
00646
00647 {
00648 XSTORMY16_INSN_MOVFGRGRIPOSTINC, "movfgrgripostinc", "movf", 16,
00649 { 0, { (1<<MACH_BASE) } }
00650 },
00651
00652 {
00653 XSTORMY16_INSN_MOVFGRGRIPREDEC, "movfgrgripredec", "movf", 16,
00654 { 0, { (1<<MACH_BASE) } }
00655 },
00656
00657 {
00658 XSTORMY16_INSN_MOVFGRIGR, "movfgrigr", "movf", 16,
00659 { 0, { (1<<MACH_BASE) } }
00660 },
00661
00662 {
00663 XSTORMY16_INSN_MOVFGRIPOSTINCGR, "movfgripostincgr", "movf", 16,
00664 { 0, { (1<<MACH_BASE) } }
00665 },
00666
00667 {
00668 XSTORMY16_INSN_MOVFGRIPREDECGR, "movfgripredecgr", "movf", 16,
00669 { 0, { (1<<MACH_BASE) } }
00670 },
00671
00672 {
00673 XSTORMY16_INSN_MOVFGRGRII, "movfgrgrii", "movf", 32,
00674 { 0, { (1<<MACH_BASE) } }
00675 },
00676
00677 {
00678 XSTORMY16_INSN_MOVFGRGRIIPOSTINC, "movfgrgriipostinc", "movf", 32,
00679 { 0, { (1<<MACH_BASE) } }
00680 },
00681
00682 {
00683 XSTORMY16_INSN_MOVFGRGRIIPREDEC, "movfgrgriipredec", "movf", 32,
00684 { 0, { (1<<MACH_BASE) } }
00685 },
00686
00687 {
00688 XSTORMY16_INSN_MOVFGRIIGR, "movfgriigr", "movf", 32,
00689 { 0, { (1<<MACH_BASE) } }
00690 },
00691
00692 {
00693 XSTORMY16_INSN_MOVFGRIIPOSTINCGR, "movfgriipostincgr", "movf", 32,
00694 { 0, { (1<<MACH_BASE) } }
00695 },
00696
00697 {
00698 XSTORMY16_INSN_MOVFGRIIPREDECGR, "movfgriipredecgr", "movf", 32,
00699 { 0, { (1<<MACH_BASE) } }
00700 },
00701
00702 {
00703 XSTORMY16_INSN_MASKGRGR, "maskgrgr", "mask", 16,
00704 { 0, { (1<<MACH_BASE) } }
00705 },
00706
00707 {
00708 XSTORMY16_INSN_MASKGRIMM16, "maskgrimm16", "mask", 32,
00709 { 0, { (1<<MACH_BASE) } }
00710 },
00711
00712 {
00713 XSTORMY16_INSN_PUSHGR, "pushgr", "push", 16,
00714 { 0, { (1<<MACH_BASE) } }
00715 },
00716
00717 {
00718 XSTORMY16_INSN_POPGR, "popgr", "pop", 16,
00719 { 0, { (1<<MACH_BASE) } }
00720 },
00721
00722 {
00723 XSTORMY16_INSN_SWPN, "swpn", "swpn", 16,
00724 { 0, { (1<<MACH_BASE) } }
00725 },
00726
00727 {
00728 XSTORMY16_INSN_SWPB, "swpb", "swpb", 16,
00729 { 0, { (1<<MACH_BASE) } }
00730 },
00731
00732 {
00733 XSTORMY16_INSN_SWPW, "swpw", "swpw", 16,
00734 { 0, { (1<<MACH_BASE) } }
00735 },
00736
00737 {
00738 XSTORMY16_INSN_ANDGRGR, "andgrgr", "and", 16,
00739 { 0, { (1<<MACH_BASE) } }
00740 },
00741
00742 {
00743 XSTORMY16_INSN_ANDIMM8, "andimm8", "and", 16,
00744 { 0, { (1<<MACH_BASE) } }
00745 },
00746
00747 {
00748 XSTORMY16_INSN_ANDGRIMM16, "andgrimm16", "and", 32,
00749 { 0, { (1<<MACH_BASE) } }
00750 },
00751
00752 {
00753 XSTORMY16_INSN_ORGRGR, "orgrgr", "or", 16,
00754 { 0, { (1<<MACH_BASE) } }
00755 },
00756
00757 {
00758 XSTORMY16_INSN_ORIMM8, "orimm8", "or", 16,
00759 { 0, { (1<<MACH_BASE) } }
00760 },
00761
00762 {
00763 XSTORMY16_INSN_ORGRIMM16, "orgrimm16", "or", 32,
00764 { 0, { (1<<MACH_BASE) } }
00765 },
00766
00767 {
00768 XSTORMY16_INSN_XORGRGR, "xorgrgr", "xor", 16,
00769 { 0, { (1<<MACH_BASE) } }
00770 },
00771
00772 {
00773 XSTORMY16_INSN_XORIMM8, "xorimm8", "xor", 16,
00774 { 0, { (1<<MACH_BASE) } }
00775 },
00776
00777 {
00778 XSTORMY16_INSN_XORGRIMM16, "xorgrimm16", "xor", 32,
00779 { 0, { (1<<MACH_BASE) } }
00780 },
00781
00782 {
00783 XSTORMY16_INSN_NOTGR, "notgr", "not", 16,
00784 { 0, { (1<<MACH_BASE) } }
00785 },
00786
00787 {
00788 XSTORMY16_INSN_ADDGRGR, "addgrgr", "add", 16,
00789 { 0, { (1<<MACH_BASE) } }
00790 },
00791
00792 {
00793 XSTORMY16_INSN_ADDGRIMM4, "addgrimm4", "add", 16,
00794 { 0, { (1<<MACH_BASE) } }
00795 },
00796
00797 {
00798 XSTORMY16_INSN_ADDIMM8, "addimm8", "add", 16,
00799 { 0, { (1<<MACH_BASE) } }
00800 },
00801
00802 {
00803 XSTORMY16_INSN_ADDGRIMM16, "addgrimm16", "add", 32,
00804 { 0, { (1<<MACH_BASE) } }
00805 },
00806
00807 {
00808 XSTORMY16_INSN_ADCGRGR, "adcgrgr", "adc", 16,
00809 { 0, { (1<<MACH_BASE) } }
00810 },
00811
00812 {
00813 XSTORMY16_INSN_ADCGRIMM4, "adcgrimm4", "adc", 16,
00814 { 0, { (1<<MACH_BASE) } }
00815 },
00816
00817 {
00818 XSTORMY16_INSN_ADCIMM8, "adcimm8", "adc", 16,
00819 { 0, { (1<<MACH_BASE) } }
00820 },
00821
00822 {
00823 XSTORMY16_INSN_ADCGRIMM16, "adcgrimm16", "adc", 32,
00824 { 0, { (1<<MACH_BASE) } }
00825 },
00826
00827 {
00828 XSTORMY16_INSN_SUBGRGR, "subgrgr", "sub", 16,
00829 { 0, { (1<<MACH_BASE) } }
00830 },
00831
00832 {
00833 XSTORMY16_INSN_SUBGRIMM4, "subgrimm4", "sub", 16,
00834 { 0, { (1<<MACH_BASE) } }
00835 },
00836
00837 {
00838 XSTORMY16_INSN_SUBIMM8, "subimm8", "sub", 16,
00839 { 0, { (1<<MACH_BASE) } }
00840 },
00841
00842 {
00843 XSTORMY16_INSN_SUBGRIMM16, "subgrimm16", "sub", 32,
00844 { 0, { (1<<MACH_BASE) } }
00845 },
00846
00847 {
00848 XSTORMY16_INSN_SBCGRGR, "sbcgrgr", "sbc", 16,
00849 { 0, { (1<<MACH_BASE) } }
00850 },
00851
00852 {
00853 XSTORMY16_INSN_SBCGRIMM4, "sbcgrimm4", "sbc", 16,
00854 { 0, { (1<<MACH_BASE) } }
00855 },
00856
00857 {
00858 XSTORMY16_INSN_SBCGRIMM8, "sbcgrimm8", "sbc", 16,
00859 { 0, { (1<<MACH_BASE) } }
00860 },
00861
00862 {
00863 XSTORMY16_INSN_SBCGRIMM16, "sbcgrimm16", "sbc", 32,
00864 { 0, { (1<<MACH_BASE) } }
00865 },
00866
00867 {
00868 XSTORMY16_INSN_INCGRIMM2, "incgrimm2", "inc", 16,
00869 { 0, { (1<<MACH_BASE) } }
00870 },
00871
00872 {
00873 XSTORMY16_INSN_DECGRIMM2, "decgrimm2", "dec", 16,
00874 { 0, { (1<<MACH_BASE) } }
00875 },
00876
00877 {
00878 XSTORMY16_INSN_RRCGRGR, "rrcgrgr", "rrc", 16,
00879 { 0, { (1<<MACH_BASE) } }
00880 },
00881
00882 {
00883 XSTORMY16_INSN_RRCGRIMM4, "rrcgrimm4", "rrc", 16,
00884 { 0, { (1<<MACH_BASE) } }
00885 },
00886
00887 {
00888 XSTORMY16_INSN_RLCGRGR, "rlcgrgr", "rlc", 16,
00889 { 0, { (1<<MACH_BASE) } }
00890 },
00891
00892 {
00893 XSTORMY16_INSN_RLCGRIMM4, "rlcgrimm4", "rlc", 16,
00894 { 0, { (1<<MACH_BASE) } }
00895 },
00896
00897 {
00898 XSTORMY16_INSN_SHRGRGR, "shrgrgr", "shr", 16,
00899 { 0, { (1<<MACH_BASE) } }
00900 },
00901
00902 {
00903 XSTORMY16_INSN_SHRGRIMM, "shrgrimm", "shr", 16,
00904 { 0, { (1<<MACH_BASE) } }
00905 },
00906
00907 {
00908 XSTORMY16_INSN_SHLGRGR, "shlgrgr", "shl", 16,
00909 { 0, { (1<<MACH_BASE) } }
00910 },
00911
00912 {
00913 XSTORMY16_INSN_SHLGRIMM, "shlgrimm", "shl", 16,
00914 { 0, { (1<<MACH_BASE) } }
00915 },
00916
00917 {
00918 XSTORMY16_INSN_ASRGRGR, "asrgrgr", "asr", 16,
00919 { 0, { (1<<MACH_BASE) } }
00920 },
00921
00922 {
00923 XSTORMY16_INSN_ASRGRIMM, "asrgrimm", "asr", 16,
00924 { 0, { (1<<MACH_BASE) } }
00925 },
00926
00927 {
00928 XSTORMY16_INSN_SET1GRIMM, "set1grimm", "set1", 16,
00929 { 0, { (1<<MACH_BASE) } }
00930 },
00931
00932 {
00933 XSTORMY16_INSN_SET1GRGR, "set1grgr", "set1", 16,
00934 { 0, { (1<<MACH_BASE) } }
00935 },
00936
00937 {
00938 XSTORMY16_INSN_SET1LMEMIMM, "set1lmemimm", "set1", 16,
00939 { 0, { (1<<MACH_BASE) } }
00940 },
00941
00942 {
00943 XSTORMY16_INSN_SET1HMEMIMM, "set1hmemimm", "set1", 16,
00944 { 0, { (1<<MACH_BASE) } }
00945 },
00946
00947 {
00948 XSTORMY16_INSN_CLR1GRIMM, "clr1grimm", "clr1", 16,
00949 { 0, { (1<<MACH_BASE) } }
00950 },
00951
00952 {
00953 XSTORMY16_INSN_CLR1GRGR, "clr1grgr", "clr1", 16,
00954 { 0, { (1<<MACH_BASE) } }
00955 },
00956
00957 {
00958 XSTORMY16_INSN_CLR1LMEMIMM, "clr1lmemimm", "clr1", 16,
00959 { 0, { (1<<MACH_BASE) } }
00960 },
00961
00962 {
00963 XSTORMY16_INSN_CLR1HMEMIMM, "clr1hmemimm", "clr1", 16,
00964 { 0, { (1<<MACH_BASE) } }
00965 },
00966
00967 {
00968 XSTORMY16_INSN_CBWGR, "cbwgr", "cbw", 16,
00969 { 0, { (1<<MACH_BASE) } }
00970 },
00971
00972 {
00973 XSTORMY16_INSN_REVGR, "revgr", "rev", 16,
00974 { 0, { (1<<MACH_BASE) } }
00975 },
00976
00977 {
00978 XSTORMY16_INSN_BCCGRGR, "bccgrgr", "b", 32,
00979 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
00980 },
00981
00982 {
00983 XSTORMY16_INSN_BCCGRIMM8, "bccgrimm8", "b", 32,
00984 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
00985 },
00986
00987 {
00988 XSTORMY16_INSN_BCCIMM16, "bccimm16", "b", 32,
00989 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
00990 },
00991
00992 {
00993 XSTORMY16_INSN_BNGRIMM4, "bngrimm4", "bn", 32,
00994 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
00995 },
00996
00997 {
00998 XSTORMY16_INSN_BNGRGR, "bngrgr", "bn", 32,
00999 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01000 },
01001
01002 {
01003 XSTORMY16_INSN_BNLMEMIMM, "bnlmemimm", "bn", 32,
01004 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01005 },
01006
01007 {
01008 XSTORMY16_INSN_BNHMEMIMM, "bnhmemimm", "bn", 32,
01009 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01010 },
01011
01012 {
01013 XSTORMY16_INSN_BPGRIMM4, "bpgrimm4", "bp", 32,
01014 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01015 },
01016
01017 {
01018 XSTORMY16_INSN_BPGRGR, "bpgrgr", "bp", 32,
01019 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01020 },
01021
01022 {
01023 XSTORMY16_INSN_BPLMEMIMM, "bplmemimm", "bp", 32,
01024 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01025 },
01026
01027 {
01028 XSTORMY16_INSN_BPHMEMIMM, "bphmemimm", "bp", 32,
01029 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01030 },
01031
01032 {
01033 XSTORMY16_INSN_BCC, "bcc", "b", 16,
01034 { 0|A(COND_CTI), { (1<<MACH_BASE) } }
01035 },
01036
01037 {
01038 XSTORMY16_INSN_BGR, "bgr", "br", 16,
01039 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01040 },
01041
01042 {
01043 XSTORMY16_INSN_BR, "br", "br", 16,
01044 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01045 },
01046
01047 {
01048 XSTORMY16_INSN_JMP, "jmp", "jmp", 16,
01049 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01050 },
01051
01052 {
01053 XSTORMY16_INSN_JMPF, "jmpf", "jmpf", 32,
01054 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01055 },
01056
01057 {
01058 XSTORMY16_INSN_CALLRGR, "callrgr", "callr", 16,
01059 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01060 },
01061
01062 {
01063 XSTORMY16_INSN_CALLRIMM, "callrimm", "callr", 16,
01064 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01065 },
01066
01067 {
01068 XSTORMY16_INSN_CALLGR, "callgr", "call", 16,
01069 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01070 },
01071
01072 {
01073 XSTORMY16_INSN_CALLFIMM, "callfimm", "callf", 32,
01074 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01075 },
01076
01077 {
01078 XSTORMY16_INSN_ICALLRGR, "icallrgr", "icallr", 16,
01079 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01080 },
01081
01082 {
01083 XSTORMY16_INSN_ICALLGR, "icallgr", "icall", 16,
01084 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01085 },
01086
01087 {
01088 XSTORMY16_INSN_ICALLFIMM, "icallfimm", "icallf", 32,
01089 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01090 },
01091
01092 {
01093 XSTORMY16_INSN_IRET, "iret", "iret", 16,
01094 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01095 },
01096
01097 {
01098 XSTORMY16_INSN_RET, "ret", "ret", 16,
01099 { 0|A(UNCOND_CTI), { (1<<MACH_BASE) } }
01100 },
01101
01102 {
01103 XSTORMY16_INSN_MUL, "mul", "mul", 16,
01104 { 0, { (1<<MACH_BASE) } }
01105 },
01106
01107 {
01108 XSTORMY16_INSN_DIV, "div", "div", 16,
01109 { 0, { (1<<MACH_BASE) } }
01110 },
01111
01112 {
01113 XSTORMY16_INSN_SDIV, "sdiv", "sdiv", 16,
01114 { 0, { (1<<MACH_BASE) } }
01115 },
01116
01117 {
01118 XSTORMY16_INSN_SDIVLH, "sdivlh", "sdivlh", 16,
01119 { 0, { (1<<MACH_BASE) } }
01120 },
01121
01122 {
01123 XSTORMY16_INSN_DIVLH, "divlh", "divlh", 16,
01124 { 0, { (1<<MACH_BASE) } }
01125 },
01126
01127 {
01128 XSTORMY16_INSN_RESET, "reset", "reset", 16,
01129 { 0, { (1<<MACH_BASE) } }
01130 },
01131
01132 {
01133 XSTORMY16_INSN_NOP, "nop", "nop", 16,
01134 { 0, { (1<<MACH_BASE) } }
01135 },
01136
01137 {
01138 XSTORMY16_INSN_HALT, "halt", "halt", 16,
01139 { 0, { (1<<MACH_BASE) } }
01140 },
01141
01142 {
01143 XSTORMY16_INSN_HOLD, "hold", "hold", 16,
01144 { 0, { (1<<MACH_BASE) } }
01145 },
01146
01147 {
01148 XSTORMY16_INSN_HOLDX, "holdx", "holdx", 16,
01149 { 0, { (1<<MACH_BASE) } }
01150 },
01151
01152 {
01153 XSTORMY16_INSN_BRK, "brk", "brk", 16,
01154 { 0, { (1<<MACH_BASE) } }
01155 },
01156
01157 {
01158 XSTORMY16_INSN_SYSCALL, "syscall", "--unused--", 16,
01159 { 0, { (1<<MACH_BASE) } }
01160 },
01161 };
01162
01163 #undef OP
01164 #undef A
01165
01166
01167 static void init_tables PARAMS ((void));
01168
01169 static void
01170 init_tables ()
01171 {
01172 }
01173
01174 static const CGEN_MACH * lookup_mach_via_bfd_name
01175 PARAMS ((const CGEN_MACH *, const char *));
01176 static void build_hw_table PARAMS ((CGEN_CPU_TABLE *));
01177 static void build_ifield_table PARAMS ((CGEN_CPU_TABLE *));
01178 static void build_operand_table PARAMS ((CGEN_CPU_TABLE *));
01179 static void build_insn_table PARAMS ((CGEN_CPU_TABLE *));
01180 static void xstormy16_cgen_rebuild_tables PARAMS ((CGEN_CPU_TABLE *));
01181
01182
01183
01184 static const CGEN_MACH *
01185 lookup_mach_via_bfd_name (table, name)
01186 const CGEN_MACH *table;
01187 const char *name;
01188 {
01189 while (table->name)
01190 {
01191 if (strcmp (name, table->bfd_name) == 0)
01192 return table;
01193 ++table;
01194 }
01195 abort ();
01196 }
01197
01198
01199
01200 static void
01201 build_hw_table (cd)
01202 CGEN_CPU_TABLE *cd;
01203 {
01204 int i;
01205 int machs = cd->machs;
01206 const CGEN_HW_ENTRY *init = & xstormy16_cgen_hw_table[0];
01207
01208
01209
01210 const CGEN_HW_ENTRY **selected =
01211 (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
01212
01213 cd->hw_table.init_entries = init;
01214 cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
01215 memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
01216
01217 for (i = 0; init[i].name != NULL; ++i)
01218 if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
01219 & machs)
01220 selected[init[i].type] = &init[i];
01221 cd->hw_table.entries = selected;
01222 cd->hw_table.num_entries = MAX_HW;
01223 }
01224
01225
01226
01227 static void
01228 build_ifield_table (cd)
01229 CGEN_CPU_TABLE *cd;
01230 {
01231 cd->ifld_table = & xstormy16_cgen_ifld_table[0];
01232 }
01233
01234
01235
01236 static void
01237 build_operand_table (cd)
01238 CGEN_CPU_TABLE *cd;
01239 {
01240 int i;
01241 int machs = cd->machs;
01242 const CGEN_OPERAND *init = & xstormy16_cgen_operand_table[0];
01243
01244
01245
01246 const CGEN_OPERAND **selected =
01247 (const CGEN_OPERAND **) xmalloc (MAX_OPERANDS * sizeof (CGEN_OPERAND *));
01248
01249 cd->operand_table.init_entries = init;
01250 cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
01251 memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
01252
01253 for (i = 0; init[i].name != NULL; ++i)
01254 if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
01255 & machs)
01256 selected[init[i].type] = &init[i];
01257 cd->operand_table.entries = selected;
01258 cd->operand_table.num_entries = MAX_OPERANDS;
01259 }
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269 static void
01270 build_insn_table (cd)
01271 CGEN_CPU_TABLE *cd;
01272 {
01273 int i;
01274 const CGEN_IBASE *ib = & xstormy16_cgen_insn_table[0];
01275 CGEN_INSN *insns = (CGEN_INSN *) xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
01276
01277 memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
01278 for (i = 0; i < MAX_INSNS; ++i)
01279 insns[i].base = &ib[i];
01280 cd->insn_table.init_entries = insns;
01281 cd->insn_table.entry_size = sizeof (CGEN_IBASE);
01282 cd->insn_table.num_init_entries = MAX_INSNS;
01283 }
01284
01285
01286
01287 static void
01288 xstormy16_cgen_rebuild_tables (cd)
01289 CGEN_CPU_TABLE *cd;
01290 {
01291 int i;
01292 unsigned int isas = cd->isas;
01293 unsigned int machs = cd->machs;
01294
01295 cd->int_insn_p = CGEN_INT_INSN_P;
01296
01297
01298 #define UNSET (CGEN_SIZE_UNKNOWN + 1)
01299 cd->default_insn_bitsize = UNSET;
01300 cd->base_insn_bitsize = UNSET;
01301 cd->min_insn_bitsize = 65535;
01302 cd->max_insn_bitsize = 0;
01303 for (i = 0; i < MAX_ISAS; ++i)
01304 if (((1 << i) & isas) != 0)
01305 {
01306 const CGEN_ISA *isa = & xstormy16_cgen_isa_table[i];
01307
01308
01309
01310 if (cd->default_insn_bitsize == UNSET)
01311 cd->default_insn_bitsize = isa->default_insn_bitsize;
01312 else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
01313 ;
01314 else
01315 cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
01316
01317
01318
01319 if (cd->base_insn_bitsize == UNSET)
01320 cd->base_insn_bitsize = isa->base_insn_bitsize;
01321 else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
01322 ;
01323 else
01324 cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
01325
01326
01327 if (isa->min_insn_bitsize < cd->min_insn_bitsize)
01328 cd->min_insn_bitsize = isa->min_insn_bitsize;
01329 if (isa->max_insn_bitsize > cd->max_insn_bitsize)
01330 cd->max_insn_bitsize = isa->max_insn_bitsize;
01331 }
01332
01333
01334 for (i = 0; i < MAX_MACHS; ++i)
01335 if (((1 << i) & machs) != 0)
01336 {
01337 const CGEN_MACH *mach = & xstormy16_cgen_mach_table[i];
01338
01339 if (mach->insn_chunk_bitsize != 0)
01340 {
01341 if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
01342 {
01343 fprintf (stderr, "xstormy16_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
01344 cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
01345 abort ();
01346 }
01347
01348 cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
01349 }
01350 }
01351
01352
01353 build_hw_table (cd);
01354
01355
01356 build_ifield_table (cd);
01357
01358
01359 build_operand_table (cd);
01360
01361
01362 build_insn_table (cd);
01363 }
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384 CGEN_CPU_DESC
01385 xstormy16_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
01386 {
01387 CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
01388 static int init_p;
01389 unsigned int isas = 0;
01390 unsigned int machs = 0;
01391 enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
01392 va_list ap;
01393
01394 if (! init_p)
01395 {
01396 init_tables ();
01397 init_p = 1;
01398 }
01399
01400 memset (cd, 0, sizeof (*cd));
01401
01402 va_start (ap, arg_type);
01403 while (arg_type != CGEN_CPU_OPEN_END)
01404 {
01405 switch (arg_type)
01406 {
01407 case CGEN_CPU_OPEN_ISAS :
01408 isas = va_arg (ap, unsigned int);
01409 break;
01410 case CGEN_CPU_OPEN_MACHS :
01411 machs = va_arg (ap, unsigned int);
01412 break;
01413 case CGEN_CPU_OPEN_BFDMACH :
01414 {
01415 const char *name = va_arg (ap, const char *);
01416 const CGEN_MACH *mach =
01417 lookup_mach_via_bfd_name (xstormy16_cgen_mach_table, name);
01418
01419 machs |= 1 << mach->num;
01420 break;
01421 }
01422 case CGEN_CPU_OPEN_ENDIAN :
01423 endian = va_arg (ap, enum cgen_endian);
01424 break;
01425 default :
01426 fprintf (stderr, "xstormy16_cgen_cpu_open: unsupported argument `%d'\n",
01427 arg_type);
01428 abort ();
01429 }
01430 arg_type = va_arg (ap, enum cgen_cpu_open_arg);
01431 }
01432 va_end (ap);
01433
01434
01435 if (machs == 0)
01436 machs = (1 << MAX_MACHS) - 1;
01437
01438 machs |= 1;
01439
01440 if (isas == 0)
01441 isas = (1 << MAX_ISAS) - 1;
01442 if (endian == CGEN_ENDIAN_UNKNOWN)
01443 {
01444
01445 fprintf (stderr, "xstormy16_cgen_cpu_open: no endianness specified\n");
01446 abort ();
01447 }
01448
01449 cd->isas = isas;
01450 cd->machs = machs;
01451 cd->endian = endian;
01452
01453
01454
01455
01456 cd->insn_endian = endian;
01457
01458
01459 cd->rebuild_tables = xstormy16_cgen_rebuild_tables;
01460 xstormy16_cgen_rebuild_tables (cd);
01461
01462
01463 cd->signed_overflow_ok_p = 0;
01464
01465 return (CGEN_CPU_DESC) cd;
01466 }
01467
01468
01469
01470
01471 CGEN_CPU_DESC
01472 xstormy16_cgen_cpu_open_1 (mach_name, endian)
01473 const char *mach_name;
01474 enum cgen_endian endian;
01475 {
01476 return xstormy16_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
01477 CGEN_CPU_OPEN_ENDIAN, endian,
01478 CGEN_CPU_OPEN_END);
01479 }
01480
01481
01482
01483
01484
01485
01486 void
01487 xstormy16_cgen_cpu_close (cd)
01488 CGEN_CPU_DESC cd;
01489 {
01490 unsigned int i;
01491 const CGEN_INSN *insns;
01492
01493 if (cd->macro_insn_table.init_entries)
01494 {
01495 insns = cd->macro_insn_table.init_entries;
01496 for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
01497 {
01498 if (CGEN_INSN_RX ((insns)))
01499 regfree (CGEN_INSN_RX (insns));
01500 }
01501 }
01502
01503 if (cd->insn_table.init_entries)
01504 {
01505 insns = cd->insn_table.init_entries;
01506 for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
01507 {
01508 if (CGEN_INSN_RX (insns))
01509 regfree (CGEN_INSN_RX (insns));
01510 }
01511 }
01512
01513
01514
01515 if (cd->macro_insn_table.init_entries)
01516 free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
01517
01518 if (cd->insn_table.init_entries)
01519 free ((CGEN_INSN *) cd->insn_table.init_entries);
01520
01521 if (cd->hw_table.entries)
01522 free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
01523
01524 if (cd->operand_table.entries)
01525 free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
01526
01527 free (cd);
01528 }
01529