diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2008-03-19 10:29:18 +0000 |
---|---|---|
committer | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2008-03-19 10:29:18 +0000 |
commit | 5746fb46c853e631ce67f9969064721cca51f4c6 (patch) | |
tree | 23310eb56152c063ba6b4193eb8ebdb153b60ca7 /opcodes/s390-mkopc.c | |
parent | 411123fd86198097d99d42d756439510446d2010 (diff) | |
download | gdb-5746fb46c853e631ce67f9969064721cca51f4c6.zip gdb-5746fb46c853e631ce67f9969064721cca51f4c6.tar.gz gdb-5746fb46c853e631ce67f9969064721cca51f4c6.tar.bz2 |
2008-03-19 Andreas Krebbel <krebbel1@de.ibm.com>
* opcodes/s390-mkopc.c (s390_opcode_cpu_val): S390_OPCODE_Z10 added.
(s390_cond_extensions): Reduced extensions to the compare related.
(main): z10 cpu type option added.
(expandConditionalJump): Renamed to ...
(insertExpandedMnemonic): ... this.
* opcodes/s390-opc.c: Re-group the operand format makros.
(INSTR_RIE_RRPU, INSTR_RIE_RRP0, INSTR_RIE_RUPI,
INSTR_RIE_R0PI, INSTR_RIE_RUPU, INSTR_RIE_R0PU, INSTR_RIE_R0IU,
INSTR_RIE_R0I0, INSTR_RIE_R0UU, INSTR_RIE_R0U0,
INSTR_RIE_RRUUU, INSTR_RIS_RURDI, INSTR_RIS_R0RDI, INSTR_RIS_RURDU,
INSTR_RIS_R0RDU, INSTR_RRF_U0RR, INSTR_RRF_00RR, INSTR_RRS_RRRDU,
INSTR_RRS_RRRD0, INSTR_RXY_URRD, INSTR_SIY_IRD, INSTR_SIL_RDI,
INSTR_SIL_RDU): New instruction formats added.
(MASK_RIE_RRPU, MASK_RIE_RRP0, MASK_RIE_RUPI, MASK_RIE_R0PI,
MASK_RIE_RUPU, MASK_RIE_R0PU, MASK_RIE_R0IU, MASK_RIE_R0I0,
MASK_RIE_R0UU, MASK_RIE_R0U0, MASK_RIE_RRUUU, MASK_RIS_RURDI,
MASK_RIS_R0RDI, MASK_RIS_RURDU, MASK_RIS_R0RDU, MASK_RRF_U0RR,
MASK_RRF_00RR, MASK_RRS_RRRDU, MASK_RRS_RRRD0, MASK_RXY_URRD,
MASK_SIY_IRD, MASK_SIL_RDI, MASK_SIL_RDU): New instruction format
masks added.
(s390_opformats): New formats added "ris", "rrs", "sil".
* opcodes/s390-opc.txt: Add the conditional jumps with the
extensions removed from automatic expansion in s390-mkopc.c manually.
(asi - trtre): Add new System z10 EC instructions.
* include/opcode/s390.h (s390_opcode_cpu_val): S390_OPCODE_Z10 added.
2008-03-19 Andreas Krebbel <krebbel1@de.ibm.com>
* config/tc-s390.c (md_parse_option): z10 option added.
2008-03-19 Andreas Krebbel <krebbel1@de.ibm.com>
* gas/s390/zarch-z10.d: New file.
* gas/s390/zarch-z10.s: New file.
* gas/s390/s390.exp: Run the z10 testcases.
Diffstat (limited to 'opcodes/s390-mkopc.c')
-rw-r--r-- | opcodes/s390-mkopc.c | 125 |
1 files changed, 62 insertions, 63 deletions
diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c index 6461507..24951db 100644 --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c @@ -37,7 +37,8 @@ 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 }; struct op_struct @@ -121,82 +122,82 @@ struct s390_cond_ext_format char extension[4]; }; -#define NUM_COND_EXTENSIONS 20 - +/* The mnemonic extensions for conditional branches used to replace + the '*' tag. */ +#define NUM_COND_EXTENSIONS 12 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 */ - }; +{ { '2', "h" }, /* jump on A high */ + { '3', "nle" }, /* jump on not low or equal */ + { '4', "l" }, /* jump on A low */ + { '5', "nhe" }, /* jump on not high or equal */ + { '6', "lh" }, /* jump on low or high */ + { '7', "ne" }, /* jump on A not equal B */ + { '8', "e" }, /* jump on A equal B */ + { '9', "nlh" }, /* jump on not low or high */ + { 'a', "he" }, /* jump on high or equal */ + { 'b', "nl" }, /* jump on A not low */ + { 'c', "le" }, /* jump on low or equal */ + { 'd', "nh" }, /* jump on A not high */ +}; /* As with insertOpcode instructions are added to the sorted opcode array. Additionally mnemonics containing the '*<number>' tag are expanded to the set of conditional instructions described by - s390_cond_extensions with the '*<number>' 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 *tag; char prefix[5]; char suffix[5]; char number[5]; - int mask_start, i = 0, star_found = 0, reading_number = 0; + int mask_start, i = 0, tag_found = 0, reading_number = 0; int number_p = 0, suffix_p = 0, prefix_p = 0; + if (!(tag = strchr (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++; } @@ -221,9 +222,9 @@ expandConditionalJump (char *opcode, char *mnemonic, char *format, char new_mnemonic[15]; strcpy (new_mnemonic, prefix); + opcode[mask_start] = s390_cond_extensions[i].nibble; strcat (new_mnemonic, s390_cond_extensions[i].extension); strcat (new_mnemonic, suffix); - opcode[mask_start] = s390_cond_extensions[i].nibble; insertOpcode (opcode, new_mnemonic, format, min_cpu, mode_bits); } return; @@ -318,6 +319,8 @@ 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 { fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string); exit (1); @@ -343,11 +346,7 @@ 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); |