diff options
| author | Martin Storsjo <martin@martin.st> | 2017-07-20 16:48:33 +0000 |
|---|---|---|
| committer | Martin Storsjo <martin@martin.st> | 2017-07-20 16:48:33 +0000 |
| commit | 5ae7649a4e9a12a19f9797d81a5c8dd02fb9e8d6 (patch) | |
| tree | 42ed7897a9aed7a5ea17e2aa29d5e56ca6ccf2a5 /lld/COFF/Chunks.cpp | |
| parent | 3562f272cf05cf5df640069f55459b2cf52a16a0 (diff) | |
| download | bcm5719-llvm-5ae7649a4e9a12a19f9797d81a5c8dd02fb9e8d6.tar.gz bcm5719-llvm-5ae7649a4e9a12a19f9797d81a5c8dd02fb9e8d6.zip | |
[COFF] Support 128 bit SIMD/FP ldr/str in IMAGE_REL_ARM64_PAGEOFFSET_12L
Also extend the tests for IMAGE_REL_ARM64_PAGEOFFSET_12L to test
all 8/16/32/64 bit GPR and 8/16/32/64/128 SIMD/FP bit ldr/str variants,
and a ldr with an existing offset.
Differential revision: https://reviews.llvm.org/D35647
llvm-svn: 308631
Diffstat (limited to 'lld/COFF/Chunks.cpp')
| -rw-r--r-- | lld/COFF/Chunks.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index e6ac3ddf486..5be4ecadf4e 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -183,7 +183,12 @@ static void applyArm64Imm(uint8_t *Off, uint64_t Imm) { } static void applyArm64Ldr(uint8_t *Off, uint64_t Imm) { - uint32_t Size = read32le(Off) >> 30; + uint32_t Orig = read32le(Off); + uint32_t Size = Orig >> 30; + // 0x04000000 indicates SIMD/FP registers + // 0x00800000 indicates 128 bit + if ((Orig & 0x4800000) == 0x4800000) + Size += 4; if ((Imm & ((1 << Size) - 1)) != 0) fatal("misaligned ldr/str offset"); applyArm64Imm(Off, Imm >> Size); |

