diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-01-16 12:19:21 +0100 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-01-16 12:28:58 +0100 |
commit | 1e2e8c529c1cf4fcc8cbae382aa0a653d0b65da6 (patch) | |
tree | 2cc295f864977f3b461a8f8fa80af608dcb8a769 /opcodes/s390-mkopc.c | |
parent | 9f2850baa3ce341f0ba42bd9519cb3c1bf1287c7 (diff) | |
download | fsf-binutils-gdb-1e2e8c529c1cf4fcc8cbae382aa0a653d0b65da6.zip fsf-binutils-gdb-1e2e8c529c1cf4fcc8cbae382aa0a653d0b65da6.tar.gz fsf-binutils-gdb-1e2e8c529c1cf4fcc8cbae382aa0a653d0b65da6.tar.bz2 |
S/390: Add support for IBM z13.
- 32 128 bit vector registers (overlapping with the existing 16 64 bit
floating point registers)
- vector double instructions
- vector integer instructions
- scalar vector instructions (allowing to have more floating point
registers for scalar operations)
- vector string instructions
gas/ChangeLog:
* config/tc-s390.c (struct pd_reg): Remove.
(pre_defined_registers): Remove.
(REG_NAME_CNT): Remove.
(reg_name_search): Calculate the register number instead of doing
a lookup.
(register_name, tc_s390_regname_to_dw2regnum): Adopt to the new
reg_name_search signature.
(s390_parse_cpu): Support the new arch string z13.
(s390_insert_operand): Support for vector registers with the extra
field for the fifth bit of each vector register operand.
(md_gather_operand): Adjust to the new handling of optional
parameters.
* doc/as.texinfo: Document the z13 cpu string.
gas/testsuite/ChangeLog:
* gas/s390/esa-g5.d: Add a variant without the optional operand.
* gas/s390/esa-g5.s: Likewise.
* gas/s390/esa-z9-109.d: Likewise.
* gas/s390/esa-z9-109.s: Likewise.
* gas/s390/zarch-z9-109.d: Likewise.
* gas/s390/zarch-z9-109.s: Likewise.
* gas/s390/zarch-z10.d: For variants with a zero optional argument
it is not dumped by objdump anymore.
* gas/s390/zarch-zEC12.d: Likewise.
* gas/s390/zarch-z13.d: New file.
* gas/s390/zarch-z13.s: New file.
* gas/s390/s390.exp: Run the test for the z13 files.
include/opcode/ChangeLog:
* s390.h (s390_opcode_cpu_val): Add S390_OPCODE_Z13.
ld/testsuite/ChangeLog:
* ld-s390/tlsbin.dd: The nopr register operand is optional and not
printed if 0 anymore.
opcodes/ChangeLog:
* s390-dis.c (s390_extract_operand): Support vector register
operands.
(s390_print_insn_with_opcode): Support new operands types and add
new handling of optional operands.
* s390-mkopc.c (s390_opcode_mode_val, s390_opcode_cpu_val): Remove
and include opcode/s390.h instead.
(struct op_struct): New field `flags'.
(insertOpcode, insertExpandedMnemonic): New parameter `flags'.
(dumpTable): Dump flags.
(main): Parse flags from the s390-opc.txt file. Add z13 as cpu
string.
* s390-opc.c: Add new operands types, instruction formats, and
instruction masks.
(s390_opformats): Add new formats for .insn.
* s390-opc.txt: Add new instructions.
Diffstat (limited to 'opcodes/s390-mkopc.c')
-rw-r--r-- | opcodes/s390-mkopc.c | 151 |
1 files changed, 81 insertions, 70 deletions
diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c index 2151801..30f58c7 100644 --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c @@ -22,26 +22,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> - -/* Taken from opcodes/s390.h */ -enum s390_opcode_mode_val - { - S390_OPCODE_ESA = 0, - S390_OPCODE_ZARCH - }; - -enum s390_opcode_cpu_val - { - S390_OPCODE_G5 = 0, - S390_OPCODE_G6, - S390_OPCODE_Z900, - S390_OPCODE_Z990, - S390_OPCODE_Z9_109, - S390_OPCODE_Z9_EC, - S390_OPCODE_Z10, - S390_OPCODE_Z196, - S390_OPCODE_ZEC12 - }; +#include "opcode/s390.h" struct op_struct { @@ -50,6 +31,7 @@ struct op_struct char format[16]; int mode_bits; int min_cpu; + int flags; unsigned long long sort_value; int no_nibbles; @@ -71,7 +53,7 @@ createTable (void) static void insertOpcode (char *opcode, char *mnemonic, char *format, - int min_cpu, int mode_bits) + int min_cpu, int mode_bits, int flags) { char *str; unsigned long long sort_value; @@ -115,6 +97,7 @@ insertOpcode (char *opcode, char *mnemonic, char *format, op_array[ix].no_nibbles = no_nibbles; op_array[ix].min_cpu = min_cpu; op_array[ix].mode_bits = mode_bits; + op_array[ix].flags = flags; no_ops++; } @@ -176,7 +159,7 @@ const struct s390_cond_ext_format s390_crb_extensions[NUM_CRB_EXTENSIONS] = static void insertExpandedMnemonic (char *opcode, char *mnemonic, char *format, - int min_cpu, int mode_bits) + int min_cpu, int mode_bits, int flags) { char *tag; char prefix[15]; @@ -189,7 +172,7 @@ insertExpandedMnemonic (char *opcode, char *mnemonic, char *format, if (!(tag = strpbrk (mnemonic, "*$"))) { - insertOpcode (opcode, mnemonic, format, min_cpu, mode_bits); + insertOpcode (opcode, mnemonic, format, min_cpu, mode_bits, flags); return; } @@ -268,7 +251,7 @@ insertExpandedMnemonic (char *opcode, char *mnemonic, char *format, opcode[mask_start] = ext_table[i].nibble; strcat (new_mnemonic, ext_table[i].extension); strcat (new_mnemonic, suffix); - insertOpcode (opcode, new_mnemonic, format, min_cpu, mode_bits); + insertOpcode (opcode, new_mnemonic, format, min_cpu, mode_bits, flags); } return; @@ -286,7 +269,10 @@ static const char file_header[] = " 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" + " instruction which matches.\n" + " MODE_BITS - zarch or esa\n" + " MIN_CPU - number of the min cpu level required\n" + " FLAGS - instruction flags. */\n\n" "const struct s390_opcode s390_opcodes[] =\n {\n"; /* `dumpTable': write opcode table. */ @@ -311,7 +297,8 @@ dumpTable (void) printf ("MASK_%s, INSTR_%s, ", op_array[ix].format, op_array[ix].format); printf ("%i, ", op_array[ix].mode_bits); - printf ("%i}", op_array[ix].min_cpu); + printf ("%i, ", op_array[ix].min_cpu); + printf ("%i}", op_array[ix].flags); if (ix < no_ops-1) printf (",\n"); else @@ -339,67 +326,91 @@ main (void) char description[80]; char cpu_string[16]; char modes_string[16]; + char flags_string[80]; int min_cpu; int mode_bits; + int flag_bits; + int num_matched; char *str; if (currentLine[0] == '#' || currentLine[0] == '\n') continue; memset (opcode, 0, 8); - if (sscanf (currentLine, "%15s %15s %15s \"%79[^\"]\" %15s %15s", - opcode, mnemonic, format, description, - cpu_string, modes_string) == 6) + num_matched = + sscanf (currentLine, "%15s %15s %15s \"%79[^\"]\" %15s %15s %79[^\n]", + opcode, mnemonic, format, description, + cpu_string, modes_string, flags_string); + if (num_matched != 6 && num_matched != 7) { - if (strcmp (cpu_string, "g5") == 0) - min_cpu = S390_OPCODE_G5; - else if (strcmp (cpu_string, "g6") == 0) - min_cpu = S390_OPCODE_G6; - else if (strcmp (cpu_string, "z900") == 0) - min_cpu = S390_OPCODE_Z900; - else if (strcmp (cpu_string, "z990") == 0) - min_cpu = S390_OPCODE_Z990; - else if (strcmp (cpu_string, "z9-109") == 0) - 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); - } + fprintf (stderr, "Couldn't scan line %s\n", currentLine); + exit (1); + } - str = modes_string; - mode_bits = 0; + if (strcmp (cpu_string, "g5") == 0) + min_cpu = S390_OPCODE_G5; + else if (strcmp (cpu_string, "g6") == 0) + min_cpu = S390_OPCODE_G6; + else if (strcmp (cpu_string, "z900") == 0) + min_cpu = S390_OPCODE_Z900; + else if (strcmp (cpu_string, "z990") == 0) + min_cpu = S390_OPCODE_Z990; + else if (strcmp (cpu_string, "z9-109") == 0) + 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 if (strcmp (cpu_string, "z13") == 0) + min_cpu = S390_OPCODE_Z13; + else { + fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string); + exit (1); + } + + str = modes_string; + mode_bits = 0; + do { + if (strncmp (str, "esa", 3) == 0 + && (str[3] == 0 || str[3] == ',')) { + mode_bits |= 1 << S390_OPCODE_ESA; + str += 3; + } else if (strncmp (str, "zarch", 5) == 0 + && (str[5] == 0 || str[5] == ',')) { + mode_bits |= 1 << S390_OPCODE_ZARCH; + str += 5; + } else { + fprintf (stderr, "Couldn't parse modes string %s\n", + modes_string); + exit (1); + } + if (*str == ',') + str++; + } while (*str != 0); + + flag_bits = 0; + + if (num_matched == 7) + { + str = flags_string; do { - if (strncmp (str, "esa", 3) == 0 - && (str[3] == 0 || str[3] == ',')) { - mode_bits |= 1 << S390_OPCODE_ESA; - str += 3; - } else if (strncmp (str, "zarch", 5) == 0 - && (str[5] == 0 || str[5] == ',')) { - mode_bits |= 1 << S390_OPCODE_ZARCH; - str += 5; + if (strncmp (str, "optparm", 7) == 0 + && (str[7] == 0 || str[7] == ',')) { + flag_bits |= S390_INSTR_FLAG_OPTPARM; + str += 7; } else { - fprintf (stderr, "Couldn't parse modes string %s\n", - modes_string); + fprintf (stderr, "Couldn't parse flags string %s\n", + flags_string); exit (1); } if (*str == ',') str++; } while (*str != 0); - - insertExpandedMnemonic (opcode, mnemonic, format, min_cpu, mode_bits); - } - else - { - fprintf (stderr, "Couldn't scan line %s\n", currentLine); - exit (1); } + insertExpandedMnemonic (opcode, mnemonic, format, min_cpu, mode_bits, flag_bits); } dumpTable (); |