diff options
author | Jan Beulich <jbeulich@suse.com> | 2019-10-30 09:05:46 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2019-10-30 09:05:46 +0100 |
commit | 507916b8551f6227da9fe8071267c164a3014b79 (patch) | |
tree | 3c019d5339902332e6faca696ab8f9e60aad73e1 /gas | |
parent | 74fb338f4689b1072a5933102fe1f08caab5bac6 (diff) | |
download | fsf-binutils-gdb-507916b8551f6227da9fe8071267c164a3014b79.zip fsf-binutils-gdb-507916b8551f6227da9fe8071267c164a3014b79.tar.gz fsf-binutils-gdb-507916b8551f6227da9fe8071267c164a3014b79.tar.bz2 |
x86: drop stray W
The flag is used to indicate opcodes which can be switched between byte
and word/dword/qword forms (in a "canonical" way). Obviously it's quite
odd then to see it on insns not allowing for byte operands in the first
place. As a result the opcode bytes need to be adjusted accordingly,
which includes comparisons done in optimize_encoding().
To make re-introduction of such issues less likely have i386-gen
diagnose it (in a generally non-fatal way for now).
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 11 |
2 files changed, 11 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 17f45e3..4a2a309 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2019-10-30 Jan Beulich <jbeulich@suse.com> + + * config/tc-i386.c (optimize_encoding): Adjust opcodes compared + against. Adjust replacement opcode and clear .w. + 2019-10-29 Alan Modra <amodra@gmail.com> PR 25125 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index b9c3124..f26b17c 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -3974,7 +3974,7 @@ optimize_encoding (void) && i.reg_operands == 1 && i.imm_operands == 1 && i.op[0].imms->X_op == O_constant - && ((i.tm.base_opcode == 0xb0 + && ((i.tm.base_opcode == 0xb8 && i.tm.extension_opcode == None && fits_in_unsigned_long (i.op[0].imms->X_add_number)) || (fits_in_imm31 (i.op[0].imms->X_add_number) @@ -3984,7 +3984,7 @@ optimize_encoding (void) || (i.tm.base_opcode == 0x80 && i.tm.extension_opcode == 0x4) || ((i.tm.base_opcode == 0xf6 - || i.tm.base_opcode == 0xc6) + || (i.tm.base_opcode | 1) == 0xc7) && i.tm.extension_opcode == 0x0))) || (fits_in_imm7 (i.op[0].imms->X_add_number) && i.tm.base_opcode == 0x83 @@ -4010,7 +4010,7 @@ optimize_encoding (void) movq $imm32, %r64 -> movl $imm32, %r32 */ i.tm.opcode_modifier.norex64 = 1; - if (i.tm.base_opcode == 0xb0 || i.tm.base_opcode == 0xc6) + if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7) { /* Handle movq $imm31, %r64 -> movl $imm31, %r32 @@ -4024,13 +4024,14 @@ optimize_encoding (void) i.types[0].bitfield.imm64 = 0; i.types[1].bitfield.dword = 1; i.types[1].bitfield.qword = 0; - if (i.tm.base_opcode == 0xc6) + if ((i.tm.base_opcode | 1) == 0xc7) { /* Handle movq $imm31, %r64 -> movl $imm31, %r32 */ - i.tm.base_opcode = 0xb0; + i.tm.base_opcode = 0xb8; i.tm.extension_opcode = None; + i.tm.opcode_modifier.w = 0; i.tm.opcode_modifier.shortform = 1; i.tm.opcode_modifier.modrm = 0; } |