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 "ansidecl.h"
00031 #include "bfd.h"
00032 #include "symcat.h"
00033 #include "ip2k-desc.h"
00034 #include "ip2k-opc.h"
00035 #include "libiberty.h"
00036
00037
00038
00039 #include "safe-ctype.h"
00040
00041
00042 unsigned int
00043 ip2k_asm_hash (insn)
00044 const char* insn;
00045 {
00046 unsigned int hash;
00047 const char* m = insn;
00048
00049 for (hash = 0; *m && !ISSPACE(*m); m++)
00050 hash = (hash * 23) ^ (0x1F & TOLOWER(*m));
00051
00052
00053
00054 return hash % CGEN_ASM_HASH_SIZE;
00055 }
00056
00057
00058
00059 int
00060 ip2k_cgen_insn_supported (cd, insn)
00061 CGEN_CPU_DESC cd;
00062 const CGEN_INSN *insn;
00063 {
00064 int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
00065
00066
00067 if (machs == 0)
00068 return 1;
00069
00070 return ((machs & cd->machs) != 0);
00071 }
00072
00073
00074
00075
00076
00077
00078 static int asm_hash_insn_p PARAMS ((const CGEN_INSN *));
00079 static unsigned int asm_hash_insn PARAMS ((const char *));
00080 static int dis_hash_insn_p PARAMS ((const CGEN_INSN *));
00081 static unsigned int dis_hash_insn PARAMS ((const char *, CGEN_INSN_INT));
00082
00083
00084
00085 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00086 #define F(f) & ip2k_cgen_ifld_table[IP2K_##f]
00087 #else
00088 #define F(f) & ip2k_cgen_ifld_table[IP2K_f]
00089 #endif
00090 static const CGEN_IFMT ifmt_empty ATTRIBUTE_UNUSED = {
00091 0, 0, 0x0, { { 0 } }
00092 };
00093
00094 static const CGEN_IFMT ifmt_jmp ATTRIBUTE_UNUSED = {
00095 16, 16, 0xe000, { { F (F_OP3) }, { F (F_ADDR16CJP) }, { 0 } }
00096 };
00097
00098 static const CGEN_IFMT ifmt_sb ATTRIBUTE_UNUSED = {
00099 16, 16, 0xf000, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00100 };
00101
00102 static const CGEN_IFMT ifmt_xorw_l ATTRIBUTE_UNUSED = {
00103 16, 16, 0xff00, { { F (F_OP4) }, { F (F_OP4MID) }, { F (F_IMM8) }, { 0 } }
00104 };
00105
00106 static const CGEN_IFMT ifmt_loadl_a ATTRIBUTE_UNUSED = {
00107 16, 16, 0xff00, { { F (F_OP4) }, { F (F_OP4MID) }, { F (F_IMM8) }, { 0 } }
00108 };
00109
00110 static const CGEN_IFMT ifmt_loadh_a ATTRIBUTE_UNUSED = {
00111 16, 16, 0xff00, { { F (F_OP4) }, { F (F_OP4MID) }, { F (F_IMM8) }, { 0 } }
00112 };
00113
00114 static const CGEN_IFMT ifmt_addcfr_w ATTRIBUTE_UNUSED = {
00115 16, 16, 0xfe00, { { F (F_OP6) }, { F (F_DIR) }, { F (F_REG) }, { 0 } }
00116 };
00117
00118 static const CGEN_IFMT ifmt_speed ATTRIBUTE_UNUSED = {
00119 16, 16, 0xff00, { { F (F_OP8) }, { F (F_IMM8) }, { 0 } }
00120 };
00121
00122 static const CGEN_IFMT ifmt_ireadi ATTRIBUTE_UNUSED = {
00123 16, 16, 0xffff, { { F (F_OP6) }, { F (F_OP6_10LOW) }, { 0 } }
00124 };
00125
00126 static const CGEN_IFMT ifmt_page ATTRIBUTE_UNUSED = {
00127 16, 16, 0xfff8, { { F (F_OP6) }, { F (F_OP6_7LOW) }, { F (F_PAGE3) }, { 0 } }
00128 };
00129
00130 static const CGEN_IFMT ifmt_reti ATTRIBUTE_UNUSED = {
00131 16, 16, 0xfff8, { { F (F_OP6) }, { F (F_OP6_7LOW) }, { F (F_RETI3) }, { 0 } }
00132 };
00133
00134 #undef F
00135
00136 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00137 #define A(a) (1 << CGEN_INSN_##a)
00138 #else
00139 #define A(a) (1 << CGEN_INSN_a)
00140 #endif
00141 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00142 #define OPERAND(op) IP2K_OPERAND_##op
00143 #else
00144 #define OPERAND(op) IP2K_OPERAND_op
00145 #endif
00146 #define MNEM CGEN_SYNTAX_MNEMONIC
00147 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00148
00149
00150
00151 static const CGEN_OPCODE ip2k_cgen_insn_opcode_table[MAX_INSNS] =
00152 {
00153
00154
00155
00156 { { 0, 0, 0, 0 }, {{0}}, 0, {0}},
00157
00158 {
00159 { 0, 0, 0, 0 },
00160 { { MNEM, ' ', OP (ADDR16CJP), 0 } },
00161 & ifmt_jmp, { 0xe000 }
00162 },
00163
00164 {
00165 { 0, 0, 0, 0 },
00166 { { MNEM, ' ', OP (ADDR16CJP), 0 } },
00167 & ifmt_jmp, { 0xc000 }
00168 },
00169
00170 {
00171 { 0, 0, 0, 0 },
00172 { { MNEM, ' ', OP (FR), ',', OP (BITNO), 0 } },
00173 & ifmt_sb, { 0xb000 }
00174 },
00175
00176 {
00177 { 0, 0, 0, 0 },
00178 { { MNEM, ' ', OP (FR), ',', OP (BITNO), 0 } },
00179 & ifmt_sb, { 0xa000 }
00180 },
00181
00182 {
00183 { 0, 0, 0, 0 },
00184 { { MNEM, ' ', OP (FR), ',', OP (BITNO), 0 } },
00185 & ifmt_sb, { 0x9000 }
00186 },
00187
00188 {
00189 { 0, 0, 0, 0 },
00190 { { MNEM, ' ', OP (FR), ',', OP (BITNO), 0 } },
00191 & ifmt_sb, { 0x8000 }
00192 },
00193
00194 {
00195 { 0, 0, 0, 0 },
00196 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00197 & ifmt_xorw_l, { 0x7f00 }
00198 },
00199
00200 {
00201 { 0, 0, 0, 0 },
00202 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00203 & ifmt_xorw_l, { 0x7e00 }
00204 },
00205
00206 {
00207 { 0, 0, 0, 0 },
00208 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00209 & ifmt_xorw_l, { 0x7d00 }
00210 },
00211
00212 {
00213 { 0, 0, 0, 0 },
00214 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00215 & ifmt_xorw_l, { 0x7b00 }
00216 },
00217
00218 {
00219 { 0, 0, 0, 0 },
00220 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00221 & ifmt_xorw_l, { 0x7a00 }
00222 },
00223
00224 {
00225 { 0, 0, 0, 0 },
00226 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00227 & ifmt_xorw_l, { 0x7900 }
00228 },
00229
00230 {
00231 { 0, 0, 0, 0 },
00232 { { MNEM, ' ', '#', OP (LIT8), 0 } },
00233 & ifmt_xorw_l, { 0x7800 }
00234 },
00235
00236 {
00237 { 0, 0, 0, 0 },
00238 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00239 & ifmt_xorw_l, { 0x7700 }
00240 },
00241
00242 {
00243 { 0, 0, 0, 0 },
00244 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00245 & ifmt_xorw_l, { 0x7600 }
00246 },
00247
00248 {
00249 { 0, 0, 0, 0 },
00250 { { MNEM, ' ', '#', OP (LIT8), 0 } },
00251 & ifmt_xorw_l, { 0x7400 }
00252 },
00253
00254 {
00255 { 0, 0, 0, 0 },
00256 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00257 & ifmt_xorw_l, { 0x7300 }
00258 },
00259
00260 {
00261 { 0, 0, 0, 0 },
00262 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00263 & ifmt_xorw_l, { 0x7200 }
00264 },
00265
00266 {
00267 { 0, 0, 0, 0 },
00268 { { MNEM, ' ', '#', OP (LIT8), 0 } },
00269 & ifmt_xorw_l, { 0x7100 }
00270 },
00271
00272 {
00273 { 0, 0, 0, 0 },
00274 { { MNEM, ' ', '#', OP (LIT8), 0 } },
00275 & ifmt_xorw_l, { 0x7000 }
00276 },
00277
00278 {
00279 { 0, 0, 0, 0 },
00280 { { MNEM, ' ', OP (ADDR16L), 0 } },
00281 & ifmt_loadl_a, { 0x7100 }
00282 },
00283
00284 {
00285 { 0, 0, 0, 0 },
00286 { { MNEM, ' ', OP (ADDR16H), 0 } },
00287 & ifmt_loadh_a, { 0x7000 }
00288 },
00289
00290 {
00291 { 0, 0, 0, 0 },
00292 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00293 & ifmt_addcfr_w, { 0x5e00 }
00294 },
00295
00296 {
00297 { 0, 0, 0, 0 },
00298 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00299 & ifmt_addcfr_w, { 0x5c00 }
00300 },
00301
00302 {
00303 { 0, 0, 0, 0 },
00304 { { MNEM, ' ', OP (FR), 0 } },
00305 & ifmt_addcfr_w, { 0x5a00 }
00306 },
00307
00308 {
00309 { 0, 0, 0, 0 },
00310 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00311 & ifmt_addcfr_w, { 0x5800 }
00312 },
00313
00314 {
00315 { 0, 0, 0, 0 },
00316 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00317 & ifmt_addcfr_w, { 0x5400 }
00318 },
00319
00320 {
00321 { 0, 0, 0, 0 },
00322 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00323 & ifmt_addcfr_w, { 0x5000 }
00324 },
00325
00326 {
00327 { 0, 0, 0, 0 },
00328 { { MNEM, ' ', OP (FR), 0 } },
00329 & ifmt_addcfr_w, { 0x4e00 }
00330 },
00331
00332 {
00333 { 0, 0, 0, 0 },
00334 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00335 & ifmt_addcfr_w, { 0x4c00 }
00336 },
00337
00338 {
00339 { 0, 0, 0, 0 },
00340 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00341 & ifmt_addcfr_w, { 0x4800 }
00342 },
00343
00344 {
00345 { 0, 0, 0, 0 },
00346 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00347 & ifmt_addcfr_w, { 0x4a00 }
00348 },
00349
00350 {
00351 { 0, 0, 0, 0 },
00352 { { MNEM, ' ', OP (FR), 0 } },
00353 & ifmt_addcfr_w, { 0x4600 }
00354 },
00355
00356 {
00357 { 0, 0, 0, 0 },
00358 { { MNEM, ' ', OP (FR), 0 } },
00359 & ifmt_addcfr_w, { 0x4400 }
00360 },
00361
00362 {
00363 { 0, 0, 0, 0 },
00364 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00365 & ifmt_addcfr_w, { 0x4200 }
00366 },
00367
00368 {
00369 { 0, 0, 0, 0 },
00370 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00371 & ifmt_addcfr_w, { 0x4000 }
00372 },
00373
00374 {
00375 { 0, 0, 0, 0 },
00376 { { MNEM, ' ', OP (FR), 0 } },
00377 & ifmt_addcfr_w, { 0x3e00 }
00378 },
00379
00380 {
00381 { 0, 0, 0, 0 },
00382 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00383 & ifmt_addcfr_w, { 0x3c00 }
00384 },
00385
00386 {
00387 { 0, 0, 0, 0 },
00388 { { MNEM, ' ', OP (FR), 0 } },
00389 & ifmt_addcfr_w, { 0x3a00 }
00390 },
00391
00392 {
00393 { 0, 0, 0, 0 },
00394 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00395 & ifmt_addcfr_w, { 0x3800 }
00396 },
00397
00398 {
00399 { 0, 0, 0, 0 },
00400 { { MNEM, ' ', OP (FR), 0 } },
00401 & ifmt_addcfr_w, { 0x3600 }
00402 },
00403
00404 {
00405 { 0, 0, 0, 0 },
00406 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00407 & ifmt_addcfr_w, { 0x3400 }
00408 },
00409
00410 {
00411 { 0, 0, 0, 0 },
00412 { { MNEM, ' ', OP (FR), 0 } },
00413 & ifmt_addcfr_w, { 0x3200 }
00414 },
00415
00416 {
00417 { 0, 0, 0, 0 },
00418 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00419 & ifmt_addcfr_w, { 0x3000 }
00420 },
00421
00422 {
00423 { 0, 0, 0, 0 },
00424 { { MNEM, ' ', OP (FR), 0 } },
00425 & ifmt_addcfr_w, { 0x2e00 }
00426 },
00427
00428 {
00429 { 0, 0, 0, 0 },
00430 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00431 & ifmt_addcfr_w, { 0x2c00 }
00432 },
00433
00434 {
00435 { 0, 0, 0, 0 },
00436 { { MNEM, ' ', OP (FR), 0 } },
00437 & ifmt_addcfr_w, { 0x2a00 }
00438 },
00439
00440 {
00441 { 0, 0, 0, 0 },
00442 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00443 & ifmt_addcfr_w, { 0x2800 }
00444 },
00445
00446 {
00447 { 0, 0, 0, 0 },
00448 { { MNEM, ' ', OP (FR), 0 } },
00449 & ifmt_addcfr_w, { 0x2600 }
00450 },
00451
00452 {
00453 { 0, 0, 0, 0 },
00454 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00455 & ifmt_addcfr_w, { 0x2400 }
00456 },
00457
00458 {
00459 { 0, 0, 0, 0 },
00460 { { MNEM, ' ', OP (FR), 0 } },
00461 & ifmt_addcfr_w, { 0x2200 }
00462 },
00463
00464 {
00465 { 0, 0, 0, 0 },
00466 { { MNEM, ' ', 'W', ',', '#', OP (LIT8), 0 } },
00467 & ifmt_xorw_l, { 0x7c00 }
00468 },
00469
00470 {
00471 { 0, 0, 0, 0 },
00472 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00473 & ifmt_addcfr_w, { 0x200 }
00474 },
00475
00476 {
00477 { 0, 0, 0, 0 },
00478 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00479 & ifmt_addcfr_w, { 0x2000 }
00480 },
00481
00482 {
00483 { 0, 0, 0, 0 },
00484 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00485 & ifmt_addcfr_w, { 0x1e00 }
00486 },
00487
00488 {
00489 { 0, 0, 0, 0 },
00490 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00491 & ifmt_addcfr_w, { 0x1c00 }
00492 },
00493
00494 {
00495 { 0, 0, 0, 0 },
00496 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00497 & ifmt_addcfr_w, { 0x1a00 }
00498 },
00499
00500 {
00501 { 0, 0, 0, 0 },
00502 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00503 & ifmt_addcfr_w, { 0x1800 }
00504 },
00505
00506 {
00507 { 0, 0, 0, 0 },
00508 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00509 & ifmt_addcfr_w, { 0x1600 }
00510 },
00511
00512 {
00513 { 0, 0, 0, 0 },
00514 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00515 & ifmt_addcfr_w, { 0x1400 }
00516 },
00517
00518 {
00519 { 0, 0, 0, 0 },
00520 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00521 & ifmt_addcfr_w, { 0x1200 }
00522 },
00523
00524 {
00525 { 0, 0, 0, 0 },
00526 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00527 & ifmt_addcfr_w, { 0x1000 }
00528 },
00529
00530 {
00531 { 0, 0, 0, 0 },
00532 { { MNEM, ' ', OP (FR), 0 } },
00533 & ifmt_addcfr_w, { 0xe00 }
00534 },
00535
00536 {
00537 { 0, 0, 0, 0 },
00538 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00539 & ifmt_addcfr_w, { 0xc00 }
00540 },
00541
00542 {
00543 { 0, 0, 0, 0 },
00544 { { MNEM, ' ', OP (FR), ',', 'W', 0 } },
00545 & ifmt_addcfr_w, { 0xa00 }
00546 },
00547
00548 {
00549 { 0, 0, 0, 0 },
00550 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00551 & ifmt_addcfr_w, { 0x800 }
00552 },
00553
00554 {
00555 { 0, 0, 0, 0 },
00556 { { MNEM, ' ', OP (FR), 0 } },
00557 & ifmt_addcfr_w, { 0x600 }
00558 },
00559
00560 {
00561 { 0, 0, 0, 0 },
00562 { { MNEM, ' ', 'W', ',', OP (FR), 0 } },
00563 & ifmt_addcfr_w, { 0x400 }
00564 },
00565
00566 {
00567 { 0, 0, 0, 0 },
00568 { { MNEM, ' ', '#', OP (LIT8), 0 } },
00569 & ifmt_speed, { 0x100 }
00570 },
00571
00572 {
00573 { 0, 0, 0, 0 },
00574 { { MNEM, 0 } },
00575 & ifmt_ireadi, { 0x1d }
00576 },
00577
00578 {
00579 { 0, 0, 0, 0 },
00580 { { MNEM, 0 } },
00581 & ifmt_ireadi, { 0x1c }
00582 },
00583
00584 {
00585 { 0, 0, 0, 0 },
00586 { { MNEM, 0 } },
00587 & ifmt_ireadi, { 0x1b }
00588 },
00589
00590 {
00591 { 0, 0, 0, 0 },
00592 { { MNEM, 0 } },
00593 & ifmt_ireadi, { 0x1a }
00594 },
00595
00596 {
00597 { 0, 0, 0, 0 },
00598 { { MNEM, 0 } },
00599 & ifmt_ireadi, { 0x19 }
00600 },
00601
00602 {
00603 { 0, 0, 0, 0 },
00604 { { MNEM, 0 } },
00605 & ifmt_ireadi, { 0x18 }
00606 },
00607
00608 {
00609 { 0, 0, 0, 0 },
00610 { { MNEM, ' ', OP (ADDR16P), 0 } },
00611 & ifmt_page, { 0x10 }
00612 },
00613
00614 {
00615 { 0, 0, 0, 0 },
00616 { { MNEM, 0 } },
00617 & ifmt_ireadi, { 0xff }
00618 },
00619
00620 {
00621 { 0, 0, 0, 0 },
00622 { { MNEM, ' ', '#', OP (RETI3), 0 } },
00623 & ifmt_reti, { 0x8 }
00624 },
00625
00626 {
00627 { 0, 0, 0, 0 },
00628 { { MNEM, 0 } },
00629 & ifmt_ireadi, { 0x7 }
00630 },
00631
00632 {
00633 { 0, 0, 0, 0 },
00634 { { MNEM, 0 } },
00635 & ifmt_ireadi, { 0x6 }
00636 },
00637
00638 {
00639 { 0, 0, 0, 0 },
00640 { { MNEM, 0 } },
00641 & ifmt_ireadi, { 0x5 }
00642 },
00643
00644 {
00645 { 0, 0, 0, 0 },
00646 { { MNEM, 0 } },
00647 & ifmt_ireadi, { 0x4 }
00648 },
00649
00650 {
00651 { 0, 0, 0, 0 },
00652 { { MNEM, 0 } },
00653 & ifmt_ireadi, { 0x3 }
00654 },
00655
00656 {
00657 { 0, 0, 0, 0 },
00658 { { MNEM, 0 } },
00659 & ifmt_ireadi, { 0x2 }
00660 },
00661
00662 {
00663 { 0, 0, 0, 0 },
00664 { { MNEM, 0 } },
00665 & ifmt_ireadi, { 0x1 }
00666 },
00667
00668 {
00669 { 0, 0, 0, 0 },
00670 { { MNEM, 0 } },
00671 & ifmt_ireadi, { 0x0 }
00672 },
00673 };
00674
00675 #undef A
00676 #undef OPERAND
00677 #undef MNEM
00678 #undef OP
00679
00680
00681
00682 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00683 #define F(f) & ip2k_cgen_ifld_table[IP2K_##f]
00684 #else
00685 #define F(f) & ip2k_cgen_ifld_table[IP2K_f]
00686 #endif
00687 static const CGEN_IFMT ifmt_sc ATTRIBUTE_UNUSED = {
00688 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00689 };
00690
00691 static const CGEN_IFMT ifmt_snc ATTRIBUTE_UNUSED = {
00692 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00693 };
00694
00695 static const CGEN_IFMT ifmt_sz ATTRIBUTE_UNUSED = {
00696 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00697 };
00698
00699 static const CGEN_IFMT ifmt_snz ATTRIBUTE_UNUSED = {
00700 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00701 };
00702
00703 static const CGEN_IFMT ifmt_skip ATTRIBUTE_UNUSED = {
00704 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00705 };
00706
00707 static const CGEN_IFMT ifmt_skipb ATTRIBUTE_UNUSED = {
00708 16, 16, 0xffff, { { F (F_OP4) }, { F (F_BITNO) }, { F (F_REG) }, { 0 } }
00709 };
00710
00711 #undef F
00712
00713
00714
00715 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00716 #define A(a) (1 << CGEN_INSN_##a)
00717 #else
00718 #define A(a) (1 << CGEN_INSN_a)
00719 #endif
00720 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00721 #define OPERAND(op) IP2K_OPERAND_##op
00722 #else
00723 #define OPERAND(op) IP2K_OPERAND_op
00724 #endif
00725 #define MNEM CGEN_SYNTAX_MNEMONIC
00726 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00727
00728
00729
00730 static const CGEN_IBASE ip2k_cgen_macro_insn_table[] =
00731 {
00732
00733 {
00734 -1, "sc", "sc", 16,
00735 { 0|A(ALIAS), { (1<<MACH_BASE) } }
00736 },
00737
00738 {
00739 -1, "snc", "snc", 16,
00740 { 0|A(ALIAS), { (1<<MACH_BASE) } }
00741 },
00742
00743 {
00744 -1, "sz", "sz", 16,
00745 { 0|A(ALIAS), { (1<<MACH_BASE) } }
00746 },
00747
00748 {
00749 -1, "snz", "snz", 16,
00750 { 0|A(ALIAS), { (1<<MACH_BASE) } }
00751 },
00752
00753 {
00754 -1, "skip", "skip", 16,
00755 { 0|A(SKIPA)|A(ALIAS), { (1<<MACH_BASE) } }
00756 },
00757
00758 {
00759 -1, "skipb", "skip", 16,
00760 { 0|A(SKIPA)|A(ALIAS), { (1<<MACH_BASE) } }
00761 },
00762 };
00763
00764
00765
00766 static const CGEN_OPCODE ip2k_cgen_macro_insn_opcode_table[] =
00767 {
00768
00769 {
00770 { 0, 0, 0, 0 },
00771 { { MNEM, 0 } },
00772 & ifmt_sc, { 0xb00b }
00773 },
00774
00775 {
00776 { 0, 0, 0, 0 },
00777 { { MNEM, 0 } },
00778 & ifmt_snc, { 0xa00b }
00779 },
00780
00781 {
00782 { 0, 0, 0, 0 },
00783 { { MNEM, 0 } },
00784 & ifmt_sz, { 0xb40b }
00785 },
00786
00787 {
00788 { 0, 0, 0, 0 },
00789 { { MNEM, 0 } },
00790 & ifmt_snz, { 0xa40b }
00791 },
00792
00793 {
00794 { 0, 0, 0, 0 },
00795 { { MNEM, 0 } },
00796 & ifmt_skip, { 0xa009 }
00797 },
00798
00799 {
00800 { 0, 0, 0, 0 },
00801 { { MNEM, 0 } },
00802 & ifmt_skipb, { 0xb009 }
00803 },
00804 };
00805
00806 #undef A
00807 #undef OPERAND
00808 #undef MNEM
00809 #undef OP
00810
00811 #ifndef CGEN_ASM_HASH_P
00812 #define CGEN_ASM_HASH_P(insn) 1
00813 #endif
00814
00815 #ifndef CGEN_DIS_HASH_P
00816 #define CGEN_DIS_HASH_P(insn) 1
00817 #endif
00818
00819
00820
00821
00822 static int
00823 asm_hash_insn_p (insn)
00824 const CGEN_INSN *insn ATTRIBUTE_UNUSED;
00825 {
00826 return CGEN_ASM_HASH_P (insn);
00827 }
00828
00829 static int
00830 dis_hash_insn_p (insn)
00831 const CGEN_INSN *insn;
00832 {
00833
00834
00835 if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_NO_DIS))
00836 return 0;
00837 return CGEN_DIS_HASH_P (insn);
00838 }
00839
00840 #ifndef CGEN_ASM_HASH
00841 #define CGEN_ASM_HASH_SIZE 127
00842 #ifdef CGEN_MNEMONIC_OPERANDS
00843 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
00844 #else
00845 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
00846 #endif
00847 #endif
00848
00849
00850
00851
00852
00853
00854 #ifndef CGEN_DIS_HASH
00855 #define CGEN_DIS_HASH_SIZE 256
00856 #define CGEN_DIS_HASH(buf, value) (*(unsigned char *) (buf))
00857 #endif
00858
00859
00860
00861
00862 static unsigned int
00863 asm_hash_insn (mnem)
00864 const char * mnem;
00865 {
00866 return CGEN_ASM_HASH (mnem);
00867 }
00868
00869
00870
00871
00872 static unsigned int
00873 dis_hash_insn (buf, value)
00874 const char * buf ATTRIBUTE_UNUSED;
00875 CGEN_INSN_INT value ATTRIBUTE_UNUSED;
00876 {
00877 return CGEN_DIS_HASH (buf, value);
00878 }
00879
00880 static void set_fields_bitsize PARAMS ((CGEN_FIELDS *, int));
00881
00882
00883
00884 static void
00885 set_fields_bitsize (fields, size)
00886 CGEN_FIELDS *fields;
00887 int size;
00888 {
00889 CGEN_FIELDS_BITSIZE (fields) = size;
00890 }
00891
00892
00893
00894
00895 void
00896 ip2k_cgen_init_opcode_table (cd)
00897 CGEN_CPU_DESC cd;
00898 {
00899 int i;
00900 int num_macros = (sizeof (ip2k_cgen_macro_insn_table) /
00901 sizeof (ip2k_cgen_macro_insn_table[0]));
00902 const CGEN_IBASE *ib = & ip2k_cgen_macro_insn_table[0];
00903 const CGEN_OPCODE *oc = & ip2k_cgen_macro_insn_opcode_table[0];
00904 CGEN_INSN *insns = (CGEN_INSN *) xmalloc (num_macros * sizeof (CGEN_INSN));
00905 memset (insns, 0, num_macros * sizeof (CGEN_INSN));
00906 for (i = 0; i < num_macros; ++i)
00907 {
00908 insns[i].base = &ib[i];
00909 insns[i].opcode = &oc[i];
00910 ip2k_cgen_build_insn_regex (& insns[i]);
00911 }
00912 cd->macro_insn_table.init_entries = insns;
00913 cd->macro_insn_table.entry_size = sizeof (CGEN_IBASE);
00914 cd->macro_insn_table.num_init_entries = num_macros;
00915
00916 oc = & ip2k_cgen_insn_opcode_table[0];
00917 insns = (CGEN_INSN *) cd->insn_table.init_entries;
00918 for (i = 0; i < MAX_INSNS; ++i)
00919 {
00920 insns[i].opcode = &oc[i];
00921 ip2k_cgen_build_insn_regex (& insns[i]);
00922 }
00923
00924 cd->sizeof_fields = sizeof (CGEN_FIELDS);
00925 cd->set_fields_bitsize = set_fields_bitsize;
00926
00927 cd->asm_hash_p = asm_hash_insn_p;
00928 cd->asm_hash = asm_hash_insn;
00929 cd->asm_hash_size = CGEN_ASM_HASH_SIZE;
00930
00931 cd->dis_hash_p = dis_hash_insn_p;
00932 cd->dis_hash = dis_hash_insn;
00933 cd->dis_hash_size = CGEN_DIS_HASH_SIZE;
00934 }