summaryrefslogtreecommitdiffstats
path: root/lld/COFF/Chunks.cpp
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2017-07-20 16:48:33 +0000
committerMartin Storsjo <martin@martin.st>2017-07-20 16:48:33 +0000
commit5ae7649a4e9a12a19f9797d81a5c8dd02fb9e8d6 (patch)
tree42ed7897a9aed7a5ea17e2aa29d5e56ca6ccf2a5 /lld/COFF/Chunks.cpp
parent3562f272cf05cf5df640069f55459b2cf52a16a0 (diff)
downloadbcm5719-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.cpp7
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);
OpenPOWER on IntegriCloud