1 /* This file is part of the program psim.
3 Copyright (C) 1994-1998, Andrew Cagney <cagney@highland.com.au>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 static insn_word_entry *
30 parse_insn_word (line_ref *line,
35 insn_word_entry *word = ZALLOC (insn_word_entry);
37 /* create a leading sentinal */
38 word->first = ZALLOC (insn_field_entry);
39 word->first->first = -1;
40 word->first->last = -1;
41 word->first->width = 0;
43 /* and a trailing sentinal */
44 word->last = ZALLOC (insn_field_entry);
45 word->last->first = options.insn_bit_size;
46 word->last->last = options.insn_bit_size;
47 word->last->width = 0;
49 /* link them together */
50 word->first->next = word->last;
51 word->last->prev = word->first;
53 /* now work through the formats */
54 chp = skip_spaces (string);
56 while (*chp != '\0') {
61 insn_field_entry *new_field;
63 /* create / link in the new field */
64 new_field = ZALLOC (insn_field_entry);
65 new_field->next = word->last;
66 new_field->prev = word->last->prev;
67 new_field->next->prev = new_field;
68 new_field->prev->next = new_field;
69 new_field->word_nr = word_nr;
71 /* break out the first field (if present) */
73 chp = skip_to_separator (chp, ".,!");
74 strlen_pos = back_spaces (start_pos, chp) - start_pos;
76 /* break out the second field (if present) */
79 /* assume what was specified was the value (and not the start
80 position). Assume the value length implicitly specifies
82 start_val = start_pos;
83 strlen_val = strlen_pos;
90 chp = skip_spaces (chp);
92 if (*chp == '/' || *chp == '*')
98 while (*chp == '/' || *chp == '*');
100 else if (isalpha(*start_val))
106 while (isalnum(*chp) || *chp == '_');
108 else if (isdigit(*start_val))
113 while (isalnum(*chp));
115 strlen_val = chp - start_val;
116 chp = skip_spaces (chp);
119 error (line, "Empty value field\n");
121 /* break out any conditional fields - { "!" <value> } */
126 insn_field_exclusion *new_exclusion = ZALLOC (insn_field_exclusion);
127 insn_field_exclusion **last;
129 /* what type of conditional field */
131 chp = skip_spaces (chp);
134 chp = skip_digits (chp);
137 error (line, "Missing or invalid conditional value\n");
138 /* fill in the entry */
139 new_exclusion->string = NZALLOC (char, len + 1);
140 strncpy (new_exclusion->string, start, len);
141 new_exclusion->value = a2i (new_exclusion->string);
143 last = &new_field->exclusions;
144 while (*last != NULL)
145 last = &(*last)->next;
146 *last = new_exclusion;
147 chp = skip_spaces (chp);
150 /* NOW verify that the field ws finished */
153 chp = skip_spaces (chp + 1);
155 error (line, "empty field\n");
157 else if (*chp != '\0')
159 error (line, "Missing field separator");
163 new_field->val_string = NZALLOC (char, strlen_val+1);
164 strncpy (new_field->val_string, start_val, strlen_val);
165 if (isdigit (new_field->val_string[0]))
169 /* when the length/pos field is omited, an integer field
173 for (i = 0; i < strlen_val; i++)
175 if (new_field->val_string[i] != '0'
176 && new_field->val_string[i] != '1')
177 error (line, "invalid binary field %s\n",
178 new_field->val_string);
179 val = (val << 1) + (new_field->val_string[i] == '1');
181 new_field->val_int = val;
182 new_field->type = insn_field_int;
186 new_field->val_int = a2i (new_field->val_string);
187 new_field->type = insn_field_int;
190 else if (new_field->val_string[0] == '/')
192 new_field->type = insn_field_reserved;
194 else if (new_field->val_string[0] == '*')
196 new_field->type = insn_field_wild;
200 new_field->type = insn_field_string;
201 if (filter_is_member (word->field_names, new_field->val_string))
202 error (line, "Field name %s is duplicated\n", new_field->val_string);
203 filter_parse (&word->field_names, new_field->val_string);
205 if (new_field->type != insn_field_string
206 && new_field->exclusions != NULL)
207 error (line, "Exclusions only apply to name fields\n");
209 /* the copy the position */
210 new_field->pos_string = NZALLOC (char, strlen_pos + 1);
211 strncpy (new_field->pos_string, start_pos, strlen_pos);
214 new_field->first = new_field->prev->last + 1;
215 if (new_field->first == 0 /* first field */
216 && *chp == '\0' /* no further fields */
217 && new_field->type == insn_field_string)
219 /* A single string without any position, assume that it
220 represents the entire instruction word */
221 new_field->width = options.insn_bit_size;
225 /* No explicit width/position, assume value implicitly
226 supplies the width */
227 new_field->width = strlen_val;
229 new_field->last = new_field->first + new_field->width - 1;
230 if (new_field->last >= options.insn_bit_size)
231 error (line, "Bit position %d exceed instruction bit size (%d)\n",
232 new_field->last, options.insn_bit_size);
234 else if (options.insn_specifying_widths)
236 new_field->first = new_field->prev->last + 1;
237 new_field->width = a2i(new_field->pos_string);
238 new_field->last = new_field->first + new_field->width - 1;
239 if (new_field->last >= options.insn_bit_size)
240 error (line, "Bit position %d exceed instruction bit size (%d)\n",
241 new_field->last, options.insn_bit_size);
245 new_field->first = target_a2i(options.hi_bit_nr,
246 new_field->pos_string);
247 new_field->last = new_field->next->first - 1; /* guess */
248 new_field->width = new_field->last - new_field->first + 1; /* guess */
249 new_field->prev->last = new_field->first - 1; /*fix*/
250 new_field->prev->width = new_field->first - new_field->prev->first; /*fix*/
254 /* fiddle first/last so that the sentinals disapear */
255 ASSERT(word->first->last < 0);
256 ASSERT(word->last->first >= options.insn_bit_size);
257 word->first = word->first->next;
258 word->last = word->last->prev;
260 /* check that the last field goes all the way to the last bit */
261 if (word->last->last != options.insn_bit_size - 1)
263 if (options.warn.width)
264 options.warning (line, "Instruction format is not %d bits wide\n",
265 options.insn_bit_size);
266 word->last->last = options.insn_bit_size - 1;
269 /* now go over this again, pointing each bit position at a field
272 insn_field_entry *field;
273 for (field = word->first;
274 field->last < options.insn_bit_size;
278 for (i = field->first; i <= field->last; i++)
280 word->bit[i] = ZALLOC (insn_bit_entry);
281 word->bit[i]->field = field;
285 word->bit[i]->mask = 1;
286 word->bit[i]->value = ((field->val_int
287 & ((insn_uint)1 << (field->last - i)))
289 case insn_field_reserved:
290 case insn_field_wild:
291 case insn_field_string:
303 parse_insn_words (insn_entry *insn,
306 insn_word_entry **last_word = &insn->words;
309 /* now work through the formats */
319 insn_word_entry *new_word;
321 /* skip leading spaces */
322 chp = skip_spaces (chp);
324 /* break out the format */
326 chp = skip_to_separator (chp, "+");
327 end_pos = back_spaces (start_pos, chp);
328 strlen_pos = end_pos - start_pos;
330 /* check that something was there */
332 error (insn->line, "missing or empty instruction format\n");
334 /* parse the field */
335 format = NZALLOC (char, strlen_pos + 1);
336 strncpy (format, start_pos, strlen_pos);
337 new_word = parse_insn_word (insn->line, format, insn->nr_words);
339 if (filter_is_common (insn->field_names, new_word->field_names))
340 error (insn->line, "Field name duplicated between two words\n");
341 filter_add (&insn->field_names, new_word->field_names);
344 *last_word = new_word;
345 last_word = &new_word->next;
350 ASSERT (*chp == '+');
354 /* now create a quick access array of the same structure */
357 insn_word_entry *word;
358 insn->word = NZALLOC (insn_word_entry *, insn->nr_words + 1);
359 for (i = 0, word = insn->words;
361 i++, word = word->next)
362 insn->word[i] = word;
368 insn_record, /* default */
374 string_function_record,
379 model_processor_record,
383 model_function_record,
384 model_internal_record,
387 static const name_map insn_type_map[] = {
388 { "option", option_record },
389 { "cache", cache_record },
390 { "compute", compute_record },
391 { "scratch", scratch_record },
392 { "define", define_record },
393 { "include", include_record },
394 { "%s", string_function_record },
395 { "function", function_record },
396 { "internal", internal_record },
397 { "model", model_processor_record },
398 { "model-macro", model_macro_record },
399 { "model-data", model_data_record },
400 { "model-static", model_static_record },
401 { "model-internal", model_internal_record },
402 { "model-function", model_function_record },
403 { NULL, insn_record },
408 record_is_old (table_entry *entry)
410 if (entry->nr_fields > record_type_field
411 && strlen (entry->field[record_type_field]) == 0)
416 static insn_record_type
417 record_type (table_entry *entry)
421 case table_code_entry:
424 case table_colon_entry:
425 if (record_is_old (entry))
428 if (entry->nr_fields > old_record_type_field)
430 int i = name2i (entry->field[old_record_type_field],
436 return unknown_record;
439 else if (entry->nr_fields > record_type_field
440 && entry->field[0][0] == '\0')
443 int i = name2i (entry->field[record_type_field],
448 return insn_record; /* default */
450 return unknown_record;
454 record_prefix_is (table_entry *entry,
458 if (entry->type != table_colon_entry)
460 if (entry->nr_fields < nr_fields)
462 if (entry->field[0][0] != ch && ch != '\0')
468 parse_model_data_record (insn_table *isa,
474 table_entry *model_record = record;
475 table_entry *code_record = NULL;
476 model_data *new_data;
477 if (record->nr_fields < nr_fields)
478 error (record->line, "Incorrect number of fields\n");
479 record = table_read (file);
480 if (record->type == table_code_entry)
482 code_record = record;
483 record = table_read (file);
485 /* create the new data record */
486 new_data = ZALLOC (model_data);
487 new_data->line = model_record->line;
488 filter_parse (&new_data->flags,
489 model_record->field[record_filter_flags_field]);
490 new_data->entry = model_record;
491 new_data->code = code_record;
492 /* append it if not filtered out */
493 if (!is_filtered_out (options.flags_filter,
494 model_record->field[record_filter_flags_field])
495 && !is_filtered_out (options.model_filter,
496 model_record->field[record_filter_models_field]))
498 while (*list != NULL)
499 list = &(*list)->next;
507 insn_bit_size_option = 1,
508 insn_specifying_widths_option,
518 static const name_map option_map[] = {
519 { "insn-bit-size", insn_bit_size_option },
520 { "insn-specifying-widths", insn_specifying_widths_option },
521 { "hi-bit-nr", hi_bit_nr_option },
522 { "flags-filter", flags_filter_option },
523 { "model-filter", model_filter_option },
524 { "multi-sim", multi_sim_option },
525 { "format-names", format_names_option },
526 { "gen-delayed-branch", gen_delayed_branch },
527 { NULL, unknown_option },
531 parse_include_record (table *file,
534 /* parse the include record */
535 if (record->nr_fields < nr_include_fields)
536 error (record->line, "Incorrect nr fields for include record\n");
538 if (!is_filtered_out (options.flags_filter,
539 record->field[record_filter_flags_field])
540 && !is_filtered_out (options.model_filter,
541 record->field[record_filter_models_field]))
543 table_push (file, record->line, options.include,
544 record->field[include_filename_field]);
546 /* nb: can't read next record until after the file has been pushed */
547 record = table_read (file);
553 parse_option_record (table *file,
556 table_entry *option_record;
557 /* parse the option record */
558 option_record = record;
559 if (record->nr_fields < nr_option_fields)
560 error (record->line, "Incorrect nr of fields for option record\n");
561 record = table_read (file);
563 if (!is_filtered_out (options.flags_filter,
564 option_record->field[record_filter_flags_field])
565 && !is_filtered_out (options.model_filter,
566 option_record->field[record_filter_models_field]))
568 char *name = option_record->field[option_name_field];
569 option_names option = name2i (name, option_map);
570 char *value = option_record->field[option_value_field];
573 case insn_bit_size_option:
575 options.insn_bit_size = a2i (value);
576 if (options.insn_bit_size < 0
577 || options.insn_bit_size > max_insn_bit_size)
578 error (option_record->line, "Instruction bit size out of range\n");
579 if (options.hi_bit_nr != options.insn_bit_size - 1
580 && options.hi_bit_nr != 0)
581 error (option_record->line, "insn-bit-size / hi-bit-nr conflict\n");
584 case insn_specifying_widths_option:
586 options.insn_specifying_widths = a2i (value);
589 case hi_bit_nr_option:
591 options.hi_bit_nr = a2i (value);
592 if (options.hi_bit_nr != 0
593 && options.hi_bit_nr != options.insn_bit_size - 1)
594 error (option_record->line, "hi-bit-nr / insn-bit-size conflict\n");
597 case flags_filter_option:
599 filter_parse (&options.flags_filter, value);
602 case model_filter_option:
604 filter_parse (&options.model_filter, value);
607 case multi_sim_option:
609 options.gen.multi_sim = a2i (value);
612 case format_names_option:
614 filter_parse (&options.format_name_filter, value);
617 case gen_delayed_branch:
619 options.gen.delayed_branch = a2i (value);
624 error (option_record->line, "Unknown option - %s\n", name);
634 parse_function_record (table *file,
636 function_entry **list,
637 function_entry **list_entry,
640 function_entry *new_function;
641 new_function = ZALLOC (function_entry);
642 new_function->line = record->line;
643 new_function->is_internal = is_internal;
644 /* parse the function header */
645 if (record_is_old (record))
647 if (record->nr_fields < nr_old_function_fields)
648 error (record->line, "Missing fields from (old) function record\n");
649 new_function->type = record->field[old_function_typedef_field];
650 new_function->type = record->field[old_function_typedef_field];
651 if (record->nr_fields > old_function_param_field)
652 new_function->param = record->field[old_function_param_field];
653 new_function->name = record->field[old_function_name_field];
657 if (record->nr_fields < nr_function_fields)
658 error (record->line, "Missing fields from function record\n");
659 filter_parse (&new_function->flags,
660 record->field[record_filter_flags_field]);
661 filter_parse (&new_function->models,
662 record->field[record_filter_models_field]);
663 new_function->type = record->field[function_typedef_field];
664 new_function->param = record->field[function_param_field];
665 new_function->name = record->field[function_name_field];
667 record = table_read (file);
668 /* parse any function-model records */
669 while (record != NULL
670 && record_prefix_is (record, '*', nr_function_model_fields))
672 filter_parse (&new_function->models,
673 record->field[function_model_name_field] + 1 /*skip `*'*/);
674 record = table_read (file);
676 /* parse the function body */
677 if (record->type == table_code_entry)
679 new_function->code = record;
680 record = table_read (file);
683 if (!filter_is_subset (options.flags_filter, new_function->flags))
685 if (options.warn.discard)
686 notify (new_function->line, "Discarding function entry - filter flags\n");
688 else if (!filter_is_subset (options.model_filter, new_function->models))
690 if (options.warn.discard)
691 notify (new_function->line, "Discarding function entry - filter models\n");
695 while (*list != NULL)
696 list = &(*list)->next;
697 *list = new_function;
698 if (list_entry != NULL)
699 *list_entry = new_function;
706 parse_insn_model_record (table *file,
711 insn_model_entry **last_insn_model;
712 insn_model_entry *new_insn_model = ZALLOC (insn_model_entry);
714 new_insn_model->line = record->line;
715 if (record->nr_fields > insn_model_unit_data_field)
716 new_insn_model->unit_data = record->field[insn_model_unit_data_field];
717 new_insn_model->insn = insn;
718 /* parse the model names, verify that all were defined */
719 new_insn_model->names = NULL;
720 filter_parse (&new_insn_model->names,
721 record->field[insn_model_name_field] + 1 /*skip `*'*/);
722 if (new_insn_model->names == NULL)
724 /* No processor names - a generic model entry, enter it into all
725 the non-empty fields */
727 for (index = 0; index < model->nr_models; index++)
728 if (insn->model[index] == 0)
730 insn->model[index] = new_insn_model;
732 /* also add the complete processor set to this processor's set */
733 filter_add (&insn->processors, model->processors);
737 /* Find the corresponding master model record for each name so
738 that they can be linked in. */
743 name = filter_next (new_insn_model->names, name);
744 if (name == NULL) break;
745 index = filter_is_member (model->processors, name) - 1;
748 error (new_insn_model->line,
749 "machine model `%s' undefined\n", name);
751 /* store it in the corresponding model array entry */
752 if (insn->model[index] != NULL
753 && insn->model[index]->names != NULL)
755 warning (new_insn_model->line,
756 "machine model `%s' previously defined\n", name);
757 error (insn->model[index]->line, "earlier definition\n");
759 insn->model[index] = new_insn_model;
760 /* also add the name to the instructions processor set as an
761 alternative lookup mechanism */
762 filter_parse (&insn->processors, name);
766 /* for some reason record the max length of any
767 function unit field */
768 int len = strlen (insn_model_ptr->field[insn_model_fields]);
769 if (model->max_model_fields_len < len)
770 model->max_model_fields_len = len;
773 last_insn_model = &insn->models;
774 while ((*last_insn_model) != NULL)
775 last_insn_model = &(*last_insn_model)->next;
776 *last_insn_model = new_insn_model;
781 parse_insn_mnemonic_record (table *file,
785 insn_mnemonic_entry **last_insn_mnemonic;
786 insn_mnemonic_entry *new_insn_mnemonic = ZALLOC (insn_mnemonic_entry);
788 new_insn_mnemonic->line = record->line;
789 ASSERT (record->nr_fields > insn_mnemonic_format_field);
790 new_insn_mnemonic->format = record->field[insn_mnemonic_format_field];
791 ASSERT (new_insn_mnemonic->format[0] == '"');
792 if (new_insn_mnemonic->format[strlen (new_insn_mnemonic->format) - 1] != '"')
793 error (new_insn_mnemonic->line, "Missing closing double quote in mnemonic field\n");
794 if (record->nr_fields > insn_mnemonic_condition_field)
795 new_insn_mnemonic->condition = record->field[insn_mnemonic_condition_field];
796 new_insn_mnemonic->insn = insn;
798 last_insn_mnemonic = &insn->mnemonics;
799 while ((*last_insn_mnemonic) != NULL)
800 last_insn_mnemonic = &(*last_insn_mnemonic)->next;
801 insn->nr_mnemonics++;
802 *last_insn_mnemonic = new_insn_mnemonic;
807 load_insn_table (char *file_name,
810 table *file = table_open (file_name);
811 table_entry *record = table_read (file);
813 insn_table *isa = ZALLOC (insn_table);
814 model_table *model = ZALLOC (model_table);
819 while (record != NULL)
822 switch (record_type (record))
827 record = parse_include_record (file, record);
833 if (isa->insns != NULL)
834 error (record->line, "Option after first instruction\n");
835 record = parse_option_record (file, record);
839 case string_function_record:
841 function_entry *function = NULL;
842 record = parse_function_record (file, record,
846 /* convert a string function record into an internal function */
847 if (function != NULL)
849 char *name = NZALLOC (char,
851 + strlen (function->name)
853 strcat (name, "str_");
854 strcat (name, function->name);
855 function->name = name;
856 function->type = "const char *";
861 case function_record: /* function record */
863 record = parse_function_record (file, record,
870 case internal_record:
872 /* only insert it into the function list if it is unknown */
873 function_entry *function = NULL;
874 record = parse_function_record (file, record,
878 /* check what was inserted to see if a pseudo-instruction
879 entry also needs to be created */
880 if (function != NULL)
882 insn_entry **insn = NULL;
883 if (strcmp (function->name, "illegal") == 0)
885 /* illegal function save it away */
886 if (isa->illegal_insn != NULL)
888 warning (function->line,
889 "Multiple illegal instruction definitions\n");
890 error (isa->illegal_insn->line,
891 "Location of first illegal instruction\n");
894 insn = &isa->illegal_insn;
898 *insn = ZALLOC (insn_entry);
899 (*insn)->line = function->line;
900 (*insn)->name = function->name;
901 (*insn)->code = function->code;
907 case scratch_record: /* cache macro records */
911 cache_entry *new_cache;
912 /* parse the cache record */
913 if (record->nr_fields < nr_cache_fields)
915 "Incorrect nr of fields for scratch/cache/compute record\n");
917 new_cache = ZALLOC (cache_entry);
918 new_cache->line = record->line;
919 filter_parse (&new_cache->flags,
920 record->field[record_filter_flags_field]);
921 filter_parse (&new_cache->models,
922 record->field[record_filter_models_field]);
923 new_cache->type = record->field[cache_typedef_field];
924 new_cache->name = record->field[cache_name_field];
925 filter_parse (&new_cache->original_fields,
926 record->field[cache_original_fields_field]);
927 new_cache->expression = record->field[cache_expression_field];
928 /* insert it but only if not filtered out */
929 if (!filter_is_subset (options.flags_filter, new_cache->flags))
931 notify (new_cache->line, "Discarding cache entry %s - filter flags\n",
934 else if (is_filtered_out (options.model_filter,
935 record->field[record_filter_models_field]))
937 notify (new_cache->line, "Discarding cache entry %s - filter models\n",
944 while (*last != NULL)
945 last = &(*last)->next;
949 record = table_read (file);
954 case model_processor_record:
956 model_entry *new_model;
957 /* parse the model */
958 if (record->nr_fields < nr_model_processor_fields)
959 error (record->line, "Incorrect nr of fields for model record\n");
960 if (isa->insns != NULL)
961 error (record->line, "Model appears after first instruction\n");
962 new_model = ZALLOC (model_entry);
963 filter_parse (&new_model->flags,
964 record->field[record_filter_flags_field]);
965 new_model->line = record->line;
966 new_model->name = record->field[model_name_field];
967 new_model->full_name = record->field[model_full_name_field];
968 new_model->unit_data = record->field[model_unit_data_field];
969 /* only insert it if not filtered out */
970 if (!filter_is_subset (options.flags_filter, new_model->flags))
972 notify (new_model->line, "Discarding processor model %s - filter flags\n",
975 else if (is_filtered_out (options.model_filter,
976 record->field[record_filter_models_field]))
978 notify (new_model->line, "Discarding processor model %s - filter models\n",
981 else if (filter_is_member (model->processors, new_model->name))
983 error (new_model->line, "Duplicate processor model %s\n",
989 last = &model->models;
990 while (*last != NULL)
991 last = &(*last)->next;
995 filter_parse (&model->processors, new_model->name);
998 record = table_read (file);
1002 case model_macro_record:
1003 record = parse_model_data_record (isa, file, record,
1004 nr_model_macro_fields,
1008 case model_data_record:
1009 record = parse_model_data_record (isa, file, record,
1010 nr_model_data_fields,
1014 case model_static_record:
1015 record = parse_function_record (file, record,
1021 case model_internal_record:
1022 record = parse_function_record (file, record,
1028 case model_function_record:
1029 record = parse_function_record (file, record,
1035 case insn_record: /* instruction records */
1037 insn_entry *new_insn;
1039 /* parse the instruction */
1040 if (record->nr_fields < nr_insn_fields)
1041 error (record->line, "Incorrect nr of fields for insn record\n");
1042 new_insn = ZALLOC (insn_entry);
1043 new_insn->line = record->line;
1044 filter_parse (&new_insn->flags,
1045 record->field[record_filter_flags_field]);
1046 /* save the format field. Can't parse it until after the
1047 filter-out checks. Could be filtered out because the
1048 format is invalid */
1049 format = record->field[insn_word_field];
1050 new_insn->format_name = record->field[insn_format_name_field];
1051 if (options.format_name_filter != NULL
1052 && !filter_is_member (options.format_name_filter,
1053 new_insn->format_name))
1054 error (new_insn->line, "Unreconized instruction format name `%s'\n",
1055 new_insn->format_name);
1056 filter_parse (&new_insn->options,
1057 record->field[insn_options_field]);
1058 new_insn->name = record->field[insn_name_field];
1059 record = table_read (file);
1060 /* Parse any model/assember records */
1061 new_insn->nr_models = model->nr_models;
1062 new_insn->model = NZALLOC (insn_model_entry*, model->nr_models + 1);
1063 while (record != NULL)
1065 if (record_prefix_is (record, '*', nr_insn_model_fields))
1066 parse_insn_model_record (file, record, new_insn, model);
1067 else if (record_prefix_is (record, '"', nr_insn_mnemonic_fields))
1068 parse_insn_mnemonic_record (file, record, new_insn);
1072 record = table_read (file);
1074 /* Parse the code record */
1075 if (record != NULL && record->type == table_code_entry)
1077 new_insn->code = record;
1078 record = table_read (file);
1081 if (!filter_is_subset (options.flags_filter, new_insn->flags))
1083 if (options.warn.discard)
1084 notify (new_insn->line,
1085 "Discarding instruction %s (flags-filter)\n",
1088 else if (new_insn->processors != NULL
1089 && options.model_filter != NULL
1090 && !filter_is_common (options.model_filter,
1091 new_insn->processors))
1093 /* only discard an instruction based in the processor
1094 model when both the instruction and the options are
1096 if (options.warn.discard)
1097 notify (new_insn->line,
1098 "Discarding instruction %s (processor-model)\n",
1104 /* finish the parsing */
1105 parse_insn_words (new_insn, format);
1109 last = &(*last)->next;
1111 /* update global isa counters */
1113 if (isa->max_nr_words < new_insn->nr_words)
1114 isa->max_nr_words = new_insn->nr_words;
1115 filter_add (&isa->flags, new_insn->flags);
1116 filter_add (&isa->options, new_insn->options);
1121 case unknown_record:
1124 error (record->line, "Unknown or unexpected entry\n");
1134 print_insn_words (lf *file,
1137 insn_word_entry *word = insn->words;
1142 insn_field_entry *field = word->first;
1145 if (options.insn_specifying_widths)
1146 lf_printf (file, "%d.", field->width);
1148 lf_printf (file, "%d.", i2target (options.hi_bit_nr, field->first));
1149 switch (field->type)
1151 case insn_field_int:
1152 lf_printf (file, "0x%lx", (long) field->val_int);
1154 case insn_field_reserved:
1155 lf_printf (file, "/");
1157 case insn_field_wild:
1158 lf_printf (file, "*");
1160 case insn_field_string:
1161 lf_printf (file, "%s", field->val_string);
1164 if (field == word->last)
1166 field = field->next;
1167 lf_printf (file, ",");
1172 lf_printf (file, "+");
1180 function_entry_traverse (lf *file,
1181 function_entry *functions,
1182 function_entry_handler *handler,
1185 function_entry *function;
1186 for (function = functions; function != NULL; function = function->next)
1188 handler (file, function, data);
1193 insn_table_traverse_insn (lf *file,
1195 insn_entry_handler *handler,
1199 for (insn = isa->insns; insn != NULL; insn = insn->next)
1201 handler (file, isa, insn, data);
1207 dump_function_entry (lf *file,
1209 function_entry *entry,
1212 lf_printf (file, "%s(function_entry *) 0x%lx", prefix, (long) entry);
1215 dump_line_ref (file, "\n(line ", entry->line, ")");
1216 dump_filter (file, "\n(flags ", entry->flags, ")");
1217 lf_printf (file, "\n(type \"%s\")", entry->type);
1218 lf_printf (file, "\n(name \"%s\")", entry->name);
1219 lf_printf (file, "\n(param \"%s\")", entry->param);
1220 dump_table_entry (file, "\n(code ", entry->code, ")");
1221 lf_printf (file, "\n(is_internal %d)", entry->is_internal);
1222 lf_printf (file, "\n(next 0x%lx)", (long) entry->next);
1224 lf_printf (file, "%s", suffix);
1228 dump_function_entries (lf *file,
1230 function_entry *entry,
1233 lf_printf (file, "%s", prefix);
1234 lf_indent (file, +1);
1235 while (entry != NULL)
1237 dump_function_entry (file, "\n(", entry, ")");
1238 entry = entry->next;
1240 lf_indent (file, -1);
1241 lf_printf (file, "%s", suffix);
1245 cache_entry_type_to_str (cache_entry_type type)
1249 case scratch_value: return "scratch";
1250 case cache_value: return "cache";
1251 case compute_value: return "compute";
1253 ERROR ("Bad switch");
1258 dump_cache_entry (lf *file,
1263 lf_printf (file, "%s(cache_entry *) 0x%lx", prefix, (long) entry);
1266 dump_line_ref (file, "\n(line ", entry->line, ")");
1267 dump_filter (file, "\n(flags ", entry->flags, ")");
1268 lf_printf (file, "\n(entry_type \"%s\")", cache_entry_type_to_str (entry->entry_type));
1269 lf_printf (file, "\n(name \"%s\")", entry->name);
1270 dump_filter (file, "\n(original_fields ", entry->original_fields, ")");
1271 lf_printf (file, "\n(type \"%s\")", entry->type);
1272 lf_printf (file, "\n(expression \"%s\")", entry->expression);
1273 lf_printf (file, "\n(next 0x%lx)", (long) entry->next);
1275 lf_printf (file, "%s", suffix);
1279 dump_cache_entries (lf *file,
1284 lf_printf (file, "%s", prefix);
1285 lf_indent (file, +1);
1286 while (entry != NULL)
1288 dump_cache_entry (file, "\n(", entry, ")");
1289 entry = entry->next;
1291 lf_indent (file, -1);
1292 lf_printf (file, "%s", suffix);
1296 dump_model_data (lf *file,
1301 lf_printf (file, "%s(model_data *) 0x%lx", prefix, (long) entry);
1304 lf_indent (file, +1);
1305 dump_line_ref (file, "\n(line ", entry->line, ")");
1306 dump_filter (file, "\n(flags ", entry->flags, ")");
1307 dump_table_entry (file, "\n(entry ", entry->entry, ")");
1308 dump_table_entry (file, "\n(code ", entry->code, ")");
1309 lf_printf (file, "\n(next 0x%lx)", (long) entry->next);
1310 lf_indent (file, -1);
1312 lf_printf (file, "%s", prefix);
1316 dump_model_datas (lf *file,
1321 lf_printf (file, "%s", prefix);
1322 lf_indent (file, +1);
1323 while (entry != NULL)
1325 dump_model_data (file, "\n(", entry, ")");
1326 entry = entry->next;
1328 lf_indent (file, -1);
1329 lf_printf (file, "%s", suffix);
1333 dump_model_entry (lf *file,
1338 lf_printf (file, "%s(model_entry *) 0x%lx", prefix, (long) entry);
1341 lf_indent (file, +1);
1342 dump_line_ref (file, "\n(line ", entry->line, ")");
1343 dump_filter (file, "\n(flags ", entry->flags, ")");
1344 lf_printf (file, "\n(name \"%s\")", entry->name);
1345 lf_printf (file, "\n(full_name \"%s\")", entry->full_name);
1346 lf_printf (file, "\n(unit_data \"%s\")", entry->unit_data);
1347 lf_printf (file, "\n(next 0x%lx)", (long) entry->next);
1348 lf_indent (file, -1);
1350 lf_printf (file, "%s", prefix);
1354 dump_model_entries (lf *file,
1359 lf_printf (file, "%s", prefix);
1360 lf_indent (file, +1);
1361 while (entry != NULL)
1363 dump_model_entry (file, "\n(", entry, ")");
1364 entry = entry->next;
1366 lf_indent (file, -1);
1367 lf_printf (file, "%s", suffix);
1372 dump_model_table (lf *file,
1377 lf_printf (file, "%s(model_table *) 0x%lx", prefix, (long) entry);
1380 lf_indent (file, +1);
1381 dump_filter (file, "\n(processors ", entry->processors, ")");
1382 lf_printf (file, "\n(nr_models %d)", entry->nr_models);
1383 dump_model_entries (file, "\n(models ", entry->models, ")");
1384 dump_model_datas (file, "\n(macros ", entry->macros, ")");
1385 dump_model_datas (file, "\n(data ", entry->data, ")");
1386 dump_function_entries (file, "\n(statics ", entry->statics, ")");
1387 dump_function_entries (file, "\n(internals ", entry->functions, ")");
1388 dump_function_entries (file, "\n(functions ", entry->functions, ")");
1389 lf_indent (file, -1);
1391 lf_printf (file, "%s", suffix);
1396 insn_field_type_to_str (insn_field_type type)
1400 case insn_field_int: return "int";
1401 case insn_field_reserved: return "reserved";
1402 case insn_field_wild: return "wild";
1403 case insn_field_string: return "string";
1405 ERROR ("bad switch");
1410 dump_insn_field (lf *file,
1412 insn_field_entry *field,
1416 lf_printf (file, "%s(insn_field_entry *) 0x%lx", prefix, (long) field);
1419 lf_indent (file, +1);
1420 lf_printf (file, "%s(first %d)", sep, field->first);
1421 lf_printf (file, "%s(last %d)", sep, field->last);
1422 lf_printf (file, "%s(width %d)", sep, field->width);
1423 lf_printf (file, "%s(type %s)", sep, insn_field_type_to_str (field->type));
1424 switch (field->type)
1426 case insn_field_int:
1427 lf_printf (file, "%s(val 0x%lx)", sep, (long) field->val_int);
1429 case insn_field_reserved:
1430 /* nothing output */
1432 case insn_field_wild:
1433 /* nothing output */
1435 case insn_field_string:
1436 lf_printf (file, "%s(val \"%s\")", sep, field->val_string);
1439 lf_printf (file, "%s(next 0x%lx)", sep, (long) field->next);
1440 lf_printf (file, "%s(prev 0x%lx)", sep, (long) field->prev);
1441 lf_indent (file, -1);
1443 lf_printf (file, "%s", suffix);
1447 dump_insn_word_entry (lf *file,
1449 insn_word_entry *word,
1452 lf_printf (file, "%s(insn_word_entry *) 0x%lx", prefix, (long) word);
1456 insn_field_entry *field;
1457 lf_indent (file, +1);
1458 lf_printf (file, "\n(first 0x%lx)", (long) word->first);
1459 lf_printf (file, "\n(last 0x%lx)", (long) word->last);
1460 lf_printf (file, "\n(bit");
1461 for (i = 0; i < options.insn_bit_size; i++)
1462 lf_printf (file, "\n ((value %d) (mask %d) (field 0x%lx))",
1463 word->bit[i]->value, word->bit[i]->mask, (long) word->bit[i]->field);
1464 lf_printf (file, ")");
1465 for (field = word->first; field != NULL; field = field->next)
1466 dump_insn_field (file, "\n(", field, ")");
1467 dump_filter (file, "\n(field_names ", word->field_names, ")");
1468 lf_printf (file, "\n(next 0x%lx)", (long) word->next);
1469 lf_indent (file, -1);
1471 lf_printf (file, "%s", suffix);
1475 dump_insn_word_entries (lf *file,
1477 insn_word_entry *word,
1480 lf_printf (file, "%s", prefix);
1481 while (word != NULL)
1483 dump_insn_word_entry (file, "\n(", word, ")");
1486 lf_printf (file, "%s", suffix);
1490 dump_insn_model_entry (lf *file,
1492 insn_model_entry *model,
1495 lf_printf (file, "%s(insn_model_entry *) 0x%lx", prefix, (long) model);
1498 lf_indent (file, +1);
1499 dump_line_ref (file, "\n(line ", model->line, ")");
1500 dump_filter (file, "\n(names ", model->names, ")");
1501 lf_printf (file, "\n(full_name \"%s\")", model->full_name);
1502 lf_printf (file, "\n(unit_data \"%s\")", model->unit_data);
1503 lf_printf (file, "\n(insn (insn_entry *) 0x%lx)", (long) model->insn);
1504 lf_printf (file, "\n(next (insn_model_entry *) 0x%lx)",
1505 (long) model->next);
1506 lf_indent (file, -1);
1508 lf_printf (file, "%s", suffix);
1512 dump_insn_model_entries (lf *file,
1514 insn_model_entry *model,
1517 lf_printf (file, "%s", prefix);
1518 while (model != NULL)
1520 dump_insn_model_entry (file, "\n", model, "");
1521 model = model->next;
1523 lf_printf (file, "%s", suffix);
1528 dump_insn_mnemonic_entry (lf *file,
1530 insn_mnemonic_entry *mnemonic,
1533 lf_printf (file, "%s(insn_mnemonic_entry *) 0x%lx", prefix, (long) mnemonic);
1534 if (mnemonic != NULL)
1536 lf_indent (file, +1);
1537 dump_line_ref (file, "\n(line ", mnemonic->line, ")");
1538 lf_printf (file, "\n(format \"%s\")", mnemonic->format);
1539 lf_printf (file, "\n(condition \"%s\")", mnemonic->condition);
1540 lf_printf (file, "\n(insn (insn_entry *) 0x%lx)",
1541 (long) mnemonic->insn);
1542 lf_printf (file, "\n(next (insn_mnemonic_entry *) 0x%lx)",
1543 (long) mnemonic->next);
1544 lf_indent (file, -1);
1546 lf_printf (file, "%s", suffix);
1550 dump_insn_mnemonic_entries (lf *file,
1552 insn_mnemonic_entry *mnemonic,
1555 lf_printf (file, "%s", prefix);
1556 while (mnemonic != NULL)
1558 dump_insn_mnemonic_entry (file, "\n", mnemonic, "");
1559 mnemonic = mnemonic->next;
1561 lf_printf (file, "%s", suffix);
1565 dump_insn_entry (lf *file,
1570 lf_printf (file, "%s(insn_entry *) 0x%lx", prefix, (long) entry);
1574 lf_indent (file, +1);
1575 dump_line_ref (file, "\n(line ", entry->line, ")");
1576 dump_filter (file, "\n(flags ", entry->flags, ")");
1577 lf_printf (file, "\n(nr_words %d)", entry->nr_words);
1578 dump_insn_word_entries (file, "\n(words ", entry->words, ")");
1579 lf_printf (file, "\n(word");
1580 for (i = 0; i < entry->nr_models; i++)
1581 lf_printf (file, " 0x%lx", (long) entry->word[i]);
1582 lf_printf (file, ")");
1583 dump_filter (file, "\n(field_names ", entry->field_names, ")");
1584 lf_printf (file, "\n(format_name \"%s\")", entry->format_name);
1585 dump_filter (file, "\n(options ", entry->options, ")");
1586 lf_printf (file, "\n(name \"%s\")", entry->name);
1587 lf_printf (file, "\n(nr_models %d)", entry->nr_models);
1588 dump_insn_model_entries (file, "\n(models ", entry->models, ")");
1589 lf_printf (file, "\n(model");
1590 for (i = 0; i < entry->nr_models; i++)
1591 lf_printf (file, " 0x%lx", (long) entry->model[i]);
1592 lf_printf (file, ")");
1593 dump_filter (file, "\n(processors ", entry->processors, ")");
1594 dump_insn_mnemonic_entries (file, "\n(mnemonics ", entry->mnemonics, ")");
1595 dump_table_entry (file, "\n(code ", entry->code, ")");
1596 lf_printf (file, "\n(next 0x%lx)", (long) entry->next);
1597 lf_indent (file, -1);
1599 lf_printf (file, "%s", suffix);
1603 dump_insn_entries (lf *file,
1608 lf_printf (file, "%s", prefix);
1609 lf_indent (file, +1);
1610 while (entry != NULL)
1612 dump_insn_entry (file, "\n(", entry, ")");
1613 entry = entry->next;
1615 lf_indent (file, -1);
1616 lf_printf (file, "%s", suffix);
1622 dump_insn_table (lf *file,
1627 lf_printf (file, "%s(insn_table *) 0x%lx", prefix, (long) isa);
1630 lf_indent (file, +1);
1631 dump_cache_entries (file, "\n(caches ", isa->caches, ")");
1632 lf_printf (file, "\n(nr_insns %d)", isa->nr_insns);
1633 lf_printf (file, "\n(max_nr_words %d)", isa->max_nr_words);
1634 dump_insn_entries (file, "\n(insns ", isa->insns, ")");
1635 dump_function_entries (file, "\n(functions ", isa->functions, ")");
1636 dump_insn_entry (file, "\n(illegal_insn ", isa->illegal_insn, ")");
1637 dump_model_table (file, "\n(model ", isa->model, ")");
1638 dump_filter (file, "\n(flags ", isa->flags, ")");
1639 dump_filter (file, "\n(options ", isa->options, ")");
1640 lf_indent (file, -1);
1642 lf_printf (file, "%s", suffix);
1647 igen_options options;
1650 main (int argc, char **argv)
1655 INIT_OPTIONS (options);
1658 filter_parse (&options.flags_filter, argv[2]);
1660 error (NULL, "Usage: insn <insn-table> [ <filter-in> ]\n");
1662 isa = load_insn_table (argv[1], NULL);
1663 l = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "tmp-ld-insn");
1664 dump_insn_table (l, "(isa ", isa, ")\n");