Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 69e5622

Browse files
committed
[3.9.1] Merging r281319 [ARM] Support ldr.w in pseudo instruction ldr rd,=immediate
git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_39@281634 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 7d62f51 commit 69e5622

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

lib/Target/ARM/ARMInstrThumb2.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4819,6 +4819,10 @@ def : t2InstAlias<"add${p} $Rd, pc, $imm",
48194819
def t2LDRConstPool
48204820
: t2AsmPseudo<"ldr${p} $Rt, $immediate",
48214821
(ins GPRnopc:$Rt, const_pool_asm_imm:$immediate, pred:$p)>;
4822+
// Version w/ the .w suffix.
4823+
def : t2InstAlias<"ldr${p}.w $Rt, $immediate",
4824+
(t2LDRConstPool GPRnopc:$Rt,
4825+
const_pool_asm_imm:$immediate, pred:$p)>;
48224826

48234827
// PLD/PLDW/PLI with alternate literal form.
48244828
def : t2InstAlias<"pld${p} $addr",

lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6933,6 +6933,9 @@ bool ARMAsmParser::processInstruction(MCInst &Inst,
69336933
else if (Inst.getOpcode() == ARM::t2LDRConstPool)
69346934
TmpInst.setOpcode(ARM::t2LDRpci);
69356935
const ARMOperand &PoolOperand =
6936+
(static_cast<ARMOperand &>(*Operands[2]).isToken() &&
6937+
static_cast<ARMOperand &>(*Operands[2]).getToken() == ".w") ?
6938+
static_cast<ARMOperand &>(*Operands[4]) :
69366939
static_cast<ARMOperand &>(*Operands[3]);
69376940
const MCExpr *SubExprVal = PoolOperand.getConstantPoolImm();
69386941
// If SubExprVal is a constant we may be able to use a MOV

test/MC/ARM/ldr-pseudo-wide.s

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
@ Test case for PR30352
2+
@ Check that ldr.w is:
3+
@ accepted and ignored for ARM
4+
@ accepted and propagated for Thumb2
5+
@ rejected as needing Thumb2 for Thumb
6+
7+
@RUN: llvm-mc -triple armv5-unknown-linux-gnueabi %s | FileCheck --check-prefix=CHECK-ARM --check-prefix=CHECK %s
8+
@RUN: llvm-mc -triple armv7-base-apple-darwin %s | FileCheck --check-prefix=CHECK-DARWIN-ARM --check-prefix=CHECK-DARWIN %s
9+
@RUN: llvm-mc -triple thumbv7-unknown-linux-gnueabi %s | FileCheck --check-prefix=CHECK-THUMB2 --check-prefix=CHECK %s
10+
@RUN: llvm-mc -triple thumbv7-base-apple-darwin %s | FileCheck --check-prefix=CHECK-DARWIN-THUMB2 --check-prefix=CHECK-DARWIN %s
11+
@RUN: not llvm-mc -triple thumbv6-unknown-linux-gnueabi %s 2>&1 | FileCheck --check-prefix=CHECK-THUMB %s
12+
@RUN: not llvm-mc -triple thumbv6-base-apple-darwin %s 2>&1 | FileCheck --check-prefix=CHECK-THUMB %s
13+
@ CHECK-LABEL: f1:
14+
f1:
15+
ldr r0, =0x10002
16+
@ CHECK-ARM: ldr r0, .Ltmp[[TMP0:[0-9]+]]
17+
@ CHECK-DARWIN-ARM: ldr r0, Ltmp0
18+
@ CHECK-THUMB2: ldr r0, .Ltmp[[TMP0:[0-9]+]]
19+
@ CHECK-DARWIN-THUMB2: ldr r0, Ltmp0
20+
21+
ldr.w r0, =0x10002
22+
@ CHECK-ARM: ldr r0, .Ltmp[[TMP1:[0-9]+]]
23+
@ CHECK-DARWIN-ARM: ldr r0, Ltmp1
24+
@ CHECK-THUMB2: ldr.w r0, .Ltmp[[TMP1:[0-9]+]]
25+
@ CHECK-DARWIN-THUMB2: ldr.w r0, Ltmp1
26+
@ CHECK-THUMB: error: instruction requires: thumb2
27+
@ CHECK-THUMB-NEXT: ldr.w r0, =0x10002
28+
29+
@ CHECK-LABEL: f2:
30+
f2:
31+
ldr r0, =foo
32+
@ CHECK-ARM: ldr r0, .Ltmp[[TMP2:[0-9]+]]
33+
@ CHECK-DARWIN-ARM: ldr r0, Ltmp2
34+
@ CHECK-THUMB2: ldr r0, .Ltmp[[TMP2:[0-9]+]]
35+
@ CHECK-DARWIN-THUMB2: ldr r0, Ltmp2
36+
37+
ldr.w r0, =foo
38+
@ CHECK-ARM: ldr r0, .Ltmp[[TMP3:[0-9]+]]
39+
@ CHECK-DARWIN-ARM: ldr r0, Ltmp3
40+
@ CHECK-THUMB2: ldr.w r0, .Ltmp[[TMP3:[0-9]+]]
41+
@ CHECK-DARWIN-THUMB2: ldr.w r0, Ltmp3
42+
@ CHECK-THUMB: error: instruction requires: thumb2
43+
@ CHECK-THUMB-NEXT: ldr.w r0, =foo
44+
45+
@ CHECK-LABEL: f3:
46+
f3:
47+
ldr.w r1, =0x1
48+
@ CHECK-ARM: mov r1, #1
49+
@ CHECK-DARWIN-ARM: mov r1, #1
50+
@ CHECK-THUMB2: mov.w r1, #1
51+
@ CHECK-DARWIN-THUMB2: mov.w r1, #1
52+
@ CHECK-THUMB: error: instruction requires: thumb2
53+
@ CHECK-THUMB-NEXT: ldr.w r1, =0x1
54+
55+
@ CHECK: .Ltmp0:
56+
@ CHECK-NEXT: .long 65538
57+
@ CHECK: .Ltmp1:
58+
@ CHECK-NEXT: .long 65538
59+
@ CHECK: .Ltmp2:
60+
@ CHECK-NEXT: .long foo
61+
@ CHECK: .Ltmp3:
62+
@ CHECK-NEXT: .long foo
63+
64+
@ CHECK-DARWIN: Ltmp0:
65+
@ CHECK-DARWIN-NEXT: .long 65538
66+
@ CHECK-DARWIN: Ltmp1:
67+
@ CHECK-DARWIN-NEXT: .long 65538
68+
@ CHECK-DARWIN: Ltmp2:
69+
@ CHECK-DARWIN-NEXT: .long foo
70+
@ CHECK-DARWIN: Ltmp3:
71+
@ CHECK-DARWIN-NEXT: .long foo

0 commit comments

Comments
 (0)