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