diff options
author | Tim Northover <Tim.Northover@arm.com> | 2013-02-27 16:43:09 +0000 |
---|---|---|
committer | Tim Northover <Tim.Northover@arm.com> | 2013-02-27 16:43:09 +0000 |
commit | 29931ab21d661ed0ea430d91346c86bb1d1fe94a (patch) | |
tree | 0a30d4012430b906b6b3b22543b71467a97fd6d0 | |
parent | dc145816fdf2ef92af473e6ec83abd33d28b6466 (diff) | |
download | bcm5719-llvm-29931ab21d661ed0ea430d91346c86bb1d1fe94a.tar.gz bcm5719-llvm-29931ab21d661ed0ea430d91346c86bb1d1fe94a.zip |
ARM: permit full range of valid ADR immediates.
This fixes an issue where trying to assemlbe valid ADR instructions would cause
LLVM to hit a failed assertion.
Patch by Keith Walker.
llvm-svn: 176189
-rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp | 17 | ||||
-rw-r--r-- | llvm/test/MC/ARM/basic-arm-instructions.s | 4 |
2 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp index 09e15afd3c0..7a59a7dd505 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp @@ -655,15 +655,28 @@ getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx, int32_t offset = MO.getImm(); uint32_t Val = 0x2000; + int SoImmVal; if (offset == INT32_MIN) { Val = 0x1000; - offset = 0; + SoImmVal = 0; } else if (offset < 0) { Val = 0x1000; offset *= -1; + SoImmVal = ARM_AM::getSOImmVal(offset); + if(SoImmVal == -1) { + Val = 0x2000; + offset *= -1; + SoImmVal = ARM_AM::getSOImmVal(offset); + } + } else { + SoImmVal = ARM_AM::getSOImmVal(offset); + if(SoImmVal == -1) { + Val = 0x1000; + offset *= -1; + SoImmVal = ARM_AM::getSOImmVal(offset); + } } - int SoImmVal = ARM_AM::getSOImmVal(offset); assert(SoImmVal != -1 && "Not a valid so_imm value!"); Val |= SoImmVal; diff --git a/llvm/test/MC/ARM/basic-arm-instructions.s b/llvm/test/MC/ARM/basic-arm-instructions.s index 45ea278aac1..560a0d633cb 100644 --- a/llvm/test/MC/ARM/basic-arm-instructions.s +++ b/llvm/test/MC/ARM/basic-arm-instructions.s @@ -143,11 +143,15 @@ Lforward: adr r1, #-0x0 adr r1, #-0x12000000 + adr r1, #-0x80000001 adr r1, #0x12000000 + adr r1, #0x80000001 @ CHECK: adr r1, #-0 @ encoding: [0x00,0x10,0x4f,0xe2] @ CHECK: adr r1, #-301989888 @ encoding: [0x12,0x14,0x4f,0xe2] +@ CHECK: adr r1, #2147483647 @ encoding: [0x06,0x11,0x4f,0xe2] @ CHECK: adr r1, #301989888 @ encoding: [0x12,0x14,0x8f,0xe2] +@ CHECK: adr r1, #-2147483647 @ encoding: [0x06,0x11,0x8f,0xe2] @------------------------------------------------------------------------------ |