1/* Simulation code for the CR16 processor. 2 Copyright (C) 2008-2023 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/* 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 30static void write_header (void); 31static void write_opcodes (void); 32static void write_template (void); 33 34int 35main (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 47static void 48write_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 66static void 67write_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 115long Opcodes[512]; 116static int curop=0; 117 118#if 0 119static void 120check_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 130static void 131write_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} 183