gencode.c revision 1.8
1/* Simulation code for the CR16 processor. 2 Copyright (C) 2008-2019 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 (SIM_DESC, SIM_CPU *);\t\t/* %s */\n", 57 cr16_instruction[i].match, (32 - cr16_instruction[i].match_bits), 58 cr16_instruction[i].mnemonic); 59} 60 61 62/* write_template creates a file all required functions, 63 ready to be filled out. */ 64 65static void 66write_template (void) 67{ 68 int i = 0,j, k, flags; 69 70 printf ("#include \"sim-main.h\"\n"); 71 printf ("#include \"simops.h\"\n\n"); 72 73 for ( ; i < NUMOPCODES; i++) 74 { 75 if (cr16_instruction[i].size != 0) 76{ 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)); 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) 86 break; 87 else 88 j++; 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} 109 } 110} 111 112 113long Opcodes[512]; 114static int curop=0; 115 116#if 0 117static void 118check_opcodes( long op) 119{ 120 int i; 121 122 for (i=0;i<curop;i++) 123 if (Opcodes[i] == op) 124 fprintf(stderr,"DUPLICATE OPCODES: %lx\n", op); 125} 126#endif 127 128static void 129write_opcodes (void) 130{ 131 int i = 0, j = 0, k; 132 133 /* write out opcode table. */ 134 printf ("#include \"sim-main.h\"\n"); 135 printf ("#include \"simops.h\"\n\n"); 136 printf ("struct simops Simops[] = {\n"); 137 138 for (i = NUMOPCODES-1; i >= 0; --i) 139 { 140 if (cr16_instruction[i].size != 0) 141{ 142 printf (" { \"%s\", %u, %d, %ld, %u, \"OP_%lX_%X\", OP_%lX_%X, ", 143 cr16_instruction[i].mnemonic, cr16_instruction[i].size, 144 cr16_instruction[i].match_bits, cr16_instruction[i].match, 145 cr16_instruction[i].flags, ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)), 146 (32 - cr16_instruction[i].match_bits), 147 ((BIN(cr16_instruction[i].match, cr16_instruction[i].match_bits))>>(cr16_instruction[i].match_bits)), (32 - cr16_instruction[i].match_bits)); 148 149 j = 0; 150 for (k=0;k<5;k++) 151 { 152 if (cr16_instruction[i].operands[k].op_type == dummy) 153 break; 154 else 155 j++; 156 } 157 printf ("%d, ",j); 158 159 j = 0; 160 for (k=0;k<4;k++) 161 { 162 int optype = cr16_instruction[i].operands[k].op_type; 163 int shift = cr16_instruction[i].operands[k].shift; 164 if (j == 0) 165 printf ("{"); 166 else 167 printf (", "); 168 printf ("{"); 169 printf ("%d,%d",optype, shift); 170 printf ("}"); 171 j = 1; 172 } 173 if (j) 174 printf ("}"); 175 printf ("},\n"); 176 } 177 } 178 printf (" { \"NULL\",1,8,0,0,\"OP_0_20\",OP_0_20,0,{{0,0},{0,0},{0,0},{0,0}}},\n};\n"); 179} 180