sim: drop -DTRACE from configure
[binutils-gdb.git] / sim / cr16 / gencode.c
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 }