xref: /llvm-project/llvm/test/CodeGen/ARM/fast-isel-ldr-str-thumb-neg-index.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
1; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=THUMB
2
3define i32 @t1(ptr nocapture %ptr) nounwind readonly {
4entry:
5; THUMB-LABEL: t1:
6  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -1
7  %0 = load i32, ptr %add.ptr, align 4
8; THUMB: ldr r{{[0-9]}}, [r0, #-4]
9  ret i32 %0
10}
11
12define i32 @t2(ptr nocapture %ptr) nounwind readonly {
13entry:
14; THUMB-LABEL: t2:
15  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -63
16  %0 = load i32, ptr %add.ptr, align 4
17; THUMB: ldr r{{[0-9]}}, [r0, #-252]
18  ret i32 %0
19}
20
21define i32 @t3(ptr nocapture %ptr) nounwind readonly {
22entry:
23; THUMB-LABEL: t3:
24  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -64
25  %0 = load i32, ptr %add.ptr, align 4
26; THUMB: ldr r{{[0-9]}}, [r0]
27  ret i32 %0
28}
29
30define zeroext i16 @t4(ptr nocapture %ptr) nounwind readonly {
31entry:
32; THUMB-LABEL: t4:
33  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -1
34  %0 = load i16, ptr %add.ptr, align 2
35; THUMB: ldrh r{{[0-9]}}, [r0, #-2]
36  ret i16 %0
37}
38
39define zeroext i16 @t5(ptr nocapture %ptr) nounwind readonly {
40entry:
41; THUMB-LABEL: t5:
42  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -127
43  %0 = load i16, ptr %add.ptr, align 2
44; THUMB: ldrh r{{[0-9]}}, [r0, #-254]
45  ret i16 %0
46}
47
48define zeroext i16 @t6(ptr nocapture %ptr) nounwind readonly {
49entry:
50; THUMB-LABEL: t6:
51  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -128
52  %0 = load i16, ptr %add.ptr, align 2
53; THUMB: ldrh r{{[0-9]}}, [r0]
54  ret i16 %0
55}
56
57define zeroext i8 @t7(ptr nocapture %ptr) nounwind readonly {
58entry:
59; THUMB-LABEL: t7:
60  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -1
61  %0 = load i8, ptr %add.ptr, align 1
62; THUMB: ldrb r{{[0-9]}}, [r0, #-1]
63  ret i8 %0
64}
65
66define zeroext i8 @t8(ptr nocapture %ptr) nounwind readonly {
67entry:
68; THUMB-LABEL: t8:
69  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -255
70  %0 = load i8, ptr %add.ptr, align 1
71; THUMB: ldrb r{{[0-9]}}, [r0, #-255]
72  ret i8 %0
73}
74
75define zeroext i8 @t9(ptr nocapture %ptr) nounwind readonly {
76entry:
77; THUMB-LABEL: t9:
78  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -256
79  %0 = load i8, ptr %add.ptr, align 1
80; THUMB: ldrb r{{[0-9]}}, [r0]
81  ret i8 %0
82}
83
84define void @t10(ptr nocapture %ptr) nounwind {
85entry:
86; THUMB-LABEL: t10:
87  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -1
88  store i32 0, ptr %add.ptr, align 4
89; THUMB: mov [[REG:r[0-9]+]], r0
90; THUMB: str r{{[0-9]}}, [[[REG]], #-4]
91  ret void
92}
93
94define void @t11(ptr nocapture %ptr) nounwind {
95entry:
96; THUMB-LABEL: t11:
97  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -63
98  store i32 0, ptr %add.ptr, align 4
99; THUMB: mov [[REG:r[0-9]+]], r0
100; THUMB: str r{{[0-9]}}, [[[REG]], #-252]
101  ret void
102}
103
104define void @t12(ptr nocapture %ptr) nounwind {
105entry:
106; THUMB-LABEL: t12:
107  %add.ptr = getelementptr inbounds i32, ptr %ptr, i32 -64
108  store i32 0, ptr %add.ptr, align 4
109; THUMB: mov [[PTR:r[0-9]+]], r0
110; THUMB: movs [[VAL:r[0-9]+]], #0
111; THUMB: movw [[REG:r[0-9]+]], #65280
112; THUMB: movt [[REG]], #65535
113; THUMB: add [[PTR]], [[REG]]
114; THUMB: str [[VAL]], [[[PTR]]]
115  ret void
116}
117
118define void @t13(ptr nocapture %ptr) nounwind {
119entry:
120; THUMB-LABEL: t13:
121  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -1
122  store i16 0, ptr %add.ptr, align 2
123; THUMB: mov [[REG:r[0-9]+]], r0
124; THUMB: strh r{{[0-9]}}, [[[REG]], #-2]
125  ret void
126}
127
128define void @t14(ptr nocapture %ptr) nounwind {
129entry:
130; THUMB-LABEL: t14:
131  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -127
132  store i16 0, ptr %add.ptr, align 2
133; THUMB: mov [[REG:r[0-9]+]], r0
134; THUMB: strh r{{[0-9]}}, [[[REG]], #-254]
135  ret void
136}
137
138define void @t15(ptr nocapture %ptr) nounwind {
139entry:
140; THUMB-LABEL: t15:
141  %add.ptr = getelementptr inbounds i16, ptr %ptr, i32 -128
142  store i16 0, ptr %add.ptr, align 2
143; THUMB: mov [[PTR:r[0-9]+]], r0
144; THUMB: movs [[VAL:r[0-9]+]], #0
145; THUMB: movw [[REG:r[0-9]+]], #65280
146; THUMB: movt [[REG]], #65535
147; THUMB: add [[PTR]], [[REG]]
148; THUMB: strh [[VAL]], [[[PTR]]]
149  ret void
150}
151
152define void @t16(ptr nocapture %ptr) nounwind {
153entry:
154; THUMB-LABEL: t16:
155  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -1
156  store i8 0, ptr %add.ptr, align 1
157; THUMB: mov [[REG:r[0-9]+]], r0
158; THUMB: strb r{{[0-9]}}, [[[REG]], #-1]
159  ret void
160}
161
162define void @t17(ptr nocapture %ptr) nounwind {
163entry:
164; THUMB-LABEL: t17:
165  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -255
166  store i8 0, ptr %add.ptr, align 1
167; THUMB: mov [[REG:r[0-9]+]], r0
168; THUMB: strb r{{[0-9]}}, [[[REG]], #-255]
169  ret void
170}
171
172define void @t18(ptr nocapture %ptr) nounwind {
173entry:
174; THUMB-LABEL: t18:
175  %add.ptr = getelementptr inbounds i8, ptr %ptr, i32 -256
176  store i8 0, ptr %add.ptr, align 1
177; THUMB: mov [[PTR:r[0-9]+]], r0
178; THUMB: movs [[VAL]], #0
179; THUMB: movw [[REG:r[0-9]+]], #65280
180; THUMB: movt [[REG]], #65535
181; THUMB: add [[PTR]], [[REG]]
182; THUMB: strb [[VAL]], [[[PTR]]]
183  ret void
184}
185