aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2023-09-27 10:53:59 +0200
committerJan Beulich <jbeulich@suse.com>2023-09-27 10:53:59 +0200
commitf79d55e124fb0b0c41ebc0ca679370170c964659 (patch)
tree1aeaa07ab9fccb71cc7e056f3328e856a55a93b9 /gas
parentfb1c10585ead9acc8d9f9d24ab093cbe5e962257 (diff)
downloadgdb-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.c7
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