X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fs390-mkopc.c;h=6aed72b8182a64d7328df4dee86a0b7db52f7e52;hb=e3f1ad4fd2e99bd226f19f88c513f13f3434de44;hp=64615073d1bad167f9155c5eb248c33fd158c1fc;hpb=fcb7aa2f6b17eb5211fe4d361eab8d985c40065e;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c index 64615073d1..6aed72b818 100644 --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c @@ -1,5 +1,5 @@ /* s390-mkopc.c -- Generates opcode table out of s390-opc.txt - Copyright 2000, 2001, 2003, 2007 Free Software Foundation, Inc. + Copyright 2000, 2001, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU opcodes library. @@ -37,7 +37,10 @@ enum s390_opcode_cpu_val S390_OPCODE_Z900, S390_OPCODE_Z990, S390_OPCODE_Z9_109, - S390_OPCODE_Z9_EC + S390_OPCODE_Z9_EC, + S390_OPCODE_Z10, + S390_OPCODE_Z196, + S390_OPCODE_ZEC12 }; struct op_struct @@ -47,7 +50,7 @@ struct op_struct char format[16]; int mode_bits; int min_cpu; - + unsigned long long sort_value; int no_nibbles; }; @@ -121,82 +124,110 @@ struct s390_cond_ext_format char extension[4]; }; +/* The mnemonic extensions for conditional jumps used to replace + the '*' tag. */ #define NUM_COND_EXTENSIONS 20 - const struct s390_cond_ext_format s390_cond_extensions[NUM_COND_EXTENSIONS] = - { - { '1', "o" }, /* jump on overflow / if ones */ - { '2', "h" }, /* jump on A high */ - { '2', "p" }, /* jump on plus */ - { '3', "nle" }, /* jump on not low or equal */ - { '4', "l" }, /* jump on A low */ - { '4', "m" }, /* jump on minus / if mixed */ - { '5', "nhe" }, /* jump on not high or equal */ - { '6', "lh" }, /* jump on low or high */ - { '7', "ne" }, /* jump on A not equal B */ - { '7', "nz" }, /* jump on not zero / if not zeros */ - { '8', "e" }, /* jump on A equal B */ - { '8', "z" }, /* jump on zero / if zeros */ - { '9', "nlh" }, /* jump on not low or high */ - { 'a', "he" }, /* jump on high or equal */ - { 'b', "nl" }, /* jump on A not low */ - { 'b', "nm" }, /* jump on not minus / if not mixed */ - { 'c', "le" }, /* jump on low or equal */ - { 'd', "nh" }, /* jump on A not high */ - { 'd', "np" }, /* jump on not plus */ - { 'e', "no" }, /* jump on not overflow / if not ones */ - }; +{ { '1', "o" }, /* jump on overflow / if ones */ + { '2', "h" }, /* jump on A high */ + { '2', "p" }, /* jump on plus */ + { '3', "nle" }, /* jump on not low or equal */ + { '4', "l" }, /* jump on A low */ + { '4', "m" }, /* jump on minus / if mixed */ + { '5', "nhe" }, /* jump on not high or equal */ + { '6', "lh" }, /* jump on low or high */ + { '7', "ne" }, /* jump on A not equal B */ + { '7', "nz" }, /* jump on not zero / if not zeros */ + { '8', "e" }, /* jump on A equal B */ + { '8', "z" }, /* jump on zero / if zeros */ + { '9', "nlh" }, /* jump on not low or high */ + { 'a', "he" }, /* jump on high or equal */ + { 'b', "nl" }, /* jump on A not low */ + { 'b', "nm" }, /* jump on not minus / if not mixed */ + { 'c', "le" }, /* jump on low or equal */ + { 'd', "nh" }, /* jump on A not high */ + { 'd', "np" }, /* jump on not plus */ + { 'e', "no" }, /* jump on not overflow / if not ones */ +}; + +/* The mnemonic extensions for conditional branches used to replace + the '$' tag. */ +#define NUM_CRB_EXTENSIONS 12 +const struct s390_cond_ext_format s390_crb_extensions[NUM_CRB_EXTENSIONS] = +{ { '2', "h" }, /* jump on A high */ + { '2', "nle" }, /* jump on not low or equal */ + { '4', "l" }, /* jump on A low */ + { '4', "nhe" }, /* jump on not high or equal */ + { '6', "ne" }, /* jump on A not equal B */ + { '6', "lh" }, /* jump on low or high */ + { '8', "e" }, /* jump on A equal B */ + { '8', "nlh" }, /* jump on not low or high */ + { 'a', "nl" }, /* jump on A not low */ + { 'a', "he" }, /* jump on high or equal */ + { 'c', "nh" }, /* jump on A not high */ + { 'c', "le" }, /* jump on low or equal */ +}; /* As with insertOpcode instructions are added to the sorted opcode array. Additionally mnemonics containing the '*' tag are expanded to the set of conditional instructions described by - s390_cond_extensions with the '*' tag replaced by the - respective mnemonic extensions. */ + s390_cond_extensions with the tag replaced by the respective + mnemonic extensions. */ static void -expandConditionalJump (char *opcode, char *mnemonic, char *format, - int min_cpu, int mode_bits) +insertExpandedMnemonic (char *opcode, char *mnemonic, char *format, + int min_cpu, int mode_bits) { - char prefix[5]; - char suffix[5]; - char number[5]; - int mask_start, i = 0, star_found = 0, reading_number = 0; + char *tag; + char prefix[15]; + char suffix[15]; + char number[15]; + int mask_start, i = 0, tag_found = 0, reading_number = 0; int number_p = 0, suffix_p = 0, prefix_p = 0; + const struct s390_cond_ext_format *ext_table; + int ext_table_length; + + if (!(tag = strpbrk (mnemonic, "*$"))) + { + insertOpcode (opcode, mnemonic, format, min_cpu, mode_bits); + return; + } while (mnemonic[i] != '\0') { - switch (mnemonic[i]) + if (mnemonic[i] == *tag) { - case '*': - if (star_found) + if (tag_found) goto malformed_mnemonic; - star_found = 1; + tag_found = 1; reading_number = 1; - break; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - if (!star_found || !reading_number) - goto malformed_mnemonic; - - number[number_p++] = mnemonic[i]; - break; - - default: - if (reading_number) - { - if (!number_p) - goto malformed_mnemonic; - else - reading_number = 0; - } - - if (star_found) - suffix[suffix_p++] = mnemonic[i]; - else - prefix[prefix_p++] = mnemonic[i]; } + else + switch (mnemonic[i]) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (!tag_found || !reading_number) + goto malformed_mnemonic; + + number[number_p++] = mnemonic[i]; + break; + + default: + if (reading_number) + { + if (!number_p) + goto malformed_mnemonic; + else + reading_number = 0; + } + + if (tag_found) + suffix[suffix_p++] = mnemonic[i]; + else + prefix[prefix_p++] = mnemonic[i]; + } i++; } @@ -216,14 +247,27 @@ expandConditionalJump (char *opcode, char *mnemonic, char *format, mask_start >>= 2; - for (i = 0; i < NUM_COND_EXTENSIONS; i++) + switch (*tag) + { + case '*': + ext_table = s390_cond_extensions; + ext_table_length = NUM_COND_EXTENSIONS; + break; + case '$': + ext_table = s390_crb_extensions; + ext_table_length = NUM_CRB_EXTENSIONS; + break; + default: fprintf (stderr, "Unknown tag char: %c\n", *tag); + } + + for (i = 0; i < ext_table_length; i++) { char new_mnemonic[15]; strcpy (new_mnemonic, prefix); - strcat (new_mnemonic, s390_cond_extensions[i].extension); + opcode[mask_start] = ext_table[i].nibble; + strcat (new_mnemonic, ext_table[i].extension); strcat (new_mnemonic, suffix); - opcode[mask_start] = s390_cond_extensions[i].nibble; insertOpcode (opcode, new_mnemonic, format, min_cpu, mode_bits); } return; @@ -232,7 +276,7 @@ expandConditionalJump (char *opcode, char *mnemonic, char *format, fprintf (stderr, "Malformed mnemonic: %s\n", mnemonic); } -static char file_header[] = +static const 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" @@ -262,7 +306,7 @@ dumpTable (void) for (str = op_array[ix].opcode; *str != 0; str++) if (*str == '?') *str = '0'; - printf ("OP%i(0x%sLL), ", + 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); @@ -282,7 +326,7 @@ int main (void) { char currentLine[256]; - + createTable (); /* Read opcode descriptions from `stdin'. For each mnemonic, @@ -292,17 +336,17 @@ main (void) char opcode[16]; char mnemonic[16]; char format[16]; - char description[64]; + char description[80]; char cpu_string[16]; char modes_string[16]; int min_cpu; int mode_bits; char *str; - if (currentLine[0] == '#') + if (currentLine[0] == '#' || currentLine[0] == '\n') continue; memset (opcode, 0, 8); - if (sscanf (currentLine, "%15s %15s %15s \"%[^\"]\" %15s %15s", + if (sscanf (currentLine, "%15s %15s %15s \"%79[^\"]\" %15s %15s", opcode, mnemonic, format, description, cpu_string, modes_string) == 6) { @@ -318,6 +362,12 @@ main (void) min_cpu = S390_OPCODE_Z9_109; else if (strcmp (cpu_string, "z9-ec") == 0) min_cpu = S390_OPCODE_Z9_EC; + else if (strcmp (cpu_string, "z10") == 0) + min_cpu = S390_OPCODE_Z10; + else if (strcmp (cpu_string, "z196") == 0) + min_cpu = S390_OPCODE_Z196; + else if (strcmp (cpu_string, "zEC12") == 0) + min_cpu = S390_OPCODE_ZEC12; else { fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string); exit (1); @@ -343,14 +393,13 @@ main (void) str++; } while (*str != 0); - if (!strchr (mnemonic, '*')) - insertOpcode (opcode, mnemonic, format, min_cpu, mode_bits); - else - expandConditionalJump (opcode, mnemonic, format, - min_cpu, mode_bits); + insertExpandedMnemonic (opcode, mnemonic, format, min_cpu, mode_bits); } else - fprintf (stderr, "Couldn't scan line %s\n", currentLine); + { + fprintf (stderr, "Couldn't scan line %s\n", currentLine); + exit (1); + } } dumpTable ();