]> granicus.if.org Git - llvm/commit
Merging r324772:
authorHans Wennborg <hans@hanshq.net>
Mon, 12 Feb 2018 10:14:34 +0000 (10:14 +0000)
committerHans Wennborg <hans@hanshq.net>
Mon, 12 Feb 2018 10:14:34 +0000 (10:14 +0000)
commite9667680470d3c40c51ff887fd33c2a91a07d62f
tree6bcd916a390e1c34b72886480ae33819e72c9307
parentde7871dcb327f91569aaf5eb9d2820f86b7ae7c7
Merging r324772:
------------------------------------------------------------------------
r324772 | thegameg | 2018-02-09 22:47:07 +0100 (Fri, 09 Feb 2018) | 25 lines

[X86][MC] Fix assembling rip-relative addressing + immediate displacements

In the rare case where the input contains rip-relative addressing with
immediate displacements, *and* the instruction ends with an immediate,
we encode the instruction in the wrong way:

movl $12345678, 0x400(%rdi) // all good, no rip-relative addr
movl %eax, 0x400(%rip) // all good, no immediate at the end of the instruction
movl $12345678, 0x400(%rip) // fails, encodes address as 0x3fc(%rip)

Offset is a label:

movl $12345678, foo(%rip)

we want to account for the size of the immediate (in this case,
$12345678, 4 bytes).

Offset is an immediate:

movl $12345678, 0x400(%rip)

we should not account for the size of the immediate, assuming the
immediate offset is what the user wanted.

Differential Revision: https://reviews.llvm.org/D43050
------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_60@324875 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
test/MC/X86/x86-64.s