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 "openrisc-desc.h"
00034 #include "openrisc-opc.h"
00035 #include "libiberty.h"
00036
00037
00038
00039
00040
00041
00042 static int asm_hash_insn_p PARAMS ((const CGEN_INSN *));
00043 static unsigned int asm_hash_insn PARAMS ((const char *));
00044 static int dis_hash_insn_p PARAMS ((const CGEN_INSN *));
00045 static unsigned int dis_hash_insn PARAMS ((const char *, CGEN_INSN_INT));
00046
00047
00048
00049 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00050 #define F(f) & openrisc_cgen_ifld_table[OPENRISC_##f]
00051 #else
00052 #define F(f) & openrisc_cgen_ifld_table[OPENRISC_f]
00053 #endif
00054 static const CGEN_IFMT ifmt_empty ATTRIBUTE_UNUSED = {
00055 0, 0, 0x0, { { 0 } }
00056 };
00057
00058 static const CGEN_IFMT ifmt_l_j ATTRIBUTE_UNUSED = {
00059 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_ABS26) }, { 0 } }
00060 };
00061
00062 static const CGEN_IFMT ifmt_l_jr ATTRIBUTE_UNUSED = {
00063 32, 32, 0xffe00000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_OP3) }, { F (F_OP4) }, { F (F_R2) }, { F (F_UIMM16) }, { 0 } }
00064 };
00065
00066 static const CGEN_IFMT ifmt_l_bal ATTRIBUTE_UNUSED = {
00067 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_DISP26) }, { 0 } }
00068 };
00069
00070 static const CGEN_IFMT ifmt_l_movhi ATTRIBUTE_UNUSED = {
00071 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_SIMM16) }, { 0 } }
00072 };
00073
00074 static const CGEN_IFMT ifmt_l_mfsr ATTRIBUTE_UNUSED = {
00075 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_UIMM16) }, { 0 } }
00076 };
00077
00078 static const CGEN_IFMT ifmt_l_mtsr ATTRIBUTE_UNUSED = {
00079 32, 32, 0xfc0007ff, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_R3) }, { F (F_I16_1) }, { 0 } }
00080 };
00081
00082 static const CGEN_IFMT ifmt_l_lw ATTRIBUTE_UNUSED = {
00083 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_SIMM16) }, { 0 } }
00084 };
00085
00086 static const CGEN_IFMT ifmt_l_sw ATTRIBUTE_UNUSED = {
00087 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R3) }, { F (F_I16NC) }, { 0 } }
00088 };
00089
00090 static const CGEN_IFMT ifmt_l_sll ATTRIBUTE_UNUSED = {
00091 32, 32, 0xfc0007ff, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_R3) }, { F (F_F_10_3) }, { F (F_OP6) }, { F (F_F_4_1) }, { F (F_OP7) }, { 0 } }
00092 };
00093
00094 static const CGEN_IFMT ifmt_l_slli ATTRIBUTE_UNUSED = {
00095 32, 32, 0xfc00ffe0, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_F_15_8) }, { F (F_OP6) }, { F (F_UIMM5) }, { 0 } }
00096 };
00097
00098 static const CGEN_IFMT ifmt_l_add ATTRIBUTE_UNUSED = {
00099 32, 32, 0xfc0007ff, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_R3) }, { F (F_F_10_7) }, { F (F_OP7) }, { 0 } }
00100 };
00101
00102 static const CGEN_IFMT ifmt_l_addi ATTRIBUTE_UNUSED = {
00103 32, 32, 0xfc000000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_R1) }, { F (F_R2) }, { F (F_LO16) }, { 0 } }
00104 };
00105
00106 static const CGEN_IFMT ifmt_l_sfgts ATTRIBUTE_UNUSED = {
00107 32, 32, 0xffe007ff, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_OP5) }, { F (F_R2) }, { F (F_R3) }, { F (F_F_10_11) }, { 0 } }
00108 };
00109
00110 static const CGEN_IFMT ifmt_l_sfgtsi ATTRIBUTE_UNUSED = {
00111 32, 32, 0xffe00000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_OP5) }, { F (F_R2) }, { F (F_SIMM16) }, { 0 } }
00112 };
00113
00114 static const CGEN_IFMT ifmt_l_sfgtui ATTRIBUTE_UNUSED = {
00115 32, 32, 0xffe00000, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_OP5) }, { F (F_R2) }, { F (F_UIMM16) }, { 0 } }
00116 };
00117
00118 #undef F
00119
00120 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00121 #define A(a) (1 << CGEN_INSN_##a)
00122 #else
00123 #define A(a) (1 << CGEN_INSN_a)
00124 #endif
00125 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00126 #define OPERAND(op) OPENRISC_OPERAND_##op
00127 #else
00128 #define OPERAND(op) OPENRISC_OPERAND_op
00129 #endif
00130 #define MNEM CGEN_SYNTAX_MNEMONIC
00131 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00132
00133
00134
00135 static const CGEN_OPCODE openrisc_cgen_insn_opcode_table[MAX_INSNS] =
00136 {
00137
00138
00139
00140 { { 0, 0, 0, 0 }, {{0}}, 0, {0}},
00141
00142 {
00143 { 0, 0, 0, 0 },
00144 { { MNEM, ' ', OP (ABS_26), 0 } },
00145 & ifmt_l_j, { 0x0 }
00146 },
00147
00148 {
00149 { 0, 0, 0, 0 },
00150 { { MNEM, ' ', OP (ABS_26), 0 } },
00151 & ifmt_l_j, { 0x4000000 }
00152 },
00153
00154 {
00155 { 0, 0, 0, 0 },
00156 { { MNEM, ' ', OP (RA), 0 } },
00157 & ifmt_l_jr, { 0x14000000 }
00158 },
00159
00160 {
00161 { 0, 0, 0, 0 },
00162 { { MNEM, ' ', OP (RA), 0 } },
00163 & ifmt_l_jr, { 0x14200000 }
00164 },
00165
00166 {
00167 { 0, 0, 0, 0 },
00168 { { MNEM, ' ', OP (DISP_26), 0 } },
00169 & ifmt_l_bal, { 0x8000000 }
00170 },
00171
00172 {
00173 { 0, 0, 0, 0 },
00174 { { MNEM, ' ', OP (DISP_26), 0 } },
00175 & ifmt_l_bal, { 0xc000000 }
00176 },
00177
00178 {
00179 { 0, 0, 0, 0 },
00180 { { MNEM, ' ', OP (DISP_26), 0 } },
00181 & ifmt_l_bal, { 0x10000000 }
00182 },
00183
00184 {
00185 { 0, 0, 0, 0 },
00186 { { MNEM, ' ', OP (UIMM_16), 0 } },
00187 & ifmt_l_jr, { 0x17000000 }
00188 },
00189
00190 {
00191 { 0, 0, 0, 0 },
00192 { { MNEM, ' ', OP (RA), 0 } },
00193 & ifmt_l_jr, { 0x14400000 }
00194 },
00195
00196 {
00197 { 0, 0, 0, 0 },
00198 { { MNEM, ' ', OP (UIMM_16), 0 } },
00199 & ifmt_l_jr, { 0x16000000 }
00200 },
00201
00202 {
00203 { 0, 0, 0, 0 },
00204 { { MNEM, 0 } },
00205 & ifmt_l_jr, { 0x15000000 }
00206 },
00207
00208 {
00209 { 0, 0, 0, 0 },
00210 { { MNEM, ' ', OP (RD), ',', OP (HI16), 0 } },
00211 & ifmt_l_movhi, { 0x18000000 }
00212 },
00213
00214 {
00215 { 0, 0, 0, 0 },
00216 { { MNEM, ' ', OP (RD), ',', OP (RA), 0 } },
00217 & ifmt_l_mfsr, { 0x1c000000 }
00218 },
00219
00220 {
00221 { 0, 0, 0, 0 },
00222 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00223 & ifmt_l_mtsr, { 0x40000000 }
00224 },
00225
00226 {
00227 { 0, 0, 0, 0 },
00228 { { MNEM, ' ', OP (RD), ',', OP (SIMM_16), '(', OP (RA), ')', 0 } },
00229 & ifmt_l_lw, { 0x80000000 }
00230 },
00231
00232 {
00233 { 0, 0, 0, 0 },
00234 { { MNEM, ' ', OP (RD), ',', OP (SIMM_16), '(', OP (RA), ')', 0 } },
00235 & ifmt_l_lw, { 0x84000000 }
00236 },
00237
00238 {
00239 { 0, 0, 0, 0 },
00240 { { MNEM, ' ', OP (RD), ',', OP (SIMM_16), '(', OP (RA), ')', 0 } },
00241 & ifmt_l_lw, { 0x88000000 }
00242 },
00243
00244 {
00245 { 0, 0, 0, 0 },
00246 { { MNEM, ' ', OP (RD), ',', OP (SIMM_16), '(', OP (RA), ')', 0 } },
00247 & ifmt_l_lw, { 0x8c000000 }
00248 },
00249
00250 {
00251 { 0, 0, 0, 0 },
00252 { { MNEM, ' ', OP (RD), ',', OP (SIMM_16), '(', OP (RA), ')', 0 } },
00253 & ifmt_l_lw, { 0x90000000 }
00254 },
00255
00256 {
00257 { 0, 0, 0, 0 },
00258 { { MNEM, ' ', OP (UI16NC), '(', OP (RA), ')', ',', OP (RB), 0 } },
00259 & ifmt_l_sw, { 0xd4000000 }
00260 },
00261
00262 {
00263 { 0, 0, 0, 0 },
00264 { { MNEM, ' ', OP (UI16NC), '(', OP (RA), ')', ',', OP (RB), 0 } },
00265 & ifmt_l_sw, { 0xd8000000 }
00266 },
00267
00268 {
00269 { 0, 0, 0, 0 },
00270 { { MNEM, ' ', OP (UI16NC), '(', OP (RA), ')', ',', OP (RB), 0 } },
00271 & ifmt_l_sw, { 0xdc000000 }
00272 },
00273
00274 {
00275 { 0, 0, 0, 0 },
00276 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00277 & ifmt_l_sll, { 0xe0000008 }
00278 },
00279
00280 {
00281 { 0, 0, 0, 0 },
00282 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (UIMM_5), 0 } },
00283 & ifmt_l_slli, { 0xb4000000 }
00284 },
00285
00286 {
00287 { 0, 0, 0, 0 },
00288 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00289 & ifmt_l_sll, { 0xe0000028 }
00290 },
00291
00292 {
00293 { 0, 0, 0, 0 },
00294 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (UIMM_5), 0 } },
00295 & ifmt_l_slli, { 0xb4000020 }
00296 },
00297
00298 {
00299 { 0, 0, 0, 0 },
00300 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00301 & ifmt_l_sll, { 0xe0000048 }
00302 },
00303
00304 {
00305 { 0, 0, 0, 0 },
00306 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (UIMM_5), 0 } },
00307 & ifmt_l_slli, { 0xb4000040 }
00308 },
00309
00310 {
00311 { 0, 0, 0, 0 },
00312 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00313 & ifmt_l_sll, { 0xe0000088 }
00314 },
00315
00316 {
00317 { 0, 0, 0, 0 },
00318 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (UIMM_5), 0 } },
00319 & ifmt_l_slli, { 0xb4000080 }
00320 },
00321
00322 {
00323 { 0, 0, 0, 0 },
00324 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00325 & ifmt_l_add, { 0xe0000000 }
00326 },
00327
00328 {
00329 { 0, 0, 0, 0 },
00330 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00331 & ifmt_l_addi, { 0x94000000 }
00332 },
00333
00334 {
00335 { 0, 0, 0, 0 },
00336 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00337 & ifmt_l_add, { 0xe0000002 }
00338 },
00339
00340 {
00341 { 0, 0, 0, 0 },
00342 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00343 & ifmt_l_addi, { 0x9c000000 }
00344 },
00345
00346 {
00347 { 0, 0, 0, 0 },
00348 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00349 & ifmt_l_add, { 0xe0000003 }
00350 },
00351
00352 {
00353 { 0, 0, 0, 0 },
00354 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00355 & ifmt_l_addi, { 0xa0000000 }
00356 },
00357
00358 {
00359 { 0, 0, 0, 0 },
00360 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00361 & ifmt_l_add, { 0xe0000004 }
00362 },
00363
00364 {
00365 { 0, 0, 0, 0 },
00366 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00367 & ifmt_l_addi, { 0xa4000000 }
00368 },
00369
00370 {
00371 { 0, 0, 0, 0 },
00372 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00373 & ifmt_l_add, { 0xe0000005 }
00374 },
00375
00376 {
00377 { 0, 0, 0, 0 },
00378 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00379 & ifmt_l_addi, { 0xa8000000 }
00380 },
00381
00382 {
00383 { 0, 0, 0, 0 },
00384 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00385 & ifmt_l_add, { 0xe0000006 }
00386 },
00387
00388 {
00389 { 0, 0, 0, 0 },
00390 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (LO16), 0 } },
00391 & ifmt_l_addi, { 0xac000000 }
00392 },
00393
00394 {
00395 { 0, 0, 0, 0 },
00396 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00397 & ifmt_l_add, { 0xe0000009 }
00398 },
00399
00400 {
00401 { 0, 0, 0, 0 },
00402 { { MNEM, ' ', OP (RD), ',', OP (RA), ',', OP (RB), 0 } },
00403 & ifmt_l_add, { 0xe000000a }
00404 },
00405
00406 {
00407 { 0, 0, 0, 0 },
00408 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00409 & ifmt_l_sfgts, { 0xe4c00000 }
00410 },
00411
00412 {
00413 { 0, 0, 0, 0 },
00414 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00415 & ifmt_l_sfgts, { 0xe4400000 }
00416 },
00417
00418 {
00419 { 0, 0, 0, 0 },
00420 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00421 & ifmt_l_sfgts, { 0xe4e00000 }
00422 },
00423
00424 {
00425 { 0, 0, 0, 0 },
00426 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00427 & ifmt_l_sfgts, { 0xe4600000 }
00428 },
00429
00430 {
00431 { 0, 0, 0, 0 },
00432 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00433 & ifmt_l_sfgts, { 0xe5000000 }
00434 },
00435
00436 {
00437 { 0, 0, 0, 0 },
00438 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00439 & ifmt_l_sfgts, { 0xe4800000 }
00440 },
00441
00442 {
00443 { 0, 0, 0, 0 },
00444 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00445 & ifmt_l_sfgts, { 0xe5200000 }
00446 },
00447
00448 {
00449 { 0, 0, 0, 0 },
00450 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00451 & ifmt_l_sfgts, { 0xe4a00000 }
00452 },
00453
00454 {
00455 { 0, 0, 0, 0 },
00456 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00457 & ifmt_l_sfgtsi, { 0xb8c00000 }
00458 },
00459
00460 {
00461 { 0, 0, 0, 0 },
00462 { { MNEM, ' ', OP (RA), ',', OP (UIMM_16), 0 } },
00463 & ifmt_l_sfgtui, { 0xb8400000 }
00464 },
00465
00466 {
00467 { 0, 0, 0, 0 },
00468 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00469 & ifmt_l_sfgtsi, { 0xb8e00000 }
00470 },
00471
00472 {
00473 { 0, 0, 0, 0 },
00474 { { MNEM, ' ', OP (RA), ',', OP (UIMM_16), 0 } },
00475 & ifmt_l_sfgtui, { 0xb8600000 }
00476 },
00477
00478 {
00479 { 0, 0, 0, 0 },
00480 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00481 & ifmt_l_sfgtsi, { 0xb9000000 }
00482 },
00483
00484 {
00485 { 0, 0, 0, 0 },
00486 { { MNEM, ' ', OP (RA), ',', OP (UIMM_16), 0 } },
00487 & ifmt_l_sfgtui, { 0xb8800000 }
00488 },
00489
00490 {
00491 { 0, 0, 0, 0 },
00492 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00493 & ifmt_l_sfgtsi, { 0xb9200000 }
00494 },
00495
00496 {
00497 { 0, 0, 0, 0 },
00498 { { MNEM, ' ', OP (RA), ',', OP (UIMM_16), 0 } },
00499 & ifmt_l_sfgtui, { 0xb8a00000 }
00500 },
00501
00502 {
00503 { 0, 0, 0, 0 },
00504 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00505 & ifmt_l_sfgts, { 0xe4000000 }
00506 },
00507
00508 {
00509 { 0, 0, 0, 0 },
00510 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00511 & ifmt_l_sfgtsi, { 0xb8000000 }
00512 },
00513
00514 {
00515 { 0, 0, 0, 0 },
00516 { { MNEM, ' ', OP (RA), ',', OP (RB), 0 } },
00517 & ifmt_l_sfgts, { 0xe4200000 }
00518 },
00519
00520 {
00521 { 0, 0, 0, 0 },
00522 { { MNEM, ' ', OP (RA), ',', OP (SIMM_16), 0 } },
00523 & ifmt_l_sfgtsi, { 0xb8200000 }
00524 },
00525 };
00526
00527 #undef A
00528 #undef OPERAND
00529 #undef MNEM
00530 #undef OP
00531
00532
00533
00534 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00535 #define F(f) & openrisc_cgen_ifld_table[OPENRISC_##f]
00536 #else
00537 #define F(f) & openrisc_cgen_ifld_table[OPENRISC_f]
00538 #endif
00539 static const CGEN_IFMT ifmt_l_ret ATTRIBUTE_UNUSED = {
00540 32, 32, 0xffffffff, { { F (F_CLASS) }, { F (F_SUB) }, { F (F_OP3) }, { F (F_OP4) }, { F (F_R2) }, { F (F_UIMM16) }, { 0 } }
00541 };
00542
00543 #undef F
00544
00545
00546
00547 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00548 #define A(a) (1 << CGEN_INSN_##a)
00549 #else
00550 #define A(a) (1 << CGEN_INSN_a)
00551 #endif
00552 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
00553 #define OPERAND(op) OPENRISC_OPERAND_##op
00554 #else
00555 #define OPERAND(op) OPENRISC_OPERAND_op
00556 #endif
00557 #define MNEM CGEN_SYNTAX_MNEMONIC
00558 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
00559
00560
00561
00562 static const CGEN_IBASE openrisc_cgen_macro_insn_table[] =
00563 {
00564
00565 {
00566 -1, "l-ret", "l.ret", 32,
00567 { 0|A(ALIAS), { (1<<MACH_BASE) } }
00568 },
00569 };
00570
00571
00572
00573 static const CGEN_OPCODE openrisc_cgen_macro_insn_opcode_table[] =
00574 {
00575
00576 {
00577 { 0, 0, 0, 0 },
00578 { { MNEM, 0 } },
00579 & ifmt_l_ret, { 0x140b0000 }
00580 },
00581 };
00582
00583 #undef A
00584 #undef OPERAND
00585 #undef MNEM
00586 #undef OP
00587
00588 #ifndef CGEN_ASM_HASH_P
00589 #define CGEN_ASM_HASH_P(insn) 1
00590 #endif
00591
00592 #ifndef CGEN_DIS_HASH_P
00593 #define CGEN_DIS_HASH_P(insn) 1
00594 #endif
00595
00596
00597
00598
00599 static int
00600 asm_hash_insn_p (insn)
00601 const CGEN_INSN *insn ATTRIBUTE_UNUSED;
00602 {
00603 return CGEN_ASM_HASH_P (insn);
00604 }
00605
00606 static int
00607 dis_hash_insn_p (insn)
00608 const CGEN_INSN *insn;
00609 {
00610
00611
00612 if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_NO_DIS))
00613 return 0;
00614 return CGEN_DIS_HASH_P (insn);
00615 }
00616
00617 #ifndef CGEN_ASM_HASH
00618 #define CGEN_ASM_HASH_SIZE 127
00619 #ifdef CGEN_MNEMONIC_OPERANDS
00620 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
00621 #else
00622 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
00623 #endif
00624 #endif
00625
00626
00627
00628
00629
00630
00631 #ifndef CGEN_DIS_HASH
00632 #define CGEN_DIS_HASH_SIZE 256
00633 #define CGEN_DIS_HASH(buf, value) (*(unsigned char *) (buf))
00634 #endif
00635
00636
00637
00638
00639 static unsigned int
00640 asm_hash_insn (mnem)
00641 const char * mnem;
00642 {
00643 return CGEN_ASM_HASH (mnem);
00644 }
00645
00646
00647
00648
00649 static unsigned int
00650 dis_hash_insn (buf, value)
00651 const char * buf ATTRIBUTE_UNUSED;
00652 CGEN_INSN_INT value ATTRIBUTE_UNUSED;
00653 {
00654 return CGEN_DIS_HASH (buf, value);
00655 }
00656
00657 static void set_fields_bitsize PARAMS ((CGEN_FIELDS *, int));
00658
00659
00660
00661 static void
00662 set_fields_bitsize (fields, size)
00663 CGEN_FIELDS *fields;
00664 int size;
00665 {
00666 CGEN_FIELDS_BITSIZE (fields) = size;
00667 }
00668
00669
00670
00671
00672 void
00673 openrisc_cgen_init_opcode_table (cd)
00674 CGEN_CPU_DESC cd;
00675 {
00676 int i;
00677 int num_macros = (sizeof (openrisc_cgen_macro_insn_table) /
00678 sizeof (openrisc_cgen_macro_insn_table[0]));
00679 const CGEN_IBASE *ib = & openrisc_cgen_macro_insn_table[0];
00680 const CGEN_OPCODE *oc = & openrisc_cgen_macro_insn_opcode_table[0];
00681 CGEN_INSN *insns = (CGEN_INSN *) xmalloc (num_macros * sizeof (CGEN_INSN));
00682 memset (insns, 0, num_macros * sizeof (CGEN_INSN));
00683 for (i = 0; i < num_macros; ++i)
00684 {
00685 insns[i].base = &ib[i];
00686 insns[i].opcode = &oc[i];
00687 openrisc_cgen_build_insn_regex (& insns[i]);
00688 }
00689 cd->macro_insn_table.init_entries = insns;
00690 cd->macro_insn_table.entry_size = sizeof (CGEN_IBASE);
00691 cd->macro_insn_table.num_init_entries = num_macros;
00692
00693 oc = & openrisc_cgen_insn_opcode_table[0];
00694 insns = (CGEN_INSN *) cd->insn_table.init_entries;
00695 for (i = 0; i < MAX_INSNS; ++i)
00696 {
00697 insns[i].opcode = &oc[i];
00698 openrisc_cgen_build_insn_regex (& insns[i]);
00699 }
00700
00701 cd->sizeof_fields = sizeof (CGEN_FIELDS);
00702 cd->set_fields_bitsize = set_fields_bitsize;
00703
00704 cd->asm_hash_p = asm_hash_insn_p;
00705 cd->asm_hash = asm_hash_insn;
00706 cd->asm_hash_size = CGEN_ASM_HASH_SIZE;
00707
00708 cd->dis_hash_p = dis_hash_insn_p;
00709 cd->dis_hash = dis_hash_insn;
00710 cd->dis_hash_size = CGEN_DIS_HASH_SIZE;
00711 }