diff options
author | Jan Beulich <jbeulich@novell.com> | 2018-03-08 08:52:27 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2018-03-08 08:52:27 +0100 |
commit | d2224064f1a70969a77a8a82b117489793d6653e (patch) | |
tree | 317e5b0e40edfa88a16b88818b93730432caa79c /gas | |
parent | 23e42951f2f2cca539c69a843ae31d9c6cdb194b (diff) | |
download | gdb-d2224064f1a70969a77a8a82b117489793d6653e.zip gdb-d2224064f1a70969a77a8a82b117489793d6653e.tar.gz gdb-d2224064f1a70969a77a8a82b117489793d6653e.tar.bz2 |
x86: drop {X,Y,Z}MMWORD_MNEM_SUFFIX
They aren't really useful (anymore?): The conflicting operand size check
isn't applicable to any insn validly using respective memory operand
sizes (and if they're used wrongly, another error would result), and the
logic in process_suffix() can be easily changed to work without them.
While re-structuring conditionals in process_suffix() also drop the
CMPXCHG8B special case in favor of a NoRex64 attribute in the opcode
table.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-i386-intel.c | 3 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 64 |
3 files changed, 32 insertions, 43 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index c36e14a..d668f42 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,13 @@ 2018-03-08 Jan Beulich <jbeulich@suse.com> + * config/tc-i386.c (XMMWORD_MNEM_SUFFIX, YMMWORD_MNEM_SUFFIX, + ZMMWORD_MNEM_SUFFIX): Delete. + (process_suffix): Drop their uses. Re-arrange final part of + logic into a switch() statement. Drop special casing of + cmpxchg8b. + +2018-03-08 Jan Beulich <jbeulich@suse.com> + * config/tc-i386.c (match_template): Also match register operands 0 and 2 for 3-operand forms. * testsuite/gas/i386/unspec64.l, testsuite/gas/i386/unspec64.s: diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index 6030b9f..26fc3ef 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -698,17 +698,14 @@ i386_intel_operand (char *operand_string, int got_a_float) case O_oword_ptr: case O_xmmword_ptr: i.types[this_operand].bitfield.xmmword = 1; - suffix = XMMWORD_MNEM_SUFFIX; break; case O_ymmword_ptr: i.types[this_operand].bitfield.ymmword = 1; - suffix = YMMWORD_MNEM_SUFFIX; break; case O_zmmword_ptr: i.types[this_operand].bitfield.zmmword = 1; - suffix = ZMMWORD_MNEM_SUFFIX; break; case O_far_ptr: diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 1da1fbd..8c37bff 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -81,9 +81,6 @@ #define SHORT_MNEM_SUFFIX 's' #define LONG_MNEM_SUFFIX 'l' #define QWORD_MNEM_SUFFIX 'q' -#define XMMWORD_MNEM_SUFFIX 'x' -#define YMMWORD_MNEM_SUFFIX 'y' -#define ZMMWORD_MNEM_SUFFIX 'z' /* Intel Syntax. Use a non-ascii letter since since it never appears in instructions. */ #define LONG_DOUBLE_MNEM_SUFFIX '\1' @@ -5790,13 +5787,6 @@ process_suffix (void) else if (!check_word_reg ()) return 0; } - else if (i.suffix == XMMWORD_MNEM_SUFFIX - || i.suffix == YMMWORD_MNEM_SUFFIX - || i.suffix == ZMMWORD_MNEM_SUFFIX) - { - /* Skip if the instruction has x/y/z suffix. match_template - should check if it is a valid suffix. */ - } else if (intel_syntax && i.tm.opcode_modifier.ignoresize) /* Do nothing if the instruction is going to ignore the prefix. */ ; @@ -5877,15 +5867,19 @@ process_suffix (void) } } - /* Change the opcode based on the operand size given by i.suffix; - We don't need to change things for byte insns. */ - - if (i.suffix - && i.suffix != BYTE_MNEM_SUFFIX - && i.suffix != XMMWORD_MNEM_SUFFIX - && i.suffix != YMMWORD_MNEM_SUFFIX - && i.suffix != ZMMWORD_MNEM_SUFFIX) + /* Change the opcode based on the operand size given by i.suffix. */ + switch (i.suffix) { + /* Size floating point instruction. */ + case LONG_MNEM_SUFFIX: + if (i.tm.opcode_modifier.floatmf) + { + i.tm.base_opcode ^= 4; + break; + } + /* fall through */ + case WORD_MNEM_SUFFIX: + case QWORD_MNEM_SUFFIX: /* It's not a byte, select word/dword operation. */ if (i.tm.opcode_modifier.w) { @@ -5894,7 +5888,8 @@ process_suffix (void) else i.tm.base_opcode |= 1; } - + /* fall through */ + case SHORT_MNEM_SUFFIX: /* Now select between word & dword operations via the operand size prefix, except for instructions that will ignore this prefix anyway. */ @@ -5910,7 +5905,6 @@ process_suffix (void) return 0; } else if (i.suffix != QWORD_MNEM_SUFFIX - && i.suffix != LONG_DOUBLE_MNEM_SUFFIX && !i.tm.opcode_modifier.ignoresize && !i.tm.opcode_modifier.floatmf && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT) @@ -5929,27 +5923,17 @@ process_suffix (void) /* Set mode64 for an operand. */ if (i.suffix == QWORD_MNEM_SUFFIX && flag_code == CODE_64BIT - && !i.tm.opcode_modifier.norex64) - { + && !i.tm.opcode_modifier.norex64 /* Special case for xchg %rax,%rax. It is NOP and doesn't - need rex64. cmpxchg8b is also a special case. */ - if (! (i.operands == 2 - && i.tm.base_opcode == 0x90 - && i.tm.extension_opcode == None - && operand_type_equal (&i.types [0], &acc64) - && operand_type_equal (&i.types [1], &acc64)) - && ! (i.operands == 1 - && i.tm.base_opcode == 0xfc7 - && i.tm.extension_opcode == 1 - && !operand_type_check (i.types [0], reg) - && operand_type_check (i.types [0], anymem))) - i.rex |= REX_W; - } - - /* Size floating point instruction. */ - if (i.suffix == LONG_MNEM_SUFFIX) - if (i.tm.opcode_modifier.floatmf) - i.tm.base_opcode ^= 4; + need rex64. */ + && ! (i.operands == 2 + && i.tm.base_opcode == 0x90 + && i.tm.extension_opcode == None + && operand_type_equal (&i.types [0], &acc64) + && operand_type_equal (&i.types [1], &acc64))) + i.rex |= REX_W; + + break; } return 1; |