1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3
4; Test that vector selects of various varieties lower correctly.
5
6target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7target triple = "wasm32-unknown-unknown"
8
9; ==============================================================================
10; 16 x i8
11; ==============================================================================
12define <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {
13; CHECK-LABEL: vselect_v16i8:
14; CHECK:         .functype vselect_v16i8 (v128, v128, v128) -> (v128)
15; CHECK-NEXT:  # %bb.0:
16; CHECK-NEXT:    local.get 1
17; CHECK-NEXT:    local.get 2
18; CHECK-NEXT:    local.get 0
19; CHECK-NEXT:    i32.const 7
20; CHECK-NEXT:    i8x16.shl
21; CHECK-NEXT:    i32.const 7
22; CHECK-NEXT:    i8x16.shr_s
23; CHECK-NEXT:    v128.bitselect
24; CHECK-NEXT:    # fallthrough-return
25  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
26  ret <16 x i8> %res
27}
28
29define <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b,
30; CHECK-LABEL: vselect_cmp_v16i8:
31; CHECK:         .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128)
32; CHECK-NEXT:  # %bb.0:
33; CHECK-NEXT:    local.get 2
34; CHECK-NEXT:    local.get 3
35; CHECK-NEXT:    local.get 0
36; CHECK-NEXT:    local.get 1
37; CHECK-NEXT:    i8x16.lt_s
38; CHECK-NEXT:    v128.bitselect
39; CHECK-NEXT:    # fallthrough-return
40                                    <16 x i8> %x, <16 x i8> %y) {
41  %c = icmp slt <16 x i8> %a, %b
42  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
43  ret <16 x i8> %res
44}
45
46define <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) {
47; CHECK-LABEL: select_v16i8:
48; CHECK:         .functype select_v16i8 (i32, v128, v128) -> (v128)
49; CHECK-NEXT:  # %bb.0:
50; CHECK-NEXT:    local.get 1
51; CHECK-NEXT:    local.get 2
52; CHECK-NEXT:    local.get 0
53; CHECK-NEXT:    v128.select
54; CHECK-NEXT:    # fallthrough-return
55  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
56  ret <16 x i8> %res
57}
58
59define <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
60; CHECK-LABEL: select_cmp_v16i8:
61; CHECK:         .functype select_cmp_v16i8 (i32, v128, v128) -> (v128)
62; CHECK-NEXT:  # %bb.0:
63; CHECK-NEXT:    local.get 1
64; CHECK-NEXT:    local.get 2
65; CHECK-NEXT:    local.get 0
66; CHECK-NEXT:    i32.const 0
67; CHECK-NEXT:    i32.lt_s
68; CHECK-NEXT:    v128.select
69; CHECK-NEXT:    # fallthrough-return
70  %c = icmp slt i32 %i, 0
71  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
72  ret <16 x i8> %res
73}
74
75define <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
76; CHECK-LABEL: select_ne_v16i8:
77; CHECK:         .functype select_ne_v16i8 (i32, v128, v128) -> (v128)
78; CHECK-NEXT:  # %bb.0:
79; CHECK-NEXT:    local.get 1
80; CHECK-NEXT:    local.get 2
81; CHECK-NEXT:    local.get 0
82; CHECK-NEXT:    v128.select
83; CHECK-NEXT:    # fallthrough-return
84  %c = icmp ne i32 %i, 0
85  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
86  ret <16 x i8> %res
87}
88
89define <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
90; CHECK-LABEL: select_eq_v16i8:
91; CHECK:         .functype select_eq_v16i8 (i32, v128, v128) -> (v128)
92; CHECK-NEXT:  # %bb.0:
93; CHECK-NEXT:    local.get 2
94; CHECK-NEXT:    local.get 1
95; CHECK-NEXT:    local.get 0
96; CHECK-NEXT:    v128.select
97; CHECK-NEXT:    # fallthrough-return
98  %c = icmp eq i32 %i, 0
99  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
100  ret <16 x i8> %res
101}
102
103define <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {
104; CHECK-LABEL: vselect_v8i16:
105; CHECK:         .functype vselect_v8i16 (v128, v128, v128) -> (v128)
106; CHECK-NEXT:  # %bb.0:
107; CHECK-NEXT:    local.get 1
108; CHECK-NEXT:    local.get 2
109; CHECK-NEXT:    local.get 0
110; CHECK-NEXT:    i32.const 15
111; CHECK-NEXT:    i16x8.shl
112; CHECK-NEXT:    i32.const 15
113; CHECK-NEXT:    i16x8.shr_s
114; CHECK-NEXT:    v128.bitselect
115; CHECK-NEXT:    # fallthrough-return
116  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
117  ret <8 x i16> %res
118}
119
120define <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b,
121; CHECK-LABEL: vselect_cmp_v8i16:
122; CHECK:         .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128)
123; CHECK-NEXT:  # %bb.0:
124; CHECK-NEXT:    local.get 2
125; CHECK-NEXT:    local.get 3
126; CHECK-NEXT:    local.get 0
127; CHECK-NEXT:    local.get 1
128; CHECK-NEXT:    i16x8.lt_s
129; CHECK-NEXT:    v128.bitselect
130; CHECK-NEXT:    # fallthrough-return
131                                           <8 x i16> %x, <8 x i16> %y) {
132  %c = icmp slt <8 x i16> %a, %b
133  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
134  ret <8 x i16> %res
135}
136
137define <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) {
138; CHECK-LABEL: select_v8i16:
139; CHECK:         .functype select_v8i16 (i32, v128, v128) -> (v128)
140; CHECK-NEXT:  # %bb.0:
141; CHECK-NEXT:    local.get 1
142; CHECK-NEXT:    local.get 2
143; CHECK-NEXT:    local.get 0
144; CHECK-NEXT:    v128.select
145; CHECK-NEXT:    # fallthrough-return
146  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
147  ret <8 x i16> %res
148}
149
150define <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
151; CHECK-LABEL: select_cmp_v8i16:
152; CHECK:         .functype select_cmp_v8i16 (i32, v128, v128) -> (v128)
153; CHECK-NEXT:  # %bb.0:
154; CHECK-NEXT:    local.get 1
155; CHECK-NEXT:    local.get 2
156; CHECK-NEXT:    local.get 0
157; CHECK-NEXT:    i32.const 0
158; CHECK-NEXT:    i32.lt_s
159; CHECK-NEXT:    v128.select
160; CHECK-NEXT:    # fallthrough-return
161  %c = icmp slt i32 %i, 0
162  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
163  ret <8 x i16> %res
164}
165
166define <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
167; CHECK-LABEL: select_ne_v8i16:
168; CHECK:         .functype select_ne_v8i16 (i32, v128, v128) -> (v128)
169; CHECK-NEXT:  # %bb.0:
170; CHECK-NEXT:    local.get 1
171; CHECK-NEXT:    local.get 2
172; CHECK-NEXT:    local.get 0
173; CHECK-NEXT:    v128.select
174; CHECK-NEXT:    # fallthrough-return
175  %c = icmp ne i32 %i, 0
176  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
177  ret <8 x i16> %res
178}
179
180define <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
181; CHECK-LABEL: select_eq_v8i16:
182; CHECK:         .functype select_eq_v8i16 (i32, v128, v128) -> (v128)
183; CHECK-NEXT:  # %bb.0:
184; CHECK-NEXT:    local.get 2
185; CHECK-NEXT:    local.get 1
186; CHECK-NEXT:    local.get 0
187; CHECK-NEXT:    v128.select
188; CHECK-NEXT:    # fallthrough-return
189  %c = icmp eq i32 %i, 0
190  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
191  ret <8 x i16> %res
192}
193
194define <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {
195; CHECK-LABEL: vselect_v4i32:
196; CHECK:         .functype vselect_v4i32 (v128, v128, v128) -> (v128)
197; CHECK-NEXT:  # %bb.0:
198; CHECK-NEXT:    local.get 1
199; CHECK-NEXT:    local.get 2
200; CHECK-NEXT:    local.get 0
201; CHECK-NEXT:    i32.const 31
202; CHECK-NEXT:    i32x4.shl
203; CHECK-NEXT:    i32.const 31
204; CHECK-NEXT:    i32x4.shr_s
205; CHECK-NEXT:    v128.bitselect
206; CHECK-NEXT:    # fallthrough-return
207  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
208  ret <4 x i32> %res
209}
210
211define <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b,
212; CHECK-LABEL: vselect_cmp_v4i32:
213; CHECK:         .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128)
214; CHECK-NEXT:  # %bb.0:
215; CHECK-NEXT:    local.get 2
216; CHECK-NEXT:    local.get 3
217; CHECK-NEXT:    local.get 0
218; CHECK-NEXT:    local.get 1
219; CHECK-NEXT:    i32x4.lt_s
220; CHECK-NEXT:    v128.bitselect
221; CHECK-NEXT:    # fallthrough-return
222                                    <4 x i32> %x, <4 x i32> %y) {
223  %c = icmp slt <4 x i32> %a, %b
224  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
225  ret <4 x i32> %res
226}
227
228define <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) {
229; CHECK-LABEL: select_v4i32:
230; CHECK:         .functype select_v4i32 (i32, v128, v128) -> (v128)
231; CHECK-NEXT:  # %bb.0:
232; CHECK-NEXT:    local.get 1
233; CHECK-NEXT:    local.get 2
234; CHECK-NEXT:    local.get 0
235; CHECK-NEXT:    v128.select
236; CHECK-NEXT:    # fallthrough-return
237  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
238  ret <4 x i32> %res
239}
240
241define <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
242; CHECK-LABEL: select_cmp_v4i32:
243; CHECK:         .functype select_cmp_v4i32 (i32, v128, v128) -> (v128)
244; CHECK-NEXT:  # %bb.0:
245; CHECK-NEXT:    local.get 1
246; CHECK-NEXT:    local.get 2
247; CHECK-NEXT:    local.get 0
248; CHECK-NEXT:    i32.const 0
249; CHECK-NEXT:    i32.lt_s
250; CHECK-NEXT:    v128.select
251; CHECK-NEXT:    # fallthrough-return
252  %c = icmp slt i32 %i, 0
253  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
254  ret <4 x i32> %res
255}
256
257define <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
258; CHECK-LABEL: select_ne_v4i32:
259; CHECK:         .functype select_ne_v4i32 (i32, v128, v128) -> (v128)
260; CHECK-NEXT:  # %bb.0:
261; CHECK-NEXT:    local.get 1
262; CHECK-NEXT:    local.get 2
263; CHECK-NEXT:    local.get 0
264; CHECK-NEXT:    v128.select
265; CHECK-NEXT:    # fallthrough-return
266  %c = icmp ne i32 %i, 0
267  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
268  ret <4 x i32> %res
269}
270
271define <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
272; CHECK-LABEL: select_eq_v4i32:
273; CHECK:         .functype select_eq_v4i32 (i32, v128, v128) -> (v128)
274; CHECK-NEXT:  # %bb.0:
275; CHECK-NEXT:    local.get 2
276; CHECK-NEXT:    local.get 1
277; CHECK-NEXT:    local.get 0
278; CHECK-NEXT:    v128.select
279; CHECK-NEXT:    # fallthrough-return
280  %c = icmp eq i32 %i, 0
281  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
282  ret <4 x i32> %res
283}
284
285define <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {
286; CHECK-LABEL: vselect_v2i64:
287; CHECK:         .functype vselect_v2i64 (v128, v128, v128) -> (v128)
288; CHECK-NEXT:  # %bb.0:
289; CHECK-NEXT:    local.get 1
290; CHECK-NEXT:    local.get 2
291; CHECK-NEXT:    local.get 0
292; CHECK-NEXT:    i32.const 63
293; CHECK-NEXT:    i64x2.shl
294; CHECK-NEXT:    i32.const 63
295; CHECK-NEXT:    i64x2.shr_s
296; CHECK-NEXT:    v128.bitselect
297; CHECK-NEXT:    # fallthrough-return
298  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
299  ret <2 x i64> %res
300}
301
302define <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %x, <2 x i64> %y) {
303; CHECK-LABEL: vselect_cmp_v2i64:
304; CHECK:         .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128)
305; CHECK-NEXT:  # %bb.0:
306; CHECK-NEXT:    local.get 2
307; CHECK-NEXT:    local.get 3
308; CHECK-NEXT:    local.get 0
309; CHECK-NEXT:    local.get 1
310; CHECK-NEXT:    i64x2.lt_s
311; CHECK-NEXT:    v128.bitselect
312; CHECK-NEXT:    # fallthrough-return
313  %c = icmp slt <2 x i64> %a, %b
314  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
315  ret <2 x i64> %res
316}
317
318define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {
319; CHECK-LABEL: select_v2i64:
320; CHECK:         .functype select_v2i64 (i32, v128, v128) -> (v128)
321; CHECK-NEXT:  # %bb.0:
322; CHECK-NEXT:    local.get 1
323; CHECK-NEXT:    local.get 2
324; CHECK-NEXT:    local.get 0
325; CHECK-NEXT:    v128.select
326; CHECK-NEXT:    # fallthrough-return
327  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
328  ret <2 x i64> %res
329}
330
331define <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
332; CHECK-LABEL: select_cmp_v2i64:
333; CHECK:         .functype select_cmp_v2i64 (i32, v128, v128) -> (v128)
334; CHECK-NEXT:  # %bb.0:
335; CHECK-NEXT:    local.get 1
336; CHECK-NEXT:    local.get 2
337; CHECK-NEXT:    local.get 0
338; CHECK-NEXT:    i32.const 0
339; CHECK-NEXT:    i32.lt_s
340; CHECK-NEXT:    v128.select
341; CHECK-NEXT:    # fallthrough-return
342  %c = icmp slt i32 %i, 0
343  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
344  ret <2 x i64> %res
345}
346
347define <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
348; CHECK-LABEL: select_ne_v2i64:
349; CHECK:         .functype select_ne_v2i64 (i32, v128, v128) -> (v128)
350; CHECK-NEXT:  # %bb.0:
351; CHECK-NEXT:    local.get 1
352; CHECK-NEXT:    local.get 2
353; CHECK-NEXT:    local.get 0
354; CHECK-NEXT:    v128.select
355; CHECK-NEXT:    # fallthrough-return
356  %c = icmp ne i32 %i, 0
357  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
358  ret <2 x i64> %res
359}
360
361define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
362; CHECK-LABEL: select_eq_v2i64:
363; CHECK:         .functype select_eq_v2i64 (i32, v128, v128) -> (v128)
364; CHECK-NEXT:  # %bb.0:
365; CHECK-NEXT:    local.get 2
366; CHECK-NEXT:    local.get 1
367; CHECK-NEXT:    local.get 0
368; CHECK-NEXT:    v128.select
369; CHECK-NEXT:    # fallthrough-return
370  %c = icmp eq i32 %i, 0
371  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
372  ret <2 x i64> %res
373}
374
375define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
376; CHECK-LABEL: vselect_v4f32:
377; CHECK:         .functype vselect_v4f32 (v128, v128, v128) -> (v128)
378; CHECK-NEXT:  # %bb.0:
379; CHECK-NEXT:    local.get 1
380; CHECK-NEXT:    local.get 2
381; CHECK-NEXT:    local.get 0
382; CHECK-NEXT:    i32.const 31
383; CHECK-NEXT:    i32x4.shl
384; CHECK-NEXT:    i32.const 31
385; CHECK-NEXT:    i32x4.shr_s
386; CHECK-NEXT:    v128.bitselect
387; CHECK-NEXT:    # fallthrough-return
388  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
389  ret <4 x float> %res
390}
391
392define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,
393; CHECK-LABEL: vselect_cmp_v4f32:
394; CHECK:         .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)
395; CHECK-NEXT:  # %bb.0:
396; CHECK-NEXT:    local.get 2
397; CHECK-NEXT:    local.get 3
398; CHECK-NEXT:    local.get 0
399; CHECK-NEXT:    local.get 1
400; CHECK-NEXT:    f32x4.lt
401; CHECK-NEXT:    v128.bitselect
402; CHECK-NEXT:    # fallthrough-return
403                                      <4 x float> %x, <4 x float> %y) {
404  %c = fcmp olt <4 x float> %a, %b
405  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
406  ret <4 x float> %res
407}
408
409define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {
410; CHECK-LABEL: select_v4f32:
411; CHECK:         .functype select_v4f32 (i32, v128, v128) -> (v128)
412; CHECK-NEXT:  # %bb.0:
413; CHECK-NEXT:    local.get 1
414; CHECK-NEXT:    local.get 2
415; CHECK-NEXT:    local.get 0
416; CHECK-NEXT:    v128.select
417; CHECK-NEXT:    # fallthrough-return
418  %res = select i1 %c, <4 x float> %x, <4 x float> %y
419  ret <4 x float> %res
420}
421
422define <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
423; CHECK-LABEL: select_cmp_v4f32:
424; CHECK:         .functype select_cmp_v4f32 (i32, v128, v128) -> (v128)
425; CHECK-NEXT:  # %bb.0:
426; CHECK-NEXT:    local.get 1
427; CHECK-NEXT:    local.get 2
428; CHECK-NEXT:    local.get 0
429; CHECK-NEXT:    i32.const 0
430; CHECK-NEXT:    i32.lt_s
431; CHECK-NEXT:    v128.select
432; CHECK-NEXT:    # fallthrough-return
433  %c = icmp slt i32 %i, 0
434  %res = select i1 %c, <4 x float> %x, <4 x float> %y
435  ret <4 x float> %res
436}
437
438define <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
439; CHECK-LABEL: select_ne_v4f32:
440; CHECK:         .functype select_ne_v4f32 (i32, v128, v128) -> (v128)
441; CHECK-NEXT:  # %bb.0:
442; CHECK-NEXT:    local.get 1
443; CHECK-NEXT:    local.get 2
444; CHECK-NEXT:    local.get 0
445; CHECK-NEXT:    v128.select
446; CHECK-NEXT:    # fallthrough-return
447  %c = icmp ne i32 %i, 0
448  %res = select i1 %c, <4 x float> %x, <4 x float> %y
449  ret <4 x float> %res
450}
451
452define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
453; CHECK-LABEL: select_eq_v4f32:
454; CHECK:         .functype select_eq_v4f32 (i32, v128, v128) -> (v128)
455; CHECK-NEXT:  # %bb.0:
456; CHECK-NEXT:    local.get 2
457; CHECK-NEXT:    local.get 1
458; CHECK-NEXT:    local.get 0
459; CHECK-NEXT:    v128.select
460; CHECK-NEXT:    # fallthrough-return
461  %c = icmp eq i32 %i, 0
462  %res = select i1 %c, <4 x float> %x, <4 x float> %y
463  ret <4 x float> %res
464}
465
466define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
467; CHECK-LABEL: vselect_v2f64:
468; CHECK:         .functype vselect_v2f64 (v128, v128, v128) -> (v128)
469; CHECK-NEXT:  # %bb.0:
470; CHECK-NEXT:    local.get 1
471; CHECK-NEXT:    local.get 2
472; CHECK-NEXT:    local.get 0
473; CHECK-NEXT:    i32.const 63
474; CHECK-NEXT:    i64x2.shl
475; CHECK-NEXT:    i32.const 63
476; CHECK-NEXT:    i64x2.shr_s
477; CHECK-NEXT:    v128.bitselect
478; CHECK-NEXT:    # fallthrough-return
479  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
480  ret <2 x double> %res
481}
482
483define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,
484; CHECK-LABEL: vselect_cmp_v2f64:
485; CHECK:         .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)
486; CHECK-NEXT:  # %bb.0:
487; CHECK-NEXT:    local.get 2
488; CHECK-NEXT:    local.get 3
489; CHECK-NEXT:    local.get 0
490; CHECK-NEXT:    local.get 1
491; CHECK-NEXT:    f64x2.lt
492; CHECK-NEXT:    v128.bitselect
493; CHECK-NEXT:    # fallthrough-return
494                                       <2 x double> %x, <2 x double> %y) {
495  %c = fcmp olt <2 x double> %a, %b
496  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
497  ret <2 x double> %res
498}
499
500define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {
501; CHECK-LABEL: select_v2f64:
502; CHECK:         .functype select_v2f64 (i32, v128, v128) -> (v128)
503; CHECK-NEXT:  # %bb.0:
504; CHECK-NEXT:    local.get 1
505; CHECK-NEXT:    local.get 2
506; CHECK-NEXT:    local.get 0
507; CHECK-NEXT:    v128.select
508; CHECK-NEXT:    # fallthrough-return
509  %res = select i1 %c, <2 x double> %x, <2 x double> %y
510  ret <2 x double> %res
511}
512
513define <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
514; CHECK-LABEL: select_cmp_v2f64:
515; CHECK:         .functype select_cmp_v2f64 (i32, v128, v128) -> (v128)
516; CHECK-NEXT:  # %bb.0:
517; CHECK-NEXT:    local.get 1
518; CHECK-NEXT:    local.get 2
519; CHECK-NEXT:    local.get 0
520; CHECK-NEXT:    i32.const 0
521; CHECK-NEXT:    i32.lt_s
522; CHECK-NEXT:    v128.select
523; CHECK-NEXT:    # fallthrough-return
524  %c = icmp slt i32 %i, 0
525  %res = select i1 %c, <2 x double> %x, <2 x double> %y
526  ret <2 x double> %res
527}
528
529define <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
530; CHECK-LABEL: select_ne_v2f64:
531; CHECK:         .functype select_ne_v2f64 (i32, v128, v128) -> (v128)
532; CHECK-NEXT:  # %bb.0:
533; CHECK-NEXT:    local.get 1
534; CHECK-NEXT:    local.get 2
535; CHECK-NEXT:    local.get 0
536; CHECK-NEXT:    v128.select
537; CHECK-NEXT:    # fallthrough-return
538  %c = icmp ne i32 %i, 0
539  %res = select i1 %c, <2 x double> %x, <2 x double> %y
540  ret <2 x double> %res
541}
542
543define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
544; CHECK-LABEL: select_eq_v2f64:
545; CHECK:         .functype select_eq_v2f64 (i32, v128, v128) -> (v128)
546; CHECK-NEXT:  # %bb.0:
547; CHECK-NEXT:    local.get 2
548; CHECK-NEXT:    local.get 1
549; CHECK-NEXT:    local.get 0
550; CHECK-NEXT:    v128.select
551; CHECK-NEXT:    # fallthrough-return
552  %c = icmp eq i32 %i, 0
553  %res = select i1 %c, <2 x double> %x, <2 x double> %y
554  ret <2 x double> %res
555}
556