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