diff options
author | Jeff Law <law@redhat.com> | 1996-08-29 01:06:42 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1996-08-29 01:06:42 +0000 |
commit | 22c1c7ddea0f359fe2c58e7593b51b9395572ade (patch) | |
tree | 0f233af0cdb27dd7bdfd4c4788ba2fd880503ae9 /sim/v850/gencode.c | |
parent | 085114ca36c21cde27a0780be9d2d6e25d7dbeac (diff) | |
download | gdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.zip gdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.tar.gz gdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.tar.bz2 |
* ChangeLog, Makefile.in, configure, configure.in, v850_sim.h,
gencode.c, interp.c, simops.c: Created.
So we've got something to hack on.
Diffstat (limited to 'sim/v850/gencode.c')
-rw-r--r-- | sim/v850/gencode.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/sim/v850/gencode.c b/sim/v850/gencode.c new file mode 100644 index 0000000..37f41b8 --- /dev/null +++ b/sim/v850/gencode.c @@ -0,0 +1,144 @@ +#include "v850_sim.h" + +static void write_header PARAMS ((void)); +static void write_opcodes PARAMS ((void)); +static void write_template PARAMS ((void)); + +int +main (argc, argv) + int argc; + char *argv[]; +{ + if ((argc > 1) && (strcmp (argv[1],"-h") == 0)) + write_header(); + else if ((argc > 1) && (strcmp (argv[1],"-t") == 0)) + write_template (); + else + write_opcodes(); + return 0; +} + + +static void +write_header () +{ + struct v850_opcode *opcode; + + for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++) + printf("void OP_%X PARAMS ((void));\t\t/* %s */\n",opcode->opcode, opcode->name); +} + + +/* write_template creates a file all required functions, ready */ +/* to be filled out */ + +static void +write_template () +{ + struct v850_opcode *opcode; + int i,j; + + printf ("#include \"v850_sim.h\"\n"); + printf ("#include \"simops.h\"\n"); + + for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++) + { + printf("/* %s */\nvoid\nOP_%X ()\n{\n",opcode->name,opcode->opcode); + + /* count operands */ + j = 0; + for (i = 0; i < 6; i++) + { + int flags = v850_operands[opcode->operands[i]].flags; + + if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC)) + j++; + } + switch (j) + { + case 0: + printf ("printf(\" %s\\n\");\n",opcode->name); + break; + case 1: + printf ("printf(\" %s\\t%%x\\n\",OP[0]);\n",opcode->name); + break; + case 2: + printf ("printf(\" %s\\t%%x,%%x\\n\",OP[0],OP[1]);\n",opcode->name); + break; + case 3: + printf ("printf(\" %s\\t%%x,%%x,%%x\\n\",OP[0],OP[1],OP[2]);\n",opcode->name); + break; + default: + fprintf (stderr,"Too many operands: %d\n",j); + } + printf ("}\n\n"); + } +} + + +long Opcodes[512]; +static int curop=0; + +check_opcodes( long op) +{ + int i; + + for (i=0;i<curop;i++) + if (Opcodes[i] == op) + fprintf(stderr,"DUPLICATE OPCODES: %x\n",op); +} + + +static void +write_opcodes () +{ + struct v850_opcode *opcode; + int i, j; + + /* write out opcode table */ + printf ("#include \"v850_sim.h\"\n"); + printf ("#include \"simops.h\"\n\n"); + printf ("struct simops Simops[] = {\n"); + + for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++) + { + printf (" { %ld,%ld,OP_%X,", + opcode->opcode, opcode->mask, opcode->opcode); + + /* REMOVE ME */ + check_opcodes (opcode->opcode); + Opcodes[curop++] = opcode->opcode; + + /* count operands */ + j = 0; + for (i = 0; i < 6; i++) + { + int flags = v850_operands[opcode->operands[i]].flags; + + if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC)) + j++; + } + printf ("%d,{",j); + + j = 0; + for (i = 0; i < 6; i++) + { + int flags = v850_operands[opcode->operands[i]].flags; + int shift = v850_operands[opcode->operands[i]].shift; + + if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC)) + { + if (j) + printf (", "); +#if 0 + if ((flags & OPERAND_REG) && (opcode->format == LONG_L)) + shift += 15; +#endif + printf ("%d,%d,%d",shift,v850_operands[opcode->operands[i]].bits,flags); + j = 1; + } + } + printf ("}},\n"); + } + printf ("{ 0,0,NULL,0,{ }},\n};\n"); +} |