]> Git Repo - binutils.git/blob - sim/cr16/gencode.c
Automatic date update in version.in
[binutils.git] / sim / cr16 / gencode.c
1 /* Simulation code for the CR16 processor.
2    Copyright (C) 2008-2022 Free Software Foundation, Inc.
3    Contributed by M Ranga Swami Reddy <[email protected]>
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 /* This must come before any other includes.  */
21 #include "defs.h"
22
23 #include <stdio.h>
24 #include <ctype.h>
25 #include <limits.h>
26 #include <string.h>
27 #include "ansidecl.h"
28 #include "opcode/cr16.h"
29
30 static void write_header (void);
31 static void write_opcodes (void);
32 static void write_template (void);
33
34 int
35 main (int argc, char *argv[])
36 {
37   if ((argc > 1) && (strcmp (argv[1],"-h") == 0))
38     write_header();
39   else if ((argc > 1) && (strcmp (argv[1],"-t") == 0))
40     write_template ();
41   else
42     write_opcodes();
43   return 0;
44 }
45
46
47 static void
48 write_header (void)
49 {
50   int i = 0; 
51
52   /* Start searching from end of instruction table.  */
53   const inst *instruction = &cr16_instruction[NUMOPCODES - 1];
54
55   /* Loop over instruction table until a full match is found.  */
56   for ( ; i < NUMOPCODES; i++)
57     printf("void OP_%lX_%X (SIM_DESC, SIM_CPU *);\t\t/* %s */\n",
58            cr16_instruction[i].match, (32 - cr16_instruction[i].match_bits),
59            cr16_instruction[i].mnemonic);
60 }
61
62
63 /* write_template creates a file all required functions, 
64    ready to be filled out.  */
65
66 static void
67 write_template (void)
68 {
69   int i = 0,j, k, flags;
70
71   printf ("#include \"defs.h\"\n");
72   printf ("#include \"sim-main.h\"\n");
73   printf ("#include \"simops.h\"\n\n");
74
75   for ( ; i < NUMOPCODES; i++)
76     {
77       if (cr16_instruction[i].size != 0)
78 {
79   printf ("/* %s */\nvoid\nOP_%lX_%X (SIM_DESC sd, SIM_CPU *cpu)\n{\n",
80           cr16_instruction[i].mnemonic, cr16_instruction[i].match,
81           (32 - cr16_instruction[i].match_bits));
82   
83   /* count operands.  */
84   j = 0;
85   for (k=0;k<5;k++)
86     {
87       if (cr16_instruction[i].operands[k].op_type == dummy)
88                 break;
89               else
90                 j++;
91     }
92   switch (j)
93     {
94     case 0:
95       printf ("printf(\"   %s\\n\");\n",cr16_instruction[i].mnemonic);
96       break;
97     case 1:
98       printf ("printf(\"   %s\\t%%x\\n\",OP[0]);\n",cr16_instruction[i].mnemonic);
99       break;
100     case 2:
101       printf ("printf(\"   %s\\t%%x,%%x\\n\",OP[0],OP[1]);\n",cr16_instruction[i].mnemonic);
102       break;
103     case 3:
104       printf ("printf(\"   %s\\t%%x,%%x,%%x\\n\",OP[0],OP[1],OP[2]);\n",cr16_instruction[i].mnemonic);
105       break;
106     default:
107       fprintf (stderr,"Too many operands: %d\n",j);
108     }
109   printf ("}\n\n");
110 }
111     }
112 }
113
114
115 long Opcodes[512];
116 static int curop=0;
117
118 #if 0
119 static void
120 check_opcodes( long op)
121 {
122   int i;
123
124   for (i=0;i<curop;i++)
125     if (Opcodes[i] == op)
126       fprintf(stderr,"DUPLICATE OPCODES: %lx\n", op);
127 }
128 #endif
129
130 static void
131 write_opcodes (void)
132 {
133   int i = 0, j = 0, k;
134   
135   /* write out opcode table.  */
136   printf ("#include \"defs.h\"\n");
137   printf ("#include \"sim-main.h\"\n");
138   printf ("#include \"simops.h\"\n\n");
139   printf ("struct simops Simops[] = {\n");
140   
141   for (i = NUMOPCODES-1; i >= 0; --i)
142     {
143       if (cr16_instruction[i].size != 0)
144 {
145            printf ("  { \"%s\", %u, %d, %ld, %u, \"OP_%lX_%X\", OP_%lX_%X, ", 
146                     cr16_instruction[i].mnemonic, cr16_instruction[i].size, 
147                     cr16_instruction[i].match_bits, cr16_instruction[i].match,
148                      cr16_instruction[i].flags, ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)),
149              (32 - cr16_instruction[i].match_bits),
150                      ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)), (32 - cr16_instruction[i].match_bits));
151       
152   j = 0;
153   for (k=0;k<5;k++)
154     {
155       if (cr16_instruction[i].operands[k].op_type == dummy)
156                 break;
157               else
158                 j++;
159     }
160   printf ("%d, ",j);
161   
162   j = 0;
163   for (k=0;k<4;k++)
164     {
165       int optype = cr16_instruction[i].operands[k].op_type;
166       int shift = cr16_instruction[i].operands[k].shift;
167       if (j == 0)
168         printf ("{");
169       else
170         printf (", ");
171       printf ("{");
172       printf ("%d,%d",optype, shift);
173       printf ("}");
174       j = 1;
175    }
176  if (j)
177   printf ("}");
178  printf ("},\n");
179         }
180     }
181   printf (" { \"NULL\",1,8,0,0,\"OP_0_20\",OP_0_20,0,{{0,0},{0,0},{0,0},{0,0}}},\n};\n");
182 }
This page took 0.032448 seconds and 4 git commands to generate.