1f7868f87SThomas Lively; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
28638c897SThomas Lively; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
338c902bcSThomas Lively
4f7868f87SThomas Lively; Test that vector selects of various varieties lower correctly.
538c902bcSThomas Lively
638c902bcSThomas Livelytarget triple = "wasm32-unknown-unknown"
738c902bcSThomas Lively
838c902bcSThomas Lively; ==============================================================================
938c902bcSThomas Lively; 16 x i8
1038c902bcSThomas Lively; ==============================================================================
1138c902bcSThomas Livelydefine <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {
12f7868f87SThomas Lively; CHECK-LABEL: vselect_v16i8:
13f7868f87SThomas Lively; CHECK:         .functype vselect_v16i8 (v128, v128, v128) -> (v128)
14f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
15f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
16f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
17f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
18f7868f87SThomas Lively; CHECK-NEXT:    i32.const 7
19f7868f87SThomas Lively; CHECK-NEXT:    i8x16.shl
20f7868f87SThomas Lively; CHECK-NEXT:    i32.const 7
21f7868f87SThomas Lively; CHECK-NEXT:    i8x16.shr_s
22f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
23f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
2438c902bcSThomas Lively  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
2538c902bcSThomas Lively  ret <16 x i8> %res
2638c902bcSThomas Lively}
2738c902bcSThomas Lively
28f0f97876SThomas Livelydefine <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b,
29f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v16i8:
30f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128)
31f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
32f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
33f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
34f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
35f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
36f7868f87SThomas Lively; CHECK-NEXT:    i8x16.lt_s
37f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
38f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
39f0f97876SThomas Lively                                    <16 x i8> %x, <16 x i8> %y) {
40f0f97876SThomas Lively  %c = icmp slt <16 x i8> %a, %b
41f0f97876SThomas Lively  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
42f0f97876SThomas Lively  ret <16 x i8> %res
43f0f97876SThomas Lively}
44f0f97876SThomas Lively
45e661f946SNikita Popovdefine <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) {
46f7868f87SThomas Lively; CHECK-LABEL: select_v16i8:
47f7868f87SThomas Lively; CHECK:         .functype select_v16i8 (i32, v128, v128) -> (v128)
48f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
49f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
50f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
51f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
52ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
53f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
5438c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
5538c902bcSThomas Lively  ret <16 x i8> %res
5638c902bcSThomas Lively}
5738c902bcSThomas Lively
5838c902bcSThomas Livelydefine <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
59f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v16i8:
60f7868f87SThomas Lively; CHECK:         .functype select_cmp_v16i8 (i32, v128, v128) -> (v128)
61f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
62f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
63f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
64f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
65ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
66ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
67ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
68f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
6938c902bcSThomas Lively  %c = icmp slt i32 %i, 0
7038c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
7138c902bcSThomas Lively  ret <16 x i8> %res
7238c902bcSThomas Lively}
7338c902bcSThomas Lively
7438c902bcSThomas Livelydefine <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
75f7868f87SThomas Lively; CHECK-LABEL: select_ne_v16i8:
76f7868f87SThomas Lively; CHECK:         .functype select_ne_v16i8 (i32, v128, v128) -> (v128)
77f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
78f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
79f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
80f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
81ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
82f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
8338c902bcSThomas Lively  %c = icmp ne i32 %i, 0
8438c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
8538c902bcSThomas Lively  ret <16 x i8> %res
8638c902bcSThomas Lively}
8738c902bcSThomas Lively
8838c902bcSThomas Livelydefine <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
89f7868f87SThomas Lively; CHECK-LABEL: select_eq_v16i8:
90f7868f87SThomas Lively; CHECK:         .functype select_eq_v16i8 (i32, v128, v128) -> (v128)
91f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
92f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
93ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
94f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
95ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
96f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
9738c902bcSThomas Lively  %c = icmp eq i32 %i, 0
9838c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
9938c902bcSThomas Lively  ret <16 x i8> %res
10038c902bcSThomas Lively}
10138c902bcSThomas Lively
10238c902bcSThomas Livelydefine <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {
103f7868f87SThomas Lively; CHECK-LABEL: vselect_v8i16:
104f7868f87SThomas Lively; CHECK:         .functype vselect_v8i16 (v128, v128, v128) -> (v128)
105f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
106f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
107f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
108f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
109f7868f87SThomas Lively; CHECK-NEXT:    i32.const 15
110f7868f87SThomas Lively; CHECK-NEXT:    i16x8.shl
111f7868f87SThomas Lively; CHECK-NEXT:    i32.const 15
112f7868f87SThomas Lively; CHECK-NEXT:    i16x8.shr_s
113f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
114f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
11538c902bcSThomas Lively  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
11638c902bcSThomas Lively  ret <8 x i16> %res
11738c902bcSThomas Lively}
11838c902bcSThomas Lively
119f0f97876SThomas Livelydefine <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b,
120f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v8i16:
121f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128)
122f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
123f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
124f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
125f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
126f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
127f7868f87SThomas Lively; CHECK-NEXT:    i16x8.lt_s
128f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
129f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
130f0f97876SThomas Lively                                           <8 x i16> %x, <8 x i16> %y) {
131f0f97876SThomas Lively  %c = icmp slt <8 x i16> %a, %b
132f0f97876SThomas Lively  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
133f0f97876SThomas Lively  ret <8 x i16> %res
134f0f97876SThomas Lively}
135f0f97876SThomas Lively
136e661f946SNikita Popovdefine <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) {
137f7868f87SThomas Lively; CHECK-LABEL: select_v8i16:
138f7868f87SThomas Lively; CHECK:         .functype select_v8i16 (i32, v128, v128) -> (v128)
139f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
140f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
141f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
142f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
143ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
144f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
14538c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
14638c902bcSThomas Lively  ret <8 x i16> %res
14738c902bcSThomas Lively}
14838c902bcSThomas Lively
14938c902bcSThomas Livelydefine <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
150f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v8i16:
151f7868f87SThomas Lively; CHECK:         .functype select_cmp_v8i16 (i32, v128, v128) -> (v128)
152f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
153f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
154f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
155f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
156ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
157ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
158ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
159f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
16038c902bcSThomas Lively  %c = icmp slt i32 %i, 0
16138c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
16238c902bcSThomas Lively  ret <8 x i16> %res
16338c902bcSThomas Lively}
16438c902bcSThomas Lively
16538c902bcSThomas Livelydefine <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
166f7868f87SThomas Lively; CHECK-LABEL: select_ne_v8i16:
167f7868f87SThomas Lively; CHECK:         .functype select_ne_v8i16 (i32, v128, v128) -> (v128)
168f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
169f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
170f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
171f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
172ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
173f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
17438c902bcSThomas Lively  %c = icmp ne i32 %i, 0
17538c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
17638c902bcSThomas Lively  ret <8 x i16> %res
17738c902bcSThomas Lively}
17838c902bcSThomas Lively
17938c902bcSThomas Livelydefine <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
180f7868f87SThomas Lively; CHECK-LABEL: select_eq_v8i16:
181f7868f87SThomas Lively; CHECK:         .functype select_eq_v8i16 (i32, v128, v128) -> (v128)
182f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
183f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
184ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
185f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
186ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
187f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
18838c902bcSThomas Lively  %c = icmp eq i32 %i, 0
18938c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
19038c902bcSThomas Lively  ret <8 x i16> %res
19138c902bcSThomas Lively}
19238c902bcSThomas Lively
19338c902bcSThomas Livelydefine <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {
194f7868f87SThomas Lively; CHECK-LABEL: vselect_v4i32:
195f7868f87SThomas Lively; CHECK:         .functype vselect_v4i32 (v128, v128, v128) -> (v128)
196f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
197f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
198f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
199f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
200f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
201f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shl
202f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
203f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shr_s
204f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
205f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
20638c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
20738c902bcSThomas Lively  ret <4 x i32> %res
20838c902bcSThomas Lively}
20938c902bcSThomas Lively
210f0f97876SThomas Livelydefine <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b,
211f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v4i32:
212f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128)
213f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
214f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
215f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
216f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
217f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
218f7868f87SThomas Lively; CHECK-NEXT:    i32x4.lt_s
219f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
220f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
221f0f97876SThomas Lively                                    <4 x i32> %x, <4 x i32> %y) {
222f0f97876SThomas Lively  %c = icmp slt <4 x i32> %a, %b
223f0f97876SThomas Lively  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
224f0f97876SThomas Lively  ret <4 x i32> %res
225f0f97876SThomas Lively}
22638c902bcSThomas Lively
227e661f946SNikita Popovdefine <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) {
228f7868f87SThomas Lively; CHECK-LABEL: select_v4i32:
229f7868f87SThomas Lively; CHECK:         .functype select_v4i32 (i32, v128, v128) -> (v128)
230f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
231f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
232f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
233f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
234ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
235f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
23638c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
23738c902bcSThomas Lively  ret <4 x i32> %res
23838c902bcSThomas Lively}
23938c902bcSThomas Lively
24038c902bcSThomas Livelydefine <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
241f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v4i32:
242f7868f87SThomas Lively; CHECK:         .functype select_cmp_v4i32 (i32, v128, v128) -> (v128)
243f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
244f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
245f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
246f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
247ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
248ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
249ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
250f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
25138c902bcSThomas Lively  %c = icmp slt i32 %i, 0
25238c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
25338c902bcSThomas Lively  ret <4 x i32> %res
25438c902bcSThomas Lively}
25538c902bcSThomas Lively
25638c902bcSThomas Livelydefine <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
257f7868f87SThomas Lively; CHECK-LABEL: select_ne_v4i32:
258f7868f87SThomas Lively; CHECK:         .functype select_ne_v4i32 (i32, v128, v128) -> (v128)
259f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
260f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
261f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
262f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
263ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
264f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
26538c902bcSThomas Lively  %c = icmp ne i32 %i, 0
26638c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
26738c902bcSThomas Lively  ret <4 x i32> %res
26838c902bcSThomas Lively}
26938c902bcSThomas Lively
27038c902bcSThomas Livelydefine <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
271f7868f87SThomas Lively; CHECK-LABEL: select_eq_v4i32:
272f7868f87SThomas Lively; CHECK:         .functype select_eq_v4i32 (i32, v128, v128) -> (v128)
273f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
274f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
275ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
276f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
277ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
278f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
27938c902bcSThomas Lively  %c = icmp eq i32 %i, 0
28038c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
28138c902bcSThomas Lively  ret <4 x i32> %res
28238c902bcSThomas Lively}
28338c902bcSThomas Lively
28438c902bcSThomas Livelydefine <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {
285f7868f87SThomas Lively; CHECK-LABEL: vselect_v2i64:
286f7868f87SThomas Lively; CHECK:         .functype vselect_v2i64 (v128, v128, v128) -> (v128)
287f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
288f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
289f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
290f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
291f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
292f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shl
293f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
294f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shr_s
295f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
296f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
29738c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
29838c902bcSThomas Lively  ret <2 x i64> %res
29938c902bcSThomas Lively}
30038c902bcSThomas Lively
301*45783d0eSThomas Livelydefine <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %x, <2 x i64> %y) {
302f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v2i64:
303f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128)
304f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
305f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
306f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
307f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
308f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
309*45783d0eSThomas Lively; CHECK-NEXT:    i64x2.lt_s
310f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
311f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
312f0f97876SThomas Lively  %c = icmp slt <2 x i64> %a, %b
313f0f97876SThomas Lively  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
314f0f97876SThomas Lively  ret <2 x i64> %res
315f0f97876SThomas Lively}
316f0f97876SThomas Lively
317e661f946SNikita Popovdefine <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {
318f7868f87SThomas Lively; CHECK-LABEL: select_v2i64:
319f7868f87SThomas Lively; CHECK:         .functype select_v2i64 (i32, v128, v128) -> (v128)
320f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
321f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
322f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
323f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
324ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
325f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
32638c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
32738c902bcSThomas Lively  ret <2 x i64> %res
32838c902bcSThomas Lively}
32938c902bcSThomas Lively
33038c902bcSThomas Livelydefine <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
331f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v2i64:
332f7868f87SThomas Lively; CHECK:         .functype select_cmp_v2i64 (i32, v128, v128) -> (v128)
333f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
334f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
335f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
336f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
337f7868f87SThomas Lively; CHECK-NEXT:    i32.const 0
338f7868f87SThomas Lively; CHECK-NEXT:    i32.lt_s
339ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
340f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
34138c902bcSThomas Lively  %c = icmp slt i32 %i, 0
34238c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
34338c902bcSThomas Lively  ret <2 x i64> %res
34438c902bcSThomas Lively}
34538c902bcSThomas Lively
34638c902bcSThomas Livelydefine <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
347f7868f87SThomas Lively; CHECK-LABEL: select_ne_v2i64:
348f7868f87SThomas Lively; CHECK:         .functype select_ne_v2i64 (i32, v128, v128) -> (v128)
349f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
350f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
351f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
352f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
353ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
354f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
35538c902bcSThomas Lively  %c = icmp ne i32 %i, 0
35638c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
35738c902bcSThomas Lively  ret <2 x i64> %res
35838c902bcSThomas Lively}
35938c902bcSThomas Lively
36038c902bcSThomas Livelydefine <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
361f7868f87SThomas Lively; CHECK-LABEL: select_eq_v2i64:
362f7868f87SThomas Lively; CHECK:         .functype select_eq_v2i64 (i32, v128, v128) -> (v128)
363f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
364f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
365ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
366f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
367ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
368f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
36938c902bcSThomas Lively  %c = icmp eq i32 %i, 0
37038c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
37138c902bcSThomas Lively  ret <2 x i64> %res
37238c902bcSThomas Lively}
37338c902bcSThomas Lively
37438c902bcSThomas Livelydefine <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
375f7868f87SThomas Lively; CHECK-LABEL: vselect_v4f32:
376f7868f87SThomas Lively; CHECK:         .functype vselect_v4f32 (v128, v128, v128) -> (v128)
377f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
378f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
379f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
380f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
381f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
382f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shl
383f7868f87SThomas Lively; CHECK-NEXT:    i32.const 31
384f7868f87SThomas Lively; CHECK-NEXT:    i32x4.shr_s
385f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
386f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
38738c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
38838c902bcSThomas Lively  ret <4 x float> %res
38938c902bcSThomas Lively}
39038c902bcSThomas Lively
391f0f97876SThomas Livelydefine <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,
392f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v4f32:
393f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)
394f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
395f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
396f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
397f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
398f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
399f7868f87SThomas Lively; CHECK-NEXT:    f32x4.lt
400f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
401f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
402f0f97876SThomas Lively                                      <4 x float> %x, <4 x float> %y) {
403f0f97876SThomas Lively  %c = fcmp olt <4 x float> %a, %b
404f0f97876SThomas Lively  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
405f0f97876SThomas Lively  ret <4 x float> %res
406f0f97876SThomas Lively}
407f0f97876SThomas Lively
408e661f946SNikita Popovdefine <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {
409f7868f87SThomas Lively; CHECK-LABEL: select_v4f32:
410f7868f87SThomas Lively; CHECK:         .functype select_v4f32 (i32, v128, v128) -> (v128)
411f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
412f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
413f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
414f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
415ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
416f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
41738c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
41838c902bcSThomas Lively  ret <4 x float> %res
41938c902bcSThomas Lively}
42038c902bcSThomas Lively
42138c902bcSThomas Livelydefine <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
422f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v4f32:
423f7868f87SThomas Lively; CHECK:         .functype select_cmp_v4f32 (i32, v128, v128) -> (v128)
424f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
425f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
426f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
427f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
428ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.const 0
429ecb2e5bcSThomas Lively; CHECK-NEXT:    i32.lt_s
430ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
431f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
43238c902bcSThomas Lively  %c = icmp slt i32 %i, 0
43338c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
43438c902bcSThomas Lively  ret <4 x float> %res
43538c902bcSThomas Lively}
43638c902bcSThomas Lively
43738c902bcSThomas Livelydefine <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
438f7868f87SThomas Lively; CHECK-LABEL: select_ne_v4f32:
439f7868f87SThomas Lively; CHECK:         .functype select_ne_v4f32 (i32, v128, v128) -> (v128)
440f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
441f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
442f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
443f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
444ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
445f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
44638c902bcSThomas Lively  %c = icmp ne i32 %i, 0
44738c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
44838c902bcSThomas Lively  ret <4 x float> %res
44938c902bcSThomas Lively}
45038c902bcSThomas Lively
45138c902bcSThomas Livelydefine <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
452f7868f87SThomas Lively; CHECK-LABEL: select_eq_v4f32:
453f7868f87SThomas Lively; CHECK:         .functype select_eq_v4f32 (i32, v128, v128) -> (v128)
454f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
455f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
456ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
457f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
458ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
459f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
46038c902bcSThomas Lively  %c = icmp eq i32 %i, 0
46138c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
46238c902bcSThomas Lively  ret <4 x float> %res
46338c902bcSThomas Lively}
46438c902bcSThomas Lively
46538c902bcSThomas Livelydefine <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
466f7868f87SThomas Lively; CHECK-LABEL: vselect_v2f64:
467f7868f87SThomas Lively; CHECK:         .functype vselect_v2f64 (v128, v128, v128) -> (v128)
468f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
469f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
470f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
471f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
472f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
473f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shl
474f7868f87SThomas Lively; CHECK-NEXT:    i32.const 63
475f7868f87SThomas Lively; CHECK-NEXT:    i64x2.shr_s
476f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
477f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
47838c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
47938c902bcSThomas Lively  ret <2 x double> %res
48038c902bcSThomas Lively}
48138c902bcSThomas Lively
482f0f97876SThomas Livelydefine <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,
483f7868f87SThomas Lively; CHECK-LABEL: vselect_cmp_v2f64:
484f7868f87SThomas Lively; CHECK:         .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)
485f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
486f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
487f7868f87SThomas Lively; CHECK-NEXT:    local.get 3
488f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
489f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
490f7868f87SThomas Lively; CHECK-NEXT:    f64x2.lt
491f7868f87SThomas Lively; CHECK-NEXT:    v128.bitselect
492f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
493f0f97876SThomas Lively                                       <2 x double> %x, <2 x double> %y) {
494f0f97876SThomas Lively  %c = fcmp olt <2 x double> %a, %b
495f0f97876SThomas Lively  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
496f0f97876SThomas Lively  ret <2 x double> %res
497f0f97876SThomas Lively}
498f0f97876SThomas Lively
499e661f946SNikita Popovdefine <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {
500f7868f87SThomas Lively; CHECK-LABEL: select_v2f64:
501f7868f87SThomas Lively; CHECK:         .functype select_v2f64 (i32, v128, v128) -> (v128)
502f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
503f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
504f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
505f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
506ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
507f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
50838c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
50938c902bcSThomas Lively  ret <2 x double> %res
51038c902bcSThomas Lively}
51138c902bcSThomas Lively
51238c902bcSThomas Livelydefine <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
513f7868f87SThomas Lively; CHECK-LABEL: select_cmp_v2f64:
514f7868f87SThomas Lively; CHECK:         .functype select_cmp_v2f64 (i32, v128, v128) -> (v128)
515f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
516f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
517f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
518f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
519f7868f87SThomas Lively; CHECK-NEXT:    i32.const 0
520f7868f87SThomas Lively; CHECK-NEXT:    i32.lt_s
521ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
522f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
52338c902bcSThomas Lively  %c = icmp slt i32 %i, 0
52438c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
52538c902bcSThomas Lively  ret <2 x double> %res
52638c902bcSThomas Lively}
52738c902bcSThomas Lively
52838c902bcSThomas Livelydefine <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
529f7868f87SThomas Lively; CHECK-LABEL: select_ne_v2f64:
530f7868f87SThomas Lively; CHECK:         .functype select_ne_v2f64 (i32, v128, v128) -> (v128)
531f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
532f7868f87SThomas Lively; CHECK-NEXT:    local.get 1
533f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
534f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
535ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
536f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
53738c902bcSThomas Lively  %c = icmp ne i32 %i, 0
53838c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
53938c902bcSThomas Lively  ret <2 x double> %res
54038c902bcSThomas Lively}
54138c902bcSThomas Lively
54238c902bcSThomas Livelydefine <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
543f7868f87SThomas Lively; CHECK-LABEL: select_eq_v2f64:
544f7868f87SThomas Lively; CHECK:         .functype select_eq_v2f64 (i32, v128, v128) -> (v128)
545f7868f87SThomas Lively; CHECK-NEXT:  # %bb.0:
546f7868f87SThomas Lively; CHECK-NEXT:    local.get 2
547ecb2e5bcSThomas Lively; CHECK-NEXT:    local.get 1
548f7868f87SThomas Lively; CHECK-NEXT:    local.get 0
549ecb2e5bcSThomas Lively; CHECK-NEXT:    v128.select
550f7868f87SThomas Lively; CHECK-NEXT:    # fallthrough-return
55138c902bcSThomas Lively  %c = icmp eq i32 %i, 0
55238c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
55338c902bcSThomas Lively  ret <2 x double> %res
55438c902bcSThomas Lively}
555