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