xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/vec-move-10.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test vector extraction to memory.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from the first element.
6*9880d681SAndroid Build Coastguard Workerdefine void @f1(<16 x i8> %val, i8 *%ptr) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 0
9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
10*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 0
11*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
12*9880d681SAndroid Build Coastguard Worker  ret void
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from the last element.
16*9880d681SAndroid Build Coastguard Workerdefine void @f2(<16 x i8> %val, i8 *%ptr) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
18*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 15
19*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
20*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 15
21*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
22*9880d681SAndroid Build Coastguard Worker  ret void
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction of an invalid element.  This must compile,
26*9880d681SAndroid Build Coastguard Worker; but we don't care what it does.
27*9880d681SAndroid Build Coastguard Workerdefine void @f3(<16 x i8> %val, i8 *%ptr) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
29*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteb %v24, 0(%r2), 16
30*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
31*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 16
32*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction with the highest in-range offset.
37*9880d681SAndroid Build Coastguard Workerdefine void @f4(<16 x i8> %val, i8 *%base) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
39*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 4095(%r2), 10
40*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
41*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%base, i32 4095
42*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 10
43*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction with the first ouf-of-range offset.
48*9880d681SAndroid Build Coastguard Workerdefine void @f5(<16 x i8> %val, i8 *%base) {
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
50*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
51*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 5
52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
53*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%base, i32 4096
54*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 5
55*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from a variable element.
60*9880d681SAndroid Build Coastguard Workerdefine void @f6(<16 x i8> %val, i8 *%ptr, i32 %index) {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
62*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteb
63*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
64*9880d681SAndroid Build Coastguard Worker  %element = extractelement <16 x i8> %val, i32 %index
65*9880d681SAndroid Build Coastguard Worker  store i8 %element, i8 *%ptr
66*9880d681SAndroid Build Coastguard Worker  ret void
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from the first element.
70*9880d681SAndroid Build Coastguard Workerdefine void @f7(<8 x i16> %val, i16 *%ptr) {
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
72*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 0
73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
74*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 0
75*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
76*9880d681SAndroid Build Coastguard Worker  ret void
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from the last element.
80*9880d681SAndroid Build Coastguard Workerdefine void @f8(<8 x i16> %val, i16 *%ptr) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
82*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 7
83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
84*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 7
85*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
86*9880d681SAndroid Build Coastguard Worker  ret void
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction of an invalid element.  This must compile,
90*9880d681SAndroid Build Coastguard Worker; but we don't care what it does.
91*9880d681SAndroid Build Coastguard Workerdefine void @f9(<8 x i16> %val, i16 *%ptr) {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
93*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteh %v24, 0(%r2), 8
94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
95*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 8
96*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction with the highest in-range offset.
101*9880d681SAndroid Build Coastguard Workerdefine void @f10(<8 x i16> %val, i16 *%base) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
103*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 4094(%r2), 5
104*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
105*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i16, i16 *%base, i32 2047
106*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 5
107*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
108*9880d681SAndroid Build Coastguard Worker  ret void
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction with the first ouf-of-range offset.
112*9880d681SAndroid Build Coastguard Workerdefine void @f11(<8 x i16> %val, i16 *%base) {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
114*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
115*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 1
116*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
117*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i16, i16 *%base, i32 2048
118*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 1
119*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
120*9880d681SAndroid Build Coastguard Worker  ret void
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from a variable element.
124*9880d681SAndroid Build Coastguard Workerdefine void @f12(<8 x i16> %val, i16 *%ptr, i32 %index) {
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteh
127*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
128*9880d681SAndroid Build Coastguard Worker  %element = extractelement <8 x i16> %val, i32 %index
129*9880d681SAndroid Build Coastguard Worker  store i16 %element, i16 *%ptr
130*9880d681SAndroid Build Coastguard Worker  ret void
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from the first element.
134*9880d681SAndroid Build Coastguard Workerdefine void @f13(<4 x i32> %val, i32 *%ptr) {
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
136*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 0
137*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
138*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 0
139*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
140*9880d681SAndroid Build Coastguard Worker  ret void
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from the last element.
144*9880d681SAndroid Build Coastguard Workerdefine void @f14(<4 x i32> %val, i32 *%ptr) {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
146*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 3
147*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
148*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 3
149*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
150*9880d681SAndroid Build Coastguard Worker  ret void
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction of an invalid element.  This must compile,
154*9880d681SAndroid Build Coastguard Worker; but we don't care what it does.
155*9880d681SAndroid Build Coastguard Workerdefine void @f15(<4 x i32> %val, i32 *%ptr) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef %v24, 0(%r2), 4
158*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
159*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 4
160*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
161*9880d681SAndroid Build Coastguard Worker  ret void
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction with the highest in-range offset.
165*9880d681SAndroid Build Coastguard Workerdefine void @f16(<4 x i32> %val, i32 *%base) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
167*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 4092(%r2), 2
168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
169*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i32, i32 *%base, i32 1023
170*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 2
171*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction with the first ouf-of-range offset.
176*9880d681SAndroid Build Coastguard Workerdefine void @f17(<4 x i32> %val, i32 *%base) {
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
178*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
179*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 1
180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
181*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i32, i32 *%base, i32 1024
182*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 1
183*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
184*9880d681SAndroid Build Coastguard Worker  ret void
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from a variable element.
188*9880d681SAndroid Build Coastguard Workerdefine void @f18(<4 x i32> %val, i32 *%ptr, i32 %index) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
190*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef
191*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
192*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 %index
193*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
194*9880d681SAndroid Build Coastguard Worker  ret void
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from the first element.
198*9880d681SAndroid Build Coastguard Workerdefine void @f19(<2 x i64> %val, i64 *%ptr) {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
200*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0
201*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
202*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 0
203*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
204*9880d681SAndroid Build Coastguard Worker  ret void
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from the last element.
208*9880d681SAndroid Build Coastguard Workerdefine void @f20(<2 x i64> %val, i64 *%ptr) {
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
210*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 1
211*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
212*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 1
213*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
214*9880d681SAndroid Build Coastguard Worker  ret void
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction of an invalid element.  This must compile,
218*9880d681SAndroid Build Coastguard Worker; but we don't care what it does.
219*9880d681SAndroid Build Coastguard Workerdefine void @f21(<2 x i64> %val, i64 *%ptr) {
220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
221*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg %v24, 0(%r2), 2
222*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
223*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 2
224*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
225*9880d681SAndroid Build Coastguard Worker  ret void
226*9880d681SAndroid Build Coastguard Worker}
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction with the highest in-range offset.
229*9880d681SAndroid Build Coastguard Workerdefine void @f22(<2 x i64> %val, i64 *%base) {
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
231*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 4088(%r2), 1
232*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
233*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i64, i64 *%base, i32 511
234*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 1
235*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
236*9880d681SAndroid Build Coastguard Worker  ret void
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction with the first ouf-of-range offset.
240*9880d681SAndroid Build Coastguard Workerdefine void @f23(<2 x i64> %val, i64 *%base) {
241*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
242*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
243*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0
244*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
245*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i64, i64 *%base, i32 512
246*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 0
247*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
248*9880d681SAndroid Build Coastguard Worker  ret void
249*9880d681SAndroid Build Coastguard Worker}
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from a variable element.
252*9880d681SAndroid Build Coastguard Workerdefine void @f24(<2 x i64> %val, i64 *%ptr, i32 %index) {
253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
254*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg
255*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
256*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 %index
257*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
258*9880d681SAndroid Build Coastguard Worker  ret void
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from the first element.
262*9880d681SAndroid Build Coastguard Workerdefine void @f25(<4 x float> %val, float *%ptr) {
263*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
264*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 0
265*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
266*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 0
267*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
268*9880d681SAndroid Build Coastguard Worker  ret void
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from the last element.
272*9880d681SAndroid Build Coastguard Workerdefine void @f26(<4 x float> %val, float *%ptr) {
273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26:
274*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 3
275*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
276*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 3
277*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
278*9880d681SAndroid Build Coastguard Worker  ret void
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction of an invalid element.  This must compile,
282*9880d681SAndroid Build Coastguard Worker; but we don't care what it does.
283*9880d681SAndroid Build Coastguard Workerdefine void @f27(<4 x float> %val, float *%ptr) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27:
285*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef %v24, 0(%r2), 4
286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
287*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 4
288*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
289*9880d681SAndroid Build Coastguard Worker  ret void
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction with the highest in-range offset.
293*9880d681SAndroid Build Coastguard Workerdefine void @f28(<4 x float> %val, float *%base) {
294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28:
295*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 4092(%r2), 2
296*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
297*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr float, float *%base, i32 1023
298*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 2
299*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
300*9880d681SAndroid Build Coastguard Worker  ret void
301*9880d681SAndroid Build Coastguard Worker}
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction with the first ouf-of-range offset.
304*9880d681SAndroid Build Coastguard Workerdefine void @f29(<4 x float> %val, float *%base) {
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29:
306*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
307*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 1
308*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
309*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr float, float *%base, i32 1024
310*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 1
311*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
312*9880d681SAndroid Build Coastguard Worker  ret void
313*9880d681SAndroid Build Coastguard Worker}
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from a variable element.
316*9880d681SAndroid Build Coastguard Workerdefine void @f30(<4 x float> %val, float *%ptr, i32 %index) {
317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30:
318*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef
319*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
320*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 %index
321*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
322*9880d681SAndroid Build Coastguard Worker  ret void
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from the first element.
326*9880d681SAndroid Build Coastguard Workerdefine void @f32(<2 x double> %val, double *%ptr) {
327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32:
328*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0
329*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
330*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 0
331*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
332*9880d681SAndroid Build Coastguard Worker  ret void
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from the last element.
336*9880d681SAndroid Build Coastguard Workerdefine void @f33(<2 x double> %val, double *%ptr) {
337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f33:
338*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 1
339*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
340*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 1
341*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
342*9880d681SAndroid Build Coastguard Worker  ret void
343*9880d681SAndroid Build Coastguard Worker}
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction with the highest in-range offset.
346*9880d681SAndroid Build Coastguard Workerdefine void @f34(<2 x double> %val, double *%base) {
347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f34:
348*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 4088(%r2), 1
349*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
350*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr double, double *%base, i32 511
351*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 1
352*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
353*9880d681SAndroid Build Coastguard Worker  ret void
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction with the first ouf-of-range offset.
357*9880d681SAndroid Build Coastguard Workerdefine void @f35(<2 x double> %val, double *%base) {
358*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f35:
359*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
360*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0
361*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
362*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr double, double *%base, i32 512
363*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 0
364*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
365*9880d681SAndroid Build Coastguard Worker  ret void
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from a variable element.
369*9880d681SAndroid Build Coastguard Workerdefine void @f36(<2 x double> %val, double *%ptr, i32 %index) {
370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f36:
371*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg
372*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
373*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 %index
374*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
375*9880d681SAndroid Build Coastguard Worker  ret void
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter of the first element.
379*9880d681SAndroid Build Coastguard Workerdefine void @f37(<4 x i32> %val, <4 x i32> %index, i64 %base) {
380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f37:
381*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 0
382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
383*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 0
384*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
385*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
386*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
387*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 0
388*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
389*9880d681SAndroid Build Coastguard Worker  ret void
390*9880d681SAndroid Build Coastguard Worker}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter of the last element.
393*9880d681SAndroid Build Coastguard Workerdefine void @f38(<4 x i32> %val, <4 x i32> %index, i64 %base) {
394*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f38:
395*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 3
396*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
397*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 3
398*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
399*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
400*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
401*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 3
402*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
403*9880d681SAndroid Build Coastguard Worker  ret void
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter with the highest in-range offset.
407*9880d681SAndroid Build Coastguard Workerdefine void @f39(<4 x i32> %val, <4 x i32> %index, i64 %base) {
408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f39:
409*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 4095(%v26,%r2), 1
410*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
411*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 1
412*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
413*9880d681SAndroid Build Coastguard Worker  %add1 = add i64 %base, %ext
414*9880d681SAndroid Build Coastguard Worker  %add2 = add i64 %add1, 4095
415*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add2 to i32 *
416*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x i32> %val, i32 1
417*9880d681SAndroid Build Coastguard Worker  store i32 %element, i32 *%ptr
418*9880d681SAndroid Build Coastguard Worker  ret void
419*9880d681SAndroid Build Coastguard Worker}
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker; Test a v2i64 scatter of the first element.
422*9880d681SAndroid Build Coastguard Workerdefine void @f40(<2 x i64> %val, <2 x i64> %index, i64 %base) {
423*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f40:
424*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 0
425*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
426*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 0
427*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
428*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i64 *
429*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 0
430*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
431*9880d681SAndroid Build Coastguard Worker  ret void
432*9880d681SAndroid Build Coastguard Worker}
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker; Test a v2i64 scatter of the last element.
435*9880d681SAndroid Build Coastguard Workerdefine void @f41(<2 x i64> %val, <2 x i64> %index, i64 %base) {
436*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f41:
437*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 1
438*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
439*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 1
440*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
441*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i64 *
442*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x i64> %val, i32 1
443*9880d681SAndroid Build Coastguard Worker  store i64 %element, i64 *%ptr
444*9880d681SAndroid Build Coastguard Worker  ret void
445*9880d681SAndroid Build Coastguard Worker}
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker; Test a v4f32 scatter of the first element.
448*9880d681SAndroid Build Coastguard Workerdefine void @f42(<4 x float> %val, <4 x i32> %index, i64 %base) {
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f42:
450*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 0
451*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
452*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 0
453*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
454*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
455*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to float *
456*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 0
457*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
458*9880d681SAndroid Build Coastguard Worker  ret void
459*9880d681SAndroid Build Coastguard Worker}
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker; Test a v4f32 scatter of the last element.
462*9880d681SAndroid Build Coastguard Workerdefine void @f43(<4 x float> %val, <4 x i32> %index, i64 %base) {
463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f43:
464*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 3
465*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
466*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 3
467*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
468*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
469*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to float *
470*9880d681SAndroid Build Coastguard Worker  %element = extractelement <4 x float> %val, i32 3
471*9880d681SAndroid Build Coastguard Worker  store float %element, float *%ptr
472*9880d681SAndroid Build Coastguard Worker  ret void
473*9880d681SAndroid Build Coastguard Worker}
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker; Test a v2f64 scatter of the first element.
476*9880d681SAndroid Build Coastguard Workerdefine void @f44(<2 x double> %val, <2 x i64> %index, i64 %base) {
477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f44:
478*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 0
479*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
480*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 0
481*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
482*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to double *
483*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 0
484*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
485*9880d681SAndroid Build Coastguard Worker  ret void
486*9880d681SAndroid Build Coastguard Worker}
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Worker; Test a v2f64 scatter of the last element.
489*9880d681SAndroid Build Coastguard Workerdefine void @f45(<2 x double> %val, <2 x i64> %index, i64 %base) {
490*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f45:
491*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 1
492*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
493*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 1
494*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
495*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to double *
496*9880d681SAndroid Build Coastguard Worker  %element = extractelement <2 x double> %val, i32 1
497*9880d681SAndroid Build Coastguard Worker  store double %element, double *%ptr
498*9880d681SAndroid Build Coastguard Worker  ret void
499*9880d681SAndroid Build Coastguard Worker}
500