• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -mattr=+unimplemented-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,
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:    i64.const -1
309; CHECK-NEXT:    i64.const 0
310; CHECK-NEXT:    local.get 0
311; CHECK-NEXT:    i64x2.extract_lane 0
312; CHECK-NEXT:    local.get 1
313; CHECK-NEXT:    i64x2.extract_lane 0
314; CHECK-NEXT:    i64.lt_s
315; CHECK-NEXT:    i64.select
316; CHECK-NEXT:    i64x2.splat
317; CHECK-NEXT:    i64.const -1
318; CHECK-NEXT:    i64.const 0
319; CHECK-NEXT:    local.get 0
320; CHECK-NEXT:    i64x2.extract_lane 1
321; CHECK-NEXT:    local.get 1
322; CHECK-NEXT:    i64x2.extract_lane 1
323; CHECK-NEXT:    i64.lt_s
324; CHECK-NEXT:    i64.select
325; CHECK-NEXT:    i64x2.replace_lane 1
326; CHECK-NEXT:    v128.bitselect
327; CHECK-NEXT:    # fallthrough-return
328                                    <2 x i64> %x, <2 x i64> %y) {
329  %c = icmp slt <2 x i64> %a, %b
330  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
331  ret <2 x i64> %res
332}
333
334define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {
335; CHECK-LABEL: select_v2i64:
336; CHECK:         .functype select_v2i64 (i32, v128, v128) -> (v128)
337; CHECK-NEXT:  # %bb.0:
338; CHECK-NEXT:    local.get 1
339; CHECK-NEXT:    local.get 2
340; CHECK-NEXT:    local.get 0
341; CHECK-NEXT:    v128.select
342; CHECK-NEXT:    # fallthrough-return
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_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
348; CHECK-LABEL: select_cmp_v2i64:
349; CHECK:         .functype select_cmp_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:    i32.const 0
355; CHECK-NEXT:    i32.lt_s
356; CHECK-NEXT:    v128.select
357; CHECK-NEXT:    # fallthrough-return
358  %c = icmp slt i32 %i, 0
359  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
360  ret <2 x i64> %res
361}
362
363define <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
364; CHECK-LABEL: select_ne_v2i64:
365; CHECK:         .functype select_ne_v2i64 (i32, v128, v128) -> (v128)
366; CHECK-NEXT:  # %bb.0:
367; CHECK-NEXT:    local.get 1
368; CHECK-NEXT:    local.get 2
369; CHECK-NEXT:    local.get 0
370; CHECK-NEXT:    v128.select
371; CHECK-NEXT:    # fallthrough-return
372  %c = icmp ne i32 %i, 0
373  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
374  ret <2 x i64> %res
375}
376
377define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
378; CHECK-LABEL: select_eq_v2i64:
379; CHECK:         .functype select_eq_v2i64 (i32, v128, v128) -> (v128)
380; CHECK-NEXT:  # %bb.0:
381; CHECK-NEXT:    local.get 2
382; CHECK-NEXT:    local.get 1
383; CHECK-NEXT:    local.get 0
384; CHECK-NEXT:    v128.select
385; CHECK-NEXT:    # fallthrough-return
386  %c = icmp eq i32 %i, 0
387  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
388  ret <2 x i64> %res
389}
390
391define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
392; CHECK-LABEL: vselect_v4f32:
393; CHECK:         .functype vselect_v4f32 (v128, v128, v128) -> (v128)
394; CHECK-NEXT:  # %bb.0:
395; CHECK-NEXT:    local.get 1
396; CHECK-NEXT:    local.get 2
397; CHECK-NEXT:    local.get 0
398; CHECK-NEXT:    i32.const 31
399; CHECK-NEXT:    i32x4.shl
400; CHECK-NEXT:    i32.const 31
401; CHECK-NEXT:    i32x4.shr_s
402; CHECK-NEXT:    v128.bitselect
403; CHECK-NEXT:    # fallthrough-return
404  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
405  ret <4 x float> %res
406}
407
408define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,
409; CHECK-LABEL: vselect_cmp_v4f32:
410; CHECK:         .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)
411; CHECK-NEXT:  # %bb.0:
412; CHECK-NEXT:    local.get 2
413; CHECK-NEXT:    local.get 3
414; CHECK-NEXT:    local.get 0
415; CHECK-NEXT:    local.get 1
416; CHECK-NEXT:    f32x4.lt
417; CHECK-NEXT:    v128.bitselect
418; CHECK-NEXT:    # fallthrough-return
419                                      <4 x float> %x, <4 x float> %y) {
420  %c = fcmp olt <4 x float> %a, %b
421  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
422  ret <4 x float> %res
423}
424
425define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {
426; CHECK-LABEL: select_v4f32:
427; CHECK:         .functype select_v4f32 (i32, v128, v128) -> (v128)
428; CHECK-NEXT:  # %bb.0:
429; CHECK-NEXT:    local.get 1
430; CHECK-NEXT:    local.get 2
431; CHECK-NEXT:    local.get 0
432; CHECK-NEXT:    v128.select
433; CHECK-NEXT:    # fallthrough-return
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_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
439; CHECK-LABEL: select_cmp_v4f32:
440; CHECK:         .functype select_cmp_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:    i32.const 0
446; CHECK-NEXT:    i32.lt_s
447; CHECK-NEXT:    v128.select
448; CHECK-NEXT:    # fallthrough-return
449  %c = icmp slt i32 %i, 0
450  %res = select i1 %c, <4 x float> %x, <4 x float> %y
451  ret <4 x float> %res
452}
453
454define <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
455; CHECK-LABEL: select_ne_v4f32:
456; CHECK:         .functype select_ne_v4f32 (i32, v128, v128) -> (v128)
457; CHECK-NEXT:  # %bb.0:
458; CHECK-NEXT:    local.get 1
459; CHECK-NEXT:    local.get 2
460; CHECK-NEXT:    local.get 0
461; CHECK-NEXT:    v128.select
462; CHECK-NEXT:    # fallthrough-return
463  %c = icmp ne i32 %i, 0
464  %res = select i1 %c, <4 x float> %x, <4 x float> %y
465  ret <4 x float> %res
466}
467
468define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
469; CHECK-LABEL: select_eq_v4f32:
470; CHECK:         .functype select_eq_v4f32 (i32, v128, v128) -> (v128)
471; CHECK-NEXT:  # %bb.0:
472; CHECK-NEXT:    local.get 2
473; CHECK-NEXT:    local.get 1
474; CHECK-NEXT:    local.get 0
475; CHECK-NEXT:    v128.select
476; CHECK-NEXT:    # fallthrough-return
477  %c = icmp eq i32 %i, 0
478  %res = select i1 %c, <4 x float> %x, <4 x float> %y
479  ret <4 x float> %res
480}
481
482define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
483; CHECK-LABEL: vselect_v2f64:
484; CHECK:         .functype vselect_v2f64 (v128, v128, v128) -> (v128)
485; CHECK-NEXT:  # %bb.0:
486; CHECK-NEXT:    local.get 1
487; CHECK-NEXT:    local.get 2
488; CHECK-NEXT:    local.get 0
489; CHECK-NEXT:    i32.const 63
490; CHECK-NEXT:    i64x2.shl
491; CHECK-NEXT:    i32.const 63
492; CHECK-NEXT:    i64x2.shr_s
493; CHECK-NEXT:    v128.bitselect
494; CHECK-NEXT:    # fallthrough-return
495  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
496  ret <2 x double> %res
497}
498
499define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,
500; CHECK-LABEL: vselect_cmp_v2f64:
501; CHECK:         .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)
502; CHECK-NEXT:  # %bb.0:
503; CHECK-NEXT:    local.get 2
504; CHECK-NEXT:    local.get 3
505; CHECK-NEXT:    local.get 0
506; CHECK-NEXT:    local.get 1
507; CHECK-NEXT:    f64x2.lt
508; CHECK-NEXT:    v128.bitselect
509; CHECK-NEXT:    # fallthrough-return
510                                       <2 x double> %x, <2 x double> %y) {
511  %c = fcmp olt <2 x double> %a, %b
512  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
513  ret <2 x double> %res
514}
515
516define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {
517; CHECK-LABEL: select_v2f64:
518; CHECK:         .functype select_v2f64 (i32, v128, v128) -> (v128)
519; CHECK-NEXT:  # %bb.0:
520; CHECK-NEXT:    local.get 1
521; CHECK-NEXT:    local.get 2
522; CHECK-NEXT:    local.get 0
523; CHECK-NEXT:    v128.select
524; CHECK-NEXT:    # fallthrough-return
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_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
530; CHECK-LABEL: select_cmp_v2f64:
531; CHECK:         .functype select_cmp_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:    i32.const 0
537; CHECK-NEXT:    i32.lt_s
538; CHECK-NEXT:    v128.select
539; CHECK-NEXT:    # fallthrough-return
540  %c = icmp slt i32 %i, 0
541  %res = select i1 %c, <2 x double> %x, <2 x double> %y
542  ret <2 x double> %res
543}
544
545define <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
546; CHECK-LABEL: select_ne_v2f64:
547; CHECK:         .functype select_ne_v2f64 (i32, v128, v128) -> (v128)
548; CHECK-NEXT:  # %bb.0:
549; CHECK-NEXT:    local.get 1
550; CHECK-NEXT:    local.get 2
551; CHECK-NEXT:    local.get 0
552; CHECK-NEXT:    v128.select
553; CHECK-NEXT:    # fallthrough-return
554  %c = icmp ne i32 %i, 0
555  %res = select i1 %c, <2 x double> %x, <2 x double> %y
556  ret <2 x double> %res
557}
558
559define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
560; CHECK-LABEL: select_eq_v2f64:
561; CHECK:         .functype select_eq_v2f64 (i32, v128, v128) -> (v128)
562; CHECK-NEXT:  # %bb.0:
563; CHECK-NEXT:    local.get 2
564; CHECK-NEXT:    local.get 1
565; CHECK-NEXT:    local.get 0
566; CHECK-NEXT:    v128.select
567; CHECK-NEXT:    # fallthrough-return
568  %c = icmp eq i32 %i, 0
569  %res = select i1 %c, <2 x double> %x, <2 x double> %y
570  ret <2 x double> %res
571}
572