MIPS/opcodes: Remove an incorrect MT ASE reference in MFC0/MTC0 decoding
[external/binutils.git] / opcodes / aarch64-gen.c
1 /* aarch64-gen.c -- Generate tables and routines for opcode lookup and
2    instruction encoding and decoding.
3    Copyright (C) 2012-2017 Free Software Foundation, Inc.
4    Contributed by ARM Ltd.
5
6    This file is part of the GNU opcodes library.
7
8    This library is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    It is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; see the file COPYING3. If not,
20    see <http://www.gnu.org/licenses/>.  */
21
22 #include "sysdep.h"
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <stdarg.h>
26
27 #include "libiberty.h"
28 #include "getopt.h"
29 #include "opcode/aarch64.h"
30
31 #define VERIFIER(x) NULL
32 #include "aarch64-tbl.h"
33
34 static int debug = 0;
35
36 /* Structure used in the decoding tree to group a list of aarch64_opcode
37    entries.  */
38
39 struct opcode_node
40 {
41   aarch64_insn opcode;
42   aarch64_insn mask;
43   /* Index of the entry in the original table; the top 2 bits help
44      determine the table.  */
45   unsigned int index;
46   struct opcode_node *next;
47 };
48
49 typedef struct opcode_node opcode_node;
50
51 /* Head of the list of the opcode_node after read_table.  */
52 static opcode_node opcode_nodes_head;
53
54 /* Node in the decoding tree.  */
55
56 struct bittree
57 {
58   unsigned int bitno;
59   /* 0, 1, and X (don't care).  */
60   struct bittree *bits[2];
61   /* List of opcodes; only valid for the leaf node.  */
62   opcode_node *list;
63 };
64
65 /* Allocate and initialize an opcode_node.  */
66 static opcode_node*
67 new_opcode_node (void)
68 {
69   opcode_node* ent = malloc (sizeof (opcode_node));
70
71   if (!ent)
72     abort ();
73
74   ent->opcode = 0;
75   ent->mask = 0;
76   ent->index = -1;
77   ent->next = NULL;
78
79   return ent;
80 }
81
82 /* Multiple tables are supported, although currently only one table is
83    in use.  N.B. there are still some functions have the table name
84    'aarch64_opcode_table' hard-coded in, e.g. print_find_next_opcode;
85    therefore some amount of work needs to be done if the full support
86    for multiple tables needs to be enabled.  */
87 static const struct aarch64_opcode *aarch64_opcode_tables[] =
88 {aarch64_opcode_table};
89
90 /* Use top 2 bits to indiate which table.  */
91 static unsigned int
92 initialize_index (const struct aarch64_opcode* table)
93 {
94   int i;
95   const int num_of_tables = sizeof (aarch64_opcode_tables)
96     / sizeof (struct aarch64_opcode *);
97   for (i = 0; i < num_of_tables; ++i)
98     if (table == aarch64_opcode_tables [i])
99       break;
100   if (i == num_of_tables)
101     abort ();
102   return (unsigned int)i << 30;
103 }
104
105 static inline const struct aarch64_opcode *
106 index2table (unsigned int index)
107 {
108   return aarch64_opcode_tables[(index >> 30) & 0x3];
109 }
110
111 static inline unsigned int
112 real_index (unsigned int index)
113 {
114   return index & ((1 << 30) - 1);
115 }
116
117 /* Given OPCODE_NODE, return the corresponding aarch64_opcode*.  */
118 static const aarch64_opcode*
119 get_aarch64_opcode (const opcode_node *opcode_node)
120 {
121   if (opcode_node == NULL)
122     return NULL;
123   return &index2table (opcode_node->index)[real_index (opcode_node->index)];
124 }
125
126 static void
127 read_table (const struct aarch64_opcode* table)
128 {
129   const struct aarch64_opcode *ent = table;
130   opcode_node **new_ent;
131   unsigned int index = initialize_index (table);
132
133   if (!ent->name)
134     return;
135
136   new_ent = &opcode_nodes_head.next;
137
138   while (*new_ent)
139     new_ent = &(*new_ent)->next;
140
141   do
142     {
143       /* F_PSEUDO needs to be used together with F_ALIAS to indicate an alias
144          opcode is a programmer friendly pseudo instruction available only in
145          the assembly code (thus will not show up in the disassembly).  */
146       assert (pseudo_opcode_p (ent) == FALSE || alias_opcode_p (ent) == TRUE);
147       /* Skip alias (inc. pseudo) opcode.  */
148       if (alias_opcode_p (ent) == TRUE)
149         {
150           index++;
151           continue;
152         }
153       *new_ent = new_opcode_node ();
154       (*new_ent)->opcode = ent->opcode;
155       (*new_ent)->mask = ent->mask;
156       (*new_ent)->index = index++;
157       new_ent = &((*new_ent)->next);
158     } while ((++ent)->name);
159 }
160
161 static inline void
162 print_one_opcode_node (opcode_node* ent)
163 {
164   printf ("%s\t%08x\t%08x\t%d\n", get_aarch64_opcode (ent)->name,
165           get_aarch64_opcode (ent)->opcode, get_aarch64_opcode (ent)->mask,
166           (int)real_index (ent->index));
167 }
168
169 /* As an internal debugging utility, print out the list of nodes pointed
170    by opcode_nodes_head.  */
171 static void
172 print_opcode_nodes (void)
173 {
174   opcode_node* ent = opcode_nodes_head.next;
175   printf ("print_opcode_nodes table:\n");
176   while (ent)
177     {
178       print_one_opcode_node (ent);
179       ent = ent->next;
180     }
181 }
182
183 static struct bittree*
184 new_bittree_node (void)
185 {
186   struct bittree* node;
187   node = malloc (sizeof (struct bittree));
188   if (!node)
189     abort ();
190   node->bitno = -1;
191   node->bits[0] = NULL;
192   node->bits[1] = NULL;
193   return node;
194 }
195
196 /* The largest number of opcode entries that exist at a leaf node of the
197    decoding decision tree.  The reason that there can be more than one
198    opcode entry is because some opcodes have shared field that is partially
199    constrained and thus cannot be fully isolated using the algorithm
200    here.  */
201 static int max_num_opcodes_at_leaf_node = 0;
202
203 /* Given a list of opcodes headed by *OPCODE, try to establish one bit that
204    is shared by all the opcodes in the list as one of base opcode bits.  If
205    such a bit is found, divide the list of the opcodes into two based on the
206    value of the bit.
207
208    Store the bit number in BITTREE->BITNO if the division succeeds.  If unable
209    to determine such a bit or there is only one opcode in the list, the list
210    is decided to be undividable and OPCODE will be assigned to BITTREE->LIST.
211
212    The function recursively call itself until OPCODE is undividable.
213
214    N.B. the nature of this algrithm determines that given any value in the
215    32-bit space, the computed decision tree will always be able to find one or
216    more opcodes entries for it, regardless whether there is a valid instruction
217    defined for this value or not.  In order to detect the undefined values,
218    when the caller obtains the opcode entry/entries, it should at least compare
219    the bit-wise AND result of the value and the mask with the base opcode
220    value; if the two are different, it means that the value is undefined
221    (although the value may be still undefined when the comparison is the same,
222    in which case call aarch64_opcode_decode to carry out further checks).  */
223
224 static void
225 divide_table_1 (struct bittree *bittree, opcode_node *opcode)
226 {
227   aarch64_insn mask_and;
228   opcode_node *ent;
229   unsigned int bitno;
230   aarch64_insn bitmask;
231   opcode_node list0, list1, **ptr0, **ptr1;
232   static int depth = 0;
233
234   ++depth;
235
236   if (debug)
237     printf ("Enter into depth %d\n", depth);
238
239   assert (opcode != NULL);
240
241   /* Succeed when there is only one opcode left.  */
242   if (!opcode->next)
243     {
244       if (debug)
245         {
246           printf ("opcode isolated:\n");
247           print_one_opcode_node (opcode);
248         }
249       goto divide_table_1_finish;
250     }
251
252 divide_table_1_try_again:
253   mask_and = -1;
254   ent = opcode;
255   while (ent)
256     {
257       mask_and &= ent->mask;
258       ent = ent->next;
259     }
260
261   if (debug)
262     printf ("mask and result: %08x\n", (unsigned int)mask_and);
263
264   /* If no more bit to look into, we have to accept the reality then.  */
265   if (!mask_and)
266     {
267       int i;
268       opcode_node *ptr;
269       if (debug)
270         {
271           ptr = opcode;
272           printf ("Isolated opcode group:\n");
273           do {
274               print_one_opcode_node (ptr);
275               ptr = ptr->next;
276           } while (ptr);
277         }
278       /* Count the number of opcodes.  */
279       for (i = 0, ptr = opcode; ptr; ++i)
280         ptr = ptr->next;
281       if (i > max_num_opcodes_at_leaf_node)
282         max_num_opcodes_at_leaf_node = i;
283       goto divide_table_1_finish;
284     }
285
286   /* Pick up the right most bit that is 1.  */
287   bitno = 0;
288   while (!(mask_and & (1 << bitno)))
289     ++bitno;
290   bitmask = (1 << bitno);
291
292   if (debug)
293     printf ("use bit %d\n", bitno);
294
295   /* Record in the bittree.  */
296   bittree->bitno = bitno;
297
298   /* Get two new opcode lists; adjust their masks.  */
299   list0.next = NULL;
300   list1.next = NULL;
301   ptr0 = &list0.next;
302   ptr1 = &list1.next;
303   ent = opcode;
304   while (ent)
305     {
306       if (ent->opcode & bitmask)
307         {
308           ent->mask &= (~bitmask);
309           *ptr1 = ent;
310           ent = ent->next;
311           (*ptr1)->next = NULL;
312           ptr1 = &(*ptr1)->next;
313         }
314       else
315         {
316           ent->mask &= (~bitmask);
317           *ptr0 = ent;
318           ent = ent->next;
319           (*ptr0)->next = NULL;
320           ptr0 = &(*ptr0)->next;
321         }
322     }
323
324   /* If BITNO can NOT divide the opcode group, try next bit.  */
325   if (list0.next == NULL)
326     {
327       opcode = list1.next;
328       goto divide_table_1_try_again;
329     }
330   else if (list1.next == NULL)
331     {
332       opcode = list0.next;
333       goto divide_table_1_try_again;
334     }
335
336   /* Further divide.  */
337   bittree->bits[0] = new_bittree_node ();
338   bittree->bits[1] = new_bittree_node ();
339   divide_table_1 (bittree->bits[0], list0.next);
340   divide_table_1 (bittree->bits[1], list1.next);
341
342 divide_table_1_finish:
343   if (debug)
344     printf ("Leave from depth %d\n", depth);
345   --depth;
346
347   /* Record the opcode entries on this leaf node.  */
348   bittree->list = opcode;
349
350   return;
351 }
352
353 /* Call divide_table_1 to divide the all the opcodes and thus create the
354    decoding decision tree.  */
355 static struct bittree *
356 divide_table (void)
357 {
358   struct bittree *bittree = new_bittree_node ();
359   divide_table_1 (bittree, opcode_nodes_head.next);
360   return bittree;
361 }
362
363 /* Read in all of the tables, create the decoding decision tree and return
364    the tree root.  */
365 static struct bittree *
366 initialize_decoder_tree (void)
367 {
368   int i;
369   const int num_of_tables = (sizeof (aarch64_opcode_tables)
370                              / sizeof (struct aarch64_opcode *));
371   for (i = 0; i < num_of_tables; ++i)
372     read_table (aarch64_opcode_tables [i]);
373   if (debug)
374     print_opcode_nodes ();
375   return divide_table ();
376 }
377
378 static void __attribute__ ((format (printf, 2, 3)))
379 indented_print (unsigned int indent, const char *format, ...)
380 {
381   va_list ap;
382   va_start (ap, format);
383   printf ("%*s", (int) indent, "");
384   vprintf (format, ap);
385   va_end (ap);
386 }
387
388 /* N.B. read the comment above divide_table_1 for the reason why the generated
389    decision tree function never returns NULL.  */
390
391 static void
392 print_decision_tree_1 (unsigned int indent, struct bittree* bittree)
393 {
394   /* PATTERN is only used to generate comment in the code.  */
395   static char pattern[33] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
396   assert (bittree != NULL);
397
398   /* Leaf node located.  */
399   if (bittree->bits[0] == NULL && bittree->bits[1] == NULL)
400     {
401       assert (bittree->list != NULL);
402       indented_print (indent, "/* 33222222222211111111110000000000\n");
403       indented_print (indent, "   10987654321098765432109876543210\n");
404       indented_print (indent, "   %s\n", pattern);
405       indented_print (indent, "   %s.  */\n",
406                       get_aarch64_opcode (bittree->list)->name);
407       indented_print (indent, "return %u;\n",
408                       real_index (bittree->list->index));
409       return;
410     }
411
412   /* Walk down the decoder tree.  */
413   indented_print (indent, "if (((word >> %d) & 0x1) == 0)\n", bittree->bitno);
414   indented_print (indent, "  {\n");
415   pattern[bittree->bitno] = '0';
416   print_decision_tree_1 (indent + 4, bittree->bits[0]);
417   indented_print (indent, "  }\n");
418   indented_print (indent, "else\n");
419   indented_print (indent, "  {\n");
420   pattern[bittree->bitno] = '1';
421   print_decision_tree_1 (indent + 4, bittree->bits[1]);
422   indented_print (indent, "  }\n");
423   pattern[bittree->bitno] = 'x';
424 }
425
426 /* Generate aarch64_opcode_lookup in C code to the standard output.  */
427
428 static void
429 print_decision_tree (struct bittree* bittree)
430 {
431   if (debug)
432     printf ("Enter print_decision_tree\n");
433
434   printf ("/* Called by aarch64_opcode_lookup.  */\n\n");
435
436   printf ("static int\n");
437   printf ("aarch64_opcode_lookup_1 (uint32_t word)\n");
438   printf ("{\n");
439
440   print_decision_tree_1 (2, bittree);
441
442   printf ("}\n\n");
443
444
445   printf ("/* Lookup opcode WORD in the opcode table.  N.B. all alias\n");
446   printf ("   opcodes are ignored here.  */\n\n");
447
448   printf ("const aarch64_opcode *\n");
449   printf ("aarch64_opcode_lookup (uint32_t word)\n");
450   printf ("{\n");
451   printf ("  return aarch64_opcode_table + aarch64_opcode_lookup_1 (word);\n");
452   printf ("}\n");
453 }
454
455 static void
456 print_find_next_opcode_1 (struct bittree* bittree)
457 {
458   assert (bittree != NULL);
459
460   /* Leaf node located.  */
461   if (bittree->bits[0] == NULL && bittree->bits[1] == NULL)
462     {
463       assert (bittree->list != NULL);
464       /* Find multiple opcode entries in one leaf node.  */
465       if (bittree->list->next != NULL)
466         {
467           opcode_node *list = bittree->list;
468           while (list != NULL)
469             {
470               const aarch64_opcode *curr = get_aarch64_opcode (list);
471               const aarch64_opcode *next = get_aarch64_opcode (list->next);
472
473               printf ("    case %u: ",
474                       (unsigned int)(curr - aarch64_opcode_table));
475               if (list->next != NULL)
476                 {
477                   printf ("value = %u; break;\t", real_index (list->next->index));
478                   printf ("/* %s --> %s.  */\n", curr->name, next->name);
479                 }
480               else
481                 {
482                   printf ("return NULL;\t\t");
483                   printf ("/* %s --> NULL.  */\n", curr->name);
484                 }
485
486               list = list->next;
487             }
488         }
489       return;
490     }
491
492   /* Walk down the decoder tree.  */
493   print_find_next_opcode_1 (bittree->bits[0]);
494   print_find_next_opcode_1 (bittree->bits[1]);
495 }
496
497 /* Generate aarch64_find_next_opcode in C code to the standard output.  */
498
499 static void
500 print_find_next_opcode (struct bittree* bittree)
501 {
502   if (debug)
503     printf ("Enter print_find_next_opcode\n");
504
505   printf ("\n");
506   printf ("const aarch64_opcode *\n");
507   printf ("aarch64_find_next_opcode (const aarch64_opcode *opcode)\n");
508   printf ("{\n");
509   printf ("  /* Use the index as the key to locate the next opcode.  */\n");
510   printf ("  int key = opcode - aarch64_opcode_table;\n");
511   printf ("  int value;\n");
512   printf ("  switch (key)\n");
513   printf ("    {\n");
514
515   print_find_next_opcode_1 (bittree);
516
517   printf ("    default: return NULL;\n");
518   printf ("    }\n\n");
519
520   printf ("  return aarch64_opcode_table + value;\n");
521   printf ("}\n");
522 }
523
524 /* Release the dynamic memory resource allocated for the generation of the
525    decoder tree.  */
526
527 static void
528 release_resource_decoder_tree (struct bittree* bittree)
529 {
530   assert (bittree != NULL);
531
532   /* Leaf node located.  */
533   if (bittree->bits[0] == NULL && bittree->bits[1] == NULL)
534     {
535       assert (bittree->list != NULL);
536       /* Free opcode_nodes.  */
537       opcode_node *list = bittree->list;
538       while (list != NULL)
539         {
540           opcode_node *next = list->next;
541           free (list);
542           list = next;
543         }
544       /* Free the tree node.  */
545       free (bittree);
546       return;
547     }
548
549   /* Walk down the decoder tree.  */
550   release_resource_decoder_tree (bittree->bits[0]);
551   release_resource_decoder_tree (bittree->bits[1]);
552
553   /* Free the tree node.  */
554   free (bittree);
555 }
556
557 /* Generate aarch64_find_real_opcode in C code to the standard output.
558    TABLE points to the alias info table, while NUM indicates the number of
559    entries in the table.  */
560
561 static void
562 print_find_real_opcode (const opcode_node *table, int num)
563 {
564   int i;
565
566   if (debug)
567     printf ("Enter print_find_real_opcode\n");
568
569   printf ("\n");
570   printf ("const aarch64_opcode *\n");
571   printf ("aarch64_find_real_opcode (const aarch64_opcode *opcode)\n");
572   printf ("{\n");
573   printf ("  /* Use the index as the key to locate the real opcode.  */\n");
574   printf ("  int key = opcode - aarch64_opcode_table;\n");
575   printf ("  int value;\n");
576   printf ("  switch (key)\n");
577   printf ("    {\n");
578
579   for (i = 0; i < num; ++i)
580     {
581       const opcode_node *real = table + i;
582       const opcode_node *alias = real->next;
583       for (; alias; alias = alias->next)
584         printf ("    case %u:\t/* %s */\n", real_index (alias->index),
585                 get_aarch64_opcode (alias)->name);
586       printf ("      value = %u;\t/* --> %s.  */\n", real_index (real->index),
587               get_aarch64_opcode (real)->name);
588       printf ("      break;\n");
589     }
590
591   printf ("    default: return NULL;\n");
592   printf ("    }\n\n");
593
594   printf ("  return aarch64_opcode_table + value;\n");
595   printf ("}\n");
596 }
597
598 /* Generate aarch64_find_alias_opcode in C code to the standard output.
599    TABLE points to the alias info table, while NUM indicates the number of
600    entries in the table.  */
601
602 static void
603 print_find_alias_opcode (const opcode_node *table, int num)
604 {
605   int i;
606
607   if (debug)
608     printf ("Enter print_find_alias_opcode\n");
609
610   printf ("\n");
611   printf ("const aarch64_opcode *\n");
612   printf ("aarch64_find_alias_opcode (const aarch64_opcode *opcode)\n");
613   printf ("{\n");
614   printf ("  /* Use the index as the key to locate the alias opcode.  */\n");
615   printf ("  int key = opcode - aarch64_opcode_table;\n");
616   printf ("  int value;\n");
617   printf ("  switch (key)\n");
618   printf ("    {\n");
619
620   for (i = 0; i < num; ++i)
621     {
622       const opcode_node *node = table + i;
623       assert (node->next);
624       printf ("    case %u: value = %u; break;", real_index (node->index),
625               real_index (node->next->index));
626       printf ("\t/* %s --> %s.  */\n", get_aarch64_opcode (node)->name,
627               get_aarch64_opcode (node->next)->name);
628     }
629
630   printf ("    default: return NULL;\n");
631   printf ("    }\n\n");
632
633   printf ("  return aarch64_opcode_table + value;\n");
634   printf ("}\n");
635 }
636
637 /* Generate aarch64_find_next_alias_opcode in C code to the standard output.
638    TABLE points to the alias info table, while NUM indicates the number of
639    entries in the table.  */
640
641 static void
642 print_find_next_alias_opcode (const opcode_node *table, int num)
643 {
644   int i;
645
646   if (debug)
647     printf ("Enter print_find_next_alias_opcode\n");
648
649   printf ("\n");
650   printf ("const aarch64_opcode *\n");
651   printf ("aarch64_find_next_alias_opcode (const aarch64_opcode *opcode)\n");
652   printf ("{\n");
653   printf ("  /* Use the index as the key to locate the next opcode.  */\n");
654   printf ("  int key = opcode - aarch64_opcode_table;\n");
655   printf ("  int value;\n");
656   printf ("  switch (key)\n");
657   printf ("    {\n");
658
659   for (i = 0; i < num; ++i)
660     {
661       const opcode_node *node = table + i;
662       assert (node->next);
663       if (node->next->next == NULL)
664         continue;
665       while (node->next->next)
666         {
667           printf ("    case %u: value = %u; break;", real_index (node->next->index),
668                  real_index (node->next->next->index));
669           printf ("\t/* %s --> %s.  */\n",
670                   get_aarch64_opcode (node->next)->name,
671                   get_aarch64_opcode (node->next->next)->name);
672           node = node->next;
673         }
674     }
675
676   printf ("    default: return NULL;\n");
677   printf ("    }\n\n");
678
679   printf ("  return aarch64_opcode_table + value;\n");
680   printf ("}\n");
681 }
682
683 /* Given OPCODE, establish and return a link list of alias nodes in the
684    preferred order.  */
685
686 opcode_node *
687 find_alias_opcode (const aarch64_opcode *opcode)
688 {
689   int i;
690   /* Assume maximum of 32 disassemble preference candidates.  */
691   const int max_num_aliases = 32;
692   const aarch64_opcode *ent;
693   const aarch64_opcode *preferred[max_num_aliases + 1];
694   opcode_node head, **next;
695
696   assert (opcode_has_alias (opcode));
697
698   i = 0;
699   if (opcode->name != NULL)
700     preferred[i++] = opcode;
701   ent = aarch64_opcode_table;
702   while (ent->name != NULL)
703     {
704       /* The mask of an alias opcode must be equal to or a super-set (i.e.
705          more constrained) of that of the aliased opcode; so is the base
706          opcode value.  */
707       if (alias_opcode_p (ent) == TRUE
708           && (ent->mask & opcode->mask) == opcode->mask
709           && (opcode->mask & ent->opcode) == (opcode->mask & opcode->opcode))
710         {
711           assert (i < max_num_aliases);
712           preferred[i++] = ent;
713           if (debug)
714             printf ("found %s for %s.", ent->name, opcode->name);
715         }
716       ++ent;
717     }
718
719   if (debug)
720     {
721       int m;
722       printf ("un-orderd list: ");
723       for (m = 0; m < i; ++m)
724         printf ("%s, ", preferred[m]->name);
725       printf ("\n");
726     }
727
728   /* There must be at least one alias.  */
729   assert (i >= 1);
730
731   /* Sort preferred array according to the priority (from the lowest to the
732      highest.  */
733   if (i > 1)
734     {
735       int j, k;
736       for (j = 0; j < i - 1; ++j)
737         {
738           for (k = 0; k < i - 1 - j; ++k)
739             {
740               const aarch64_opcode *t;
741               t = preferred [k+1];
742               if (opcode_priority (t) < opcode_priority (preferred [k]))
743                 {
744                   preferred [k+1] = preferred [k];
745                   preferred [k] = t;
746                 }
747             }
748         }
749     }
750
751   if (debug)
752     {
753       int m;
754       printf ("orderd list: ");
755       for (m = 0; m < i; ++m)
756         printf ("%s, ", preferred[m]->name);
757       printf ("\n");
758     }
759
760   /* Create a link-list of opcode_node with disassemble preference from
761      higher to lower.  */
762   next = &head.next;
763   --i;
764   while (i >= 0)
765     {
766       const aarch64_opcode *alias = preferred [i];
767       opcode_node *node = new_opcode_node ();
768
769       if (debug)
770         printf ("add %s.\n", alias->name);
771
772       node->index = alias - aarch64_opcode_table;
773       *next = node;
774       next = &node->next;
775
776       --i;
777     }
778   *next = NULL;
779
780   return head.next;
781 }
782
783 /* Create and return alias information.
784    Return the address of the created alias info table; return the number
785    of table entries in *NUM_PTR.  */
786
787 opcode_node *
788 create_alias_info (int *num_ptr)
789 {
790   int i, num;
791   opcode_node *ret;
792   const aarch64_opcode *ent;
793
794   /* Calculate the total number of opcodes that have alias.  */
795   num = 0;
796   ent = aarch64_opcode_table;
797   while (ent->name != NULL)
798     {
799       if (opcode_has_alias (ent))
800         {
801           /* Assert the alias relationship be flat-structured to keep
802              algorithms simple; not allow F_ALIAS and F_HAS_ALIAS both
803              specified.  */
804           assert (!alias_opcode_p (ent));
805           ++num;
806         }
807       ++ent;
808     }
809   assert (num_ptr);
810   *num_ptr = num;
811
812   /* The array of real opcodes that have alias(es).  */
813   ret = malloc (sizeof (opcode_node) * num);
814
815   /* For each opcode, establish a list of alias nodes in a preferred
816      order.  */
817   for (i = 0, ent = aarch64_opcode_table; i < num; ++i, ++ent)
818     {
819       opcode_node *node = ret + i;
820       while (ent->name != NULL && !opcode_has_alias (ent))
821         ++ent;
822       assert (ent->name != NULL);
823       node->index = ent - aarch64_opcode_table;
824       node->next = find_alias_opcode (ent);
825       assert (node->next);
826     }
827   assert (i == num);
828
829   return ret;
830 }
831
832 /* Release the dynamic memory resource allocated for the generation of the
833    alias information.  */
834
835 void
836 release_resource_alias_info (opcode_node *alias_info, int num)
837 {
838   int i = 0;
839   opcode_node *node = alias_info;
840
841   /* Free opcode_node list.  */
842   for (; i < num; ++i, ++node)
843     {
844       opcode_node *list = node->next;
845       do
846         {
847           opcode_node *next = list->next;
848           free (list);
849           list = next;
850         } while (list != NULL);
851     }
852
853   /* Free opcode_node array.  */
854   free (alias_info);
855 }
856
857 /* As a debugging utility, print out the result of the table division, although
858    it is not doing much this moment.  */
859 static void
860 print_divide_result (const struct bittree *bittree ATTRIBUTE_UNUSED)
861 {
862   printf ("max_num_opcodes_at_leaf_node: %d\n", max_num_opcodes_at_leaf_node);
863   return;
864 }
865 \f
866 /* Structure to help generate the operand table.  */
867 struct operand
868 {
869   const char *class;
870   const char *inserter;
871   const char *extractor;
872   const char *str;
873   const char *flags;
874   const char *fields;
875   const char *desc;
876   unsigned processed : 1;
877   unsigned has_inserter : 1;
878   unsigned has_extractor : 1;
879 };
880
881 typedef struct operand operand;
882
883 #ifdef X
884 #undef X
885 #endif
886
887 #ifdef Y
888 #undef Y
889 #endif
890
891 #ifdef F
892 #undef F
893 #endif
894
895 /* Get the operand information in strings.  */
896
897 static operand operands[] =
898 {
899     {"NIL", "0", "0", "", "0", "{0}", "<none>", 0, 0, 0},
900 #define F(...)  #__VA_ARGS__
901 #define X(a,b,c,d,e,f,g)        \
902     {#a, #b, #c, d, #e, "{"f"}", g, 0, 0, 0},
903 #define Y(a,b,d,e,f,g)          \
904     {#a, "ins_"#b, "ext_"#b, d, #e, "{"f"}", g, 0, 0, 0},
905     AARCH64_OPERANDS
906     {"NIL", "0", "0", "", "0", "{0}", "DUMMY", 0, 0, 0},
907 };
908
909 #undef F
910 #undef X
911
912 static void
913 process_operand_table (void)
914 {
915   int i;
916   operand *opnd;
917   const int num = sizeof (operands) / sizeof (operand);
918
919   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
920     {
921       opnd->has_inserter = opnd->inserter[0] != '0';
922       opnd->has_extractor = opnd->extractor[0] != '0';
923     }
924 }
925
926 /* Generate aarch64_operands in C to the standard output.  */
927
928 static void
929 print_operand_table (void)
930 {
931   int i;
932   operand *opnd;
933   const int num = sizeof (operands) / sizeof (operand);
934
935   if (debug)
936     printf ("Enter print_operand_table\n");
937
938   printf ("\n");
939   printf ("const struct aarch64_operand aarch64_operands[] =\n");
940   printf ("{\n");
941
942   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
943     {
944       char flags[256];
945       flags[0] = '\0';
946       if (opnd->flags[0] != '0')
947         sprintf (flags, "%s", opnd->flags);
948       if (opnd->has_inserter)
949         {
950           if (flags[0] != '\0')
951             strcat (flags, " | ");
952           strcat (flags, "OPD_F_HAS_INSERTER");
953         }
954       if (opnd->has_extractor)
955         {
956           if (flags[0] != '\0')
957             strcat (flags, " | ");
958           strcat (flags, "OPD_F_HAS_EXTRACTOR");
959         }
960       if (flags[0] == '\0')
961         {
962           flags[0] = '0';
963           flags[1] = '\0';
964         }
965     printf ("  {AARCH64_OPND_CLASS_%s, \"%s\", %s, %s, \"%s\"},\n",
966             opnd->class, opnd->str, flags, opnd->fields, opnd->desc);
967     }
968   printf ("};\n");
969 }
970
971 /* Generate aarch64_insert_operand in C to the standard output.  */
972
973 static void
974 print_operand_inserter (void)
975 {
976   int i;
977   operand *opnd;
978   const int num = sizeof (operands) / sizeof (operand);
979
980   if (debug)
981     printf ("Enter print_operand_inserter\n");
982
983   printf ("\n");
984   printf ("const char*\n");
985   printf ("aarch64_insert_operand (const aarch64_operand *self,\n\
986                            const aarch64_opnd_info *info,\n\
987                            aarch64_insn *code, const aarch64_inst *inst)\n");
988   printf ("{\n");
989   printf ("  /* Use the index as the key.  */\n");
990   printf ("  int key = self - aarch64_operands;\n");
991   printf ("  switch (key)\n");
992   printf ("    {\n");
993
994   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
995     opnd->processed = 0;
996
997   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
998     {
999       if (!opnd->processed && opnd->has_inserter)
1000         {
1001           int j = i + 1;
1002           const int len = strlen (opnd->inserter);
1003           operand *opnd2 = opnd + 1;
1004           printf ("    case %u:\n", (unsigned int)(opnd - operands));
1005           opnd->processed = 1;
1006           for (; j < num; ++j, ++opnd2)
1007             {
1008               if (!opnd2->processed
1009                   && opnd2->has_inserter
1010                   && len == strlen (opnd2->inserter)
1011                   && strncmp (opnd->inserter, opnd2->inserter, len) == 0)
1012                 {
1013                   printf ("    case %u:\n", (unsigned int)(opnd2 - operands));
1014                   opnd2->processed = 1;
1015                 }
1016             }
1017           printf ("      return aarch64_%s (self, info, code, inst);\n",
1018                   opnd->inserter);
1019         }
1020     }
1021
1022   printf ("    default: assert (0); abort ();\n");
1023   printf ("    }\n");
1024   printf ("}\n");
1025 }
1026
1027 /* Generate aarch64_extract_operand in C to the standard output.  */
1028
1029 static void
1030 print_operand_extractor (void)
1031 {
1032   int i;
1033   operand *opnd;
1034   const int num = sizeof (operands) / sizeof (operand);
1035
1036   if (debug)
1037     printf ("Enter print_operand_extractor\n");
1038
1039   printf ("\n");
1040   printf ("int\n");
1041   printf ("aarch64_extract_operand (const aarch64_operand *self,\n\
1042                            aarch64_opnd_info *info,\n\
1043                            aarch64_insn code, const aarch64_inst *inst)\n");
1044   printf ("{\n");
1045   printf ("  /* Use the index as the key.  */\n");
1046   printf ("  int key = self - aarch64_operands;\n");
1047   printf ("  switch (key)\n");
1048   printf ("    {\n");
1049
1050   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
1051     opnd->processed = 0;
1052
1053   for (i = 0, opnd = operands; i < num; ++i, ++opnd)
1054     {
1055       if (!opnd->processed && opnd->has_extractor)
1056         {
1057           int j = i + 1;
1058           const int len = strlen (opnd->extractor);
1059           operand *opnd2 = opnd + 1;
1060           printf ("    case %u:\n", (unsigned int)(opnd - operands));
1061           opnd->processed = 1;
1062           for (; j < num; ++j, ++opnd2)
1063             {
1064               if (!opnd2->processed
1065                   && opnd2->has_extractor
1066                   && len == strlen (opnd2->extractor)
1067                   && strncmp (opnd->extractor, opnd2->extractor, len) == 0)
1068                 {
1069                   printf ("    case %u:\n", (unsigned int)(opnd2 - operands));
1070                   opnd2->processed = 1;
1071                 }
1072             }
1073           printf ("      return aarch64_%s (self, info, code, inst);\n",
1074                   opnd->extractor);
1075         }
1076     }
1077
1078   printf ("    default: assert (0); abort ();\n");
1079   printf ("    }\n");
1080   printf ("}\n");
1081 }
1082 \f
1083 /* Table indexed by opcode enumerator stores the index of the corresponding
1084    opcode entry in aarch64_opcode_table.  */
1085 static unsigned op_enum_table [OP_TOTAL_NUM];
1086
1087 /* Print out the routine which, given the opcode enumerator, returns the
1088    corresponding opcode entry pointer.  */
1089
1090 static void
1091 print_get_opcode (void)
1092 {
1093   int i;
1094   const int num = OP_TOTAL_NUM;
1095   const aarch64_opcode *opcode;
1096
1097   if (debug)
1098     printf ("Enter print_get_opcode\n");
1099
1100   /* Fill in the internal table.  */
1101   opcode = aarch64_opcode_table;
1102   while (opcode->name != NULL)
1103     {
1104       if (opcode->op != OP_NIL)
1105         {
1106           /* Assert opcode enumerator be unique, in other words, no shared by
1107              different opcodes.  */
1108           if (op_enum_table[opcode->op] != 0)
1109             {
1110               fprintf (stderr, "Opcode %u is shared by different %s and %s.\n",
1111                        opcode->op,
1112                        aarch64_opcode_table[op_enum_table[opcode->op]].name,
1113                        opcode->name);
1114               assert (0);
1115               abort ();
1116             }
1117           assert (opcode->op < OP_TOTAL_NUM);
1118           op_enum_table[opcode->op] = opcode - aarch64_opcode_table;
1119         }
1120       ++opcode;
1121     }
1122
1123   /* Print the table.  */
1124   printf ("\n");
1125   printf ("/* Indexed by an enum aarch64_op enumerator, the value is the offset of\n\
1126    the corresponding aarch64_opcode entry in the aarch64_opcode_table.  */\n\n");
1127   printf ("static const unsigned op_enum_table [] =\n");
1128   printf ("{\n");
1129   for (i = 0; i < num; ++i)
1130     printf ("  %u,\n", op_enum_table[i]);
1131   printf ("};\n");
1132
1133   /* Print the function.  */
1134   printf ("\n");
1135   printf ("/* Given the opcode enumerator OP, return the pointer to the corresponding\n");
1136   printf ("   opcode entry.  */\n");
1137   printf ("\n");
1138   printf ("const aarch64_opcode *\n");
1139   printf ("aarch64_get_opcode (enum aarch64_op op)\n");
1140   printf ("{\n");
1141   printf ("  return aarch64_opcode_table + op_enum_table[op];\n");
1142   printf ("}\n");
1143 }
1144
1145 /* Print out the content of an opcode table (not in use).  */
1146 static void ATTRIBUTE_UNUSED
1147 print_table (struct aarch64_opcode* table)
1148 {
1149   struct aarch64_opcode *ent = table;
1150   do
1151     {
1152       printf ("%s\t%08x\t%08x\n", ent->name, (unsigned int)ent->opcode,
1153               (unsigned int)ent->mask);
1154     } while ((++ent)->name);
1155 }
1156 \f
1157 static const char * program_name = NULL;
1158
1159 /* Program options.  */
1160 struct option long_options[] =
1161 {
1162   {"debug",   no_argument,       NULL, 'd'},
1163   {"version", no_argument,       NULL, 'V'},
1164   {"help",    no_argument,       NULL, 'h'},
1165   {"gen-opc", no_argument,       NULL, 'c'},
1166   {"gen-asm", no_argument,       NULL, 'a'},
1167   {"gen-dis", no_argument,       NULL, 's'},
1168   {0,         no_argument,       NULL, 0}
1169 };
1170
1171 static void
1172 print_version (void)
1173 {
1174   printf ("%s: version 1.0\n", program_name);
1175   xexit (0);
1176 }
1177
1178 static void
1179 usage (FILE * stream, int status)
1180 {
1181   fprintf (stream, "Usage: %s [-V | --version] [-d | --debug] [--help]\n",
1182            program_name);
1183   fprintf (stream, "\t[ [-c | --gen-opc] | [-a | --gen-asm] | [-s | --gen-dis] ]\n");
1184   xexit (status);
1185 }
1186
1187 int
1188 main (int argc, char **argv)
1189 {
1190   extern int chdir (char *);
1191   int c;
1192   int gen_opcode_p = 0;
1193   int gen_assembler_p = 0;
1194   int gen_disassembler_p = 0;
1195
1196   program_name = *argv;
1197   xmalloc_set_program_name (program_name);
1198
1199   while ((c = getopt_long (argc, argv, "vVdhacs", long_options, 0)) != EOF)
1200     switch (c)
1201       {
1202       case 'V':
1203       case 'v':
1204         print_version ();
1205         break;
1206       case 'd':
1207         debug = 1;
1208         break;
1209       case 'h':
1210       case '?':
1211         usage (stderr, 0);
1212         break;
1213       case 'c':
1214         gen_opcode_p = 1;
1215         break;
1216       case 'a':
1217         gen_assembler_p = 1;
1218         break;
1219       case 's':
1220         gen_disassembler_p = 1;
1221         break;
1222       default:
1223       case 0:
1224         break;
1225       }
1226
1227   if (argc == 1 || optind != argc)
1228     usage (stdout, 1);
1229
1230   if (gen_opcode_p + gen_assembler_p + gen_disassembler_p > 1)
1231     {
1232       printf ("Please specify only one of the following options\n\
1233               [-c | --gen-opc] [-a | --gen-asm] [-s | --gen-dis]\n");
1234       xexit (2);
1235     }
1236
1237   struct bittree *decoder_tree;
1238
1239   decoder_tree = initialize_decoder_tree ();
1240   if (debug)
1241     print_divide_result (decoder_tree);
1242
1243   printf ("/* This file is automatically generated by aarch64-gen.  Do not edit!  */\n");
1244   printf ("/* Copyright (C) 2012-2017 Free Software Foundation, Inc.\n\
1245    Contributed by ARM Ltd.\n\
1246 \n\
1247    This file is part of the GNU opcodes library.\n\
1248 \n\
1249    This library is free software; you can redistribute it and/or modify\n\
1250    it under the terms of the GNU General Public License as published by\n\
1251    the Free Software Foundation; either version 3, or (at your option)\n\
1252    any later version.\n\
1253 \n\
1254    It is distributed in the hope that it will be useful, but WITHOUT\n\
1255    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
1256    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n\
1257    License for more details.\n\
1258 \n\
1259    You should have received a copy of the GNU General Public License\n\
1260    along with this program; see the file COPYING3. If not,\n\
1261    see <http://www.gnu.org/licenses/>.  */\n");
1262
1263   printf ("\n");
1264   printf ("#include \"sysdep.h\"\n");
1265   if (gen_opcode_p)
1266     printf ("#include \"aarch64-opc.h\"\n");
1267   if (gen_assembler_p)
1268     printf ("#include \"aarch64-asm.h\"\n");
1269   if (gen_disassembler_p)
1270     printf ("#include \"aarch64-dis.h\"\n");
1271   printf ("\n");
1272
1273   /* Generate opcode entry lookup for the disassembler.  */
1274   if (gen_disassembler_p)
1275     {
1276       print_decision_tree (decoder_tree);
1277       print_find_next_opcode (decoder_tree);
1278       release_resource_decoder_tree (decoder_tree);
1279     }
1280
1281   /* Generate alias opcode handling for the assembler or the disassembler.  */
1282   if (gen_assembler_p || gen_disassembler_p)
1283     {
1284       int num;
1285       opcode_node *alias_info = create_alias_info (&num);
1286
1287       if (gen_assembler_p)
1288         print_find_real_opcode (alias_info, num);
1289
1290       if (gen_disassembler_p)
1291         {
1292           print_find_alias_opcode (alias_info, num);
1293           print_find_next_alias_opcode (alias_info, num);
1294         }
1295
1296       release_resource_alias_info (alias_info, num);
1297     }
1298
1299   /* Generate operand table.  */
1300   process_operand_table ();
1301
1302   if (gen_assembler_p)
1303     print_operand_inserter ();
1304
1305   if (gen_disassembler_p)
1306     print_operand_extractor ();
1307
1308   if (gen_opcode_p)
1309     print_operand_table ();
1310
1311   /* Generate utility to return aarch64_opcode entry given an enumerator.  */
1312   if (gen_opcode_p)
1313     print_get_opcode ();
1314
1315   exit (0);
1316 }