xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-vector-ldst.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; rdar://9428579
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%type1 = type { <16 x i8> }
6*9880d681SAndroid Build Coastguard Worker%type2 = type { <8 x i8> }
7*9880d681SAndroid Build Coastguard Worker%type3 = type { <4 x i16> }
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine hidden fastcc void @t1(%type1** %argtable) nounwind {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1:
13*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REG:[0-9]+]], [x0]
14*9880d681SAndroid Build Coastguard Worker; CHECK: str q0, [x[[REG]]]
15*9880d681SAndroid Build Coastguard Worker  %tmp1 = load %type1*, %type1** %argtable, align 8
16*9880d681SAndroid Build Coastguard Worker  %tmp2 = getelementptr inbounds %type1, %type1* %tmp1, i64 0, i32 0
17*9880d681SAndroid Build Coastguard Worker  store <16 x i8> zeroinitializer, <16 x i8>* %tmp2, align 16
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine hidden fastcc void @t2(%type2** %argtable) nounwind {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2:
24*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REG:[0-9]+]], [x0]
25*9880d681SAndroid Build Coastguard Worker; CHECK: str d0, [x[[REG]]]
26*9880d681SAndroid Build Coastguard Worker  %tmp1 = load %type2*, %type2** %argtable, align 8
27*9880d681SAndroid Build Coastguard Worker  %tmp2 = getelementptr inbounds %type2, %type2* %tmp1, i64 0, i32 0
28*9880d681SAndroid Build Coastguard Worker  store <8 x i8> zeroinitializer, <8 x i8>* %tmp2, align 8
29*9880d681SAndroid Build Coastguard Worker  ret void
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; add a bunch of tests for rdar://11246289
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker@globalArray64x2 = common global <2 x i64>* null, align 8
35*9880d681SAndroid Build Coastguard Worker@globalArray32x4 = common global <4 x i32>* null, align 8
36*9880d681SAndroid Build Coastguard Worker@globalArray16x8 = common global <8 x i16>* null, align 8
37*9880d681SAndroid Build Coastguard Worker@globalArray8x16 = common global <16 x i8>* null, align 8
38*9880d681SAndroid Build Coastguard Worker@globalArray64x1 = common global <1 x i64>* null, align 8
39*9880d681SAndroid Build Coastguard Worker@globalArray32x2 = common global <2 x i32>* null, align 8
40*9880d681SAndroid Build Coastguard Worker@globalArray16x4 = common global <4 x i16>* null, align 8
41*9880d681SAndroid Build Coastguard Worker@globalArray8x8 = common global <8 x i8>* null, align 8
42*9880d681SAndroid Build Coastguard Worker@floatglobalArray64x2 = common global <2 x double>* null, align 8
43*9880d681SAndroid Build Coastguard Worker@floatglobalArray32x4 = common global <4 x float>* null, align 8
44*9880d681SAndroid Build Coastguard Worker@floatglobalArray64x1 = common global <1 x double>* null, align 8
45*9880d681SAndroid Build Coastguard Worker@floatglobalArray32x2 = common global <2 x float>* null, align 8
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @fct1_64x2(<2 x i64>* nocapture %array, i64 %offset) nounwind ssp {
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_64x2:
50*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #4
51*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, [[SHIFTEDOFFSET]]
52*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
53*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
54*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <2 x i64>, <2 x i64>* %array, i64 %offset
55*9880d681SAndroid Build Coastguard Worker  %tmp = load <2 x i64>, <2 x i64>* %arrayidx, align 16
56*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i64>*, <2 x i64>** @globalArray64x2, align 8
57*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x i64>, <2 x i64>* %tmp1, i64 %offset
58*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %tmp, <2 x i64>* %arrayidx1, align 16
59*9880d681SAndroid Build Coastguard Worker  ret void
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine void @fct2_64x2(<2 x i64>* nocapture %array) nounwind ssp {
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_64x2:
65*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, #48]
66*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
67*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #80]
68*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <2 x i64>, <2 x i64>* %array, i64 3
69*9880d681SAndroid Build Coastguard Worker  %tmp = load <2 x i64>, <2 x i64>* %arrayidx, align 16
70*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i64>*, <2 x i64>** @globalArray64x2, align 8
71*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x i64>, <2 x i64>* %tmp1, i64 5
72*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %tmp, <2 x i64>* %arrayidx1, align 16
73*9880d681SAndroid Build Coastguard Worker  ret void
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine void @fct1_32x4(<4 x i32>* nocapture %array, i64 %offset) nounwind ssp {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_32x4:
79*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #4
80*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
81*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
82*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
83*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <4 x i32>, <4 x i32>* %array, i64 %offset
84*9880d681SAndroid Build Coastguard Worker  %tmp = load <4 x i32>, <4 x i32>* %arrayidx, align 16
85*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i32>*, <4 x i32>** @globalArray32x4, align 8
86*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <4 x i32>, <4 x i32>* %tmp1, i64 %offset
87*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %tmp, <4 x i32>* %arrayidx1, align 16
88*9880d681SAndroid Build Coastguard Worker  ret void
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine void @fct2_32x4(<4 x i32>* nocapture %array) nounwind ssp {
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_32x4:
94*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, #48]
95*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
96*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #80]
97*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <4 x i32>, <4 x i32>* %array, i64 3
98*9880d681SAndroid Build Coastguard Worker  %tmp = load <4 x i32>, <4 x i32>* %arrayidx, align 16
99*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i32>*, <4 x i32>** @globalArray32x4, align 8
100*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <4 x i32>, <4 x i32>* %tmp1, i64 5
101*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %tmp, <4 x i32>* %arrayidx1, align 16
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine void @fct1_16x8(<8 x i16>* nocapture %array, i64 %offset) nounwind ssp {
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_16x8:
108*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #4
109*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
110*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
111*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
112*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <8 x i16>, <8 x i16>* %array, i64 %offset
113*9880d681SAndroid Build Coastguard Worker  %tmp = load <8 x i16>, <8 x i16>* %arrayidx, align 16
114*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i16>*, <8 x i16>** @globalArray16x8, align 8
115*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <8 x i16>, <8 x i16>* %tmp1, i64 %offset
116*9880d681SAndroid Build Coastguard Worker  store <8 x i16> %tmp, <8 x i16>* %arrayidx1, align 16
117*9880d681SAndroid Build Coastguard Worker  ret void
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine void @fct2_16x8(<8 x i16>* nocapture %array) nounwind ssp {
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_16x8:
123*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, #48]
124*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
125*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #80]
126*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <8 x i16>, <8 x i16>* %array, i64 3
127*9880d681SAndroid Build Coastguard Worker  %tmp = load <8 x i16>, <8 x i16>* %arrayidx, align 16
128*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i16>*, <8 x i16>** @globalArray16x8, align 8
129*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <8 x i16>, <8 x i16>* %tmp1, i64 5
130*9880d681SAndroid Build Coastguard Worker  store <8 x i16> %tmp, <8 x i16>* %arrayidx1, align 16
131*9880d681SAndroid Build Coastguard Worker  ret void
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine void @fct1_8x16(<16 x i8>* nocapture %array, i64 %offset) nounwind ssp {
135*9880d681SAndroid Build Coastguard Workerentry:
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_8x16:
137*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #4
138*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
139*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
140*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
141*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <16 x i8>, <16 x i8>* %array, i64 %offset
142*9880d681SAndroid Build Coastguard Worker  %tmp = load <16 x i8>, <16 x i8>* %arrayidx, align 16
143*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <16 x i8>*, <16 x i8>** @globalArray8x16, align 8
144*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <16 x i8>, <16 x i8>* %tmp1, i64 %offset
145*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %tmp, <16 x i8>* %arrayidx1, align 16
146*9880d681SAndroid Build Coastguard Worker  ret void
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine void @fct2_8x16(<16 x i8>* nocapture %array) nounwind ssp {
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_8x16:
152*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], [x0, #48]
153*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
154*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #80]
155*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <16 x i8>, <16 x i8>* %array, i64 3
156*9880d681SAndroid Build Coastguard Worker  %tmp = load <16 x i8>, <16 x i8>* %arrayidx, align 16
157*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <16 x i8>*, <16 x i8>** @globalArray8x16, align 8
158*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <16 x i8>, <16 x i8>* %tmp1, i64 5
159*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %tmp, <16 x i8>* %arrayidx1, align 16
160*9880d681SAndroid Build Coastguard Worker  ret void
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine void @fct1_64x1(<1 x i64>* nocapture %array, i64 %offset) nounwind ssp {
164*9880d681SAndroid Build Coastguard Workerentry:
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_64x1:
166*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #3
167*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
168*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
169*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
170*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <1 x i64>, <1 x i64>* %array, i64 %offset
171*9880d681SAndroid Build Coastguard Worker  %tmp = load <1 x i64>, <1 x i64>* %arrayidx, align 8
172*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <1 x i64>*, <1 x i64>** @globalArray64x1, align 8
173*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <1 x i64>, <1 x i64>* %tmp1, i64 %offset
174*9880d681SAndroid Build Coastguard Worker  store <1 x i64> %tmp, <1 x i64>* %arrayidx1, align 8
175*9880d681SAndroid Build Coastguard Worker  ret void
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine void @fct2_64x1(<1 x i64>* nocapture %array) nounwind ssp {
179*9880d681SAndroid Build Coastguard Workerentry:
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_64x1:
181*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, #24]
182*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
183*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #40]
184*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <1 x i64>, <1 x i64>* %array, i64 3
185*9880d681SAndroid Build Coastguard Worker  %tmp = load <1 x i64>, <1 x i64>* %arrayidx, align 8
186*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <1 x i64>*, <1 x i64>** @globalArray64x1, align 8
187*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <1 x i64>, <1 x i64>* %tmp1, i64 5
188*9880d681SAndroid Build Coastguard Worker  store <1 x i64> %tmp, <1 x i64>* %arrayidx1, align 8
189*9880d681SAndroid Build Coastguard Worker  ret void
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdefine void @fct1_32x2(<2 x i32>* nocapture %array, i64 %offset) nounwind ssp {
193*9880d681SAndroid Build Coastguard Workerentry:
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_32x2:
195*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #3
196*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
197*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
198*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
199*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <2 x i32>, <2 x i32>* %array, i64 %offset
200*9880d681SAndroid Build Coastguard Worker  %tmp = load <2 x i32>, <2 x i32>* %arrayidx, align 8
201*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i32>*, <2 x i32>** @globalArray32x2, align 8
202*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x i32>, <2 x i32>* %tmp1, i64 %offset
203*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %tmp, <2 x i32>* %arrayidx1, align 8
204*9880d681SAndroid Build Coastguard Worker  ret void
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine void @fct2_32x2(<2 x i32>* nocapture %array) nounwind ssp {
208*9880d681SAndroid Build Coastguard Workerentry:
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_32x2:
210*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, #24]
211*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
212*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #40]
213*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <2 x i32>, <2 x i32>* %array, i64 3
214*9880d681SAndroid Build Coastguard Worker  %tmp = load <2 x i32>, <2 x i32>* %arrayidx, align 8
215*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i32>*, <2 x i32>** @globalArray32x2, align 8
216*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x i32>, <2 x i32>* %tmp1, i64 5
217*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %tmp, <2 x i32>* %arrayidx1, align 8
218*9880d681SAndroid Build Coastguard Worker  ret void
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine void @fct1_16x4(<4 x i16>* nocapture %array, i64 %offset) nounwind ssp {
222*9880d681SAndroid Build Coastguard Workerentry:
223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_16x4:
224*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #3
225*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
226*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
227*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
228*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <4 x i16>, <4 x i16>* %array, i64 %offset
229*9880d681SAndroid Build Coastguard Worker  %tmp = load <4 x i16>, <4 x i16>* %arrayidx, align 8
230*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i16>*, <4 x i16>** @globalArray16x4, align 8
231*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <4 x i16>, <4 x i16>* %tmp1, i64 %offset
232*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %tmp, <4 x i16>* %arrayidx1, align 8
233*9880d681SAndroid Build Coastguard Worker  ret void
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerdefine void @fct2_16x4(<4 x i16>* nocapture %array) nounwind ssp {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2_16x4:
239*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, #24]
240*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
241*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], #40]
242*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <4 x i16>, <4 x i16>* %array, i64 3
243*9880d681SAndroid Build Coastguard Worker  %tmp = load <4 x i16>, <4 x i16>* %arrayidx, align 8
244*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i16>*, <4 x i16>** @globalArray16x4, align 8
245*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <4 x i16>, <4 x i16>* %tmp1, i64 5
246*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %tmp, <4 x i16>* %arrayidx1, align 8
247*9880d681SAndroid Build Coastguard Worker  ret void
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerdefine void @fct1_8x8(<8 x i8>* nocapture %array, i64 %offset) nounwind ssp {
251*9880d681SAndroid Build Coastguard Workerentry:
252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1_8x8:
253*9880d681SAndroid Build Coastguard Worker; CHECK: lsl [[SHIFTEDOFFSET:x[0-9]+]], x1, #3
254*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:d[0-9]+]], [x0, [[SHIFTEDOFFSET]]]
255*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[BASE:x[0-9]+]],
256*9880d681SAndroid Build Coastguard Worker; CHECK: str [[DEST]], {{\[}}[[BASE]], [[SHIFTEDOFFSET]]]
257*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds <8 x i8>, <8 x i8>* %array, i64 %offset
258*9880d681SAndroid Build Coastguard Worker  %tmp = load <8 x i8>, <8 x i8>* %arrayidx, align 8
259*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i8>*, <8 x i8>** @globalArray8x8, align 8
260*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <8 x i8>, <8 x i8>* %tmp1, i64 %offset
261*9880d681SAndroid Build Coastguard Worker  store <8 x i8> %tmp, <8 x i8>* %arrayidx1, align 8
262*9880d681SAndroid Build Coastguard Worker  ret void
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker; Add a bunch of tests for rdar://13258794: Match LDUR/STUR for D and Q
266*9880d681SAndroid Build Coastguard Worker; registers for unscaled vector accesses
267*9880d681SAndroid Build Coastguard Worker@str = global [63 x i8] c"Test case for rdar://13258794: LDUR/STUR for D and Q registers\00", align 1
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fct0() nounwind readonly ssp {
270*9880d681SAndroid Build Coastguard Workerentry:
271*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct0:
272*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{d[0-9]+}}, [{{x[0-9]+}}, #3]
273*9880d681SAndroid Build Coastguard Worker  %0 = load <1 x i64>, <1 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <1 x i64>*), align 8
274*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %0
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @fct1() nounwind readonly ssp {
278*9880d681SAndroid Build Coastguard Workerentry:
279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1:
280*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{d[0-9]+}}, [{{x[0-9]+}}, #3]
281*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x i32>, <2 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <2 x i32>*), align 8
282*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %0
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @fct2() nounwind readonly ssp {
286*9880d681SAndroid Build Coastguard Workerentry:
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2:
288*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{d[0-9]+}}, [{{x[0-9]+}}, #3]
289*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x i16>, <4 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <4 x i16>*), align 8
290*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %0
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @fct3() nounwind readonly ssp {
294*9880d681SAndroid Build Coastguard Workerentry:
295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct3:
296*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{d[0-9]+}}, [{{x[0-9]+}}, #3]
297*9880d681SAndroid Build Coastguard Worker  %0 = load <8 x i8>, <8 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <8 x i8>*), align 8
298*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %0
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @fct4() nounwind readonly ssp {
302*9880d681SAndroid Build Coastguard Workerentry:
303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct4:
304*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{q[0-9]+}}, [{{x[0-9]+}}, #3]
305*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x i64>, <2 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <2 x i64>*), align 16
306*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %0
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @fct5() nounwind readonly ssp {
310*9880d681SAndroid Build Coastguard Workerentry:
311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct5:
312*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{q[0-9]+}}, [{{x[0-9]+}}, #3]
313*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x i32>, <4 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <4 x i32>*), align 16
314*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %0
315*9880d681SAndroid Build Coastguard Worker}
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @fct6() nounwind readonly ssp {
318*9880d681SAndroid Build Coastguard Workerentry:
319*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct6:
320*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{q[0-9]+}}, [{{x[0-9]+}}, #3]
321*9880d681SAndroid Build Coastguard Worker  %0 = load <8 x i16>, <8 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <8 x i16>*), align 16
322*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %0
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fct7() nounwind readonly ssp {
326*9880d681SAndroid Build Coastguard Workerentry:
327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct7:
328*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{q[0-9]+}}, [{{x[0-9]+}}, #3]
329*9880d681SAndroid Build Coastguard Worker  %0 = load <16 x i8>, <16 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <16 x i8>*), align 16
330*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %0
331*9880d681SAndroid Build Coastguard Worker}
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Workerdefine void @fct8() nounwind ssp {
334*9880d681SAndroid Build Coastguard Workerentry:
335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct8:
336*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:d[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
337*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
338*9880d681SAndroid Build Coastguard Worker  %0 = load <1 x i64>, <1 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <1 x i64>*), align 8
339*9880d681SAndroid Build Coastguard Worker  store <1 x i64> %0, <1 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <1 x i64>*), align 8
340*9880d681SAndroid Build Coastguard Worker  ret void
341*9880d681SAndroid Build Coastguard Worker}
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerdefine void @fct9() nounwind ssp {
344*9880d681SAndroid Build Coastguard Workerentry:
345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct9:
346*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:d[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
347*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
348*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x i32>, <2 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <2 x i32>*), align 8
349*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %0, <2 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <2 x i32>*), align 8
350*9880d681SAndroid Build Coastguard Worker  ret void
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerdefine void @fct10() nounwind ssp {
354*9880d681SAndroid Build Coastguard Workerentry:
355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct10:
356*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:d[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
357*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
358*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x i16>, <4 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <4 x i16>*), align 8
359*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %0, <4 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <4 x i16>*), align 8
360*9880d681SAndroid Build Coastguard Worker  ret void
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerdefine void @fct11() nounwind ssp {
364*9880d681SAndroid Build Coastguard Workerentry:
365*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct11:
366*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:d[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
367*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
368*9880d681SAndroid Build Coastguard Worker  %0 = load <8 x i8>, <8 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <8 x i8>*), align 8
369*9880d681SAndroid Build Coastguard Worker  store <8 x i8> %0, <8 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <8 x i8>*), align 8
370*9880d681SAndroid Build Coastguard Worker  ret void
371*9880d681SAndroid Build Coastguard Worker}
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerdefine void @fct12() nounwind ssp {
374*9880d681SAndroid Build Coastguard Workerentry:
375*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct12:
376*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:q[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
377*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
378*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x i64>, <2 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <2 x i64>*), align 16
379*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %0, <2 x i64>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <2 x i64>*), align 16
380*9880d681SAndroid Build Coastguard Worker  ret void
381*9880d681SAndroid Build Coastguard Worker}
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerdefine void @fct13() nounwind ssp {
384*9880d681SAndroid Build Coastguard Workerentry:
385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct13:
386*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:q[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
387*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
388*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x i32>, <4 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <4 x i32>*), align 16
389*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %0, <4 x i32>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <4 x i32>*), align 16
390*9880d681SAndroid Build Coastguard Worker  ret void
391*9880d681SAndroid Build Coastguard Worker}
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerdefine void @fct14() nounwind ssp {
394*9880d681SAndroid Build Coastguard Workerentry:
395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct14:
396*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:q[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
397*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
398*9880d681SAndroid Build Coastguard Worker  %0 = load <8 x i16>, <8 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <8 x i16>*), align 16
399*9880d681SAndroid Build Coastguard Worker  store <8 x i16> %0, <8 x i16>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <8 x i16>*), align 16
400*9880d681SAndroid Build Coastguard Worker  ret void
401*9880d681SAndroid Build Coastguard Worker}
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdefine void @fct15() nounwind ssp {
404*9880d681SAndroid Build Coastguard Workerentry:
405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct15:
406*9880d681SAndroid Build Coastguard Worker; CHECK: ldur [[DESTREG:q[0-9]+]], {{\[}}[[BASEREG:x[0-9]+]], #3]
407*9880d681SAndroid Build Coastguard Worker; CHECK: stur [[DESTREG]], {{\[}}[[BASEREG]], #4]
408*9880d681SAndroid Build Coastguard Worker  %0 = load <16 x i8>, <16 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 3) to <16 x i8>*), align 16
409*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %0, <16 x i8>* bitcast (i8* getelementptr inbounds ([63 x i8], [63 x i8]* @str, i64 0, i64 4) to <16 x i8>*), align 16
410*9880d681SAndroid Build Coastguard Worker  ret void
411*9880d681SAndroid Build Coastguard Worker}
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker; Check the building of vector from a single loaded value.
414*9880d681SAndroid Build Coastguard Worker; Part of <rdar://problem/14170854>
415*9880d681SAndroid Build Coastguard Worker;
416*9880d681SAndroid Build Coastguard Worker; Single loads with immediate offset.
417*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @fct16(i8* nocapture %sp0) {
418*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct16:
419*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1]
420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.8b v0, v[[REGNUM]], v[[REGNUM]]
421*9880d681SAndroid Build Coastguard Workerentry:
422*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
423*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
424*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <8 x i8> undef, i8 %pix_sp0.0.copyload, i32 0
425*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <8 x i8> %vec, %vec
426*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vmull.i
427*9880d681SAndroid Build Coastguard Worker}
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fct17(i8* nocapture %sp0) {
430*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct17:
431*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1]
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.16b v0, v[[REGNUM]], v[[REGNUM]]
433*9880d681SAndroid Build Coastguard Workerentry:
434*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
435*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
436*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <16 x i8> undef, i8 %pix_sp0.0.copyload, i32 0
437*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <16 x i8> %vec, %vec
438*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %vmull.i
439*9880d681SAndroid Build Coastguard Worker}
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @fct18(i16* nocapture %sp0) {
442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct18:
443*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.4h v0, v[[REGNUM]], v[[REGNUM]]
445*9880d681SAndroid Build Coastguard Workerentry:
446*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
447*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
448*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <4 x i16> undef, i16 %pix_sp0.0.copyload, i32 0
449*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <4 x i16> %vec, %vec
450*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vmull.i
451*9880d681SAndroid Build Coastguard Worker}
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @fct19(i16* nocapture %sp0) {
454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct19:
455*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.8h v0, v[[REGNUM]], v[[REGNUM]]
457*9880d681SAndroid Build Coastguard Workerentry:
458*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
459*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
460*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <8 x i16> undef, i16 %pix_sp0.0.copyload, i32 0
461*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <8 x i16> %vec, %vec
462*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i
463*9880d681SAndroid Build Coastguard Worker}
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @fct20(i32* nocapture %sp0) {
466*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct20:
467*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.2s v0, v[[REGNUM]], v[[REGNUM]]
469*9880d681SAndroid Build Coastguard Workerentry:
470*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
471*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
472*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <2 x i32> undef, i32 %pix_sp0.0.copyload, i32 0
473*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <2 x i32> %vec, %vec
474*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vmull.i
475*9880d681SAndroid Build Coastguard Worker}
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @fct21(i32* nocapture %sp0) {
478*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct21:
479*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
480*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.4s v0, v[[REGNUM]], v[[REGNUM]]
481*9880d681SAndroid Build Coastguard Workerentry:
482*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
483*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
484*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <4 x i32> undef, i32 %pix_sp0.0.copyload, i32 0
485*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <4 x i32> %vec, %vec
486*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull.i
487*9880d681SAndroid Build Coastguard Worker}
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fct22(i64* nocapture %sp0) {
490*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct22:
491*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0, #8]
492*9880d681SAndroid Build Coastguard Workerentry:
493*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
494*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
495*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <1 x i64> undef, i64 %pix_sp0.0.copyload, i32 0
496*9880d681SAndroid Build Coastguard Worker   ret <1 x i64> %vec
497*9880d681SAndroid Build Coastguard Worker}
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @fct23(i64* nocapture %sp0) {
500*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct23:
501*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, #8]
502*9880d681SAndroid Build Coastguard Workerentry:
503*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
504*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
505*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <2 x i64> undef, i64 %pix_sp0.0.copyload, i32 0
506*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vec
507*9880d681SAndroid Build Coastguard Worker}
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker;
510*9880d681SAndroid Build Coastguard Worker; Single loads with register offset.
511*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @fct24(i8* nocapture %sp0, i64 %offset) {
512*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct24:
513*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1]
514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.8b v0, v[[REGNUM]], v[[REGNUM]]
515*9880d681SAndroid Build Coastguard Workerentry:
516*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
517*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
518*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <8 x i8> undef, i8 %pix_sp0.0.copyload, i32 0
519*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <8 x i8> %vec, %vec
520*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vmull.i
521*9880d681SAndroid Build Coastguard Worker}
522*9880d681SAndroid Build Coastguard Worker
523*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fct25(i8* nocapture %sp0, i64 %offset) {
524*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct25:
525*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1]
526*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.16b v0, v[[REGNUM]], v[[REGNUM]]
527*9880d681SAndroid Build Coastguard Workerentry:
528*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
529*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
530*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <16 x i8> undef, i8 %pix_sp0.0.copyload, i32 0
531*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <16 x i8> %vec, %vec
532*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %vmull.i
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @fct26(i16* nocapture %sp0, i64 %offset) {
536*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct26:
537*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.4h v0, v[[REGNUM]], v[[REGNUM]]
539*9880d681SAndroid Build Coastguard Workerentry:
540*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
541*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
542*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <4 x i16> undef, i16 %pix_sp0.0.copyload, i32 0
543*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <4 x i16> %vec, %vec
544*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vmull.i
545*9880d681SAndroid Build Coastguard Worker}
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @fct27(i16* nocapture %sp0, i64 %offset) {
548*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct27:
549*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
550*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.8h v0, v[[REGNUM]], v[[REGNUM]]
551*9880d681SAndroid Build Coastguard Workerentry:
552*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
553*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
554*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <8 x i16> undef, i16 %pix_sp0.0.copyload, i32 0
555*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <8 x i16> %vec, %vec
556*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i
557*9880d681SAndroid Build Coastguard Worker}
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @fct28(i32* nocapture %sp0, i64 %offset) {
560*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct28:
561*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
562*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.2s v0, v[[REGNUM]], v[[REGNUM]]
563*9880d681SAndroid Build Coastguard Workerentry:
564*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
565*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
566*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <2 x i32> undef, i32 %pix_sp0.0.copyload, i32 0
567*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <2 x i32> %vec, %vec
568*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vmull.i
569*9880d681SAndroid Build Coastguard Worker}
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @fct29(i32* nocapture %sp0, i64 %offset) {
572*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct29:
573*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
574*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul.4s v0, v[[REGNUM]], v[[REGNUM]]
575*9880d681SAndroid Build Coastguard Workerentry:
576*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
577*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
578*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <4 x i32> undef, i32 %pix_sp0.0.copyload, i32 0
579*9880d681SAndroid Build Coastguard Worker  %vmull.i = mul <4 x i32> %vec, %vec
580*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull.i
581*9880d681SAndroid Build Coastguard Worker}
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @fct30(i64* nocapture %sp0, i64 %offset) {
584*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct30:
585*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0, x1, lsl #3]
586*9880d681SAndroid Build Coastguard Workerentry:
587*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
588*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
589*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <1 x i64> undef, i64 %pix_sp0.0.copyload, i32 0
590*9880d681SAndroid Build Coastguard Worker   ret <1 x i64> %vec
591*9880d681SAndroid Build Coastguard Worker}
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @fct31(i64* nocapture %sp0, i64 %offset) {
594*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct31:
595*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0, x1, lsl #3]
596*9880d681SAndroid Build Coastguard Workerentry:
597*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
598*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
599*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <2 x i64> undef, i64 %pix_sp0.0.copyload, i32 0
600*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vec
601*9880d681SAndroid Build Coastguard Worker}
602