xref: /netbsd-src/external/gpl3/gdb/dist/sim/cr16/gencode.c (revision d909946ca08dceb44d7d0f22ec9488679695d976)
1 /* Simulation code for the CR16 processor.
2    Copyright (C) 2008-2015 Free Software Foundation, Inc.
3    Contributed by M Ranga Swami Reddy <MR.Swami.Reddy@nsc.com>
4 
5    This file is part of GDB, the GNU debugger.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program. If not, see <http://www.gnu.org/licenses/>.  */
19 
20 
21 #include "config.h"
22 #include <stdio.h>
23 #include <ctype.h>
24 #include <limits.h>
25 #include <string.h>
26 #include "ansidecl.h"
27 #include "opcode/cr16.h"
28 
29 static void write_header (void);
30 static void write_opcodes (void);
31 static void write_template (void);
32 
33 int
34 main (int argc, char *argv[])
35 {
36   if ((argc > 1) && (strcmp (argv[1],"-h") == 0))
37     write_header();
38   else if ((argc > 1) && (strcmp (argv[1],"-t") == 0))
39     write_template ();
40   else
41     write_opcodes();
42   return 0;
43 }
44 
45 
46 static void
47 write_header (void)
48 {
49   int i = 0;
50 
51   /* Start searching from end of instruction table.  */
52   const inst *instruction = &cr16_instruction[NUMOPCODES - 1];
53 
54   /* Loop over instruction table until a full match is found.  */
55   for ( ; i < NUMOPCODES; i++)
56     printf("void OP_%lX_%X (void);\t\t/* %s */\n", cr16_instruction[i].match,
57 	   (32 - cr16_instruction[i].match_bits), cr16_instruction[i].mnemonic);
58 }
59 
60 
61 /* write_template creates a file all required functions,
62    ready to be filled out.  */
63 
64 static void
65 write_template (void)
66 {
67   int i = 0,j, k, flags;
68 
69   printf ("#include \"cr16_sim.h\"\n");
70   printf ("#include \"simops.h\"\n\n");
71 
72   for ( ; i < NUMOPCODES; i++)
73     {
74       if (cr16_instruction[i].size != 0)
75 {
76   printf("/* %s */\nvoid\nOP_%lX_%X ()\n{\n", cr16_instruction[i].mnemonic,
77 	 cr16_instruction[i].match, (32 - cr16_instruction[i].match_bits));
78 
79   /* count operands.  */
80   j = 0;
81   for (k=0;k<5;k++)
82     {
83       if (cr16_instruction[i].operands[k].op_type == dummy)
84                 break;
85               else
86                 j++;
87     }
88   switch (j)
89     {
90     case 0:
91       printf ("printf(\"   %s\\n\");\n",cr16_instruction[i].mnemonic);
92       break;
93     case 1:
94       printf ("printf(\"   %s\\t%%x\\n\",OP[0]);\n",cr16_instruction[i].mnemonic);
95       break;
96     case 2:
97       printf ("printf(\"   %s\\t%%x,%%x\\n\",OP[0],OP[1]);\n",cr16_instruction[i].mnemonic);
98       break;
99     case 3:
100       printf ("printf(\"   %s\\t%%x,%%x,%%x\\n\",OP[0],OP[1],OP[2]);\n",cr16_instruction[i].mnemonic);
101       break;
102     default:
103       fprintf (stderr,"Too many operands: %d\n",j);
104     }
105   printf ("}\n\n");
106 }
107     }
108 }
109 
110 
111 long Opcodes[512];
112 static int curop=0;
113 
114 #if 0
115 static void
116 check_opcodes( long op)
117 {
118   int i;
119 
120   for (i=0;i<curop;i++)
121     if (Opcodes[i] == op)
122       fprintf(stderr,"DUPLICATE OPCODES: %lx\n", op);
123 }
124 #endif
125 
126 static void
127 write_opcodes (void)
128 {
129   int i = 0, j = 0, k;
130 
131   /* write out opcode table.  */
132   printf ("#include \"cr16_sim.h\"\n");
133   printf ("#include \"simops.h\"\n\n");
134   printf ("struct simops Simops[] = {\n");
135 
136   for (i = NUMOPCODES-1; i >= 0; --i)
137     {
138       if (cr16_instruction[i].size != 0)
139 {
140            printf ("  { \"%s\", %u, %d, %ld, %u, \"OP_%lX_%X\", OP_%lX_%X, ",
141                     cr16_instruction[i].mnemonic, cr16_instruction[i].size,
142                     cr16_instruction[i].match_bits, cr16_instruction[i].match,
143                      cr16_instruction[i].flags, ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)),
144              (32 - cr16_instruction[i].match_bits),
145                      ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)), (32 - cr16_instruction[i].match_bits));
146 
147   j = 0;
148   for (k=0;k<5;k++)
149     {
150       if (cr16_instruction[i].operands[k].op_type == dummy)
151                 break;
152               else
153                 j++;
154     }
155   printf ("%d, ",j);
156 
157   j = 0;
158   for (k=0;k<4;k++)
159     {
160       int optype = cr16_instruction[i].operands[k].op_type;
161       int shift = cr16_instruction[i].operands[k].shift;
162       if (j == 0)
163         printf ("{");
164       else
165         printf (", ");
166       printf ("{");
167       printf ("%d,%d",optype, shift);
168       printf ("}");
169       j = 1;
170    }
171  if (j)
172   printf ("}");
173  printf ("},\n");
174         }
175     }
176   printf (" { \"NULL\",1,8,0,0,\"OP_0_20\",OP_0_20,0,{{0,0},{0,0},{0,0},{0,0}}},\n};\n");
177 }
178