diff options
author | Jan Beulich <jbeulich@suse.com> | 2023-09-27 10:53:38 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2023-09-27 10:53:38 +0200 |
commit | fb1c10585ead9acc8d9f9d24ab093cbe5e962257 (patch) | |
tree | 9ce03142c74a2fd1d569e3437825c71564d13fff | |
parent | df940f8bb348cf90445195ed4a34cddf9af634f6 (diff) | |
download | gdb-fb1c10585ead9acc8d9f9d24ab093cbe5e962257.zip gdb-fb1c10585ead9acc8d9f9d24ab093cbe5e962257.tar.gz gdb-fb1c10585ead9acc8d9f9d24ab093cbe5e962257.tar.bz2 |
x86-64: fix suffix-less PUSH of symbol address
PR gas/30856
In 5cc007751cdb ("x86: further adjust extend-to-32bit-address
conditions") I neglected the case of PUSH, which is the only insn
allowing (proper) symbol addresses to be used as immediates (not
displacements, like CALL/JMP) in the absence of any register operands.
Since it defaults to 64-bit operand size, guessing an L suffix is wrong
there.
-rw-r--r-- | gas/config/tc-i386.c | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/immed64.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/immed64.s | 6 |
3 files changed, 18 insertions, 1 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index cec9a02..2e3154c 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -6214,7 +6214,12 @@ optimize_imm (void) } else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)) guess_suffix = WORD_MNEM_SUFFIX; - else if (flag_code != CODE_64BIT || !(i.prefix[REX_PREFIX] & REX_W)) + else if (flag_code != CODE_64BIT + || (!(i.prefix[REX_PREFIX] & REX_W) + /* A more generic (but also more involved) way of dealing + with the special case(s) would be to go look for + DefaultSize attributes on any of the templates. */ + && current_templates->start->mnem_off != MN_push)) guess_suffix = LONG_MNEM_SUFFIX; for (op = i.operands; --op >= 0;) diff --git a/gas/testsuite/gas/i386/immed64.d b/gas/testsuite/gas/i386/immed64.d index 35492a5..a83ab2c 100644 --- a/gas/testsuite/gas/i386/immed64.d +++ b/gas/testsuite/gas/i386/immed64.d @@ -24,6 +24,12 @@ Disassembly of section \.text: [ ]*[0-9a-fA-F]+:[ ]+48 b8 04 00 00 00 00 00 00 00[ ]+movabsq? +\$0x4,%rax [ ]*[0-9a-fA-F]+:[ ]+48 b8 08 00 00 00 00 00 00 00[ ]+movabsq? +\$0x8,%rax [ ]*[0-9a-fA-F]+:[ ]+48 b8 00 00 00 00 00 00 00 00[ ]+movabsq? +\$0x0,%rax +[ ]*[0-9a-fA-F]+:[ ]+6a 04[ ]+pushq? +\$0x4 +[ ]*[0-9a-fA-F]+:[ ]+68 08 00 00 00[ ]+pushq? +\$0x8 +[ ]*[0-9a-fA-F]+:[ ]+66 6a 04[ ]+pushw +\$0x4 +[ ]*[0-9a-fA-F]+:[ ]+66 68 08 00[ ]+pushw +\$0x8 +[ ]*[0-9a-fA-F]+:[ ]+6a 04[ ]+pushq? +\$0x4 +[ ]*[0-9a-fA-F]+:[ ]+68 08 00 00 00[ ]+pushq? +\$0x8 [ ]*[0-9a-fA-F]+:[ ]+04 04[ ]+addb? +\$0x4,%al [ ]*[0-9a-fA-F]+:[ ]+04 08[ ]+addb? +\$0x8,%al [ ]*[0-9a-fA-F]+:[ ]+04 00[ ]+addb? +\$0x0,%al diff --git a/gas/testsuite/gas/i386/immed64.s b/gas/testsuite/gas/i386/immed64.s index 265b419..21c30ec 100644 --- a/gas/testsuite/gas/i386/immed64.s +++ b/gas/testsuite/gas/i386/immed64.s @@ -19,6 +19,12 @@ _start: movabsq $early, %rax movabsq $late, %rax movabsq $xtrn, %rax + pushq $early + pushq $late + pushw $early + pushw $late + push $early + push $late addb $early, %al addb $late, %al addb $xtrn, %al |