diff options
author | Jan Beulich <jbeulich@suse.com> | 2023-09-27 10:53:59 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2023-09-27 10:53:59 +0200 |
commit | f79d55e124fb0b0c41ebc0ca679370170c964659 (patch) | |
tree | 1aeaa07ab9fccb71cc7e056f3328e856a55a93b9 /gas | |
parent | fb1c10585ead9acc8d9f9d24ab093cbe5e962257 (diff) | |
download | gdb-f79d55e124fb0b0c41ebc0ca679370170c964659.zip gdb-f79d55e124fb0b0c41ebc0ca679370170c964659.tar.gz gdb-f79d55e124fb0b0c41ebc0ca679370170c964659.tar.bz2 |
x86-64: REX.W overrides DATA_PREFIX
REX.W needs to be respected when immediate size and relocation type are
determined.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-i386.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 2e3154c..aec4f21 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -6212,7 +6212,8 @@ optimize_imm (void) break; } } - else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)) + else if ((flag_code == CODE_16BIT) + ^ (i.prefix[DATA_PREFIX] != 0 && !(i.prefix[REX_PREFIX] & REX_W))) guess_suffix = WORD_MNEM_SUFFIX; else if (flag_code != CODE_64BIT || (!(i.prefix[REX_PREFIX] & REX_W) @@ -8186,7 +8187,8 @@ update_imm (unsigned int j) || operand_type_equal (&overlap, &imm16_32) || operand_type_equal (&overlap, &imm16_32s)) { - if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)) + if ((flag_code == CODE_16BIT) + ^ (i.prefix[DATA_PREFIX] != 0 && !(i.prefix[REX_PREFIX] & REX_W))) overlap = imm16; else overlap = imm32s; @@ -10426,6 +10428,7 @@ output_imm (fragS *insn_start_frag, offsetT insn_start_off) if (i.types[n].bitfield.imm32s && (i.suffix == QWORD_MNEM_SUFFIX || (!i.suffix && i.tm.opcode_modifier.no_lsuf) + || (i.prefix[REX_PREFIX] & REX_W) || dot_insn ())) sign = 1; else |