1f7868f87SThomas Lively; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2f7868f87SThomas Lively; RUN: llc < %s -verify-machineinstrs -mattr=+unimplemented-simd128 | FileCheck %s
338c902bcSThomas Lively
4f7868f87SThomas Lively; Test that vector selects of various varieties lower correctly.
538c902bcSThomas Lively
638c902bcSThomas Livelytarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
738c902bcSThomas Livelytarget triple = "wasm32-unknown-unknown"
838c902bcSThomas Lively
938c902bcSThomas Lively; ==============================================================================
1038c902bcSThomas Lively; 16 x i8
1138c902bcSThomas Lively; ==============================================================================
1238c902bcSThomas Livelydefine <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {
13f7868f87SThomas Lively; CHECK-LABEL: vselect_v16i8:
14f7868f87SThomas Lively; CHECK:         .functype vselect_v16i8 (v128, v128, v128) -> (v128)
15f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
16f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
17f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
18f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
19f7868f87SThomas Lively; CHECK-NEXT:    i32.const 7
20f7868f87SThomas Lively; CHECK-NEXT:    i8x16.shl
21f7868f87SThomas Lively; CHECK-NEXT:    i32.const 7
22f7868f87SThomas Lively; CHECK-NEXT:    i8x16.shr_s
23f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
24f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
2538c902bcSThomas Lively  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
2638c902bcSThomas Lively  ret <16 x i8> %res
2738c902bcSThomas Lively}
2838c902bcSThomas Lively
29f0f97876SThomas Livelydefine <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b,
30f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v16i8:
31f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128)
32f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
33f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
34f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
35f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
36f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
37f7868f87SThomas Lively; CHECK-NEXT:    i8x16.lt_s
38f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
39f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
40f0f97876SThomas Lively                                    <16 x i8> %x, <16 x i8> %y) {
41f0f97876SThomas Lively  %c = icmp slt <16 x i8> %a, %b
42f0f97876SThomas Lively  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
43f0f97876SThomas Lively  ret <16 x i8> %res
44f0f97876SThomas Lively}
45f0f97876SThomas Lively
46e661f946SNikita Popovdefine <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) {
47f7868f87SThomas Lively; CHECK-LABEL: select_v16i8:
48f7868f87SThomas Lively; CHECK:         .functype select_v16i8 (i32, v128, v128) -> (v128)
49f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
50f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
51f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
52f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
53*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
54f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
5538c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
5638c902bcSThomas Lively  ret <16 x i8> %res
5738c902bcSThomas Lively}
5838c902bcSThomas Lively
5938c902bcSThomas Livelydefine <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
60f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v16i8:
61f7868f87SThomas Lively; CHECK:         .functype select_cmp_v16i8 (i32, v128, v128) -> (v128)
62f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
63f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
64f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
65f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
66*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
67*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
68*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
69f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
7038c902bcSThomas Lively  %c = icmp slt i32 %i, 0
7138c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
7238c902bcSThomas Lively  ret <16 x i8> %res
7338c902bcSThomas Lively}
7438c902bcSThomas Lively
7538c902bcSThomas Livelydefine <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
76f7868f87SThomas Lively; CHECK-LABEL: select_ne_v16i8:
77f7868f87SThomas Lively; CHECK:         .functype select_ne_v16i8 (i32, v128, v128) -> (v128)
78f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
79f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
80f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
81f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
82*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
83f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
8438c902bcSThomas Lively  %c = icmp ne i32 %i, 0
8538c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
8638c902bcSThomas Lively  ret <16 x i8> %res
8738c902bcSThomas Lively}
8838c902bcSThomas Lively
8938c902bcSThomas Livelydefine <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
90f7868f87SThomas Lively; CHECK-LABEL: select_eq_v16i8:
91f7868f87SThomas Lively; CHECK:         .functype select_eq_v16i8 (i32, v128, v128) -> (v128)
92f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
93f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
94*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
95f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
96*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
97f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
9838c902bcSThomas Lively  %c = icmp eq i32 %i, 0
9938c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
10038c902bcSThomas Lively  ret <16 x i8> %res
10138c902bcSThomas Lively}
10238c902bcSThomas Lively
10338c902bcSThomas Livelydefine <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {
104f7868f87SThomas Lively; CHECK-LABEL: vselect_v8i16:
105f7868f87SThomas Lively; CHECK:         .functype vselect_v8i16 (v128, v128, v128) -> (v128)
106f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
107f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
108f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
109f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
110f7868f87SThomas Lively; CHECK-NEXT:    i32.const 15
111f7868f87SThomas Lively; CHECK-NEXT:    i16x8.shl
112f7868f87SThomas Lively; CHECK-NEXT:    i32.const 15
113f7868f87SThomas Lively; CHECK-NEXT:    i16x8.shr_s
114f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
115f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
11638c902bcSThomas Lively  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
11738c902bcSThomas Lively  ret <8 x i16> %res
11838c902bcSThomas Lively}
11938c902bcSThomas Lively
120f0f97876SThomas Livelydefine <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b,
121f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v8i16:
122f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128)
123f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
124f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
125f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
126f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
127f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
128f7868f87SThomas Lively; CHECK-NEXT:    i16x8.lt_s
129f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
130f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
131f0f97876SThomas Lively                                           <8 x i16> %x, <8 x i16> %y) {
132f0f97876SThomas Lively  %c = icmp slt <8 x i16> %a, %b
133f0f97876SThomas Lively  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
134f0f97876SThomas Lively  ret <8 x i16> %res
135f0f97876SThomas Lively}
136f0f97876SThomas Lively
137e661f946SNikita Popovdefine <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) {
138f7868f87SThomas Lively; CHECK-LABEL: select_v8i16:
139f7868f87SThomas Lively; CHECK:         .functype select_v8i16 (i32, v128, v128) -> (v128)
140f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
141f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
142f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
143f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
144*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
145f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
14638c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
14738c902bcSThomas Lively  ret <8 x i16> %res
14838c902bcSThomas Lively}
14938c902bcSThomas Lively
15038c902bcSThomas Livelydefine <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
151f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v8i16:
152f7868f87SThomas Lively; CHECK:         .functype select_cmp_v8i16 (i32, v128, v128) -> (v128)
153f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
154f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
155f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
156f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
157*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
158*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
159*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
160f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
16138c902bcSThomas Lively  %c = icmp slt i32 %i, 0
16238c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
16338c902bcSThomas Lively  ret <8 x i16> %res
16438c902bcSThomas Lively}
16538c902bcSThomas Lively
16638c902bcSThomas Livelydefine <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
167f7868f87SThomas Lively; CHECK-LABEL: select_ne_v8i16:
168f7868f87SThomas Lively; CHECK:         .functype select_ne_v8i16 (i32, v128, v128) -> (v128)
169f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
170f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
171f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
172f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
173*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
174f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
17538c902bcSThomas Lively  %c = icmp ne i32 %i, 0
17638c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
17738c902bcSThomas Lively  ret <8 x i16> %res
17838c902bcSThomas Lively}
17938c902bcSThomas Lively
18038c902bcSThomas Livelydefine <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
181f7868f87SThomas Lively; CHECK-LABEL: select_eq_v8i16:
182f7868f87SThomas Lively; CHECK:         .functype select_eq_v8i16 (i32, v128, v128) -> (v128)
183f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
184f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
185*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
186f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
187*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
188f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
18938c902bcSThomas Lively  %c = icmp eq i32 %i, 0
19038c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
19138c902bcSThomas Lively  ret <8 x i16> %res
19238c902bcSThomas Lively}
19338c902bcSThomas Lively
19438c902bcSThomas Livelydefine <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {
195f7868f87SThomas Lively; CHECK-LABEL: vselect_v4i32:
196f7868f87SThomas Lively; CHECK:         .functype vselect_v4i32 (v128, v128, v128) -> (v128)
197f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
198f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
199f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
200f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
201f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
202f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shl
203f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
204f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shr_s
205f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
206f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
20738c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
20838c902bcSThomas Lively  ret <4 x i32> %res
20938c902bcSThomas Lively}
21038c902bcSThomas Lively
211f0f97876SThomas Livelydefine <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b,
212f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v4i32:
213f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128)
214f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
215f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
216f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
217f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
218f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
219f7868f87SThomas Lively; CHECK-NEXT:    i32x4.lt_s
220f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
221f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
222f0f97876SThomas Lively                                    <4 x i32> %x, <4 x i32> %y) {
223f0f97876SThomas Lively  %c = icmp slt <4 x i32> %a, %b
224f0f97876SThomas Lively  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
225f0f97876SThomas Lively  ret <4 x i32> %res
226f0f97876SThomas Lively}
22738c902bcSThomas Lively
228e661f946SNikita Popovdefine <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) {
229f7868f87SThomas Lively; CHECK-LABEL: select_v4i32:
230f7868f87SThomas Lively; CHECK:         .functype select_v4i32 (i32, v128, v128) -> (v128)
231f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
232f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
233f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
234f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
235*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
236f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
23738c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
23838c902bcSThomas Lively  ret <4 x i32> %res
23938c902bcSThomas Lively}
24038c902bcSThomas Lively
24138c902bcSThomas Livelydefine <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
242f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v4i32:
243f7868f87SThomas Lively; CHECK:         .functype select_cmp_v4i32 (i32, v128, v128) -> (v128)
244f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
245f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
246f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
247f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
248*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
249*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
250*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
251f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
25238c902bcSThomas Lively  %c = icmp slt i32 %i, 0
25338c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
25438c902bcSThomas Lively  ret <4 x i32> %res
25538c902bcSThomas Lively}
25638c902bcSThomas Lively
25738c902bcSThomas Livelydefine <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
258f7868f87SThomas Lively; CHECK-LABEL: select_ne_v4i32:
259f7868f87SThomas Lively; CHECK:         .functype select_ne_v4i32 (i32, v128, v128) -> (v128)
260f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
261f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
262f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
263f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
264*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
265f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
26638c902bcSThomas Lively  %c = icmp ne i32 %i, 0
26738c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
26838c902bcSThomas Lively  ret <4 x i32> %res
26938c902bcSThomas Lively}
27038c902bcSThomas Lively
27138c902bcSThomas Livelydefine <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
272f7868f87SThomas Lively; CHECK-LABEL: select_eq_v4i32:
273f7868f87SThomas Lively; CHECK:         .functype select_eq_v4i32 (i32, v128, v128) -> (v128)
274f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
275f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
276*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
277f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
278*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
279f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
28038c902bcSThomas Lively  %c = icmp eq i32 %i, 0
28138c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
28238c902bcSThomas Lively  ret <4 x i32> %res
28338c902bcSThomas Lively}
28438c902bcSThomas Lively
28538c902bcSThomas Livelydefine <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {
286f7868f87SThomas Lively; CHECK-LABEL: vselect_v2i64:
287f7868f87SThomas Lively; CHECK:         .functype vselect_v2i64 (v128, v128, v128) -> (v128)
288f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
289f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
290f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
291f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
292f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
293f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shl
294f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
295f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shr_s
296f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
297f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
29838c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
29938c902bcSThomas Lively  ret <2 x i64> %res
30038c902bcSThomas Lively}
30138c902bcSThomas Lively
302f0f97876SThomas Livelydefine <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b,
303f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v2i64:
304f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128)
305f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
306f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
307f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
308f7868f87SThomas Lively; CHECK-NEXT:    i64.const -1
309f7868f87SThomas Lively; CHECK-NEXT:    i64.const 0
310f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
311f7868f87SThomas Lively; CHECK-NEXT:    i64x2.extract_lane 0
312f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
313f7868f87SThomas Lively; CHECK-NEXT:    i64x2.extract_lane 0
314f7868f87SThomas Lively; CHECK-NEXT:    i64.lt_s
315f7868f87SThomas Lively; CHECK-NEXT:    i64.select
316f7868f87SThomas Lively; CHECK-NEXT:    i64x2.splat
317f7868f87SThomas Lively; CHECK-NEXT:    i64.const -1
318f7868f87SThomas Lively; CHECK-NEXT:    i64.const 0
319f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
320f7868f87SThomas Lively; CHECK-NEXT:    i64x2.extract_lane 1
321f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
322f7868f87SThomas Lively; CHECK-NEXT:    i64x2.extract_lane 1
323f7868f87SThomas Lively; CHECK-NEXT:    i64.lt_s
324f7868f87SThomas Lively; CHECK-NEXT:    i64.select
325f7868f87SThomas Lively; CHECK-NEXT:    i64x2.replace_lane 1
326f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
327f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
328f0f97876SThomas Lively                                    <2 x i64> %x, <2 x i64> %y) {
329f0f97876SThomas Lively  %c = icmp slt <2 x i64> %a, %b
330f0f97876SThomas Lively  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
331f0f97876SThomas Lively  ret <2 x i64> %res
332f0f97876SThomas Lively}
333f0f97876SThomas Lively
334e661f946SNikita Popovdefine <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {
335f7868f87SThomas Lively; CHECK-LABEL: select_v2i64:
336f7868f87SThomas Lively; CHECK:         .functype select_v2i64 (i32, v128, v128) -> (v128)
337f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
338f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
339f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
340f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
341*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
342f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
34338c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
34438c902bcSThomas Lively  ret <2 x i64> %res
34538c902bcSThomas Lively}
34638c902bcSThomas Lively
34738c902bcSThomas Livelydefine <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
348f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v2i64:
349f7868f87SThomas Lively; CHECK:         .functype select_cmp_v2i64 (i32, v128, v128) -> (v128)
350f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
351f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
352f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
353f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
354f7868f87SThomas Lively; CHECK-NEXT:    i32.const 0
355f7868f87SThomas Lively; CHECK-NEXT:    i32.lt_s
356*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
357f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
35838c902bcSThomas Lively  %c = icmp slt i32 %i, 0
35938c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
36038c902bcSThomas Lively  ret <2 x i64> %res
36138c902bcSThomas Lively}
36238c902bcSThomas Lively
36338c902bcSThomas Livelydefine <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
364f7868f87SThomas Lively; CHECK-LABEL: select_ne_v2i64:
365f7868f87SThomas Lively; CHECK:         .functype select_ne_v2i64 (i32, v128, v128) -> (v128)
366f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
367f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
368f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
369f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
370*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
371f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
37238c902bcSThomas Lively  %c = icmp ne i32 %i, 0
37338c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
37438c902bcSThomas Lively  ret <2 x i64> %res
37538c902bcSThomas Lively}
37638c902bcSThomas Lively
37738c902bcSThomas Livelydefine <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
378f7868f87SThomas Lively; CHECK-LABEL: select_eq_v2i64:
379f7868f87SThomas Lively; CHECK:         .functype select_eq_v2i64 (i32, v128, v128) -> (v128)
380f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
381f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
382*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
383f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
384*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
385f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
38638c902bcSThomas Lively  %c = icmp eq i32 %i, 0
38738c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
38838c902bcSThomas Lively  ret <2 x i64> %res
38938c902bcSThomas Lively}
39038c902bcSThomas Lively
39138c902bcSThomas Livelydefine <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
392f7868f87SThomas Lively; CHECK-LABEL: vselect_v4f32:
393f7868f87SThomas Lively; CHECK:         .functype vselect_v4f32 (v128, v128, v128) -> (v128)
394f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
395f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
396f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
397f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
398f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
399f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shl
400f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
401f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shr_s
402f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
403f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
40438c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
40538c902bcSThomas Lively  ret <4 x float> %res
40638c902bcSThomas Lively}
40738c902bcSThomas Lively
408f0f97876SThomas Livelydefine <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,
409f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v4f32:
410f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)
411f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
412f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
413f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
414f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
415f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
416f7868f87SThomas Lively; CHECK-NEXT:    f32x4.lt
417f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
418f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
419f0f97876SThomas Lively                                      <4 x float> %x, <4 x float> %y) {
420f0f97876SThomas Lively  %c = fcmp olt <4 x float> %a, %b
421f0f97876SThomas Lively  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
422f0f97876SThomas Lively  ret <4 x float> %res
423f0f97876SThomas Lively}
424f0f97876SThomas Lively
425e661f946SNikita Popovdefine <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {
426f7868f87SThomas Lively; CHECK-LABEL: select_v4f32:
427f7868f87SThomas Lively; CHECK:         .functype select_v4f32 (i32, v128, v128) -> (v128)
428f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
429f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
430f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
431f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
432*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
433f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
43438c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
43538c902bcSThomas Lively  ret <4 x float> %res
43638c902bcSThomas Lively}
43738c902bcSThomas Lively
43838c902bcSThomas Livelydefine <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
439f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v4f32:
440f7868f87SThomas Lively; CHECK:         .functype select_cmp_v4f32 (i32, v128, v128) -> (v128)
441f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
442f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
443f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
444f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
445*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
446*ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
447*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
448f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
44938c902bcSThomas Lively  %c = icmp slt i32 %i, 0
45038c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
45138c902bcSThomas Lively  ret <4 x float> %res
45238c902bcSThomas Lively}
45338c902bcSThomas Lively
45438c902bcSThomas Livelydefine <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
455f7868f87SThomas Lively; CHECK-LABEL: select_ne_v4f32:
456f7868f87SThomas Lively; CHECK:         .functype select_ne_v4f32 (i32, v128, v128) -> (v128)
457f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
458f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
459f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
460f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
461*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
462f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
46338c902bcSThomas Lively  %c = icmp ne i32 %i, 0
46438c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
46538c902bcSThomas Lively  ret <4 x float> %res
46638c902bcSThomas Lively}
46738c902bcSThomas Lively
46838c902bcSThomas Livelydefine <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
469f7868f87SThomas Lively; CHECK-LABEL: select_eq_v4f32:
470f7868f87SThomas Lively; CHECK:         .functype select_eq_v4f32 (i32, v128, v128) -> (v128)
471f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
472f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
473*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
474f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
475*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
476f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
47738c902bcSThomas Lively  %c = icmp eq i32 %i, 0
47838c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
47938c902bcSThomas Lively  ret <4 x float> %res
48038c902bcSThomas Lively}
48138c902bcSThomas Lively
48238c902bcSThomas Livelydefine <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
483f7868f87SThomas Lively; CHECK-LABEL: vselect_v2f64:
484f7868f87SThomas Lively; CHECK:         .functype vselect_v2f64 (v128, v128, v128) -> (v128)
485f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
486f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
487f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
488f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
489f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
490f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shl
491f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
492f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shr_s
493f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
494f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
49538c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
49638c902bcSThomas Lively  ret <2 x double> %res
49738c902bcSThomas Lively}
49838c902bcSThomas Lively
499f0f97876SThomas Livelydefine <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,
500f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v2f64:
501f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)
502f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
503f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
504f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
505f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
506f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
507f7868f87SThomas Lively; CHECK-NEXT:    f64x2.lt
508f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
509f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
510f0f97876SThomas Lively                                       <2 x double> %x, <2 x double> %y) {
511f0f97876SThomas Lively  %c = fcmp olt <2 x double> %a, %b
512f0f97876SThomas Lively  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
513f0f97876SThomas Lively  ret <2 x double> %res
514f0f97876SThomas Lively}
515f0f97876SThomas Lively
516e661f946SNikita Popovdefine <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {
517f7868f87SThomas Lively; CHECK-LABEL: select_v2f64:
518f7868f87SThomas Lively; CHECK:         .functype select_v2f64 (i32, v128, v128) -> (v128)
519f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
520f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
521f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
522f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
523*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
524f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
52538c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
52638c902bcSThomas Lively  ret <2 x double> %res
52738c902bcSThomas Lively}
52838c902bcSThomas Lively
52938c902bcSThomas Livelydefine <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
530f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v2f64:
531f7868f87SThomas Lively; CHECK:         .functype select_cmp_v2f64 (i32, v128, v128) -> (v128)
532f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
533f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
534f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
535f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
536f7868f87SThomas Lively; CHECK-NEXT:    i32.const 0
537f7868f87SThomas Lively; CHECK-NEXT:    i32.lt_s
538*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
539f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
54038c902bcSThomas Lively  %c = icmp slt i32 %i, 0
54138c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
54238c902bcSThomas Lively  ret <2 x double> %res
54338c902bcSThomas Lively}
54438c902bcSThomas Lively
54538c902bcSThomas Livelydefine <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
546f7868f87SThomas Lively; CHECK-LABEL: select_ne_v2f64:
547f7868f87SThomas Lively; CHECK:         .functype select_ne_v2f64 (i32, v128, v128) -> (v128)
548f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
549f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
550f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
551f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
552*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
553f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
55438c902bcSThomas Lively  %c = icmp ne i32 %i, 0
55538c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
55638c902bcSThomas Lively  ret <2 x double> %res
55738c902bcSThomas Lively}
55838c902bcSThomas Lively
55938c902bcSThomas Livelydefine <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
560f7868f87SThomas Lively; CHECK-LABEL: select_eq_v2f64:
561f7868f87SThomas Lively; CHECK:         .functype select_eq_v2f64 (i32, v128, v128) -> (v128)
562f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
563f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
564*ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
565f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
566*ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
567f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
56838c902bcSThomas Lively  %c = icmp eq i32 %i, 0
56938c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
57038c902bcSThomas Lively  ret <2 x double> %res
57138c902bcSThomas Lively}
572