[PowerPC] Cleanup cost model for unaligned vector loads/stores
[oota-llvm.git] / test / CodeGen / PowerPC / unal-vec-ldst.ll
1 ; RUN: llc < %s | FileCheck %s
2 target datalayout = "E-m:e-i64:64-n32:64"
3 target triple = "powerpc64-unknown-linux-gnu"
4
5 define <16 x i8> @test_l_v16i8(<16 x i8>* %p) #0 {
6 entry:
7   %r = load <16 x i8>, <16 x i8>* %p, align 1
8   ret <16 x i8> %r
9
10 ; CHECK-LABEL: @test_l_v16i8
11 ; CHECK-DAG: li [[REG1:[0-9]+]], 15
12 ; CHECK-DAG: lvsl [[REG2:[0-9]+]], 0, 3
13 ; CHECK-DAG: lvx [[REG3:[0-9]+]], 3, [[REG1]]
14 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 0, 3
15 ; CHECK: vperm 2, [[REG4]], [[REG3]], [[REG2]]
16 ; CHECK: blr
17 }
18
19 define <32 x i8> @test_l_v32i8(<32 x i8>* %p) #0 {
20 entry:
21   %r = load <32 x i8>, <32 x i8>* %p, align 1
22   ret <32 x i8> %r
23
24 ; CHECK-LABEL: @test_l_v32i8
25 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
26 ; CHECK-DAG: li [[REG2:[0-9]+]], 16
27 ; CHECK-DAG: lvsl [[REG3:[0-9]+]], 0, 3
28 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 3, [[REG1]]
29 ; CHECK-DAG: lvx [[REG5:[0-9]+]], 3, [[REG2]]
30 ; CHECK-DAG: lvx [[REG6:[0-9]+]], 0, 3
31 ; CHECK-DAG: vperm 3, [[REG5]], [[REG4]], [[REG3]]
32 ; CHECK-DAG: vperm 2, [[REG6]], [[REG5]], [[REG3]]
33 ; CHECK: blr
34 }
35
36 define <8 x i16> @test_l_v8i16(<8 x i16>* %p) #0 {
37 entry:
38   %r = load <8 x i16>, <8 x i16>* %p, align 2
39   ret <8 x i16> %r
40
41 ; CHECK-LABEL: @test_l_v8i16
42 ; CHECK-DAG: li [[REG1:[0-9]+]], 15
43 ; CHECK-DAG: lvsl [[REG2:[0-9]+]], 0, 3
44 ; CHECK-DAG: lvx [[REG3:[0-9]+]], 3, [[REG1]]
45 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 0, 3
46 ; CHECK: vperm 2, [[REG4]], [[REG3]], [[REG2]]
47 ; CHECK: blr
48 }
49
50 define <16 x i16> @test_l_v16i16(<16 x i16>* %p) #0 {
51 entry:
52   %r = load <16 x i16>, <16 x i16>* %p, align 2
53   ret <16 x i16> %r
54
55 ; CHECK-LABEL: @test_l_v16i16
56 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
57 ; CHECK-DAG: li [[REG2:[0-9]+]], 16
58 ; CHECK-DAG: lvsl [[REG3:[0-9]+]], 0, 3
59 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 3, [[REG1]]
60 ; CHECK-DAG: lvx [[REG5:[0-9]+]], 3, [[REG2]]
61 ; CHECK-DAG: lvx [[REG6:[0-9]+]], 0, 3
62 ; CHECK-DAG: vperm 3, [[REG5]], [[REG4]], [[REG3]]
63 ; CHECK-DAG: vperm 2, [[REG6]], [[REG5]], [[REG3]]
64 ; CHECK: blr
65 }
66
67 define <4 x i32> @test_l_v4i32(<4 x i32>* %p) #0 {
68 entry:
69   %r = load <4 x i32>, <4 x i32>* %p, align 4
70   ret <4 x i32> %r
71
72 ; CHECK-LABEL: @test_l_v4i32
73 ; CHECK-DAG: li [[REG1:[0-9]+]], 15
74 ; CHECK-DAG: lvsl [[REG2:[0-9]+]], 0, 3
75 ; CHECK-DAG: lvx [[REG3:[0-9]+]], 3, [[REG1]]
76 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 0, 3
77 ; CHECK: vperm 2, [[REG4]], [[REG3]], [[REG2]]
78 ; CHECK: blr
79 }
80
81 define <8 x i32> @test_l_v8i32(<8 x i32>* %p) #0 {
82 entry:
83   %r = load <8 x i32>, <8 x i32>* %p, align 4
84   ret <8 x i32> %r
85
86 ; CHECK-LABEL: @test_l_v8i32
87 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
88 ; CHECK-DAG: li [[REG2:[0-9]+]], 16
89 ; CHECK-DAG: lvsl [[REG3:[0-9]+]], 0, 3
90 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 3, [[REG1]]
91 ; CHECK-DAG: lvx [[REG5:[0-9]+]], 3, [[REG2]]
92 ; CHECK-DAG: lvx [[REG6:[0-9]+]], 0, 3
93 ; CHECK-DAG: vperm 3, [[REG5]], [[REG4]], [[REG3]]
94 ; CHECK-DAG: vperm 2, [[REG6]], [[REG5]], [[REG3]]
95 ; CHECK: blr
96 }
97
98 define <2 x i64> @test_l_v2i64(<2 x i64>* %p) #0 {
99 entry:
100   %r = load <2 x i64>, <2 x i64>* %p, align 8
101   ret <2 x i64> %r
102
103 ; CHECK-LABEL: @test_l_v2i64
104 ; CHECK: lxvd2x 34, 0, 3
105 ; CHECK: blr
106 }
107
108 define <4 x i64> @test_l_v4i64(<4 x i64>* %p) #0 {
109 entry:
110   %r = load <4 x i64>, <4 x i64>* %p, align 8
111   ret <4 x i64> %r
112
113 ; CHECK-LABEL: @test_l_v4i64
114 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
115 ; CHECK-DAG: lxvd2x 34, 0, 3
116 ; CHECK-DAG: lxvd2x 35, 3, [[REG1]]
117 ; CHECK: blr
118 }
119
120 define <4 x float> @test_l_v4float(<4 x float>* %p) #0 {
121 entry:
122   %r = load <4 x float>, <4 x float>* %p, align 4
123   ret <4 x float> %r
124
125 ; CHECK-LABEL: @test_l_v4float
126 ; CHECK-DAG: li [[REG1:[0-9]+]], 15
127 ; CHECK-DAG: lvsl [[REG2:[0-9]+]], 0, 3
128 ; CHECK-DAG: lvx [[REG3:[0-9]+]], 3, [[REG1]]
129 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 0, 3
130 ; CHECK: vperm 2, [[REG4]], [[REG3]], [[REG2]]
131 ; CHECK: blr
132 }
133
134 define <8 x float> @test_l_v8float(<8 x float>* %p) #0 {
135 entry:
136   %r = load <8 x float>, <8 x float>* %p, align 4
137   ret <8 x float> %r
138
139 ; CHECK-LABEL: @test_l_v8float
140 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
141 ; CHECK-DAG: li [[REG2:[0-9]+]], 16
142 ; CHECK-DAG: lvsl [[REG3:[0-9]+]], 0, 3
143 ; CHECK-DAG: lvx [[REG4:[0-9]+]], 3, [[REG1]]
144 ; CHECK-DAG: lvx [[REG5:[0-9]+]], 3, [[REG2]]
145 ; CHECK-DAG: lvx [[REG6:[0-9]+]], 0, 3
146 ; CHECK-DAG: vperm 3, [[REG5]], [[REG4]], [[REG3]]
147 ; CHECK-DAG: vperm 2, [[REG6]], [[REG5]], [[REG3]]
148 ; CHECK: blr
149 }
150
151 define <2 x double> @test_l_v2double(<2 x double>* %p) #0 {
152 entry:
153   %r = load <2 x double>, <2 x double>* %p, align 8
154   ret <2 x double> %r
155
156 ; CHECK-LABEL: @test_l_v2double
157 ; CHECK: lxvd2x 34, 0, 3
158 ; CHECK: blr
159 }
160
161 define <4 x double> @test_l_v4double(<4 x double>* %p) #0 {
162 entry:
163   %r = load <4 x double>, <4 x double>* %p, align 8
164   ret <4 x double> %r
165
166 ; CHECK-LABEL: @test_l_v4double
167 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
168 ; CHECK-DAG: lxvd2x 34, 0, 3
169 ; CHECK-DAG: lxvd2x 35, 3, [[REG1]]
170 ; CHECK: blr
171 }
172
173 define <16 x i8> @test_l_p8v16i8(<16 x i8>* %p) #2 {
174 entry:
175   %r = load <16 x i8>, <16 x i8>* %p, align 1
176   ret <16 x i8> %r
177
178 ; CHECK-LABEL: @test_l_p8v16i8
179 ; CHECK: lxvw4x 34, 0, 3
180 ; CHECK: blr
181 }
182
183 define <32 x i8> @test_l_p8v32i8(<32 x i8>* %p) #2 {
184 entry:
185   %r = load <32 x i8>, <32 x i8>* %p, align 1
186   ret <32 x i8> %r
187
188 ; CHECK-LABEL: @test_l_p8v32i8
189 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
190 ; CHECK-DAG: lxvw4x 34, 0, 3
191 ; CHECK-DAG: lxvw4x 35, 3, [[REG1]]
192 ; CHECK: blr
193 }
194
195 define <8 x i16> @test_l_p8v8i16(<8 x i16>* %p) #2 {
196 entry:
197   %r = load <8 x i16>, <8 x i16>* %p, align 2
198   ret <8 x i16> %r
199
200 ; CHECK-LABEL: @test_l_p8v8i16
201 ; CHECK: lxvw4x 34, 0, 3
202 ; CHECK: blr
203 }
204
205 define <16 x i16> @test_l_p8v16i16(<16 x i16>* %p) #2 {
206 entry:
207   %r = load <16 x i16>, <16 x i16>* %p, align 2
208   ret <16 x i16> %r
209
210 ; CHECK-LABEL: @test_l_p8v16i16
211 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
212 ; CHECK-DAG: lxvw4x 34, 0, 3
213 ; CHECK-DAG: lxvw4x 35, 3, [[REG1]]
214 ; CHECK: blr
215 }
216
217 define <4 x i32> @test_l_p8v4i32(<4 x i32>* %p) #2 {
218 entry:
219   %r = load <4 x i32>, <4 x i32>* %p, align 4
220   ret <4 x i32> %r
221
222 ; CHECK-LABEL: @test_l_p8v4i32
223 ; CHECK: lxvw4x 34, 0, 3
224 ; CHECK: blr
225 }
226
227 define <8 x i32> @test_l_p8v8i32(<8 x i32>* %p) #2 {
228 entry:
229   %r = load <8 x i32>, <8 x i32>* %p, align 4
230   ret <8 x i32> %r
231
232 ; CHECK-LABEL: @test_l_p8v8i32
233 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
234 ; CHECK-DAG: lxvw4x 34, 0, 3
235 ; CHECK-DAG: lxvw4x 35, 3, [[REG1]]
236 ; CHECK: blr
237 }
238
239 define <2 x i64> @test_l_p8v2i64(<2 x i64>* %p) #2 {
240 entry:
241   %r = load <2 x i64>, <2 x i64>* %p, align 8
242   ret <2 x i64> %r
243
244 ; CHECK-LABEL: @test_l_p8v2i64
245 ; CHECK: lxvd2x 34, 0, 3
246 ; CHECK: blr
247 }
248
249 define <4 x i64> @test_l_p8v4i64(<4 x i64>* %p) #2 {
250 entry:
251   %r = load <4 x i64>, <4 x i64>* %p, align 8
252   ret <4 x i64> %r
253
254 ; CHECK-LABEL: @test_l_p8v4i64
255 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
256 ; CHECK-DAG: lxvd2x 34, 0, 3
257 ; CHECK-DAG: lxvd2x 35, 3, [[REG1]]
258 ; CHECK: blr
259 }
260
261 define <4 x float> @test_l_p8v4float(<4 x float>* %p) #2 {
262 entry:
263   %r = load <4 x float>, <4 x float>* %p, align 4
264   ret <4 x float> %r
265
266 ; CHECK-LABEL: @test_l_p8v4float
267 ; CHECK: lxvw4x 34, 0, 3
268 ; CHECK: blr
269 }
270
271 define <8 x float> @test_l_p8v8float(<8 x float>* %p) #2 {
272 entry:
273   %r = load <8 x float>, <8 x float>* %p, align 4
274   ret <8 x float> %r
275
276 ; CHECK-LABEL: @test_l_p8v8float
277 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
278 ; CHECK-DAG: lxvw4x 34, 0, 3
279 ; CHECK-DAG: lxvw4x 35, 3, [[REG1]]
280 ; CHECK: blr
281 }
282
283 define <2 x double> @test_l_p8v2double(<2 x double>* %p) #2 {
284 entry:
285   %r = load <2 x double>, <2 x double>* %p, align 8
286   ret <2 x double> %r
287
288 ; CHECK-LABEL: @test_l_p8v2double
289 ; CHECK: lxvd2x 34, 0, 3
290 ; CHECK: blr
291 }
292
293 define <4 x double> @test_l_p8v4double(<4 x double>* %p) #2 {
294 entry:
295   %r = load <4 x double>, <4 x double>* %p, align 8
296   ret <4 x double> %r
297
298 ; CHECK-LABEL: @test_l_p8v4double
299 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
300 ; CHECK-DAG: lxvd2x 34, 0, 3
301 ; CHECK-DAG: lxvd2x 35, 3, [[REG1]]
302 ; CHECK: blr
303 }
304
305 define <4 x float> @test_l_qv4float(<4 x float>* %p) #1 {
306 entry:
307   %r = load <4 x float>, <4 x float>* %p, align 4
308   ret <4 x float> %r
309
310 ; CHECK-LABEL: @test_l_qv4float
311 ; CHECK-DAG: li [[REG1:[0-9]+]], 15
312 ; CHECK-DAG: qvlpclsx 0, 0, 3
313 ; CHECK-DAG: qvlfsx [[REG2:[0-9]+]], 3, [[REG1]]
314 ; CHECK-DAG: qvlfsx [[REG3:[0-9]+]], 0, 3
315 ; CHECK: qvfperm 1, [[REG3]], [[REG2]], 0
316 ; CHECK: blr
317 }
318
319 define <8 x float> @test_l_qv8float(<8 x float>* %p) #1 {
320 entry:
321   %r = load <8 x float>, <8 x float>* %p, align 4
322   ret <8 x float> %r
323
324 ; CHECK-LABEL: @test_l_qv8float
325 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
326 ; CHECK-DAG: li [[REG2:[0-9]+]], 16
327 ; CHECK-DAG: qvlfsx [[REG3:[0-9]+]], 3, [[REG1]]
328 ; CHECK-DAG: qvlfsx [[REG4:[0-9]+]], 3, [[REG2]]
329 ; CHECK-DAG: qvlpclsx [[REG5:[0-5]+]], 0, 3
330 ; CHECK-DAG: qvlfsx [[REG6:[0-9]+]], 0, 3
331 ; CHECK-DAG: qvfperm 2, [[REG4]], [[REG3]], [[REG5]]
332 ; CHECK-DAG: qvfperm 1, [[REG6]], [[REG4]], [[REG5]]
333 ; CHECK: blr
334 }
335
336 define <4 x double> @test_l_qv4double(<4 x double>* %p) #1 {
337 entry:
338   %r = load <4 x double>, <4 x double>* %p, align 8
339   ret <4 x double> %r
340
341 ; CHECK-LABEL: @test_l_qv4double
342 ; CHECK-DAG: li [[REG1:[0-9]+]], 31
343 ; CHECK-DAG: qvlpcldx 0, 0, 3
344 ; CHECK-DAG: qvlfdx [[REG2:[0-9]+]], 3, [[REG1]]
345 ; CHECK-DAG: qvlfdx [[REG3:[0-9]+]], 0, 3
346 ; CHECK: qvfperm 1, [[REG3]], [[REG2]], 0
347 ; CHECK: blr
348 }
349
350 define <8 x double> @test_l_qv8double(<8 x double>* %p) #1 {
351 entry:
352   %r = load <8 x double>, <8 x double>* %p, align 8
353   ret <8 x double> %r
354
355 ; CHECK-LABEL: @test_l_qv8double
356 ; CHECK-DAG: li [[REG1:[0-9]+]], 63
357 ; CHECK-DAG: li [[REG2:[0-9]+]], 32
358 ; CHECK-DAG: qvlfdx [[REG3:[0-9]+]], 3, [[REG1]]
359 ; CHECK-DAG: qvlfdx [[REG4:[0-9]+]], 3, [[REG2]]
360 ; CHECK-DAG: qvlpcldx [[REG5:[0-5]+]], 0, 3
361 ; CHECK-DAG: qvlfdx [[REG6:[0-9]+]], 0, 3
362 ; CHECK-DAG: qvfperm 2, [[REG4]], [[REG3]], [[REG5]]
363 ; CHECK-DAG: qvfperm 1, [[REG6]], [[REG4]], [[REG5]]
364 ; CHECK: blr
365 }
366
367 define void @test_s_v16i8(<16 x i8>* %p, <16 x i8> %v) #0 {
368 entry:
369   store <16 x i8> %v, <16 x i8>* %p, align 1
370   ret void
371
372 ; CHECK-LABEL: @test_s_v16i8
373 ; CHECK: stxvw4x 34, 0, 3
374 ; CHECK: blr
375 }
376
377 define void @test_s_v32i8(<32 x i8>* %p, <32 x i8> %v) #0 {
378 entry:
379   store <32 x i8> %v, <32 x i8>* %p, align 1
380   ret void
381
382 ; CHECK-LABEL: @test_s_v32i8
383 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
384 ; CHECK-DAG: stxvw4x 35, 3, [[REG1]]
385 ; CHECK-DAG: stxvw4x 34, 0, 3
386 ; CHECK: blr
387 }
388
389 define void @test_s_v8i16(<8 x i16>* %p, <8 x i16> %v) #0 {
390 entry:
391   store <8 x i16> %v, <8 x i16>* %p, align 2
392   ret void
393
394 ; CHECK-LABEL: @test_s_v8i16
395 ; CHECK: stxvw4x 34, 0, 3
396 ; CHECK: blr
397 }
398
399 define void @test_s_v16i16(<16 x i16>* %p, <16 x i16> %v) #0 {
400 entry:
401   store <16 x i16> %v, <16 x i16>* %p, align 2
402   ret void
403
404 ; CHECK-LABEL: @test_s_v16i16
405 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
406 ; CHECK-DAG: stxvw4x 35, 3, [[REG1]]
407 ; CHECK-DAG: stxvw4x 34, 0, 3
408 ; CHECK: blr
409 }
410
411 define void @test_s_v4i32(<4 x i32>* %p, <4 x i32> %v) #0 {
412 entry:
413   store <4 x i32> %v, <4 x i32>* %p, align 4
414   ret void
415
416 ; CHECK-LABEL: @test_s_v4i32
417 ; CHECK: stxvw4x 34, 0, 3
418 ; CHECK: blr
419 }
420
421 define void @test_s_v8i32(<8 x i32>* %p, <8 x i32> %v) #0 {
422 entry:
423   store <8 x i32> %v, <8 x i32>* %p, align 4
424   ret void
425
426 ; CHECK-LABEL: @test_s_v8i32
427 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
428 ; CHECK-DAG: stxvw4x 35, 3, [[REG1]]
429 ; CHECK-DAG: stxvw4x 34, 0, 3
430 ; CHECK: blr
431 }
432
433 define void @test_s_v2i64(<2 x i64>* %p, <2 x i64> %v) #0 {
434 entry:
435   store <2 x i64> %v, <2 x i64>* %p, align 8
436   ret void
437
438 ; CHECK-LABEL: @test_s_v2i64
439 ; CHECK: stxvd2x 34, 0, 3
440 ; CHECK: blr
441 }
442
443 define void @test_s_v4i64(<4 x i64>* %p, <4 x i64> %v) #0 {
444 entry:
445   store <4 x i64> %v, <4 x i64>* %p, align 8
446   ret void
447
448 ; CHECK-LABEL: @test_s_v4i64
449 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
450 ; CHECK-DAG: stxvd2x 35, 3, [[REG1]]
451 ; CHECK-DAG: stxvd2x 34, 0, 3
452 ; CHECK: blr
453 }
454
455 define void @test_s_v4float(<4 x float>* %p, <4 x float> %v) #0 {
456 entry:
457   store <4 x float> %v, <4 x float>* %p, align 4
458   ret void
459
460 ; CHECK-LABEL: @test_s_v4float
461 ; CHECK: stxvw4x 34, 0, 3
462 ; CHECK: blr
463 }
464
465 define void @test_s_v8float(<8 x float>* %p, <8 x float> %v) #0 {
466 entry:
467   store <8 x float> %v, <8 x float>* %p, align 4
468   ret void
469
470 ; CHECK-LABEL: @test_s_v8float
471 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
472 ; CHECK-DAG: stxvw4x 35, 3, [[REG1]]
473 ; CHECK-DAG: stxvw4x 34, 0, 3
474 ; CHECK: blr
475 }
476
477 define void @test_s_v2double(<2 x double>* %p, <2 x double> %v) #0 {
478 entry:
479   store <2 x double> %v, <2 x double>* %p, align 8
480   ret void
481
482 ; CHECK-LABEL: @test_s_v2double
483 ; CHECK: stxvd2x 34, 0, 3
484 ; CHECK: blr
485 }
486
487 define void @test_s_v4double(<4 x double>* %p, <4 x double> %v) #0 {
488 entry:
489   store <4 x double> %v, <4 x double>* %p, align 8
490   ret void
491
492 ; CHECK-LABEL: @test_s_v4double
493 ; CHECK-DAG: li [[REG1:[0-9]+]], 16
494 ; CHECK-DAG: stxvd2x 35, 3, [[REG1]]
495 ; CHECK-DAG: stxvd2x 34, 0, 3
496 ; CHECK: blr
497 }
498
499 define void @test_s_qv4float(<4 x float>* %p, <4 x float> %v) #1 {
500 entry:
501   store <4 x float> %v, <4 x float>* %p, align 4
502   ret void
503
504 ; CHECK-LABEL: @test_s_qv4float
505 ; CHECK-DAG: qvesplati [[REG1:[0-9]+]], 1, 3
506 ; CHECK-DAG: qvesplati [[REG2:[0-9]+]], 1, 2
507 ; CHECK-DAG: qvesplati [[REG3:[0-9]+]], 1, 1
508 ; CHECK-DAG: stfs 1, 0(3)
509 ; CHECK-DAG: stfs [[REG1]], 12(3)
510 ; CHECK-DAG: stfs [[REG2]], 8(3)
511 ; CHECK-DAG: stfs [[REG3]], 4(3)
512 ; CHECK: blr
513 }
514
515 define void @test_s_qv8float(<8 x float>* %p, <8 x float> %v) #1 {
516 entry:
517   store <8 x float> %v, <8 x float>* %p, align 4
518   ret void
519
520 ; CHECK-LABEL: @test_s_qv8float
521 ; CHECK-DAG: qvesplati [[REG1:[0-9]+]], 2, 3
522 ; CHECK-DAG: qvesplati [[REG2:[0-9]+]], 2, 2
523 ; CHECK-DAG: qvesplati [[REG3:[0-9]+]], 2, 1
524 ; CHECK-DAG: qvesplati [[REG4:[0-9]+]], 1, 3
525 ; CHECK-DAG: qvesplati [[REG5:[0-9]+]], 1, 2
526 ; CHECK-DAG: qvesplati [[REG6:[0-9]+]], 1, 1
527 ; CHECK-DAG: stfs 2, 16(3)
528 ; CHECK-DAG: stfs 1, 0(3)
529 ; CHECK-DAG: stfs [[REG1]], 28(3)
530 ; CHECK-DAG: stfs [[REG2]], 24(3)
531 ; CHECK-DAG: stfs [[REG3]], 20(3)
532 ; CHECK-DAG: stfs [[REG4]], 12(3)
533 ; CHECK-DAG: stfs [[REG5]], 8(3)
534 ; CHECK-DAG: stfs [[REG6]], 4(3)
535 ; CHECK: blr
536 }
537
538 define void @test_s_qv4double(<4 x double>* %p, <4 x double> %v) #1 {
539 entry:
540   store <4 x double> %v, <4 x double>* %p, align 8
541   ret void
542
543 ; CHECK-LABEL: @test_s_qv4double
544 ; CHECK-DAG: qvesplati [[REG1:[0-9]+]], 1, 3
545 ; CHECK-DAG: qvesplati [[REG2:[0-9]+]], 1, 2
546 ; CHECK-DAG: qvesplati [[REG3:[0-9]+]], 1, 1
547 ; CHECK-DAG: stfd 1, 0(3)
548 ; CHECK-DAG: stfd [[REG1]], 24(3)
549 ; CHECK-DAG: stfd [[REG2]], 16(3)
550 ; CHECK-DAG: stfd [[REG3]], 8(3)
551 ; CHECK: blr
552 }
553
554 define void @test_s_qv8double(<8 x double>* %p, <8 x double> %v) #1 {
555 entry:
556   store <8 x double> %v, <8 x double>* %p, align 8
557   ret void
558
559 ; CHECK-LABEL: @test_s_qv8double
560 ; CHECK-DAG: qvesplati [[REG1:[0-9]+]], 2, 3
561 ; CHECK-DAG: qvesplati [[REG2:[0-9]+]], 2, 2
562 ; CHECK-DAG: qvesplati [[REG3:[0-9]+]], 2, 1
563 ; CHECK-DAG: qvesplati [[REG4:[0-9]+]], 1, 3
564 ; CHECK-DAG: qvesplati [[REG5:[0-9]+]], 1, 2
565 ; CHECK-DAG: qvesplati [[REG6:[0-9]+]], 1, 1
566 ; CHECK-DAG: stfd 2, 32(3)
567 ; CHECK-DAG: stfd 1, 0(3)
568 ; CHECK-DAG: stfd [[REG1]], 56(3)
569 ; CHECK-DAG: stfd [[REG2]], 48(3)
570 ; CHECK-DAG: stfd [[REG3]], 40(3)
571 ; CHECK-DAG: stfd [[REG4]], 24(3)
572 ; CHECK-DAG: stfd [[REG5]], 16(3)
573 ; CHECK-DAG: stfd [[REG6]], 8(3)
574 ; CHECK: blr
575 }
576
577 attributes #0 = { nounwind "target-cpu"="pwr7" }
578 attributes #1 = { nounwind "target-cpu"="a2q" }
579 attributes #2 = { nounwind "target-cpu"="pwr8" }
580