diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
commit | c906108c21474dfb4ed285bcc0ac6fe02cd400cc (patch) | |
tree | a0015aa5cedc19ccbab307251353a41722a3ae13 /sim/v850/gencode.c | |
parent | cd946cff9ede3f30935803403f06f6ed30cad136 (diff) | |
download | gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.zip gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.gz gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.bz2 |
Initial creation of sourceware repositorygdb-4_18-branchpoint
Diffstat (limited to 'sim/v850/gencode.c')
-rw-r--r-- | sim/v850/gencode.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/sim/v850/gencode.c b/sim/v850/gencode.c new file mode 100644 index 0000000..05ce866 --- /dev/null +++ b/sim/v850/gencode.c @@ -0,0 +1,149 @@ +#include <stdio.h> +#include <ctype.h> +#include "ansidecl.h" +#include "opcode/v850.h" +#include <limits.h> + +static void write_header PARAMS ((void)); +static void write_opcodes PARAMS ((void)); +static void write_template PARAMS ((void)); + +long Opcodes[512]; +static int curop=0; + +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("int 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 \"sim-main.h\"\n"); + 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 (void)\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"); + } +} + +static void +write_opcodes () +{ + struct v850_opcode *opcode; + int i, j; + int numops; + + /* write out opcode table */ + printf ("#include \"sim-main.h\"\n"); + 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 (" { 0x%x,0x%x,OP_%X,", + opcode->opcode, opcode->mask, 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; + numops = 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 (", "); + printf ("%d,%d,%d", shift, + v850_operands[opcode->operands[i]].bits,flags); + j = 1; + numops++; + } + } + + switch (numops) + { + case 0: + printf ("0,0,0"); + case 1: + printf (",0,0,0"); + } + + printf ("}},\n"); + } + printf ("{ 0,0,NULL,0,{0,0,0,0,0,0}},\n};\n"); +} |