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