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