gencode.c revision 1.5
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
29static void write_header (void);
30static void write_opcodes (void);
31static void write_template (void);
32
33int
34main (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
46static void
47write_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
64static void
65write_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
111long Opcodes[512];
112static int curop=0;
113
114#if 0
115static void
116check_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
126static void
127write_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