1 /* The IGEN simulator generator for GDB, the GNU Debugger. 2 3 Copyright 2002, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 5 Contributed by Andrew Cagney. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 23 #include "misc.h" 24 #include "lf.h" 25 #include "table.h" 26 #include "filter.h" 27 28 #include "igen.h" 29 #include "ld-insn.h" 30 #include "ld-decode.h" 31 #include "gen.h" 32 33 static insn_uint 34 sub_val (insn_uint val, int val_last_pos, int first_pos, int last_pos) 35 { 36 return ((val >> (val_last_pos - last_pos)) 37 & (((insn_uint) 1 << (last_pos - first_pos + 1)) - 1)); 38 } 39 40 static void 41 update_depth (lf *file, gen_entry *entry, int depth, void *data) 42 { 43 int *max_depth = (int *) data; 44 if (*max_depth < depth) 45 *max_depth = depth; 46 } 47 48 49 int 50 gen_entry_depth (gen_entry *table) 51 { 52 int depth = 0; 53 gen_entry_traverse_tree (NULL, table, 1, NULL, /*start */ 54 update_depth, NULL, /*end */ 55 &depth); /* data */ 56 return depth; 57 } 58 59 60 static void 61 print_gen_entry_path (line_ref *line, gen_entry *table, error_func *print) 62 { 63 if (table->parent == NULL) 64 { 65 if (table->top->model != NULL) 66 print (line, "%s", table->top->model->name); 67 else 68 print (line, ""); 69 } 70 else 71 { 72 print_gen_entry_path (line, table->parent, print); 73 print (NULL, ".%d", table->opcode_nr); 74 } 75 } 76 77 static void 78 print_gen_entry_insns (gen_entry *table, 79 error_func *print, 80 char *first_message, char *next_message) 81 { 82 insn_list *i; 83 char *message; 84 message = first_message; 85 for (i = table->insns; i != NULL; i = i->next) 86 { 87 insn_entry *insn = i->insn; 88 print_gen_entry_path (insn->line, table, print); 89 print (NULL, ": %s.%s %s\n", insn->format_name, insn->name, message); 90 if (next_message != NULL) 91 message = next_message; 92 } 93 } 94 95 /* same as strcmp */ 96 static int 97 insn_field_cmp (insn_word_entry *l, insn_word_entry *r) 98 { 99 while (1) 100 { 101 int bit_nr; 102 if (l == NULL && r == NULL) 103 return 0; /* all previous fields the same */ 104 if (l == NULL) 105 return -1; /* left shorter than right */ 106 if (r == NULL) 107 return +1; /* left longer than right */ 108 for (bit_nr = 0; bit_nr < options.insn_bit_size; bit_nr++) 109 { 110 if (l->bit[bit_nr]->field->type != insn_field_string) 111 continue; 112 if (r->bit[bit_nr]->field->type != insn_field_string) 113 continue; 114 if (l->bit[bit_nr]->field->conditions == NULL) 115 continue; 116 if (r->bit[bit_nr]->field->conditions == NULL) 117 continue; 118 if (0) 119 printf ("%s%s%s VS %s%s%s\n", 120 l->bit[bit_nr]->field->val_string, 121 l->bit[bit_nr]->field->conditions->test == 122 insn_field_cond_eq ? "=" : "!", 123 l->bit[bit_nr]->field->conditions->string, 124 r->bit[bit_nr]->field->val_string, 125 r->bit[bit_nr]->field->conditions->test == 126 insn_field_cond_eq ? "=" : "!", 127 r->bit[bit_nr]->field->conditions->string); 128 if (l->bit[bit_nr]->field->conditions->test == insn_field_cond_eq 129 && r->bit[bit_nr]->field->conditions->test == 130 insn_field_cond_eq) 131 { 132 if (l->bit[bit_nr]->field->conditions->type == 133 insn_field_cond_field 134 && r->bit[bit_nr]->field->conditions->type == 135 insn_field_cond_field) 136 /* somewhat arbitrary */ 137 { 138 int cmp = strcmp (l->bit[bit_nr]->field->conditions->string, 139 r->bit[bit_nr]->field->conditions-> 140 string); 141 if (cmp != 0) 142 return cmp; 143 else 144 continue; 145 } 146 if (l->bit[bit_nr]->field->conditions->type == 147 insn_field_cond_field) 148 return +1; 149 if (r->bit[bit_nr]->field->conditions->type == 150 insn_field_cond_field) 151 return -1; 152 /* The case of both fields having constant values should have 153 already have been handled because such fields are converted 154 into normal constant fields. */ 155 continue; 156 } 157 if (l->bit[bit_nr]->field->conditions->test == insn_field_cond_eq) 158 return +1; /* left = only */ 159 if (r->bit[bit_nr]->field->conditions->test == insn_field_cond_eq) 160 return -1; /* right = only */ 161 /* FIXME: Need to some what arbitrarily order conditional lists */ 162 continue; 163 } 164 l = l->next; 165 r = r->next; 166 } 167 } 168 169 /* same as strcmp */ 170 static int 171 insn_word_cmp (insn_word_entry *l, insn_word_entry *r) 172 { 173 while (1) 174 { 175 int bit_nr; 176 if (l == NULL && r == NULL) 177 return 0; /* all previous fields the same */ 178 if (l == NULL) 179 return -1; /* left shorter than right */ 180 if (r == NULL) 181 return +1; /* left longer than right */ 182 for (bit_nr = 0; bit_nr < options.insn_bit_size; bit_nr++) 183 { 184 if (l->bit[bit_nr]->mask < r->bit[bit_nr]->mask) 185 return -1; 186 if (l->bit[bit_nr]->mask > r->bit[bit_nr]->mask) 187 return 1; 188 if (l->bit[bit_nr]->value < r->bit[bit_nr]->value) 189 return -1; 190 if (l->bit[bit_nr]->value > r->bit[bit_nr]->value) 191 return 1; 192 } 193 l = l->next; 194 r = r->next; 195 } 196 } 197 198 /* same as strcmp */ 199 static int 200 opcode_bit_cmp (opcode_bits *l, opcode_bits *r) 201 { 202 if (l == NULL && r == NULL) 203 return 0; /* all previous bits the same */ 204 if (l == NULL) 205 return -1; /* left shorter than right */ 206 if (r == NULL) 207 return +1; /* left longer than right */ 208 /* most significant word */ 209 if (l->field->word_nr < r->field->word_nr) 210 return +1; /* left has more significant word */ 211 if (l->field->word_nr > r->field->word_nr) 212 return -1; /* right has more significant word */ 213 /* most significant bit? */ 214 if (l->first < r->first) 215 return +1; /* left as more significant bit */ 216 if (l->first > r->first) 217 return -1; /* right as more significant bit */ 218 /* nr bits? */ 219 if (l->last < r->last) 220 return +1; /* left as less bits */ 221 if (l->last > r->last) 222 return -1; /* right as less bits */ 223 /* value? */ 224 if (l->value < r->value) 225 return -1; 226 if (l->value > r->value) 227 return 1; 228 return 0; 229 } 230 231 232 /* same as strcmp */ 233 static int 234 opcode_bits_cmp (opcode_bits *l, opcode_bits *r) 235 { 236 while (1) 237 { 238 int cmp; 239 if (l == NULL && r == NULL) 240 return 0; /* all previous bits the same */ 241 cmp = opcode_bit_cmp (l, r); 242 if (cmp != 0) 243 return cmp; 244 l = l->next; 245 r = r->next; 246 } 247 } 248 249 /* same as strcmp */ 250 static opcode_bits * 251 new_opcode_bits (opcode_bits *old_bits, 252 int value, 253 int first, 254 int last, insn_field_entry *field, opcode_field *opcode) 255 { 256 opcode_bits *new_bits = ZALLOC (opcode_bits); 257 new_bits->field = field; 258 new_bits->value = value; 259 new_bits->first = first; 260 new_bits->last = last; 261 new_bits->opcode = opcode; 262 263 if (old_bits != NULL) 264 { 265 opcode_bits *new_list; 266 opcode_bits **last = &new_list; 267 new_list = new_opcode_bits (old_bits->next, 268 old_bits->value, 269 old_bits->first, 270 old_bits->last, 271 old_bits->field, old_bits->opcode); 272 while (*last != NULL) 273 { 274 int cmp = opcode_bit_cmp (new_bits, *last); 275 if (cmp < 0) /* new < new_list */ 276 { 277 break; 278 } 279 if (cmp == 0) 280 { 281 ERROR ("Duplicated insn bits in list"); 282 } 283 last = &(*last)->next; 284 } 285 new_bits->next = *last; 286 *last = new_bits; 287 return new_list; 288 } 289 else 290 { 291 return new_bits; 292 } 293 } 294 295 /* Same as strcmp(). */ 296 static int 297 name_cmp (const char *l, const char *r) 298 { 299 if (l == NULL && r == NULL) 300 return 0; 301 if (l != NULL && r == NULL) 302 return -1; 303 if (l == NULL && r != NULL) 304 return +1; 305 return strcmp (l, r); 306 } 307 308 309 typedef enum 310 { 311 merge_duplicate_insns, 312 report_duplicate_insns, 313 } 314 duplicate_insn_actions; 315 316 static insn_list * 317 insn_list_insert (insn_list **cur_insn_ptr, 318 int *nr_insns, 319 insn_entry * insn, 320 opcode_bits *expanded_bits, 321 opcode_field *opcodes, 322 int nr_prefetched_words, 323 duplicate_insn_actions duplicate_action) 324 { 325 /* insert it according to the order of the fields & bits */ 326 for (; (*cur_insn_ptr) != NULL; cur_insn_ptr = &(*cur_insn_ptr)->next) 327 { 328 int cmp; 329 330 /* key#1 sort according to the constant fields of each instruction */ 331 cmp = insn_word_cmp (insn->words, (*cur_insn_ptr)->insn->words); 332 if (cmp < 0) 333 break; 334 else if (cmp > 0) 335 continue; 336 337 /* key#2 sort according to the expanded bits of each instruction */ 338 cmp = opcode_bits_cmp (expanded_bits, (*cur_insn_ptr)->expanded_bits); 339 if (cmp < 0) 340 break; 341 else if (cmp > 0) 342 continue; 343 344 /* key#3 sort according to the non-constant fields of each instruction */ 345 cmp = insn_field_cmp (insn->words, (*cur_insn_ptr)->insn->words); 346 if (cmp < 0) 347 break; 348 else if (cmp > 0) 349 continue; 350 351 if (duplicate_action == merge_duplicate_insns) 352 { 353 /* key#4: If we're going to merge duplicates, also sort 354 according to the format_name. Two instructions with 355 identical decode patterns, but different names, are 356 considered different when merging. Duplicates are only 357 important when creating a decode table (implied by 358 report_duplicate_insns) as such a table only has the 359 instruction's bit code as a way of differentiating 360 between instructions. */ 361 int cmp = name_cmp (insn->format_name, 362 (*cur_insn_ptr)->insn->format_name); 363 if (cmp < 0) 364 break; 365 else if (cmp > 0) 366 continue; 367 } 368 369 if (duplicate_action == merge_duplicate_insns) 370 { 371 /* key#5: If we're going to merge duplicates, also sort 372 according to the name. See comment above for 373 format_name. */ 374 int cmp = name_cmp (insn->name, (*cur_insn_ptr)->insn->name); 375 if (cmp < 0) 376 break; 377 else if (cmp > 0) 378 continue; 379 } 380 381 /* duplicate keys, report problem */ 382 switch (duplicate_action) 383 { 384 case report_duplicate_insns: 385 /* It would appear that we have two instructions with the 386 same constant field values across all words and bits. 387 This error can also occure when insn_field_cmp() is 388 failing to differentiate between two instructions that 389 differ only in their conditional fields. */ 390 warning (insn->line, 391 "Two instructions with identical constant fields\n"); 392 error ((*cur_insn_ptr)->insn->line, 393 "Location of duplicate instruction\n"); 394 case merge_duplicate_insns: 395 /* Add the opcode path to the instructions list */ 396 if (options.trace.insn_insertion) 397 { 398 notify ((*cur_insn_ptr)->insn->line, 399 "%s.%s: insert merge %s.%s\n", 400 (*cur_insn_ptr)->insn->format_name, 401 (*cur_insn_ptr)->insn->name, 402 insn->format_name, 403 insn->name); 404 } 405 if (opcodes != NULL) 406 { 407 insn_opcodes **last = &(*cur_insn_ptr)->opcodes; 408 while (*last != NULL) 409 { 410 last = &(*last)->next; 411 } 412 (*last) = ZALLOC (insn_opcodes); 413 (*last)->opcode = opcodes; 414 } 415 /* Use the larger nr_prefetched_words */ 416 if ((*cur_insn_ptr)->nr_prefetched_words < nr_prefetched_words) 417 (*cur_insn_ptr)->nr_prefetched_words = nr_prefetched_words; 418 return (*cur_insn_ptr); 419 } 420 421 } 422 423 /* create a new list entry and insert it */ 424 { 425 insn_list *new_insn = ZALLOC (insn_list); 426 if (options.trace.insn_insertion) 427 { 428 notify (insn->line, 429 "%s.%s: insert new\n", 430 insn->format_name, 431 insn->name); 432 } 433 new_insn->insn = insn; 434 new_insn->expanded_bits = expanded_bits; 435 new_insn->next = (*cur_insn_ptr); 436 new_insn->nr_prefetched_words = nr_prefetched_words; 437 if (opcodes != NULL) 438 { 439 new_insn->opcodes = ZALLOC (insn_opcodes); 440 new_insn->opcodes->opcode = opcodes; 441 } 442 (*cur_insn_ptr) = new_insn; 443 } 444 445 *nr_insns += 1; 446 447 return (*cur_insn_ptr); 448 } 449 450 451 extern void 452 gen_entry_traverse_tree (lf *file, 453 gen_entry *table, 454 int depth, 455 gen_entry_handler * start, 456 gen_entry_handler * leaf, 457 gen_entry_handler * end, void *data) 458 { 459 gen_entry *entry; 460 461 ASSERT (table !=NULL); 462 ASSERT (table->opcode != NULL); 463 ASSERT (table->nr_entries > 0); 464 ASSERT (table->entries != 0); 465 466 /* prefix */ 467 if (start != NULL && depth >= 0) 468 { 469 start (file, table, depth, data); 470 } 471 /* infix leaves */ 472 for (entry = table->entries; entry != NULL; entry = entry->sibling) 473 { 474 if (entry->entries != NULL && depth != 0) 475 { 476 gen_entry_traverse_tree (file, entry, depth + 1, 477 start, leaf, end, data); 478 } 479 else if (depth >= 0) 480 { 481 if (leaf != NULL) 482 { 483 leaf (file, entry, depth, data); 484 } 485 } 486 } 487 /* postfix */ 488 if (end != NULL && depth >= 0) 489 { 490 end (file, table, depth, data); 491 } 492 } 493 494 495 496 /* create a list element containing a single gen_table entry */ 497 498 static gen_list * 499 make_table (insn_table *isa, decode_table *rules, model_entry *model) 500 { 501 insn_entry *insn; 502 gen_list *entry = ZALLOC (gen_list); 503 entry->table = ZALLOC (gen_entry); 504 entry->table->top = entry; 505 entry->model = model; 506 entry->isa = isa; 507 for (insn = isa->insns; insn != NULL; insn = insn->next) 508 { 509 if (model == NULL 510 || insn->processors == NULL 511 || filter_is_member (insn->processors, model->name)) 512 { 513 insn_list_insert (&entry->table->insns, &entry->table->nr_insns, insn, NULL, /* expanded_bits - none yet */ 514 NULL, /* opcodes - none yet */ 515 0, /* nr_prefetched_words - none yet */ 516 report_duplicate_insns); 517 } 518 } 519 entry->table->opcode_rule = rules; 520 return entry; 521 } 522 523 524 gen_table * 525 make_gen_tables (insn_table *isa, decode_table *rules) 526 { 527 gen_table *gen = ZALLOC (gen_table); 528 gen->isa = isa; 529 gen->rules = rules; 530 if (options.gen.multi_sim) 531 { 532 gen_list **last = &gen->tables; 533 model_entry *model; 534 filter *processors; 535 if (options.model_filter != NULL) 536 processors = options.model_filter; 537 else 538 processors = isa->model->processors; 539 for (model = isa->model->models; model != NULL; model = model->next) 540 { 541 if (filter_is_member (processors, model->name)) 542 { 543 *last = make_table (isa, rules, model); 544 last = &(*last)->next; 545 } 546 } 547 } 548 else 549 { 550 gen->tables = make_table (isa, rules, NULL); 551 } 552 return gen; 553 } 554 555 556 /****************************************************************/ 557 558 #if 0 559 typedef enum 560 { 561 field_is_not_constant = 0, 562 field_constant_int = 1, 563 field_constant_reserved = 2, 564 field_constant_string = 3 565 } 566 constant_field_types; 567 568 static constant_field_types 569 insn_field_is_constant (insn_field * field, decode_table *rule) 570 { 571 switch (field->type) 572 { 573 case insn_field_int: 574 /* field is an integer */ 575 return field_constant_int; 576 case insn_field_reserved: 577 /* field is `/' and treating that as a constant */ 578 if (rule->with_zero_reserved) 579 return field_constant_reserved; 580 else 581 return field_is_not_constant; 582 case insn_field_wild: 583 return field_is_not_constant; /* never constant */ 584 case insn_field_string: 585 /* field, though variable, is on the list of forced constants */ 586 if (filter_is_member (rule->constant_field_names, field->val_string)) 587 return field_constant_string; 588 else 589 return field_is_not_constant; 590 } 591 ERROR ("Internal error"); 592 return field_is_not_constant; 593 } 594 #endif 595 596 597 /****************************************************************/ 598 599 600 /* Is the bit, according to the decode rule, identical across all the 601 instructions? */ 602 static int 603 insns_bit_useless (insn_list *insns, decode_table *rule, int bit_nr) 604 { 605 insn_list *entry; 606 int value = -1; 607 int is_useless = 1; /* cleared if something actually found */ 608 609 /* check the instructions for some constant value in at least one of 610 the bit fields */ 611 for (entry = insns; entry != NULL; entry = entry->next) 612 { 613 insn_word_entry *word = entry->insn->word[rule->word_nr]; 614 insn_bit_entry *bit = word->bit[bit_nr]; 615 switch (bit->field->type) 616 { 617 case insn_field_invalid: 618 ASSERT (0); 619 break; 620 case insn_field_wild: 621 case insn_field_reserved: 622 /* neither useless or useful - ignore */ 623 break; 624 case insn_field_int: 625 switch (rule->search) 626 { 627 case decode_find_strings: 628 /* an integer isn't a string */ 629 return 1; 630 case decode_find_constants: 631 case decode_find_mixed: 632 /* an integer is useful if its value isn't the same 633 between all instructions. The first time through the 634 value is saved, the second time through (if the 635 values differ) it is marked as useful. */ 636 if (value < 0) 637 value = bit->value; 638 else if (value != bit->value) 639 is_useless = 0; 640 break; 641 } 642 break; 643 case insn_field_string: 644 switch (rule->search) 645 { 646 case decode_find_strings: 647 /* at least one string, keep checking */ 648 is_useless = 0; 649 break; 650 case decode_find_constants: 651 case decode_find_mixed: 652 if (filter_is_member (rule->constant_field_names, 653 bit->field->val_string)) 654 /* a string field forced to constant? */ 655 is_useless = 0; 656 else if (rule->search == decode_find_constants) 657 /* the string field isn't constant */ 658 return 1; 659 break; 660 } 661 } 662 } 663 664 /* Given only one constant value has been found, check through all 665 the instructions to see if at least one conditional makes it 666 usefull */ 667 if (value >= 0 && is_useless) 668 { 669 for (entry = insns; entry != NULL; entry = entry->next) 670 { 671 insn_word_entry *word = entry->insn->word[rule->word_nr]; 672 insn_bit_entry *bit = word->bit[bit_nr]; 673 switch (bit->field->type) 674 { 675 case insn_field_invalid: 676 ASSERT (0); 677 break; 678 case insn_field_wild: 679 case insn_field_reserved: 680 case insn_field_int: 681 /* already processed */ 682 break; 683 case insn_field_string: 684 switch (rule->search) 685 { 686 case decode_find_strings: 687 case decode_find_constants: 688 /* already processed */ 689 break; 690 case decode_find_mixed: 691 /* string field with conditions. If this condition 692 eliminates the value then the compare is useful */ 693 if (bit->field->conditions != NULL) 694 { 695 insn_field_cond *condition; 696 int shift = bit->field->last - bit_nr; 697 for (condition = bit->field->conditions; 698 condition != NULL; condition = condition->next) 699 { 700 switch (condition->type) 701 { 702 case insn_field_cond_value: 703 switch (condition->test) 704 { 705 case insn_field_cond_ne: 706 if (((condition->value >> shift) & 1) 707 == (unsigned) value) 708 /* conditional field excludes the 709 current value */ 710 is_useless = 0; 711 break; 712 case insn_field_cond_eq: 713 if (((condition->value >> shift) & 1) 714 != (unsigned) value) 715 /* conditional field requires the 716 current value */ 717 is_useless = 0; 718 break; 719 } 720 break; 721 case insn_field_cond_field: 722 /* are these handled separatly? */ 723 break; 724 } 725 } 726 } 727 } 728 } 729 } 730 } 731 732 return is_useless; 733 } 734 735 736 /* go through a gen-table's list of instruction formats looking for a 737 range of bits that meet the decode table RULEs requirements */ 738 739 static opcode_field * 740 gen_entry_find_opcode_field (insn_list *insns, 741 decode_table *rule, int string_only) 742 { 743 opcode_field curr_opcode; 744 ASSERT (rule != NULL); 745 746 memset (&curr_opcode, 0, sizeof (curr_opcode)); 747 curr_opcode.word_nr = rule->word_nr; 748 curr_opcode.first = rule->first; 749 curr_opcode.last = rule->last; 750 751 /* Try to reduce the size of first..last in accordance with the 752 decode rules */ 753 754 while (curr_opcode.first <= rule->last) 755 { 756 if (insns_bit_useless (insns, rule, curr_opcode.first)) 757 curr_opcode.first++; 758 else 759 break; 760 } 761 while (curr_opcode.last >= rule->first) 762 { 763 if (insns_bit_useless (insns, rule, curr_opcode.last)) 764 curr_opcode.last--; 765 else 766 break; 767 } 768 769 770 #if 0 771 for (entry = insns; entry != NULL; entry = entry->next) 772 { 773 insn_word_entry *fields = entry->insn->word[rule->word_nr]; 774 opcode_field new_opcode; 775 776 ASSERT (fields != NULL); 777 778 /* find a start point for the opcode field */ 779 new_opcode.first = rule->first; 780 while (new_opcode.first <= rule->last 781 && (!string_only 782 || 783 (insn_field_is_constant (fields->bit[new_opcode.first], rule) 784 != field_constant_string)) && (string_only 785 || 786 (insn_field_is_constant 787 (fields-> 788 bit[new_opcode.first], 789 rule) == 790 field_is_not_constant))) 791 { 792 int new_first = fields->bit[new_opcode.first]->last + 1; 793 ASSERT (new_first > new_opcode.first); 794 new_opcode.first = new_first; 795 } 796 ASSERT (new_opcode.first > rule->last 797 || (string_only 798 && insn_field_is_constant (fields->bit[new_opcode.first], 799 rule) == field_constant_string) 800 || (!string_only 801 && insn_field_is_constant (fields->bit[new_opcode.first], 802 rule))); 803 804 /* find the end point for the opcode field */ 805 new_opcode.last = rule->last; 806 while (new_opcode.last >= rule->first 807 && (!string_only 808 || insn_field_is_constant (fields->bit[new_opcode.last], 809 rule) != field_constant_string) 810 && (string_only 811 || !insn_field_is_constant (fields->bit[new_opcode.last], 812 rule))) 813 { 814 int new_last = fields->bit[new_opcode.last]->first - 1; 815 ASSERT (new_last < new_opcode.last); 816 new_opcode.last = new_last; 817 } 818 ASSERT (new_opcode.last < rule->first 819 || (string_only 820 && insn_field_is_constant (fields->bit[new_opcode.last], 821 rule) == field_constant_string) 822 || (!string_only 823 && insn_field_is_constant (fields->bit[new_opcode.last], 824 rule))); 825 826 /* now see if our current opcode needs expanding to include the 827 interesting fields within this instruction */ 828 if (new_opcode.first <= rule->last 829 && curr_opcode.first > new_opcode.first) 830 curr_opcode.first = new_opcode.first; 831 if (new_opcode.last >= rule->first 832 && curr_opcode.last < new_opcode.last) 833 curr_opcode.last = new_opcode.last; 834 835 } 836 #endif 837 838 /* did the final opcode field end up being empty? */ 839 if (curr_opcode.first > curr_opcode.last) 840 { 841 return NULL; 842 } 843 ASSERT (curr_opcode.last >= rule->first); 844 ASSERT (curr_opcode.first <= rule->last); 845 ASSERT (curr_opcode.first <= curr_opcode.last); 846 847 /* Ensure that, for the non string only case, the opcode includes 848 the range forced_first .. forced_last */ 849 if (!string_only && curr_opcode.first > rule->force_first) 850 { 851 curr_opcode.first = rule->force_first; 852 } 853 if (!string_only && curr_opcode.last < rule->force_last) 854 { 855 curr_opcode.last = rule->force_last; 856 } 857 858 /* For the string only case, force just the lower bound (so that the 859 shift can be eliminated) */ 860 if (string_only && rule->force_last == options.insn_bit_size - 1) 861 { 862 curr_opcode.last = options.insn_bit_size - 1; 863 } 864 865 /* handle any special cases */ 866 switch (rule->type) 867 { 868 case normal_decode_rule: 869 /* let the above apply */ 870 curr_opcode.nr_opcodes = 871 (1 << (curr_opcode.last - curr_opcode.first + 1)); 872 break; 873 case boolean_rule: 874 curr_opcode.is_boolean = 1; 875 curr_opcode.boolean_constant = rule->constant; 876 curr_opcode.nr_opcodes = 2; 877 break; 878 } 879 880 { 881 opcode_field *new_field = ZALLOC (opcode_field); 882 memcpy (new_field, &curr_opcode, sizeof (opcode_field)); 883 return new_field; 884 } 885 } 886 887 888 static void 889 gen_entry_insert_insn (gen_entry *table, 890 insn_entry * old_insn, 891 int new_word_nr, 892 int new_nr_prefetched_words, 893 int new_opcode_nr, opcode_bits *new_bits) 894 { 895 gen_entry **entry = &table->entries; 896 897 /* find the new table for this entry */ 898 while ((*entry) != NULL && (*entry)->opcode_nr < new_opcode_nr) 899 { 900 entry = &(*entry)->sibling; 901 } 902 903 if ((*entry) == NULL || (*entry)->opcode_nr != new_opcode_nr) 904 { 905 /* insert the missing entry */ 906 gen_entry *new_entry = ZALLOC (gen_entry); 907 new_entry->sibling = (*entry); 908 (*entry) = new_entry; 909 table->nr_entries++; 910 /* fill it in */ 911 new_entry->top = table->top; 912 new_entry->opcode_nr = new_opcode_nr; 913 new_entry->word_nr = new_word_nr; 914 new_entry->expanded_bits = new_bits; 915 new_entry->opcode_rule = table->opcode_rule->next; 916 new_entry->parent = table; 917 new_entry->nr_prefetched_words = new_nr_prefetched_words; 918 } 919 /* ASSERT new_bits == cur_entry bits */ 920 ASSERT ((*entry) != NULL && (*entry)->opcode_nr == new_opcode_nr); 921 insn_list_insert (&(*entry)->insns, &(*entry)->nr_insns, old_insn, NULL, /* expanded_bits - only in final list */ 922 NULL, /* opcodes - only in final list */ 923 new_nr_prefetched_words, /* for this table */ 924 report_duplicate_insns); 925 } 926 927 928 static void 929 gen_entry_expand_opcode (gen_entry *table, 930 insn_entry * instruction, 931 int bit_nr, int opcode_nr, opcode_bits *bits) 932 { 933 if (bit_nr > table->opcode->last) 934 { 935 /* Only include the hardwired bit information with an entry IF 936 that entry (and hence its functions) are being duplicated. */ 937 if (options.trace.insn_expansion) 938 { 939 print_gen_entry_path (table->opcode_rule->line, table, notify); 940 notify (NULL, ": insert %d - %s.%s%s\n", 941 opcode_nr, 942 instruction->format_name, 943 instruction->name, 944 (table->opcode_rule-> 945 with_duplicates ? " (duplicated)" : "")); 946 } 947 if (table->opcode_rule->with_duplicates) 948 { 949 gen_entry_insert_insn (table, instruction, 950 table->opcode->word_nr, 951 table->nr_prefetched_words, opcode_nr, bits); 952 } 953 else 954 { 955 gen_entry_insert_insn (table, instruction, 956 table->opcode->word_nr, 957 table->nr_prefetched_words, opcode_nr, NULL); 958 } 959 } 960 else 961 { 962 insn_word_entry *word = instruction->word[table->opcode->word_nr]; 963 insn_field_entry *field = word->bit[bit_nr]->field; 964 int last_pos = ((field->last < table->opcode->last) 965 ? field->last : table->opcode->last); 966 int first_pos = ((field->first > table->opcode->first) 967 ? field->first : table->opcode->first); 968 int width = last_pos - first_pos + 1; 969 switch (field->type) 970 { 971 case insn_field_int: 972 { 973 int val; 974 val = sub_val (field->val_int, field->last, first_pos, last_pos); 975 gen_entry_expand_opcode (table, instruction, 976 last_pos + 1, 977 ((opcode_nr << width) | val), bits); 978 break; 979 } 980 default: 981 { 982 if (field->type == insn_field_reserved) 983 gen_entry_expand_opcode (table, instruction, 984 last_pos + 1, 985 ((opcode_nr << width)), bits); 986 else 987 { 988 int val; 989 int last_val = (table->opcode->is_boolean ? 2 : (1 << width)); 990 for (val = 0; val < last_val; val++) 991 { 992 /* check to see if the value has been precluded 993 (by a conditional) in some way */ 994 int is_precluded; 995 insn_field_cond *condition; 996 for (condition = field->conditions, is_precluded = 0; 997 condition != NULL && !is_precluded; 998 condition = condition->next) 999 { 1000 switch (condition->type) 1001 { 1002 case insn_field_cond_value: 1003 { 1004 int value = 1005 sub_val (condition->value, field->last, 1006 first_pos, last_pos); 1007 switch (condition->test) 1008 { 1009 case insn_field_cond_ne: 1010 if (value == val) 1011 is_precluded = 1; 1012 break; 1013 case insn_field_cond_eq: 1014 if (value != val) 1015 is_precluded = 1; 1016 break; 1017 } 1018 break; 1019 } 1020 case insn_field_cond_field: 1021 { 1022 int value = -1; 1023 opcode_bits *bit; 1024 gen_entry *t = NULL; 1025 /* Try to find a value for the 1026 conditional by looking back through 1027 the previously defined bits for one 1028 that covers the designated 1029 conditional field */ 1030 for (bit = bits; bit != NULL; bit = bit->next) 1031 { 1032 if (bit->field->word_nr == 1033 condition->field->word_nr 1034 && bit->first <= condition->field->first 1035 && bit->last >= condition->field->last) 1036 { 1037 /* the bit field fully specified 1038 the conditional field's value */ 1039 value = sub_val (bit->value, bit->last, 1040 condition->field-> 1041 first, 1042 condition->field-> 1043 last); 1044 } 1045 } 1046 /* Try to find a value by looking 1047 through this and previous tables */ 1048 if (bit == NULL) 1049 { 1050 for (t = table; 1051 t->parent != NULL; t = t->parent) 1052 { 1053 if (t->parent->opcode->word_nr == 1054 condition->field->word_nr 1055 && t->parent->opcode->first <= 1056 condition->field->first 1057 && t->parent->opcode->last >= 1058 condition->field->last) 1059 { 1060 /* the table entry fully 1061 specified the condition 1062 field's value */ 1063 /* extract the field's value 1064 from the opcode */ 1065 value = 1066 sub_val (t->opcode_nr, 1067 t->parent->opcode->last, 1068 condition->field->first, 1069 condition->field->last); 1070 /* this is a requirement of 1071 a conditonal field 1072 refering to another field */ 1073 ASSERT ((condition->field->first - 1074 condition->field->last) == 1075 (first_pos - last_pos)); 1076 printf 1077 ("value=%d, opcode_nr=%d, last=%d, [%d..%d]\n", 1078 value, t->opcode_nr, 1079 t->parent->opcode->last, 1080 condition->field->first, 1081 condition->field->last); 1082 } 1083 } 1084 } 1085 if (bit == NULL && t == NULL) 1086 error (instruction->line, 1087 "Conditional `%s' of field `%s' isn't expanded", 1088 condition->string, field->val_string); 1089 switch (condition->test) 1090 { 1091 case insn_field_cond_ne: 1092 if (value == val) 1093 is_precluded = 1; 1094 break; 1095 case insn_field_cond_eq: 1096 if (value != val) 1097 is_precluded = 1; 1098 break; 1099 } 1100 break; 1101 } 1102 } 1103 } 1104 if (!is_precluded) 1105 { 1106 /* Only add additional hardwired bit 1107 information if the entry is not going to 1108 later be combined */ 1109 if (table->opcode_rule->with_combine) 1110 { 1111 gen_entry_expand_opcode (table, instruction, 1112 last_pos + 1, 1113 ((opcode_nr << width) | 1114 val), bits); 1115 } 1116 else 1117 { 1118 opcode_bits *new_bits = 1119 new_opcode_bits (bits, val, 1120 first_pos, last_pos, 1121 field, 1122 table->opcode); 1123 gen_entry_expand_opcode (table, instruction, 1124 last_pos + 1, 1125 ((opcode_nr << width) | 1126 val), new_bits); 1127 } 1128 } 1129 } 1130 } 1131 } 1132 } 1133 } 1134 } 1135 1136 static void 1137 gen_entry_insert_expanding (gen_entry *table, insn_entry * instruction) 1138 { 1139 gen_entry_expand_opcode (table, 1140 instruction, 1141 table->opcode->first, 0, table->expanded_bits); 1142 } 1143 1144 1145 static int 1146 insns_match_format_names (insn_list *insns, filter *format_names) 1147 { 1148 if (format_names != NULL) 1149 { 1150 insn_list *i; 1151 for (i = insns; i != NULL; i = i->next) 1152 { 1153 if (i->insn->format_name != NULL 1154 && !filter_is_member (format_names, i->insn->format_name)) 1155 return 0; 1156 } 1157 } 1158 return 1; 1159 } 1160 1161 static int 1162 table_matches_path (gen_entry *table, decode_path_list *paths) 1163 { 1164 if (paths == NULL) 1165 return 1; 1166 while (paths != NULL) 1167 { 1168 gen_entry *entry = table; 1169 decode_path *path = paths->path; 1170 while (1) 1171 { 1172 if (entry == NULL && path == NULL) 1173 return 1; 1174 if (entry == NULL || path == NULL) 1175 break; 1176 if (entry->opcode_nr != path->opcode_nr) 1177 break; 1178 entry = entry->parent; 1179 path = path->parent; 1180 } 1181 paths = paths->next; 1182 } 1183 return 0; 1184 } 1185 1186 1187 static int 1188 insns_match_conditions (insn_list *insns, decode_cond *conditions) 1189 { 1190 if (conditions != NULL) 1191 { 1192 insn_list *i; 1193 for (i = insns; i != NULL; i = i->next) 1194 { 1195 decode_cond *cond; 1196 for (cond = conditions; cond != NULL; cond = cond->next) 1197 { 1198 int bit_nr; 1199 if (i->insn->nr_words <= cond->word_nr) 1200 return 0; 1201 for (bit_nr = 0; bit_nr < options.insn_bit_size; bit_nr++) 1202 { 1203 if (!cond->mask[bit_nr]) 1204 continue; 1205 if (!i->insn->word[cond->word_nr]->bit[bit_nr]->mask) 1206 return 0; 1207 if ((i->insn->word[cond->word_nr]->bit[bit_nr]->value 1208 == cond->value[bit_nr]) == !cond->is_equal) 1209 return 0; 1210 } 1211 } 1212 } 1213 } 1214 return 1; 1215 } 1216 1217 static int 1218 insns_match_nr_words (insn_list *insns, int nr_words) 1219 { 1220 insn_list *i; 1221 for (i = insns; i != NULL; i = i->next) 1222 { 1223 if (i->insn->nr_words < nr_words) 1224 return 0; 1225 } 1226 return 1; 1227 } 1228 1229 static int 1230 insn_list_cmp (insn_list *l, insn_list *r) 1231 { 1232 while (1) 1233 { 1234 insn_entry *insn; 1235 if (l == NULL && r == NULL) 1236 return 0; 1237 if (l == NULL) 1238 return -1; 1239 if (r == NULL) 1240 return 1; 1241 if (l->insn != r->insn) 1242 return -1; /* somewhat arbitrary at present */ 1243 /* skip this insn */ 1244 insn = l->insn; 1245 while (l != NULL && l->insn == insn) 1246 l = l->next; 1247 while (r != NULL && r->insn == insn) 1248 r = r->next; 1249 } 1250 } 1251 1252 1253 1254 static void 1255 gen_entry_expand_insns (gen_entry *table) 1256 { 1257 decode_table *opcode_rule; 1258 1259 ASSERT (table->nr_insns >= 1); 1260 1261 /* determine a valid opcode */ 1262 for (opcode_rule = table->opcode_rule; 1263 opcode_rule != NULL; opcode_rule = opcode_rule->next) 1264 { 1265 char *discard_reason; 1266 if (table->top->model != NULL 1267 && opcode_rule->model_names != NULL 1268 && !filter_is_member (opcode_rule->model_names, 1269 table->top->model->name)) 1270 { 1271 /* the rule isn't applicable to this processor */ 1272 discard_reason = "wrong model"; 1273 } 1274 else if (table->nr_insns == 1 && opcode_rule->conditions == NULL) 1275 { 1276 /* for safety, require a pre-codition when attempting to 1277 apply a rule to a single instruction */ 1278 discard_reason = "need pre-condition when nr-insn == 1"; 1279 } 1280 else if (table->nr_insns == 1 && !opcode_rule->with_duplicates) 1281 { 1282 /* Little point in expanding a single instruction when we're 1283 not duplicating the semantic functions that this table 1284 calls */ 1285 discard_reason = "need duplication with nr-insns == 1"; 1286 } 1287 else 1288 if (!insns_match_format_names 1289 (table->insns, opcode_rule->format_names)) 1290 { 1291 discard_reason = "wrong format name"; 1292 } 1293 else if (!insns_match_nr_words (table->insns, opcode_rule->word_nr + 1)) 1294 { 1295 discard_reason = "wrong nr words"; 1296 } 1297 else if (!table_matches_path (table, opcode_rule->paths)) 1298 { 1299 discard_reason = "path failed"; 1300 } 1301 else 1302 if (!insns_match_conditions (table->insns, opcode_rule->conditions)) 1303 { 1304 discard_reason = "condition failed"; 1305 } 1306 else 1307 { 1308 discard_reason = "no opcode field"; 1309 table->opcode = gen_entry_find_opcode_field (table->insns, 1310 opcode_rule, 1311 table->nr_insns == 1 /*string-only */ 1312 ); 1313 if (table->opcode != NULL) 1314 { 1315 table->opcode_rule = opcode_rule; 1316 break; 1317 } 1318 } 1319 1320 if (options.trace.rule_rejection) 1321 { 1322 print_gen_entry_path (opcode_rule->line, table, notify); 1323 notify (NULL, ": rule discarded - %s\n", discard_reason); 1324 } 1325 } 1326 1327 /* did we find anything */ 1328 if (opcode_rule == NULL) 1329 { 1330 /* the decode table failed, this set of instructions haven't 1331 been uniquely identified */ 1332 if (table->nr_insns > 1) 1333 { 1334 print_gen_entry_insns (table, warning, 1335 "was not uniquely decoded", 1336 "decodes to the same entry"); 1337 error (NULL, ""); 1338 } 1339 return; 1340 } 1341 1342 /* Determine the number of words that must have been prefetched for 1343 this table to function */ 1344 if (table->parent == NULL) 1345 table->nr_prefetched_words = table->opcode_rule->word_nr + 1; 1346 else if (table->opcode_rule->word_nr + 1 > 1347 table->parent->nr_prefetched_words) 1348 table->nr_prefetched_words = table->opcode_rule->word_nr + 1; 1349 else 1350 table->nr_prefetched_words = table->parent->nr_prefetched_words; 1351 1352 /* back link what we found to its parent */ 1353 if (table->parent != NULL) 1354 { 1355 ASSERT (table->parent->opcode != NULL); 1356 table->opcode->parent = table->parent->opcode; 1357 } 1358 1359 /* report the rule being used to expand the instructions */ 1360 if (options.trace.rule_selection) 1361 { 1362 print_gen_entry_path (table->opcode_rule->line, table, notify); 1363 notify (NULL, 1364 ": decode - word %d, bits [%d..%d] in [%d..%d], opcodes %d, entries %d\n", 1365 table->opcode->word_nr, 1366 i2target (options.hi_bit_nr, table->opcode->first), 1367 i2target (options.hi_bit_nr, table->opcode->last), 1368 i2target (options.hi_bit_nr, table->opcode_rule->first), 1369 i2target (options.hi_bit_nr, table->opcode_rule->last), 1370 table->opcode->nr_opcodes, table->nr_entries); 1371 } 1372 1373 /* expand the raw instructions according to the opcode */ 1374 { 1375 insn_list *entry; 1376 for (entry = table->insns; entry != NULL; entry = entry->next) 1377 { 1378 if (options.trace.insn_expansion) 1379 { 1380 print_gen_entry_path (table->opcode_rule->line, table, notify); 1381 notify (NULL, ": expand - %s.%s\n", 1382 entry->insn->format_name, entry->insn->name); 1383 } 1384 gen_entry_insert_expanding (table, entry->insn); 1385 } 1386 } 1387 1388 /* dump the results */ 1389 if (options.trace.entries) 1390 { 1391 gen_entry *entry; 1392 for (entry = table->entries; entry != NULL; entry = entry->sibling) 1393 { 1394 insn_list *l; 1395 print_gen_entry_path (table->opcode_rule->line, entry, notify); 1396 notify (NULL, ": %d - entries %d -", 1397 entry->opcode_nr, entry->nr_insns); 1398 for (l = entry->insns; l != NULL; l = l->next) 1399 notify (NULL, " %s.%s", l->insn->format_name, l->insn->name); 1400 notify (NULL, "\n"); 1401 } 1402 } 1403 1404 /* perform a combine pass if needed */ 1405 if (table->opcode_rule->with_combine) 1406 { 1407 gen_entry *entry; 1408 for (entry = table->entries; entry != NULL; entry = entry->sibling) 1409 { 1410 if (entry->combined_parent == NULL) 1411 { 1412 gen_entry **last = &entry->combined_next; 1413 gen_entry *alt; 1414 for (alt = entry->sibling; alt != NULL; alt = alt->sibling) 1415 { 1416 if (alt->combined_parent == NULL 1417 && insn_list_cmp (entry->insns, alt->insns) == 0) 1418 { 1419 alt->combined_parent = entry; 1420 *last = alt; 1421 last = &alt->combined_next; 1422 } 1423 } 1424 } 1425 } 1426 if (options.trace.combine) 1427 { 1428 int nr_unique = 0; 1429 gen_entry *entry; 1430 for (entry = table->entries; entry != NULL; entry = entry->sibling) 1431 { 1432 if (entry->combined_parent == NULL) 1433 { 1434 insn_list *l; 1435 gen_entry *duplicate; 1436 nr_unique++; 1437 print_gen_entry_path (table->opcode_rule->line, entry, 1438 notify); 1439 for (duplicate = entry->combined_next; duplicate != NULL; 1440 duplicate = duplicate->combined_next) 1441 { 1442 notify (NULL, "+%d", duplicate->opcode_nr); 1443 } 1444 notify (NULL, ": entries %d -", entry->nr_insns); 1445 for (l = entry->insns; l != NULL; l = l->next) 1446 { 1447 notify (NULL, " %s.%s", 1448 l->insn->format_name, l->insn->name); 1449 } 1450 notify (NULL, "\n"); 1451 } 1452 } 1453 print_gen_entry_path (table->opcode_rule->line, table, notify); 1454 notify (NULL, 1455 ": combine - word %d, bits [%d..%d] in [%d..%d], opcodes %d, entries %d, unique %d\n", 1456 table->opcode->word_nr, i2target (options.hi_bit_nr, 1457 table->opcode->first), 1458 i2target (options.hi_bit_nr, table->opcode->last), 1459 i2target (options.hi_bit_nr, table->opcode_rule->first), 1460 i2target (options.hi_bit_nr, table->opcode_rule->last), 1461 table->opcode->nr_opcodes, table->nr_entries, nr_unique); 1462 } 1463 } 1464 1465 /* Check that the rule did more than re-arange the order of the 1466 instructions */ 1467 { 1468 gen_entry *entry; 1469 for (entry = table->entries; entry != NULL; entry = entry->sibling) 1470 { 1471 if (entry->combined_parent == NULL) 1472 { 1473 if (insn_list_cmp (table->insns, entry->insns) == 0) 1474 { 1475 print_gen_entry_path (table->opcode_rule->line, table, 1476 warning); 1477 warning (NULL, 1478 ": Applying rule just copied all instructions\n"); 1479 print_gen_entry_insns (entry, warning, "Copied", NULL); 1480 error (NULL, ""); 1481 } 1482 } 1483 } 1484 } 1485 1486 /* if some form of expanded table, fill in the missing dots */ 1487 switch (table->opcode_rule->gen) 1488 { 1489 case padded_switch_gen: 1490 case array_gen: 1491 case goto_switch_gen: 1492 if (!table->opcode->is_boolean) 1493 { 1494 gen_entry **entry = &table->entries; 1495 gen_entry *illegals = NULL; 1496 gen_entry **last_illegal = &illegals; 1497 int opcode_nr = 0; 1498 while (opcode_nr < table->opcode->nr_opcodes) 1499 { 1500 if ((*entry) == NULL || (*entry)->opcode_nr != opcode_nr) 1501 { 1502 /* missing - insert it under our feet at *entry */ 1503 gen_entry_insert_insn (table, table->top->isa->illegal_insn, table->opcode->word_nr, 0, /* nr_prefetched_words == 0 for invalid */ 1504 opcode_nr, NULL); 1505 ASSERT ((*entry) != NULL); 1506 ASSERT ((*entry)->opcode_nr == opcode_nr); 1507 (*last_illegal) = *entry; 1508 (*last_illegal)->combined_parent = illegals; 1509 last_illegal = &(*last_illegal)->combined_next; 1510 } 1511 entry = &(*entry)->sibling; 1512 opcode_nr++; 1513 } 1514 /* oops, will have pointed the first illegal insn back to 1515 its self. Fix this */ 1516 if (illegals != NULL) 1517 illegals->combined_parent = NULL; 1518 } 1519 break; 1520 case switch_gen: 1521 case invalid_gen: 1522 /* ignore */ 1523 break; 1524 } 1525 1526 /* and do the same for the newly created sub entries but *only* 1527 expand entries that haven't been combined. */ 1528 { 1529 gen_entry *entry; 1530 for (entry = table->entries; entry != NULL; entry = entry->sibling) 1531 { 1532 if (entry->combined_parent == NULL) 1533 { 1534 gen_entry_expand_insns (entry); 1535 } 1536 } 1537 } 1538 } 1539 1540 void 1541 gen_tables_expand_insns (gen_table *gen) 1542 { 1543 gen_list *entry; 1544 for (entry = gen->tables; entry != NULL; entry = entry->next) 1545 { 1546 gen_entry_expand_insns (entry->table); 1547 } 1548 } 1549 1550 1551 /* create a list of all the semantic functions that need to be 1552 generated. Eliminate any duplicates. Verify that the decode stage 1553 worked. */ 1554 1555 static void 1556 make_gen_semantics_list (lf *file, gen_entry *entry, int depth, void *data) 1557 { 1558 gen_table *gen = (gen_table *) data; 1559 insn_list *insn; 1560 /* Not interested in an entrie that have been combined into some 1561 other entry at the same level */ 1562 if (entry->combined_parent != NULL) 1563 return; 1564 1565 /* a leaf should contain exactly one instruction. If not the decode 1566 stage failed. */ 1567 ASSERT (entry->nr_insns == 1); 1568 1569 /* Enter this instruction into the list of semantic functions. */ 1570 insn = insn_list_insert (&gen->semantics, &gen->nr_semantics, 1571 entry->insns->insn, 1572 entry->expanded_bits, 1573 entry->parent->opcode, 1574 entry->insns->nr_prefetched_words, 1575 merge_duplicate_insns); 1576 /* point the table entry at the real semantic function */ 1577 ASSERT (insn != NULL); 1578 entry->insns->semantic = insn; 1579 } 1580 1581 1582 void 1583 gen_tables_expand_semantics (gen_table *gen) 1584 { 1585 gen_list *entry; 1586 for (entry = gen->tables; entry != NULL; entry = entry->next) 1587 { 1588 gen_entry_traverse_tree (NULL, entry->table, 1, /* depth */ 1589 NULL, /* start-handler */ 1590 make_gen_semantics_list, /* leaf-handler */ 1591 NULL, /* end-handler */ 1592 gen); /* data */ 1593 } 1594 } 1595 1596 1597 1598 #ifdef MAIN 1599 1600 1601 static void 1602 dump_opcode_field (lf *file, 1603 char *prefix, 1604 opcode_field *field, char *suffix, int levels) 1605 { 1606 lf_printf (file, "%s(opcode_field *) 0x%lx", prefix, (long) field); 1607 if (levels && field != NULL) 1608 { 1609 lf_indent (file, +1); 1610 lf_printf (file, "\n(first %d)", field->first); 1611 lf_printf (file, "\n(last %d)", field->last); 1612 lf_printf (file, "\n(nr_opcodes %d)", field->nr_opcodes); 1613 lf_printf (file, "\n(is_boolean %d)", field->is_boolean); 1614 lf_printf (file, "\n(boolean_constant %d)", field->boolean_constant); 1615 dump_opcode_field (file, "\n(parent ", field->parent, ")", levels - 1); 1616 lf_indent (file, -1); 1617 } 1618 lf_printf (file, "%s", suffix); 1619 } 1620 1621 1622 static void 1623 dump_opcode_bits (lf *file, 1624 char *prefix, opcode_bits *bits, char *suffix, int levels) 1625 { 1626 lf_printf (file, "%s(opcode_bits *) 0x%lx", prefix, (long) bits); 1627 1628 if (levels && bits != NULL) 1629 { 1630 lf_indent (file, +1); 1631 lf_printf (file, "\n(value %d)", bits->value); 1632 dump_opcode_field (file, "\n(opcode ", bits->opcode, ")", 0); 1633 dump_insn_field (file, "\n(field ", bits->field, ")"); 1634 dump_opcode_bits (file, "\n(next ", bits->next, ")", levels - 1); 1635 lf_indent (file, -1); 1636 } 1637 lf_printf (file, "%s", suffix); 1638 } 1639 1640 1641 1642 static void 1643 dump_insn_list (lf *file, char *prefix, insn_list *entry, char *suffix) 1644 { 1645 lf_printf (file, "%s(insn_list *) 0x%lx", prefix, (long) entry); 1646 1647 if (entry != NULL) 1648 { 1649 lf_indent (file, +1); 1650 dump_insn_entry (file, "\n(insn ", entry->insn, ")"); 1651 lf_printf (file, "\n(next 0x%lx)", (long) entry->next); 1652 lf_indent (file, -1); 1653 } 1654 lf_printf (file, "%s", suffix); 1655 } 1656 1657 1658 static void 1659 dump_insn_word_entry_list_entries (lf *file, 1660 char *prefix, 1661 insn_list *entry, char *suffix) 1662 { 1663 lf_printf (file, "%s", prefix); 1664 while (entry != NULL) 1665 { 1666 dump_insn_list (file, "\n(", entry, ")"); 1667 entry = entry->next; 1668 } 1669 lf_printf (file, "%s", suffix); 1670 } 1671 1672 1673 static void 1674 dump_gen_entry (lf *file, 1675 char *prefix, gen_entry *table, char *suffix, int levels) 1676 { 1677 1678 lf_printf (file, "%s(gen_entry *) 0x%lx", prefix, (long) table); 1679 1680 if (levels && table !=NULL) 1681 { 1682 1683 lf_indent (file, +1); 1684 lf_printf (file, "\n(opcode_nr %d)", table->opcode_nr); 1685 lf_printf (file, "\n(word_nr %d)", table->word_nr); 1686 dump_opcode_bits (file, "\n(expanded_bits ", table->expanded_bits, ")", 1687 -1); 1688 lf_printf (file, "\n(nr_insns %d)", table->nr_insns); 1689 dump_insn_word_entry_list_entries (file, "\n(insns ", table->insns, 1690 ")"); 1691 dump_decode_rule (file, "\n(opcode_rule ", table->opcode_rule, ")"); 1692 dump_opcode_field (file, "\n(opcode ", table->opcode, ")", 0); 1693 lf_printf (file, "\n(nr_entries %d)", table->nr_entries); 1694 dump_gen_entry (file, "\n(entries ", table->entries, ")", 1695 table->nr_entries); 1696 dump_gen_entry (file, "\n(sibling ", table->sibling, ")", levels - 1); 1697 dump_gen_entry (file, "\n(parent ", table->parent, ")", 0); 1698 lf_indent (file, -1); 1699 } 1700 lf_printf (file, "%s", suffix); 1701 } 1702 1703 static void 1704 dump_gen_list (lf *file, 1705 char *prefix, gen_list *entry, char *suffix, int levels) 1706 { 1707 while (entry != NULL) 1708 { 1709 lf_printf (file, "%s(gen_list *) 0x%lx", prefix, (long) entry); 1710 dump_gen_entry (file, "\n(", entry->table, ")", levels); 1711 lf_printf (file, "\n(next (gen_list *) 0x%lx)", (long) entry->next); 1712 lf_printf (file, "%s", suffix); 1713 } 1714 } 1715 1716 1717 static void 1718 dump_gen_table (lf *file, 1719 char *prefix, gen_table *gen, char *suffix, int levels) 1720 { 1721 lf_printf (file, "%s(gen_table *) 0x%lx", prefix, (long) gen); 1722 lf_printf (file, "\n(isa (insn_table *) 0x%lx)", (long) gen->isa); 1723 lf_printf (file, "\n(rules (decode_table *) 0x%lx)", (long) gen->rules); 1724 dump_gen_list (file, "\n(", gen->tables, ")", levels); 1725 lf_printf (file, "%s", suffix); 1726 } 1727 1728 1729 igen_options options; 1730 1731 int 1732 main (int argc, char **argv) 1733 { 1734 decode_table *decode_rules; 1735 insn_table *instructions; 1736 gen_table *gen; 1737 lf *l; 1738 1739 if (argc != 7) 1740 error (NULL, 1741 "Usage: insn <filter-in> <hi-bit-nr> <insn-bit-size> <widths> <decode-table> <insn-table>\n"); 1742 1743 INIT_OPTIONS (options); 1744 1745 filter_parse (&options.flags_filter, argv[1]); 1746 1747 options.hi_bit_nr = a2i (argv[2]); 1748 options.insn_bit_size = a2i (argv[3]); 1749 options.insn_specifying_widths = a2i (argv[4]); 1750 ASSERT (options.hi_bit_nr < options.insn_bit_size); 1751 1752 instructions = load_insn_table (argv[6], NULL); 1753 decode_rules = load_decode_table (argv[5]); 1754 gen = make_gen_tables (instructions, decode_rules); 1755 1756 gen_tables_expand_insns (gen); 1757 1758 l = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "tmp-ld-insn"); 1759 1760 dump_gen_table (l, "(", gen, ")\n", -1); 1761 return 0; 1762 } 1763 1764 #endif 1765