Fix typo.
[oota-llvm.git] / test / CodeGen / PowerPC / vsx.ll
1 ; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx < %s | FileCheck %s
2 ; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx < %s | FileCheck -check-prefix=CHECK-REG %s
3 ; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 < %s | FileCheck %s
4 ; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 < %s | FileCheck -check-prefix=CHECK-FISL %s
5 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -mattr=+vsx < %s | FileCheck -check-prefix=CHECK-LE %s
6
7 define double @test1(double %a, double %b) {
8 entry:
9   %v = fmul double %a, %b
10   ret double %v
11
12 ; CHECK-LABEL: @test1
13 ; CHECK: xsmuldp 1, 1, 2
14 ; CHECK: blr
15
16 ; CHECK-LE-LABEL: @test1
17 ; CHECK-LE: xsmuldp 1, 1, 2
18 ; CHECK-LE: blr
19 }
20
21 define double @test2(double %a, double %b) {
22 entry:
23   %v = fdiv double %a, %b
24   ret double %v
25
26 ; CHECK-LABEL: @test2
27 ; CHECK: xsdivdp 1, 1, 2
28 ; CHECK: blr
29
30 ; CHECK-LE-LABEL: @test2
31 ; CHECK-LE: xsdivdp 1, 1, 2
32 ; CHECK-LE: blr
33 }
34
35 define double @test3(double %a, double %b) {
36 entry:
37   %v = fadd double %a, %b
38   ret double %v
39
40 ; CHECK-LABEL: @test3
41 ; CHECK: xsadddp 1, 1, 2
42 ; CHECK: blr
43
44 ; CHECK-LE-LABEL: @test3
45 ; CHECK-LE: xsadddp 1, 1, 2
46 ; CHECK-LE: blr
47 }
48
49 define <2 x double> @test4(<2 x double> %a, <2 x double> %b) {
50 entry:
51   %v = fadd <2 x double> %a, %b
52   ret <2 x double> %v
53
54 ; CHECK-LABEL: @test4
55 ; CHECK: xvadddp 34, 34, 35
56 ; CHECK: blr
57
58 ; CHECK-LE-LABEL: @test4
59 ; CHECK-LE: xvadddp 34, 34, 35
60 ; CHECK-LE: blr
61 }
62
63 define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) {
64 entry:
65   %v = xor <4 x i32> %a, %b
66   ret <4 x i32> %v
67
68 ; CHECK-REG-LABEL: @test5
69 ; CHECK-REG: xxlxor 34, 34, 35
70 ; CHECK-REG: blr
71
72 ; CHECK-FISL-LABEL: @test5
73 ; CHECK-FISL: vor
74 ; CHECK-FISL: vor
75 ; CHECK-FISL: xxlxor
76 ; CHECK-FISL: vor 2
77 ; CHECK-FISL: blr
78
79 ; CHECK-LE-LABEL: @test5
80 ; CHECK-LE: xxlxor 34, 34, 35
81 ; CHECK-LE: blr
82 }
83
84 define <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) {
85 entry:
86   %v = xor <8 x i16> %a, %b
87   ret <8 x i16> %v
88
89 ; CHECK-REG-LABEL: @test6
90 ; CHECK-REG: xxlxor 34, 34, 35
91 ; CHECK-REG: blr
92
93 ; CHECK-FISL-LABEL: @test6
94 ; CHECK-FISL: vor 4, 2, 2
95 ; CHECK-FISL: vor 5, 3, 3
96 ; CHECK-FISL: xxlxor 36, 36, 37
97 ; CHECK-FISL: vor 2, 4, 4
98 ; CHECK-FISL: blr
99
100 ; CHECK-LE-LABEL: @test6
101 ; CHECK-LE: xxlxor 34, 34, 35
102 ; CHECK-LE: blr
103 }
104
105 define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) {
106 entry:
107   %v = xor <16 x i8> %a, %b
108   ret <16 x i8> %v
109
110 ; CHECK-REG-LABEL: @test7
111 ; CHECK-REG: xxlxor 34, 34, 35
112 ; CHECK-REG: blr
113
114 ; CHECK-FISL-LABEL: @test7
115 ; CHECK-FISL: vor 4, 2, 2
116 ; CHECK-FISL: vor 5, 3, 3
117 ; CHECK-FISL: xxlxor 36, 36, 37
118 ; CHECK-FISL: vor 2, 4, 4
119 ; CHECK-FISL: blr
120
121 ; CHECK-LE-LABEL: @test7
122 ; CHECK-LE: xxlxor 34, 34, 35
123 ; CHECK-LE: blr
124 }
125
126 define <4 x i32> @test8(<4 x i32> %a, <4 x i32> %b) {
127 entry:
128   %v = or <4 x i32> %a, %b
129   ret <4 x i32> %v
130
131 ; CHECK-REG-LABEL: @test8
132 ; CHECK-REG: xxlor 34, 34, 35
133 ; CHECK-REG: blr
134
135 ; CHECK-FISL-LABEL: @test8
136 ; CHECK-FISL: vor
137 ; CHECK-FISL: vor
138 ; CHECK-FISL: xxlor
139 ; CHECK-FISL: vor 2
140 ; CHECK-FISL: blr
141
142 ; CHECK-LE-LABEL: @test8
143 ; CHECK-LE: xxlor 34, 34, 35
144 ; CHECK-LE: blr
145 }
146
147 define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) {
148 entry:
149   %v = or <8 x i16> %a, %b
150   ret <8 x i16> %v
151
152 ; CHECK-REG-LABEL: @test9
153 ; CHECK-REG: xxlor 34, 34, 35
154 ; CHECK-REG: blr
155
156 ; CHECK-FISL-LABEL: @test9
157 ; CHECK-FISL: vor 4, 2, 2
158 ; CHECK-FISL: vor 5, 3, 3
159 ; CHECK-FISL: xxlor 36, 36, 37
160 ; CHECK-FISL: vor 2, 4, 4
161 ; CHECK-FISL: blr
162
163 ; CHECK-LE-LABEL: @test9
164 ; CHECK-LE: xxlor 34, 34, 35
165 ; CHECK-LE: blr
166 }
167
168 define <16 x i8> @test10(<16 x i8> %a, <16 x i8> %b) {
169 entry:
170   %v = or <16 x i8> %a, %b
171   ret <16 x i8> %v
172
173 ; CHECK-REG-LABEL: @test10
174 ; CHECK-REG: xxlor 34, 34, 35
175 ; CHECK-REG: blr
176
177 ; CHECK-FISL-LABEL: @test10
178 ; CHECK-FISL: vor 4, 2, 2
179 ; CHECK-FISL: vor 5, 3, 3
180 ; CHECK-FISL: xxlor 36, 36, 37
181 ; CHECK-FISL: vor 2, 4, 4
182 ; CHECK-FISL: blr
183
184 ; CHECK-LE-LABEL: @test10
185 ; CHECK-LE: xxlor 34, 34, 35
186 ; CHECK-LE: blr
187 }
188
189 define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) {
190 entry:
191   %v = and <4 x i32> %a, %b
192   ret <4 x i32> %v
193
194 ; CHECK-REG-LABEL: @test11
195 ; CHECK-REG: xxland 34, 34, 35
196 ; CHECK-REG: blr
197
198 ; CHECK-FISL-LABEL: @test11
199 ; CHECK-FISL: vor
200 ; CHECK-FISL: vor
201 ; CHECK-FISL: xxland
202 ; CHECK-FISL: vor 2
203 ; CHECK-FISL: blr
204
205 ; CHECK-LE-LABEL: @test11
206 ; CHECK-LE: xxland 34, 34, 35
207 ; CHECK-LE: blr
208 }
209
210 define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) {
211 entry:
212   %v = and <8 x i16> %a, %b
213   ret <8 x i16> %v
214
215 ; CHECK-REG-LABEL: @test12
216 ; CHECK-REG: xxland 34, 34, 35
217 ; CHECK-REG: blr
218
219 ; CHECK-FISL-LABEL: @test12
220 ; CHECK-FISL: vor 4, 2, 2
221 ; CHECK-FISL: vor 5, 3, 3
222 ; CHECK-FISL: xxland 36, 36, 37
223 ; CHECK-FISL: vor 2, 4, 4
224 ; CHECK-FISL: blr
225
226 ; CHECK-LE-LABEL: @test12
227 ; CHECK-LE: xxland 34, 34, 35
228 ; CHECK-LE: blr
229 }
230
231 define <16 x i8> @test13(<16 x i8> %a, <16 x i8> %b) {
232 entry:
233   %v = and <16 x i8> %a, %b
234   ret <16 x i8> %v
235
236 ; CHECK-REG-LABEL: @test13
237 ; CHECK-REG: xxland 34, 34, 35
238 ; CHECK-REG: blr
239
240 ; CHECK-FISL-LABEL: @test13
241 ; CHECK-FISL: vor 4, 2, 2
242 ; CHECK-FISL: vor 5, 3, 3
243 ; CHECK-FISL: xxland 36, 36, 37
244 ; CHECK-FISL: vor 2, 4, 4
245 ; CHECK-FISL: blr
246
247 ; CHECK-LE-LABEL: @test13
248 ; CHECK-LE: xxland 34, 34, 35
249 ; CHECK-LE: blr
250 }
251
252 define <4 x i32> @test14(<4 x i32> %a, <4 x i32> %b) {
253 entry:
254   %v = or <4 x i32> %a, %b
255   %w = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1>
256   ret <4 x i32> %w
257
258 ; CHECK-REG-LABEL: @test14
259 ; CHECK-REG: xxlnor 34, 34, 35
260 ; CHECK-REG: blr
261
262 ; CHECK-FISL-LABEL: @test14
263 ; CHECK-FISL: vor 4, 3, 3
264 ; CHECK-FISL: vor 5, 2, 2
265 ; CHECK-FISL: xxlor 0, 37, 36
266 ; CHECK-FISL: xxlnor 36, 37, 36
267 ; CHECK-FISL: vor 2, 4, 4
268 ; CHECK-FISL: lis 0, -1
269 ; CHECK-FISL: ori 0, 0, 65520
270 ; CHECK-FISL: stxvd2x 0, 1, 0
271 ; CHECK-FISL: blr
272
273 ; CHECK-LE-LABEL: @test14
274 ; CHECK-LE: xxlnor 34, 34, 35
275 ; CHECK-LE: blr
276 }
277
278 define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) {
279 entry:
280   %v = or <8 x i16> %a, %b
281   %w = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
282   ret <8 x i16> %w
283
284 ; CHECK-REG-LABEL: @test15
285 ; CHECK-REG: xxlnor 34, 34, 35
286 ; CHECK-REG: blr
287
288 ; CHECK-FISL-LABEL: @test15
289 ; CHECK-FISL: vor 4, 2, 2
290 ; CHECK-FISL: vor 5, 3, 3
291 ; CHECK-FISL: xxlor 36, 36, 37
292 ; CHECK-FISL: vor 0, 4, 4
293 ; CHECK-FISL: vor 4, 2, 2
294 ; CHECK-FISL: vor 5, 3, 3
295 ; CHECK-FISL: xxlnor 36, 36, 37
296 ; CHECK-FISL: vor 2, 4, 4
297 ; CHECK-FISL: lis 0, -1
298 ; CHECK-FISL: ori 0, 0, 65520
299 ; CHECK-FISL: stvx 0, 1, 0
300 ; CHECK-FISL: blr
301
302 ; CHECK-LE-LABEL: @test15
303 ; CHECK-LE: xxlnor 34, 34, 35
304 ; CHECK-LE: blr
305 }
306
307 define <16 x i8> @test16(<16 x i8> %a, <16 x i8> %b) {
308 entry:
309   %v = or <16 x i8> %a, %b
310   %w = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
311   ret <16 x i8> %w
312
313 ; CHECK-REG-LABEL: @test16
314 ; CHECK-REG: xxlnor 34, 34, 35
315 ; CHECK-REG: blr
316
317 ; CHECK-FISL-LABEL: @test16
318 ; CHECK-FISL: vor 4, 2, 2
319 ; CHECK-FISL: vor 5, 3, 3
320 ; CHECK-FISL: xxlor 36, 36, 37
321 ; CHECK-FISL: vor 0, 4, 4
322 ; CHECK-FISL: vor 4, 2, 2
323 ; CHECK-FISL: vor 5, 3, 3
324 ; CHECK-FISL: xxlnor 36, 36, 37
325 ; CHECK-FISL: vor 2, 4, 4
326 ; CHECK-FISL: lis 0, -1
327 ; CHECK-FISL: ori 0, 0, 65520
328 ; CHECK-FISL: stvx 0, 1, 0
329 ; CHECK-FISL: blr
330
331 ; CHECK-LE-LABEL: @test16
332 ; CHECK-LE: xxlnor 34, 34, 35
333 ; CHECK-LE: blr
334 }
335
336 define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) {
337 entry:
338   %w = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1>
339   %v = and <4 x i32> %a, %w
340   ret <4 x i32> %v
341
342 ; CHECK-REG-LABEL: @test17
343 ; CHECK-REG: xxlandc 34, 34, 35
344 ; CHECK-REG: blr
345
346 ; CHECK-FISL-LABEL: @test17
347 ; CHECK-FISL: vor 4, 3, 3
348 ; CHECK-FISL: vor 5, 2, 2
349 ; CHECK-FISL: vspltisb 2, -1
350 ; CHECK-FISL: vor 0, 2, 2
351 ; CHECK-FISL: xxlxor 36, 36, 32
352 ; CHECK-FISL: xxland 36, 37, 36
353 ; CHECK-FISL: vor 2, 4, 4
354 ; CHECK-FISL: blr
355
356 ; CHECK-LE-LABEL: @test17
357 ; CHECK-LE: xxlandc 34, 34, 35
358 ; CHECK-LE: blr
359 }
360
361 define <8 x i16> @test18(<8 x i16> %a, <8 x i16> %b) {
362 entry:
363   %w = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
364   %v = and <8 x i16> %a, %w
365   ret <8 x i16> %v
366
367 ; CHECK-REG-LABEL: @test18
368 ; CHECK-REG: xxlandc 34, 34, 35
369 ; CHECK-REG: blr
370
371 ; CHECK-FISL-LABEL: @test18
372 ; CHECK-FISL: vspltisb 4, -1
373 ; CHECK-FISL: vor 5, 3, 3
374 ; CHECK-FISL: vor 0, 4, 4
375 ; CHECK-FISL: xxlxor 37, 37, 32
376 ; CHECK-FISL: vor 4, 5, 5
377 ; CHECK-FISL: vor 5, 2, 2
378 ; CHECK-FISL: vor 0, 3, 3
379 ; CHECK-FISL: xxlandc 37, 37, 32
380 ; CHECK-FISL: vor 2, 5, 5
381 ; CHECK-FISL: lis 0, -1
382 ; CHECK-FISL: ori 0, 0, 65520
383 ; CHECK-FISL: stvx 4, 1, 0
384 ; CHECK-FISL: blr
385
386 ; CHECK-LE-LABEL: @test18
387 ; CHECK-LE: xxlandc 34, 34, 35
388 ; CHECK-LE: blr
389 }
390
391 define <16 x i8> @test19(<16 x i8> %a, <16 x i8> %b) {
392 entry:
393   %w = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
394   %v = and <16 x i8> %a, %w
395   ret <16 x i8> %v
396
397 ; CHECK-REG-LABEL: @test19
398 ; CHECK-REG: xxlandc 34, 34, 35
399 ; CHECK-REG: blr
400
401 ; CHECK-FISL-LABEL: @test19
402 ; CHECK-FISL: vspltisb 4, -1
403 ; CHECK-FISL: vor 5, 3, 3
404 ; CHECK-FISL: vor 0, 4, 4
405 ; CHECK-FISL: xxlxor 37, 37, 32
406 ; CHECK-FISL: vor 4, 5, 5
407 ; CHECK-FISL: vor 5, 2, 2
408 ; CHECK-FISL: vor 0, 3, 3
409 ; CHECK-FISL: xxlandc 37, 37, 32
410 ; CHECK-FISL: vor 2, 5, 5
411 ; CHECK-FISL: lis 0, -1
412 ; CHECK-FISL: ori 0, 0, 65520
413 ; CHECK-FISL: stvx 4, 1, 0
414 ; CHECK-FISL: blr
415
416 ; CHECK-LE-LABEL: @test19
417 ; CHECK-LE: xxlandc 34, 34, 35
418 ; CHECK-LE: blr
419 }
420
421 define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
422 entry:
423   %m = icmp eq <4 x i32> %c, %d
424   %v = select <4 x i1> %m, <4 x i32> %a, <4 x i32> %b
425   ret <4 x i32> %v
426
427 ; CHECK-REG-LABEL: @test20
428 ; CHECK-REG: vcmpequw {{[0-9]+}}, 4, 5
429 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
430 ; CHECK-REG: blr
431
432 ; FIXME: The fast-isel code is pretty miserable for this one.
433
434 ; CHECK-FISL-LABEL: @test20
435 ; CHECK-FISL: vor 0, 5, 5
436 ; CHECK-FISL: vor 1, 4, 4
437 ; CHECK-FISL: vor 6, 3, 3
438 ; CHECK-FISL: vor 7, 2, 2
439 ; CHECK-FISL: vor 2, 1, 1
440 ; CHECK-FISL: vor 3, 0, 0
441 ; CHECK-FISL: vcmpequw 2, 2, 3
442 ; CHECK-FISL: vor 0, 2, 2
443 ; CHECK-FISL: xxsel 32, 38, 39, 32
444 ; CHECK-FISL: vor 2, 0, 0
445 ; CHECK-FISL: blr
446
447 ; CHECK-LE-LABEL: @test20
448 ; CHECK-LE: vcmpequw {{[0-9]+}}, 4, 5
449 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
450 ; CHECK-LE: blr
451 }
452
453 define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
454 entry:
455   %m = fcmp oeq <4 x float> %c, %d
456   %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
457   ret <4 x float> %v
458
459 ; CHECK-REG-LABEL: @test21
460 ; CHECK-REG: xvcmpeqsp [[V1:[0-9]+]], 36, 37
461 ; CHECK-REG: xxsel 34, 35, 34, [[V1]]
462 ; CHECK-REG: blr
463
464 ; CHECK-FISL-LABEL: @test21
465 ; CHECK-FISL: vor 0, 5, 5
466 ; CHECK-FISL: vor 1, 4, 4
467 ; CHECK-FISL: vor 6, 3, 3
468 ; CHECK-FISL: vor 7, 2, 2
469 ; CHECK-FISL: xvcmpeqsp 32, 33, 32
470 ; CHECK-FISL: xxsel 32, 38, 39, 32
471 ; CHECK-FISL: vor 2, 0, 0
472 ; CHECK-FISL: blr
473
474 ; CHECK-LE-LABEL: @test21
475 ; CHECK-LE: xvcmpeqsp [[V1:[0-9]+]], 36, 37
476 ; CHECK-LE: xxsel 34, 35, 34, [[V1]]
477 ; CHECK-LE: blr
478 }
479
480 define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
481 entry:
482   %m = fcmp ueq <4 x float> %c, %d
483   %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
484   ret <4 x float> %v
485
486 ; CHECK-REG-LABEL: @test22
487 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 37, 37
488 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 36, 36
489 ; CHECK-REG-DAG: xvcmpeqsp {{[0-9]+}}, 36, 37
490 ; CHECK-REG-DAG: xxlnor
491 ; CHECK-REG-DAG: xxlnor
492 ; CHECK-REG-DAG: xxlor
493 ; CHECK-REG-DAG: xxlor
494 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
495 ; CHECK-REG: blr
496
497 ; CHECK-FISL-LABEL: @test22
498 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 33, 32
499 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 32, 32
500 ; CHECK-FISL-DAG: xvcmpeqsp {{[0-9]+}}, 33, 33
501 ; CHECK-FISL-DAG: xxlnor
502 ; CHECK-FISL-DAG: xxlnor
503 ; CHECK-FISL-DAG: xxlor
504 ; CHECK-FISL-DAG: xxlor
505 ; CHECK-FISL: xxsel 0, 38, 39, {{[0-9]+}}
506 ; CHECK-FISL: blr
507
508 ; CHECK-LE-LABEL: @test22
509 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 37, 37
510 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 36, 36
511 ; CHECK-LE-DAG: xvcmpeqsp {{[0-9]+}}, 36, 37
512 ; CHECK-LE-DAG: xxlnor
513 ; CHECK-LE-DAG: xxlnor
514 ; CHECK-LE-DAG: xxlor
515 ; CHECK-LE-DAG: xxlor
516 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
517 ; CHECK-LE: blr
518 }
519
520 define <8 x i16> @test23(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) {
521 entry:
522   %m = icmp eq <8 x i16> %c, %d
523   %v = select <8 x i1> %m, <8 x i16> %a, <8 x i16> %b
524   ret <8 x i16> %v
525
526 ; CHECK-REG-LABEL: @test23
527 ; CHECK-REG: vcmpequh {{[0-9]+}}, 4, 5
528 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
529 ; CHECK-REG: blr
530
531 ; CHECK-FISL-LABEL: @test23
532 ; CHECK-FISL: vcmpequh 4, 4, 5
533 ; CHECK-FISL: vor 0, 3, 3
534 ; CHECK-FISL: vor 1, 2, 2
535 ; CHECK-FISL: vor 6, 4, 4
536 ; CHECK-FISL: xxsel 32, 32, 33, 38
537 ; CHECK-FISL: vor 2, 0, 
538 ; CHECK-FISL: blr
539
540 ; CHECK-LE-LABEL: @test23
541 ; CHECK-LE: vcmpequh {{[0-9]+}}, 4, 5
542 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
543 ; CHECK-LE: blr
544 }
545
546 define <16 x i8> @test24(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) {
547 entry:
548   %m = icmp eq <16 x i8> %c, %d
549   %v = select <16 x i1> %m, <16 x i8> %a, <16 x i8> %b
550   ret <16 x i8> %v
551
552 ; CHECK-REG-LABEL: @test24
553 ; CHECK-REG: vcmpequb {{[0-9]+}}, 4, 5
554 ; CHECK-REG: xxsel 34, 35, 34, {{[0-9]+}}
555 ; CHECK-REG: blr
556
557 ; CHECK-FISL-LABEL: @test24
558 ; CHECK-FISL: vcmpequb 4, 4, 5
559 ; CHECK-FISL: vor 0, 3, 3
560 ; CHECK-FISL: vor 1, 2, 2
561 ; CHECK-FISL: vor 6, 4, 4
562 ; CHECK-FISL: xxsel 32, 32, 33, 38
563 ; CHECK-FISL: vor 2, 0, 0
564 ; CHECK-FISL: blr
565
566 ; CHECK-LE-LABEL: @test24
567 ; CHECK-LE: vcmpequb {{[0-9]+}}, 4, 5
568 ; CHECK-LE: xxsel 34, 35, 34, {{[0-9]+}}
569 ; CHECK-LE: blr
570 }
571
572 define <2 x double> @test25(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) {
573 entry:
574   %m = fcmp oeq <2 x double> %c, %d
575   %v = select <2 x i1> %m, <2 x double> %a, <2 x double> %b
576   ret <2 x double> %v
577
578 ; CHECK-LABEL: @test25
579 ; CHECK: xvcmpeqdp [[V1:[0-9]+]], 36, 37
580 ; CHECK: xxsel 34, 35, 34, [[V1]]
581 ; CHECK: blr
582
583 ; CHECK-LE-LABEL: @test25
584 ; CHECK-LE: xvcmpeqdp [[V1:[0-9]+]], 36, 37
585 ; CHECK-LE: xxsel 34, 35, 34, [[V1]]
586 ; CHECK-LE: blr
587 }
588
589 define <2 x i64> @test26(<2 x i64> %a, <2 x i64> %b) {
590   %v = add <2 x i64> %a, %b
591   ret <2 x i64> %v
592
593 ; CHECK-LABEL: @test26
594
595 ; Make sure we use only two stores (one for each operand).
596 ; CHECK: stxvd2x 35,
597 ; CHECK: stxvd2x 34,
598 ; CHECK-NOT: stxvd2x
599
600 ; FIXME: The code quality here is not good; just make sure we do something for now.
601 ; CHECK: add
602 ; CHECK: add
603 ; CHECK: blr
604
605 ; CHECK-LE: vaddudm 2, 2, 3
606 ; CHECK-LE: blr
607 }
608
609 define <2 x i64> @test27(<2 x i64> %a, <2 x i64> %b) {
610   %v = and <2 x i64> %a, %b
611   ret <2 x i64> %v
612
613 ; CHECK-LABEL: @test27
614 ; CHECK: xxland 34, 34, 35
615 ; CHECK: blr
616
617 ; CHECK-LE-LABEL: @test27
618 ; CHECK-LE: xxland 34, 34, 35
619 ; CHECK-LE: blr
620 }
621
622 define <2 x double> @test28(<2 x double>* %a) {
623   %v = load <2 x double>, <2 x double>* %a, align 16
624   ret <2 x double> %v
625
626 ; CHECK-LABEL: @test28
627 ; CHECK: lxvd2x 34, 0, 3
628 ; CHECK: blr
629
630 ; CHECK-LE-LABEL: @test28
631 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
632 ; CHECK-LE: xxswapd 34, [[V1]]
633 ; CHECK-LE: blr
634 }
635
636 define void @test29(<2 x double>* %a, <2 x double> %b) {
637   store <2 x double> %b, <2 x double>* %a, align 16
638   ret void
639
640 ; CHECK-LABEL: @test29
641 ; CHECK: stxvd2x 34, 0, 3
642 ; CHECK: blr
643
644 ; CHECK-LE-LABEL: @test29
645 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
646 ; CHECK-LE: stxvd2x [[V1]], 0, 3
647 ; CHECK-LE: blr
648 }
649
650 define <2 x double> @test28u(<2 x double>* %a) {
651   %v = load <2 x double>, <2 x double>* %a, align 8
652   ret <2 x double> %v
653
654 ; CHECK-LABEL: @test28u
655 ; CHECK: lxvd2x 34, 0, 3
656 ; CHECK: blr
657
658 ; CHECK-LE-LABEL: @test28u
659 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
660 ; CHECK-LE: xxswapd 34, [[V1]]
661 ; CHECK-LE: blr
662 }
663
664 define void @test29u(<2 x double>* %a, <2 x double> %b) {
665   store <2 x double> %b, <2 x double>* %a, align 8
666   ret void
667
668 ; CHECK-LABEL: @test29u
669 ; CHECK: stxvd2x 34, 0, 3
670 ; CHECK: blr
671
672 ; CHECK-LE-LABEL: @test29u
673 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
674 ; CHECK-LE: stxvd2x [[V1]], 0, 3
675 ; CHECK-LE: blr
676 }
677
678 define <2 x i64> @test30(<2 x i64>* %a) {
679   %v = load <2 x i64>, <2 x i64>* %a, align 16
680   ret <2 x i64> %v
681
682 ; CHECK-REG-LABEL: @test30
683 ; CHECK-REG: lxvd2x 34, 0, 3
684 ; CHECK-REG: blr
685
686 ; CHECK-FISL-LABEL: @test30
687 ; CHECK-FISL: lxvd2x 0, 0, 3
688 ; CHECK-FISL: xxlor 34, 0, 0
689 ; CHECK-FISL: vor 3, 2, 2
690 ; CHECK-FISL: vor 2, 3, 3
691 ; CHECK-FISL: blr
692
693 ; CHECK-LE-LABEL: @test30
694 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
695 ; CHECK-LE: xxswapd 34, [[V1]]
696 ; CHECK-LE: blr
697 }
698
699 define void @test31(<2 x i64>* %a, <2 x i64> %b) {
700   store <2 x i64> %b, <2 x i64>* %a, align 16
701   ret void
702
703 ; CHECK-LABEL: @test31
704 ; CHECK: stxvd2x 34, 0, 3
705 ; CHECK: blr
706
707 ; CHECK-LE-LABEL: @test31
708 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
709 ; CHECK-LE: stxvd2x [[V1]], 0, 3
710 ; CHECK-LE: blr
711 }
712
713 define <4 x float> @test32(<4 x float>* %a) {
714   %v = load <4 x float>, <4 x float>* %a, align 16
715   ret <4 x float> %v
716
717 ; CHECK-REG-LABEL: @test32
718 ; CHECK-REG: lxvw4x 34, 0, 3
719 ; CHECK-REG: blr
720
721 ; CHECK-FISL-LABEL: @test32
722 ; CHECK-FISL: lxvw4x 0, 0, 3
723 ; CHECK-FISL: xxlor 34, 0, 0
724 ; CHECK-FISL: blr
725
726 ; CHECK-LE-LABEL: @test32
727 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
728 ; CHECK-LE: xxswapd 34, [[V1]]
729 ; CHECK-LE: blr
730 }
731
732 define void @test33(<4 x float>* %a, <4 x float> %b) {
733   store <4 x float> %b, <4 x float>* %a, align 16
734   ret void
735
736 ; CHECK-REG-LABEL: @test33
737 ; CHECK-REG: stxvw4x 34, 0, 3
738 ; CHECK-REG: blr
739
740 ; CHECK-FISL-LABEL: @test33
741 ; CHECK-FISL: vor 3, 2, 2
742 ; CHECK-FISL: stxvw4x 35, 0, 3
743 ; CHECK-FISL: blr
744
745 ; CHECK-LE-LABEL: @test33
746 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
747 ; CHECK-LE: stxvd2x [[V1]], 0, 3
748 ; CHECK-LE: blr
749 }
750
751 define <4 x float> @test32u(<4 x float>* %a) {
752   %v = load <4 x float>, <4 x float>* %a, align 8
753   ret <4 x float> %v
754
755 ; CHECK-LABEL: @test32u
756 ; CHECK-DAG: lvsl
757 ; CHECK-DAG: lvx
758 ; CHECK-DAG: lvx
759 ; CHECK: vperm 2,
760 ; CHECK: blr
761
762 ; CHECK-LE-LABEL: @test32u
763 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
764 ; CHECK-LE: xxswapd 34, [[V1]]
765 ; CHECK-LE: blr
766 }
767
768 define void @test33u(<4 x float>* %a, <4 x float> %b) {
769   store <4 x float> %b, <4 x float>* %a, align 8
770   ret void
771
772 ; CHECK-REG-LABEL: @test33u
773 ; CHECK-REG: stxvw4x 34, 0, 3
774 ; CHECK-REG: blr
775
776 ; CHECK-FISL-LABEL: @test33u
777 ; CHECK-FISL: vor 3, 2, 2
778 ; CHECK-FISL: stxvw4x 35, 0, 3
779 ; CHECK-FISL: blr
780
781 ; CHECK-LE-LABEL: @test33u
782 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
783 ; CHECK-LE: stxvd2x [[V1]], 0, 3
784 ; CHECK-LE: blr
785 }
786
787 define <4 x i32> @test34(<4 x i32>* %a) {
788   %v = load <4 x i32>, <4 x i32>* %a, align 16
789   ret <4 x i32> %v
790
791 ; CHECK-REG-LABEL: @test34
792 ; CHECK-REG: lxvw4x 34, 0, 3
793 ; CHECK-REG: blr
794
795 ; CHECK-FISL-LABEL: @test34
796 ; CHECK-FISL: lxvw4x 0, 0, 3
797 ; CHECK-FISL: xxlor 34, 0, 0
798 ; CHECK-FISL: blr
799
800 ; CHECK-LE-LABEL: @test34
801 ; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
802 ; CHECK-LE: xxswapd 34, [[V1]]
803 ; CHECK-LE: blr
804 }
805
806 define void @test35(<4 x i32>* %a, <4 x i32> %b) {
807   store <4 x i32> %b, <4 x i32>* %a, align 16
808   ret void
809
810 ; CHECK-REG-LABEL: @test35
811 ; CHECK-REG: stxvw4x 34, 0, 3
812 ; CHECK-REG: blr
813
814 ; CHECK-FISL-LABEL: @test35
815 ; CHECK-FISL: vor 3, 2, 2
816 ; CHECK-FISL: stxvw4x 35, 0, 3
817 ; CHECK-FISL: blr
818
819 ; CHECK-LE-LABEL: @test35
820 ; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
821 ; CHECK-LE: stxvd2x [[V1]], 0, 3
822 ; CHECK-LE: blr
823 }
824
825 define <2 x double> @test40(<2 x i64> %a) {
826   %v = uitofp <2 x i64> %a to <2 x double>
827   ret <2 x double> %v
828
829 ; CHECK-LABEL: @test40
830 ; CHECK: xvcvuxddp 34, 34
831 ; CHECK: blr
832
833 ; CHECK-LE-LABEL: @test40
834 ; CHECK-LE: xvcvuxddp 34, 34
835 ; CHECK-LE: blr
836 }
837
838 define <2 x double> @test41(<2 x i64> %a) {
839   %v = sitofp <2 x i64> %a to <2 x double>
840   ret <2 x double> %v
841
842 ; CHECK-LABEL: @test41
843 ; CHECK: xvcvsxddp 34, 34
844 ; CHECK: blr
845
846 ; CHECK-LE-LABEL: @test41
847 ; CHECK-LE: xvcvsxddp 34, 34
848 ; CHECK-LE: blr
849 }
850
851 define <2 x i64> @test42(<2 x double> %a) {
852   %v = fptoui <2 x double> %a to <2 x i64>
853   ret <2 x i64> %v
854
855 ; CHECK-LABEL: @test42
856 ; CHECK: xvcvdpuxds 34, 34
857 ; CHECK: blr
858
859 ; CHECK-LE-LABEL: @test42
860 ; CHECK-LE: xvcvdpuxds 34, 34
861 ; CHECK-LE: blr
862 }
863
864 define <2 x i64> @test43(<2 x double> %a) {
865   %v = fptosi <2 x double> %a to <2 x i64>
866   ret <2 x i64> %v
867
868 ; CHECK-LABEL: @test43
869 ; CHECK: xvcvdpsxds 34, 34
870 ; CHECK: blr
871
872 ; CHECK-LE-LABEL: @test43
873 ; CHECK-LE: xvcvdpsxds 34, 34
874 ; CHECK-LE: blr
875 }
876
877 define <2 x float> @test44(<2 x i64> %a) {
878   %v = uitofp <2 x i64> %a to <2 x float>
879   ret <2 x float> %v
880
881 ; CHECK-LABEL: @test44
882 ; FIXME: The code quality here looks pretty bad.
883 ; CHECK: blr
884 }
885
886 define <2 x float> @test45(<2 x i64> %a) {
887   %v = sitofp <2 x i64> %a to <2 x float>
888   ret <2 x float> %v
889
890 ; CHECK-LABEL: @test45
891 ; FIXME: The code quality here looks pretty bad.
892 ; CHECK: blr
893 }
894
895 define <2 x i64> @test46(<2 x float> %a) {
896   %v = fptoui <2 x float> %a to <2 x i64>
897   ret <2 x i64> %v
898
899 ; CHECK-LABEL: @test46
900 ; FIXME: The code quality here looks pretty bad.
901 ; CHECK: blr
902 }
903
904 define <2 x i64> @test47(<2 x float> %a) {
905   %v = fptosi <2 x float> %a to <2 x i64>
906   ret <2 x i64> %v
907
908 ; CHECK-LABEL: @test47
909 ; FIXME: The code quality here looks pretty bad.
910 ; CHECK: blr
911 }
912
913 define <2 x double> @test50(double* %a) {
914   %v = load double, double* %a, align 8
915   %w = insertelement <2 x double> undef, double %v, i32 0
916   %x = insertelement <2 x double> %w, double %v, i32 1
917   ret <2 x double> %x
918
919 ; CHECK-LABEL: @test50
920 ; CHECK: lxvdsx 34, 0, 3
921 ; CHECK: blr
922
923 ; CHECK-LE-LABEL: @test50
924 ; CHECK-LE: lxvdsx 34, 0, 3
925 ; CHECK-LE: blr
926 }
927
928 define <2 x double> @test51(<2 x double> %a, <2 x double> %b) {
929   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
930   ret <2 x double> %v
931
932 ; CHECK-LABEL: @test51
933 ; CHECK: xxspltd 34, 34, 0
934 ; CHECK: blr
935
936 ; CHECK-LE-LABEL: @test51
937 ; CHECK-LE: xxspltd 34, 34, 1
938 ; CHECK-LE: blr
939 }
940
941 define <2 x double> @test52(<2 x double> %a, <2 x double> %b) {
942   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
943   ret <2 x double> %v
944
945 ; CHECK-LABEL: @test52
946 ; CHECK: xxmrghd 34, 34, 35
947 ; CHECK: blr
948
949 ; CHECK-LE-LABEL: @test52
950 ; CHECK-LE: xxmrgld 34, 35, 34
951 ; CHECK-LE: blr
952 }
953
954 define <2 x double> @test53(<2 x double> %a, <2 x double> %b) {
955   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 0>
956   ret <2 x double> %v
957
958 ; CHECK-LABEL: @test53
959 ; CHECK: xxmrghd 34, 35, 34
960 ; CHECK: blr
961
962 ; CHECK-LE-LABEL: @test53
963 ; CHECK-LE: xxmrgld 34, 34, 35
964 ; CHECK-LE: blr
965 }
966
967 define <2 x double> @test54(<2 x double> %a, <2 x double> %b) {
968   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 2>
969   ret <2 x double> %v
970
971 ; CHECK-LABEL: @test54
972 ; CHECK: xxpermdi 34, 34, 35, 2
973 ; CHECK: blr
974
975 ; CHECK-LE-LABEL: @test54
976 ; CHECK-LE: xxpermdi 34, 35, 34, 2
977 ; CHECK-LE: blr
978 }
979
980 define <2 x double> @test55(<2 x double> %a, <2 x double> %b) {
981   %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
982   ret <2 x double> %v
983
984 ; CHECK-LABEL: @test55
985 ; CHECK: xxmrgld 34, 34, 35
986 ; CHECK: blr
987
988 ; CHECK-LE-LABEL: @test55
989 ; CHECK-LE: xxmrghd 34, 35, 34
990 ; CHECK-LE: blr
991 }
992
993 define <2 x i64> @test56(<2 x i64> %a, <2 x i64> %b) {
994   %v = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
995   ret <2 x i64> %v
996
997 ; CHECK-LABEL: @test56
998 ; CHECK: xxmrgld 34, 34, 35
999 ; CHECK: blr
1000
1001 ; CHECK-LE-LABEL: @test56
1002 ; CHECK-LE: xxmrghd 34, 35, 34
1003 ; CHECK-LE: blr
1004 }
1005
1006 define <2 x i64> @test60(<2 x i64> %a, <2 x i64> %b) {
1007   %v = shl <2 x i64> %a, %b
1008   ret <2 x i64> %v
1009
1010 ; CHECK-LABEL: @test60
1011 ; This should scalarize, and the current code quality is not good.
1012 ; CHECK: stxvd2x
1013 ; CHECK: stxvd2x
1014 ; CHECK: sld
1015 ; CHECK: sld
1016 ; CHECK: lxvd2x
1017 ; CHECK: blr
1018 }
1019
1020 define <2 x i64> @test61(<2 x i64> %a, <2 x i64> %b) {
1021   %v = lshr <2 x i64> %a, %b
1022   ret <2 x i64> %v
1023
1024 ; CHECK-LABEL: @test61
1025 ; This should scalarize, and the current code quality is not good.
1026 ; CHECK: stxvd2x
1027 ; CHECK: stxvd2x
1028 ; CHECK: srd
1029 ; CHECK: srd
1030 ; CHECK: lxvd2x
1031 ; CHECK: blr
1032 }
1033
1034 define <2 x i64> @test62(<2 x i64> %a, <2 x i64> %b) {
1035   %v = ashr <2 x i64> %a, %b
1036   ret <2 x i64> %v
1037
1038 ; CHECK-LABEL: @test62
1039 ; This should scalarize, and the current code quality is not good.
1040 ; CHECK: stxvd2x
1041 ; CHECK: stxvd2x
1042 ; CHECK: srad
1043 ; CHECK: srad
1044 ; CHECK: lxvd2x
1045 ; CHECK: blr
1046 }
1047
1048 define double @test63(<2 x double> %a) {
1049   %v = extractelement <2 x double> %a, i32 0
1050   ret double %v
1051
1052 ; CHECK-REG-LABEL: @test63
1053 ; CHECK-REG: xxlor 1, 34, 34
1054 ; CHECK-REG: blr
1055
1056 ; CHECK-FISL-LABEL: @test63
1057 ; CHECK-FISL: xxlor 0, 34, 34
1058 ; CHECK-FISL: fmr 1, 0
1059 ; CHECK-FISL: blr
1060
1061 ; CHECK-LE-LABEL: @test63
1062 ; CHECK-LE: xxswapd 1, 34
1063 ; CHECK-LE: blr
1064 }
1065
1066 define double @test64(<2 x double> %a) {
1067   %v = extractelement <2 x double> %a, i32 1
1068   ret double %v
1069
1070 ; CHECK-REG-LABEL: @test64
1071 ; CHECK-REG: xxswapd 1, 34
1072 ; CHECK-REG: blr
1073
1074 ; CHECK-FISL-LABEL: @test64
1075 ; CHECK-FISL: xxswapd  34, 34
1076 ; CHECK-FISL: xxlor 0, 34, 34
1077 ; CHECK-FISL: fmr 1, 0
1078 ; CHECK-FISL: blr
1079
1080 ; CHECK-LE-LABEL: @test64
1081 ; CHECK-LE: xxlor 1, 34, 34
1082 }
1083
1084 define <2 x i1> @test65(<2 x i64> %a, <2 x i64> %b) {
1085   %w = icmp eq <2 x i64> %a, %b
1086   ret <2 x i1> %w
1087
1088 ; CHECK-REG-LABEL: @test65
1089 ; CHECK-REG: vcmpequw 2, 2, 3
1090 ; CHECK-REG: blr
1091
1092 ; CHECK-FISL-LABEL: @test65
1093 ; CHECK-FISL: vor 4, 3, 3
1094 ; CHECK-FISL: vor 5, 2, 2
1095 ; CHECK-FISL: vcmpequw 4, 5, 4
1096 ; CHECK-FISL: vor 2, 4, 4
1097 ; CHECK-FISL: blr
1098
1099 ; CHECK-LE-LABEL: @test65
1100 ; CHECK-LE: vcmpequd 2, 2, 3
1101 ; CHECK-LE: blr
1102 }
1103
1104 define <2 x i1> @test66(<2 x i64> %a, <2 x i64> %b) {
1105   %w = icmp ne <2 x i64> %a, %b
1106   ret <2 x i1> %w
1107
1108 ; CHECK-REG-LABEL: @test66
1109 ; CHECK-REG: vcmpequw {{[0-9]+}}, 2, 3
1110 ; CHECK-REG: xxlnor 34, {{[0-9]+}}, {{[0-9]+}}
1111 ; CHECK-REG: blr
1112
1113 ; CHECK-FISL-LABEL: @test66
1114 ; CHECK-FISL: vcmpequw {{[0-9]+}}, 5, 4
1115 ; CHECK-FISL: xxlnor 34, {{[0-9]+}}, {{[0-9]+}}
1116 ; CHECK-FISL: blr
1117
1118 ; CHECK-LE-LABEL: @test66
1119 ; CHECK-LE: vcmpequd {{[0-9]+}}, 2, 3
1120 ; CHECK-LE: xxlnor 34, {{[0-9]+}}, {{[0-9]+}}
1121 ; CHECK-LE: blr
1122 }
1123
1124 define <2 x i1> @test67(<2 x i64> %a, <2 x i64> %b) {
1125   %w = icmp ult <2 x i64> %a, %b
1126   ret <2 x i1> %w
1127
1128 ; CHECK-LABEL: @test67
1129 ; This should scalarize, and the current code quality is not good.
1130 ; CHECK: stxvd2x
1131 ; CHECK: stxvd2x
1132 ; CHECK: cmpld
1133 ; CHECK: cmpld
1134 ; CHECK: lxvd2x
1135 ; CHECK: blr
1136
1137 ; CHECK-LE-LABEL: @test67
1138 ; CHECK-LE: vcmpgtud 2, 3, 2
1139 ; CHECK-LE: blr
1140 }
1141
1142 define <2 x double> @test68(<2 x i32> %a) {
1143   %w = sitofp <2 x i32> %a to <2 x double>
1144   ret <2 x double> %w
1145
1146 ; CHECK-LABEL: @test68
1147 ; CHECK: xxsldwi [[V1:[0-9]+]], 34, 34, 1
1148 ; CHECK: xvcvsxwdp 34, [[V1]]
1149 ; CHECK: blr
1150
1151 ; CHECK-LE-LABEL: @test68
1152 ; CHECK-LE: xxsldwi [[V1:[0-9]+]], 34, 34, 1
1153 ; CHECK-LE: xvcvsxwdp 34, [[V1]]
1154 ; CHECK-LE: blr
1155 }
1156
1157 define <2 x double> @test69(<2 x i16> %a) {
1158   %w = sitofp <2 x i16> %a to <2 x double>
1159   ret <2 x double> %w
1160
1161 ; CHECK-LABEL: @test69
1162 ; CHECK: vspltisw [[V1:[0-9]+]], 8
1163 ; CHECK: vadduwm [[V2:[0-9]+]], [[V1]], [[V1]]
1164 ; CHECK: vslw [[V3:[0-9]+]], {{[0-9]+}}, [[V2]]
1165 ; CHECK: vsraw {{[0-9]+}}, [[V3]], [[V2]]
1166 ; CHECK: xxsldwi [[V4:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, 1
1167 ; CHECK: xvcvsxwdp 34, [[V4]]
1168 ; CHECK: blr
1169
1170 ; CHECK-LE-LABEL: @test69
1171 ; CHECK-LE: vspltisw [[V1:[0-9]+]], 8
1172 ; CHECK-LE: vadduwm [[V2:[0-9]+]], [[V1]], [[V1]]
1173 ; CHECK-LE: vslw [[V3:[0-9]+]], {{[0-9]+}}, [[V2]]
1174 ; CHECK-LE: vsraw {{[0-9]+}}, [[V3]], [[V2]]
1175 ; CHECK-LE: xxsldwi [[V4:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, 1
1176 ; CHECK-LE: xvcvsxwdp 34, [[V4]]
1177 ; CHECK-LE: blr
1178 }
1179
1180 define <2 x double> @test70(<2 x i8> %a) {
1181   %w = sitofp <2 x i8> %a to <2 x double>
1182   ret <2 x double> %w
1183
1184 ; CHECK-LABEL: @test70
1185 ; CHECK: vspltisw [[V1:[0-9]+]], 12
1186 ; CHECK: vadduwm [[V2:[0-9]+]], [[V1]], [[V1]]
1187 ; CHECK: vslw [[V3:[0-9]+]], {{[0-9]+}}, [[V2]]
1188 ; CHECK: vsraw {{[0-9]+}}, [[V3]], [[V2]]
1189 ; CHECK: xxsldwi [[V4:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, 1
1190 ; CHECK: xvcvsxwdp 34, [[V4]]
1191 ; CHECK: blr
1192
1193 ; CHECK-LE-LABEL: @test70
1194 ; CHECK-LE: vspltisw [[V1:[0-9]+]], 12
1195 ; CHECK-LE: vadduwm [[V2:[0-9]+]], [[V1]], [[V1]]
1196 ; CHECK-LE: vslw [[V3:[0-9]+]], {{[0-9]+}}, [[V2]]
1197 ; CHECK-LE: vsraw {{[0-9]+}}, [[V3]], [[V2]]
1198 ; CHECK-LE: xxsldwi [[V4:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}, 1
1199 ; CHECK-LE: xvcvsxwdp 34, [[V4]]
1200 ; CHECK-LE: blr
1201 }
1202
1203 define <2 x i32> @test80(i32 %v) {
1204   %b1 = insertelement <2 x i32> undef, i32 %v, i32 0
1205   %b2 = shufflevector <2 x i32> %b1, <2 x i32> undef, <2 x i32> zeroinitializer
1206   %i = add <2 x i32> %b2, <i32 2, i32 3>
1207   ret <2 x i32> %i
1208
1209 ; CHECK-REG-LABEL: @test80
1210 ; CHECK-REG-DAG: addi [[R1:[0-9]+]], 3, 3
1211 ; CHECK-REG-DAG: addi [[R2:[0-9]+]], 1, -16
1212 ; CHECK-REG-DAG: addi [[R3:[0-9]+]], 3, 2
1213 ; CHECK-REG: std [[R1]], -8(1)
1214 ; CHECK-REG: std [[R3]], -16(1)
1215 ; CHECK-REG: lxvd2x 34, 0, [[R2]]
1216 ; CHECK-REG-NOT: stxvd2x
1217 ; CHECK-REG: blr
1218
1219 ; CHECK-FISL-LABEL: @test80
1220 ; CHECK-FISL-DAG: addi [[R1:[0-9]+]], 3, 3
1221 ; CHECK-FISL-DAG: addi [[R2:[0-9]+]], 1, -16
1222 ; CHECK-FISL-DAG: addi [[R3:[0-9]+]], 3, 2
1223 ; CHECK-FISL-DAG: std [[R1]], -8(1)
1224 ; CHECK-FISL-DAG: std [[R3]], -16(1)
1225 ; CHECK-FISL-DAG: lxvd2x 0, 0, [[R2]]
1226 ; CHECK-FISL: blr
1227
1228 ; CHECK-LE-LABEL: @test80
1229 ; CHECK-LE-DAG: addi [[R1:[0-9]+]], 1, -16
1230 ; CHECK-LE-DAG: addi [[R2:[0-9]+]], {{[0-9]+}}, .LCPI
1231 ; CHECK-LE-DAG: lxvd2x [[V1:[0-9]+]], 0, [[R1]]
1232 ; CHECK-LE-DAG: lxvd2x [[V2:[0-9]+]], 0, [[R2]]
1233 ; CHECK-LE-DAG: xxswapd 34, [[V1]]
1234 ; CHECK-LE-DAG: xxswapd 35, [[V2]]
1235 ; CHECK-LE: vaddudm 2, 2, 3
1236 ; CHECK-LE: blr
1237 }
1238
1239 define <2 x double> @test81(<4 x float> %b) {
1240   %w = bitcast <4 x float> %b to <2 x double>
1241   ret <2 x double> %w
1242
1243 ; CHECK-LABEL: @test81
1244 ; CHECK: blr
1245
1246 ; CHECK-LE-LABEL: @test81
1247 ; CHECK-LE: blr
1248 }
1249
1250 define double @test82(double %a, double %b, double %c, double %d) {
1251 entry:
1252   %m = fcmp oeq double %c, %d
1253   %v = select i1 %m, double %a, double %b
1254   ret double %v
1255
1256 ; CHECK-REG-LABEL: @test82
1257 ; CHECK-REG: xscmpudp [[REG:[0-9]+]], 3, 4
1258 ; CHECK-REG: beqlr [[REG]]
1259
1260 ; CHECK-FISL-LABEL: @test82
1261 ; CHECK-FISL: xscmpudp [[REG:[0-9]+]], 3, 4
1262 ; CHECK-FISL: beq [[REG]], {{.*}}
1263
1264 ; CHECK-LE-LABEL: @test82
1265 ; CHECK-LE: xscmpudp [[REG:[0-9]+]], 3, 4
1266 ; CHECK-LE: beqlr [[REG]]
1267 }