diff options
author | Nick Clifton <nickc@redhat.com> | 2001-09-18 15:41:33 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2001-09-18 15:41:33 +0000 |
commit | b6849f55b93759fa93a28c749cee6b799000067e (patch) | |
tree | 81746f85b1463c2b72ecb67aa1b9a234d5e77b84 /opcodes/s390-mkopc.c | |
parent | 55c808902f95f3394179ca67a0e54dea4d1c8cdb (diff) | |
download | gdb-b6849f55b93759fa93a28c749cee6b799000067e.zip gdb-b6849f55b93759fa93a28c749cee6b799000067e.tar.gz gdb-b6849f55b93759fa93a28c749cee6b799000067e.tar.bz2 |
s390 assembler improvements and testsuite
Diffstat (limited to 'opcodes/s390-mkopc.c')
-rw-r--r-- | opcodes/s390-mkopc.c | 192 |
1 files changed, 105 insertions, 87 deletions
diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c index 6b2edde..d79ff81 100644 --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c @@ -32,45 +32,48 @@ #define ARCHBITS_ESA 3 #define ARCHBITS_ESAME 2 -struct op_struct { - char opcode[16]; - char mnemonic[16]; - char format[16]; - int archbits; - unsigned long long sort_value; - int no_nibbles; -}; +struct op_struct + { + char opcode[16]; + char mnemonic[16]; + char format[16]; + int archbits; + unsigned long long sort_value; + int no_nibbles; + }; struct op_struct *op_array; int max_ops; int no_ops; static void -createTable(void) +createTable (void) { - max_ops = 256; - op_array = malloc(max_ops*sizeof(struct op_struct)); - no_ops = 0; + max_ops = 256; + op_array = malloc (max_ops * sizeof (struct op_struct)); + no_ops = 0; } -/* - * `insertOpcode': insert an op_struct into sorted opcode array - */ +/* `insertOpcode': insert an op_struct into sorted opcode array. */ + static void -insertOpcode(char *opcode, char *mnemonic, char *format, int archbits) +insertOpcode (char *opcode, char *mnemonic, char *format, int archbits) { - char *str; - unsigned long long sort_value; - int no_nibbles; - int ix, k; - - while (no_ops >= max_ops) { - max_ops = max_ops*2; - op_array = realloc(op_array, max_ops*sizeof(struct op_struct)); + char *str; + unsigned long long sort_value; + int no_nibbles; + int ix, k; + + while (no_ops >= max_ops) + { + max_ops = max_ops * 2; + op_array = realloc (op_array, max_ops * sizeof (struct op_struct)); } - sort_value = 0; - str = opcode; - for (ix = 0; ix < 16; ix++) { + + sort_value = 0; + str = opcode; + for (ix = 0; ix < 16; ix++) + { if (*str >= '0' && *str <= '9') sort_value = (sort_value << 4) + (*str - '0'); else if (*str >= 'a' && *str <= 'f') @@ -81,67 +84,80 @@ insertOpcode(char *opcode, char *mnemonic, char *format, int archbits) sort_value <<= 4; else break; - str++; + str ++; } - sort_value <<= 4*(16 - ix); - no_nibbles = ix; - for (ix = 0; ix < no_ops; ix++) - if (sort_value > op_array[ix].sort_value) - break; - for (k = no_ops; k > ix; k--) - op_array[k] = op_array[k-1]; - strcpy(op_array[ix].opcode, opcode); - strcpy(op_array[ix].mnemonic, mnemonic); - strcpy(op_array[ix].format, format); - op_array[ix].sort_value = sort_value; - op_array[ix].no_nibbles = no_nibbles; - op_array[ix].archbits = archbits; - no_ops++; + sort_value <<= 4*(16 - ix); + no_nibbles = ix; + for (ix = 0; ix < no_ops; ix++) + if (sort_value > op_array[ix].sort_value) + break; + for (k = no_ops; k > ix; k--) + op_array[k] = op_array[k-1]; + strcpy(op_array[ix].opcode, opcode); + strcpy(op_array[ix].mnemonic, mnemonic); + strcpy(op_array[ix].format, format); + op_array[ix].sort_value = sort_value; + op_array[ix].no_nibbles = no_nibbles; + op_array[ix].archbits = archbits; + no_ops++; } +static char file_header[] = + "/* The opcode table. This file was generated by s390-mkopc.\n\n" + " The format of the opcode table is:\n\n" + " NAME OPCODE MASK OPERANDS\n\n" + " Name is the name of the instruction.\n" + " OPCODE is the instruction opcode.\n" + " MASK is the opcode mask; this is used to tell the disassembler\n" + " which bits in the actual opcode must match OPCODE.\n" + " OPERANDS is the list of operands.\n\n" + " The disassembler reads the table in order and prints the first\n" + " instruction which matches. */\n\n" + "const struct s390_opcode s390_opcodes[] =\n {\n"; + +/* `dumpTable': write opcode table. */ -/* - * `dumpTable': write opcode table - */ static void -dumpTable(void) +dumpTable (void) { - char *str; - int ix; + char *str; + int ix; - /* Write hash table entries (slots). */ - printf("const struct s390_opcode s390_opcodes[] = {\n"); - for (ix = 0; ix < no_ops; ix++) { - printf(" { \"%s\", ", op_array[ix].mnemonic); + /* Write hash table entries (slots). */ + printf (file_header); + + for (ix = 0; ix < no_ops; ix++) + { + printf (" { \"%s\", ", op_array[ix].mnemonic); for (str = op_array[ix].opcode; *str != 0; str++) if (*str == '?') *str = '0'; - printf("OP%i(0x%sLL), ", - op_array[ix].no_nibbles*4, op_array[ix].opcode); - printf("MASK_%s, INSTR_%s, ", - op_array[ix].format, op_array[ix].format); - printf("%i}", op_array[ix].archbits); + printf ("OP%i(0x%sLL), ", + op_array[ix].no_nibbles*4, op_array[ix].opcode); + printf ("MASK_%s, INSTR_%s, ", + op_array[ix].format, op_array[ix].format); + printf ("%i}", op_array[ix].archbits); if (ix < no_ops-1) - printf(",\n"); + printf (",\n"); else - printf("\n"); + printf ("\n"); } - printf("};\n\n"); - printf("const int s390_num_opcodes =\n"); - printf(" sizeof (s390_opcodes) / sizeof (s390_opcodes[0]);\n\n"); + printf ("};\n\n"); + printf ("const int s390_num_opcodes =\n"); + printf (" sizeof (s390_opcodes) / sizeof (s390_opcodes[0]);\n\n"); } - int -main(void) +main (void) { - char currentLine[256]; - - createTable(); - /* Read opcode descriptions from `stdin'. For each mnemonic, - * make an entry into the opcode table. - */ - while (fgets(currentLine, sizeof(currentLine), stdin) != NULL) { + char currentLine[256]; + + createTable (); + + /* Read opcode descriptions from `stdin'. For each mnemonic, + make an entry into the opcode table. */ + while (fgets (currentLine, sizeof (currentLine), stdin) != NULL) + { char opcode[16]; char mnemonic[16]; char format[16]; @@ -151,22 +167,24 @@ main(void) if (currentLine[0] == '#') continue; - memset(opcode, 0, 8); - if (sscanf(currentLine, "%15s %15s %15s \"%[^\"]\" %15s", - opcode, mnemonic, format, description, archtag) == 5) { - if (strcmp(archtag, "esaonly") == 0) - archbits = ARCHBITS_ESAONLY; - else if (strcmp(archtag, "esa") == 0) - archbits = ARCHBITS_ESA; - else if (strcmp(archtag, "esame") == 0) - archbits = ARCHBITS_ESAME; - else - archbits = 0; - insertOpcode(opcode, mnemonic, format, archbits); - } else - fprintf(stderr, "Couldn't scan line %s\n", currentLine); + memset (opcode, 0, 8); + if (sscanf (currentLine, "%15s %15s %15s \"%[^\"]\" %15s", + opcode, mnemonic, format, description, archtag) == 5) + { + if (strcmp (archtag, "esaonly") == 0) + archbits = ARCHBITS_ESAONLY; + else if (strcmp (archtag, "esa") == 0) + archbits = ARCHBITS_ESA; + else if (strcmp (archtag, "esame") == 0) + archbits = ARCHBITS_ESAME; + else + archbits = 0; + insertOpcode (opcode, mnemonic, format, archbits); + } + else + fprintf (stderr, "Couldn't scan line %s\n", currentLine); } - dumpTable(); - return 0; + dumpTable (); + return 0; } |