xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-ldp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_int
4*9880d681SAndroid Build Coastguard Worker; CHECK: ldp
5*9880d681SAndroid Build Coastguard Workerdefine i32 @ldp_int(i32* %p) nounwind {
6*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %p, align 4
7*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
8*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr, align 4
9*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp1, %tmp
10*9880d681SAndroid Build Coastguard Worker  ret i32 %add
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int
14*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw
15*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int(i32* %p) nounwind {
16*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %p, align 4
17*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
18*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr, align 4
19*9880d681SAndroid Build Coastguard Worker  %sexttmp = sext i32 %tmp to i64
20*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
21*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %sexttmp1, %sexttmp
22*9880d681SAndroid Build Coastguard Worker  ret i64 %add
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_sext_res0_int:
26*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0]
27*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST1]], w[[DST1]]
28*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_sext_res0_int(i32* %p) nounwind {
29*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %p, align 4
30*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
31*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr, align 4
32*9880d681SAndroid Build Coastguard Worker  %sexttmp = sext i32 %tmp to i64
33*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = zext i32 %tmp1 to i64
34*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %sexttmp1, %sexttmp
35*9880d681SAndroid Build Coastguard Worker  ret i64 %add
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_sext_res1_int:
39*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0]
40*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST2]], w[[DST2]]
41*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_sext_res1_int(i32* %p) nounwind {
42*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %p, align 4
43*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
44*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr, align 4
45*9880d681SAndroid Build Coastguard Worker  %sexttmp = zext i32 %tmp to i64
46*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
47*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %sexttmp1, %sexttmp
48*9880d681SAndroid Build Coastguard Worker  ret i64 %add
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_long
53*9880d681SAndroid Build Coastguard Worker; CHECK: ldp
54*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_long(i64* %p) nounwind {
55*9880d681SAndroid Build Coastguard Worker  %tmp = load i64, i64* %p, align 8
56*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i64, i64* %p, i64 1
57*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %add.ptr, align 8
58*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %tmp1, %tmp
59*9880d681SAndroid Build Coastguard Worker  ret i64 %add
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_float
63*9880d681SAndroid Build Coastguard Worker; CHECK: ldp
64*9880d681SAndroid Build Coastguard Workerdefine float @ldp_float(float* %p) nounwind {
65*9880d681SAndroid Build Coastguard Worker  %tmp = load float, float* %p, align 4
66*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds float, float* %p, i64 1
67*9880d681SAndroid Build Coastguard Worker  %tmp1 = load float, float* %add.ptr, align 4
68*9880d681SAndroid Build Coastguard Worker  %add = fadd float %tmp, %tmp1
69*9880d681SAndroid Build Coastguard Worker  ret float %add
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_double
73*9880d681SAndroid Build Coastguard Worker; CHECK: ldp
74*9880d681SAndroid Build Coastguard Workerdefine double @ldp_double(double* %p) nounwind {
75*9880d681SAndroid Build Coastguard Worker  %tmp = load double, double* %p, align 8
76*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds double, double* %p, i64 1
77*9880d681SAndroid Build Coastguard Worker  %tmp1 = load double, double* %add.ptr, align 8
78*9880d681SAndroid Build Coastguard Worker  %add = fadd double %tmp, %tmp1
79*9880d681SAndroid Build Coastguard Worker  ret double %add
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; Test the load/store optimizer---combine ldurs into a ldp, if appropriate
83*9880d681SAndroid Build Coastguard Workerdefine i32 @ldur_int(i32* %a) nounwind {
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_int
85*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     [[DST1:w[0-9]+]], [[DST2:w[0-9]+]], [x0, #-8]
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     w{{[0-9]+}}, [[DST2]], [[DST1]]
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
88*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i32 -1
89*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
90*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i32 -2
91*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
92*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i32 %tmp1, %tmp2
93*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp3
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_sext_int(i32* %a) nounwind {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_sext_int
98*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw     [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-8]
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, [[DST2]], [[DST1]]
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
101*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i32 -1
102*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
103*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i32 -2
104*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
105*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
106*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
107*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
108*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_half_sext_int_res0(i32* %a) nounwind {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_half_sext_int_res0
113*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-8]
114*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST1]], w[[DST1]]
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, x[[DST2]], x[[DST1]]
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
117*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i32 -1
118*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
119*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i32 -2
120*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
121*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = zext i32 %tmp1 to i64
122*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
123*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
124*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_half_sext_int_res1(i32* %a) nounwind {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_half_sext_int_res1
129*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-8]
130*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST2]], w[[DST2]]
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, x[[DST2]], x[[DST1]]
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
133*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i32 -1
134*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
135*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i32 -2
136*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
137*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
138*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = zext i32 %tmp2 to i64
139*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
140*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_long(i64* %a) nounwind ssp {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_long
146*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-16]
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, [[DST2]], [[DST1]]
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
149*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i64, i64* %a, i64 -1
150*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %p1, align 2
151*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i64, i64* %a, i64 -2
152*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i64, i64* %p2, align 2
153*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %tmp1, %tmp2
154*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine float @ldur_float(float* %a) {
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_float
159*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     [[DST1:s[0-9]+]], [[DST2:s[0-9]+]], [x0, #-8]
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     s{{[0-9]+}}, [[DST2]], [[DST1]]
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
162*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds float, float* %a, i64 -1
163*9880d681SAndroid Build Coastguard Worker  %tmp1 = load float, float* %p1, align 2
164*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds float, float* %a, i64 -2
165*9880d681SAndroid Build Coastguard Worker  %tmp2 = load float, float* %p2, align 2
166*9880d681SAndroid Build Coastguard Worker  %tmp3 = fadd float %tmp1, %tmp2
167*9880d681SAndroid Build Coastguard Worker  ret float %tmp3
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerdefine double @ldur_double(double* %a) {
171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_double
172*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     [[DST1:d[0-9]+]], [[DST2:d[0-9]+]], [x0, #-16]
173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     d{{[0-9]+}}, [[DST2]], [[DST1]]
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
175*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds double, double* %a, i64 -1
176*9880d681SAndroid Build Coastguard Worker  %tmp1 = load double, double* %p1, align 2
177*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds double, double* %a, i64 -2
178*9880d681SAndroid Build Coastguard Worker  %tmp2 = load double, double* %p2, align 2
179*9880d681SAndroid Build Coastguard Worker  %tmp3 = fadd double %tmp1, %tmp2
180*9880d681SAndroid Build Coastguard Worker  ret double %tmp3
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; Now check some boundary conditions
184*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyIn(i64* %a) nounwind ssp {
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyIn
186*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur
187*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-256]
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, [[DST2]], [[DST1]]
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
190*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i64, i64* %a, i64 -31
191*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %p1, align 2
192*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i64, i64* %a, i64 -32
193*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i64, i64* %p2, align 2
194*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %tmp1, %tmp2
195*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInSext(i32* %a) nounwind ssp {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInSext
200*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur
201*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw     [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-256]
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, [[DST2]], [[DST1]]
203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
204*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i64 -63
205*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
206*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i64 -64
207*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
208*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
209*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
210*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
211*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInHalfSextRes0(i32* %a) nounwind ssp {
215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInHalfSextRes0
216*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur
217*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-256]
218*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST1]], w[[DST1]]
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, x[[DST2]], x[[DST1]]
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
221*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i64 -63
222*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
223*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i64 -64
224*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
225*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = zext i32 %tmp1 to i64
226*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
227*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
228*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInHalfSextRes1(i32* %a) nounwind ssp {
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInHalfSextRes1
233*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur
234*9880d681SAndroid Build Coastguard Worker; CHECK: ldp     w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-256]
235*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw     x[[DST2]], w[[DST2]]
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add     x{{[0-9]+}}, x[[DST2]], x[[DST1]]
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
238*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i64 -63
239*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
240*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i64 -64
241*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
242*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
243*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = zext i32 %tmp2 to i64
244*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
245*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyOut(i64* %a) nounwind ssp {
249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyOut
250*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp
251*9880d681SAndroid Build Coastguard Worker; Don't be fragile about which loads or manipulations of the base register
252*9880d681SAndroid Build Coastguard Worker; are used---just check that there isn't an ldp before the add
253*9880d681SAndroid Build Coastguard Worker; CHECK: add
254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
255*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i64, i64* %a, i64 -32
256*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %p1, align 2
257*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i64, i64* %a, i64 -33
258*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i64, i64* %p2, align 2
259*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %tmp1, %tmp2
260*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
261*9880d681SAndroid Build Coastguard Worker}
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyOutSext(i32* %a) nounwind ssp {
264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyOutSext
265*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp
266*9880d681SAndroid Build Coastguard Worker; Don't be fragile about which loads or manipulations of the base register
267*9880d681SAndroid Build Coastguard Worker; are used---just check that there isn't an ldp before the add
268*9880d681SAndroid Build Coastguard Worker; CHECK: add
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
270*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i64 -64
271*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %p1, align 2
272*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i64 -65
273*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %p2, align 2
274*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
275*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
276*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
277*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
278*9880d681SAndroid Build Coastguard Worker}
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpNotAligned(i64* %a) nounwind ssp {
281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpNotAligned
282*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp
283*9880d681SAndroid Build Coastguard Worker; CHECK: ldur
284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur
285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add
286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
287*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i64, i64* %a, i64 -18
288*9880d681SAndroid Build Coastguard Worker  %bp1 = bitcast i64* %p1 to i8*
289*9880d681SAndroid Build Coastguard Worker  %bp1p1 = getelementptr inbounds i8, i8* %bp1, i64 1
290*9880d681SAndroid Build Coastguard Worker  %dp1 = bitcast i8* %bp1p1 to i64*
291*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %dp1, align 1
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i64, i64* %a, i64 -17
294*9880d681SAndroid Build Coastguard Worker  %bp2 = bitcast i64* %p2 to i8*
295*9880d681SAndroid Build Coastguard Worker  %bp2p1 = getelementptr inbounds i8, i8* %bp2, i64 1
296*9880d681SAndroid Build Coastguard Worker  %dp2 = bitcast i8* %bp2p1 to i64*
297*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i64, i64* %dp2, align 1
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %tmp1, %tmp2
300*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
301*9880d681SAndroid Build Coastguard Worker}
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpNotAlignedSext(i32* %a) nounwind ssp {
304*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpNotAlignedSext
305*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp
306*9880d681SAndroid Build Coastguard Worker; CHECK: ldursw
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldursw
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
310*9880d681SAndroid Build Coastguard Worker  %p1 = getelementptr inbounds i32, i32* %a, i64 -18
311*9880d681SAndroid Build Coastguard Worker  %bp1 = bitcast i32* %p1 to i8*
312*9880d681SAndroid Build Coastguard Worker  %bp1p1 = getelementptr inbounds i8, i8* %bp1, i64 1
313*9880d681SAndroid Build Coastguard Worker  %dp1 = bitcast i8* %bp1p1 to i32*
314*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %dp1, align 1
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr inbounds i32, i32* %a, i64 -17
317*9880d681SAndroid Build Coastguard Worker  %bp2 = bitcast i32* %p2 to i8*
318*9880d681SAndroid Build Coastguard Worker  %bp2p1 = getelementptr inbounds i8, i8* %bp2, i64 1
319*9880d681SAndroid Build Coastguard Worker  %dp2 = bitcast i8* %bp2p1 to i32*
320*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %dp2, align 1
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
323*9880d681SAndroid Build Coastguard Worker  %sexttmp2 = sext i32 %tmp2 to i64
324*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i64 %sexttmp1, %sexttmp2
325*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3
326*9880d681SAndroid Build Coastguard Worker}
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Workerdeclare void @use-ptr(i32*)
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int_pre
331*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw x{{[0-9]+}}, x{{[0-9]+}}, [x{{[0-9]+}}, #8]
332*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int_pre(i32* %p) nounwind {
333*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %p, i64 2
334*9880d681SAndroid Build Coastguard Worker  call void @use-ptr(i32* %ptr)
335*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 0
336*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %add.ptr, align 4
337*9880d681SAndroid Build Coastguard Worker  %add.ptr1 = getelementptr inbounds i32, i32* %ptr, i64 1
338*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr1, align 4
339*9880d681SAndroid Build Coastguard Worker  %sexttmp = sext i32 %tmp to i64
340*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
341*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %sexttmp1, %sexttmp
342*9880d681SAndroid Build Coastguard Worker  ret i64 %add
343*9880d681SAndroid Build Coastguard Worker}
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int_post
346*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw x{{[0-9]+}}, x{{[0-9]+}}, [x0], #8
347*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int_post(i32* %p) nounwind {
348*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %p, align 4
349*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
350*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %add.ptr, align 4
351*9880d681SAndroid Build Coastguard Worker  %sexttmp = sext i32 %tmp to i64
352*9880d681SAndroid Build Coastguard Worker  %sexttmp1 = sext i32 %tmp1 to i64
353*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %add.ptr, i64 1
354*9880d681SAndroid Build Coastguard Worker  call void @use-ptr(i32* %ptr)
355*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %sexttmp1, %sexttmp
356*9880d681SAndroid Build Coastguard Worker  ret i64 %add
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359