1*38c902bcSThomas Lively; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s
2*38c902bcSThomas Lively
3*38c902bcSThomas Lively; Test that vector selects of various varieties lower correctly to bitselects.
4*38c902bcSThomas Lively
5*38c902bcSThomas Livelytarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6*38c902bcSThomas Livelytarget triple = "wasm32-unknown-unknown"
7*38c902bcSThomas Lively
8*38c902bcSThomas Lively; ==============================================================================
9*38c902bcSThomas Lively; 16 x i8
10*38c902bcSThomas Lively; ==============================================================================
11*38c902bcSThomas Lively; CHECK-LABEL: vselect_v16i8:
12*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
13*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
14*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 7{{$}}
15*38c902bcSThomas Lively; CHECK-NEXT: i8x16.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
16*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 7{{$}}
17*38c902bcSThomas Lively; CHECK-NEXT: i8x16.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
18*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
19*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
20*38c902bcSThomas Livelydefine <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {
21*38c902bcSThomas Lively  %res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
22*38c902bcSThomas Lively  ret <16 x i8> %res
23*38c902bcSThomas Lively}
24*38c902bcSThomas Lively
25*38c902bcSThomas Lively; CHECK-LABEL: select_v16i8:
26*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
27*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
28*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
29*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
30*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
31*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
32*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
33*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
34*38c902bcSThomas Livelydefine <16 x i8> @select_v16i8(i1 %c, <16 x i8> %x, <16 x i8> %y) {
35*38c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
36*38c902bcSThomas Lively  ret <16 x i8> %res
37*38c902bcSThomas Lively}
38*38c902bcSThomas Lively
39*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v16i8:
40*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
41*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
42*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31
43*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
44*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}}
45*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}}
46*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
47*38c902bcSThomas Livelydefine <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
48*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
49*38c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
50*38c902bcSThomas Lively  ret <16 x i8> %res
51*38c902bcSThomas Lively}
52*38c902bcSThomas Lively
53*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v16i8:
54*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
55*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
56*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
57*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
58*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
59*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
60*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
61*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
62*38c902bcSThomas Livelydefine <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
63*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
64*38c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
65*38c902bcSThomas Lively  ret <16 x i8> %res
66*38c902bcSThomas Lively}
67*38c902bcSThomas Lively
68*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v16i8:
69*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
70*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
71*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
72*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}}
73*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
74*38c902bcSThomas Lively; CHECK-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
75*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
76*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
77*38c902bcSThomas Livelydefine <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
78*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
79*38c902bcSThomas Lively  %res = select i1 %c, <16 x i8> %x, <16 x i8> %y
80*38c902bcSThomas Lively  ret <16 x i8> %res
81*38c902bcSThomas Lively}
82*38c902bcSThomas Lively
83*38c902bcSThomas Lively; ==============================================================================
84*38c902bcSThomas Lively; 8 x i16
85*38c902bcSThomas Lively; ==============================================================================
86*38c902bcSThomas Lively; CHECK-LABEL: vselect_v8i16:
87*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
88*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
89*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 15{{$}}
90*38c902bcSThomas Lively; CHECK-NEXT: i16x8.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
91*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 15{{$}}
92*38c902bcSThomas Lively; CHECK-NEXT: i16x8.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
93*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
94*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
95*38c902bcSThomas Livelydefine <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {
96*38c902bcSThomas Lively  %res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
97*38c902bcSThomas Lively  ret <8 x i16> %res
98*38c902bcSThomas Lively}
99*38c902bcSThomas Lively
100*38c902bcSThomas Lively; CHECK-LABEL: select_v8i16:
101*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
102*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
103*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
104*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
105*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
106*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
107*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
108*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
109*38c902bcSThomas Livelydefine <8 x i16> @select_v8i16(i1 %c, <8 x i16> %x, <8 x i16> %y) {
110*38c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
111*38c902bcSThomas Lively  ret <8 x i16> %res
112*38c902bcSThomas Lively}
113*38c902bcSThomas Lively
114*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v8i16:
115*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
116*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
117*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}}
118*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
119*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}}
120*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}}
121*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
122*38c902bcSThomas Livelydefine <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
123*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
124*38c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
125*38c902bcSThomas Lively  ret <8 x i16> %res
126*38c902bcSThomas Lively}
127*38c902bcSThomas Lively
128*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v8i16:
129*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
130*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
131*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
132*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
133*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
134*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
135*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
136*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
137*38c902bcSThomas Livelydefine <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
138*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
139*38c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
140*38c902bcSThomas Lively  ret <8 x i16> %res
141*38c902bcSThomas Lively}
142*38c902bcSThomas Lively
143*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v8i16:
144*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
145*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
146*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
147*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}}
148*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
149*38c902bcSThomas Lively; CHECK-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
150*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
151*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
152*38c902bcSThomas Livelydefine <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
153*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
154*38c902bcSThomas Lively  %res = select i1 %c, <8 x i16> %x, <8 x i16> %y
155*38c902bcSThomas Lively  ret <8 x i16> %res
156*38c902bcSThomas Lively}
157*38c902bcSThomas Lively
158*38c902bcSThomas Lively; ==============================================================================
159*38c902bcSThomas Lively; 4 x i32
160*38c902bcSThomas Lively; ==============================================================================
161*38c902bcSThomas Lively; CHECK-LABEL: vselect_v4i32:
162*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
163*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
164*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}}
165*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
166*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 31{{$}}
167*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
168*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
169*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
170*38c902bcSThomas Livelydefine <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {
171*38c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
172*38c902bcSThomas Lively  ret <4 x i32> %res
173*38c902bcSThomas Lively}
174*38c902bcSThomas Lively
175*38c902bcSThomas Lively
176*38c902bcSThomas Lively; CHECK-LABEL: select_v4i32:
177*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
178*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
179*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
180*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
181*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
182*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
183*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
184*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
185*38c902bcSThomas Livelydefine <4 x i32> @select_v4i32(i1 %c, <4 x i32> %x, <4 x i32> %y) {
186*38c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
187*38c902bcSThomas Lively  ret <4 x i32> %res
188*38c902bcSThomas Lively}
189*38c902bcSThomas Lively
190*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v4i32:
191*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
192*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
193*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}}
194*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
195*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}}
196*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}}
197*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
198*38c902bcSThomas Livelydefine <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
199*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
200*38c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
201*38c902bcSThomas Lively  ret <4 x i32> %res
202*38c902bcSThomas Lively}
203*38c902bcSThomas Lively
204*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v4i32:
205*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
206*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
207*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
208*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
209*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
210*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
211*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
212*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
213*38c902bcSThomas Livelydefine <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
214*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
215*38c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
216*38c902bcSThomas Lively  ret <4 x i32> %res
217*38c902bcSThomas Lively}
218*38c902bcSThomas Lively
219*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v4i32:
220*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
221*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
222*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
223*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}}
224*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
225*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
226*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
227*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
228*38c902bcSThomas Livelydefine <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
229*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
230*38c902bcSThomas Lively  %res = select i1 %c, <4 x i32> %x, <4 x i32> %y
231*38c902bcSThomas Lively  ret <4 x i32> %res
232*38c902bcSThomas Lively}
233*38c902bcSThomas Lively
234*38c902bcSThomas Lively; ==============================================================================
235*38c902bcSThomas Lively; 2 x i64
236*38c902bcSThomas Lively; ==============================================================================
237*38c902bcSThomas Lively; CHECK-LABEL: vselect_v2i64:
238*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
239*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
240*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 63{{$}}
241*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
242*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 63{{$}}
243*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
244*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
245*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
246*38c902bcSThomas Livelydefine <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {
247*38c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
248*38c902bcSThomas Lively  ret <2 x i64> %res
249*38c902bcSThomas Lively}
250*38c902bcSThomas Lively
251*38c902bcSThomas Lively; CHECK-LABEL: select_v2i64:
252*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
253*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
254*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
255*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
256*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
257*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
258*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
259*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
260*38c902bcSThomas Livelydefine <2 x i64> @select_v2i64(i1 %c, <2 x i64> %x, <2 x i64> %y) {
261*38c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
262*38c902bcSThomas Lively  ret <2 x i64> %res
263*38c902bcSThomas Lively}
264*38c902bcSThomas Lively
265*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v2i64:
266*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
267*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
268*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
269*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
270*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 0{{$}}
271*38c902bcSThomas Lively; CHECK-NEXT: i32.lt_s $push[[L3:[0-9]+]]=, $0, $pop[[L2]]{{$}}
272*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L4:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $pop[[L3]]{{$}}
273*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L5:[0-9]+]]=, $pop[[L4]]{{$}}
274*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L5]]{{$}}
275*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
276*38c902bcSThomas Livelydefine <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
277*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
278*38c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
279*38c902bcSThomas Lively  ret <2 x i64> %res
280*38c902bcSThomas Lively}
281*38c902bcSThomas Lively
282*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v2i64:
283*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
284*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
285*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
286*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
287*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
288*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
289*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
290*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
291*38c902bcSThomas Livelydefine <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
292*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
293*38c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
294*38c902bcSThomas Lively  ret <2 x i64> %res
295*38c902bcSThomas Lively}
296*38c902bcSThomas Lively
297*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v2i64:
298*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
299*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
300*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 0{{$}}
301*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, -1{{$}}
302*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
303*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
304*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
305*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
306*38c902bcSThomas Livelydefine <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
307*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
308*38c902bcSThomas Lively  %res = select i1 %c, <2 x i64> %x, <2 x i64> %y
309*38c902bcSThomas Lively  ret <2 x i64> %res
310*38c902bcSThomas Lively}
311*38c902bcSThomas Lively
312*38c902bcSThomas Lively; ==============================================================================
313*38c902bcSThomas Lively; 4 x float
314*38c902bcSThomas Lively; ==============================================================================
315*38c902bcSThomas Lively; CHECK-LABEL: vselect_v4f32:
316*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
317*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
318*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}}
319*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
320*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 31{{$}}
321*38c902bcSThomas Lively; CHECK-NEXT: i32x4.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
322*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
323*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
324*38c902bcSThomas Livelydefine <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
325*38c902bcSThomas Lively  %res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
326*38c902bcSThomas Lively  ret <4 x float> %res
327*38c902bcSThomas Lively}
328*38c902bcSThomas Lively
329*38c902bcSThomas Lively; CHECK-LABEL: select_v4f32:
330*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
331*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
332*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
333*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
334*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
335*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
336*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
337*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
338*38c902bcSThomas Livelydefine <4 x float> @select_v4f32(i1 %c, <4 x float> %x, <4 x float> %y) {
339*38c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
340*38c902bcSThomas Lively  ret <4 x float> %res
341*38c902bcSThomas Lively}
342*38c902bcSThomas Lively
343*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v4f32:
344*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
345*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
346*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 31{{$}}
347*38c902bcSThomas Lively; CHECK-NEXT: i32.shr_s $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
348*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L2:[0-9]+]]=, $pop[[L1]]{{$}}
349*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L2]]{{$}}
350*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
351*38c902bcSThomas Livelydefine <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
352*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
353*38c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
354*38c902bcSThomas Lively  ret <4 x float> %res
355*38c902bcSThomas Lively}
356*38c902bcSThomas Lively
357*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v4f32:
358*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
359*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
360*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, -1{{$}}
361*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, 0{{$}}
362*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
363*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
364*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
365*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
366*38c902bcSThomas Livelydefine <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
367*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
368*38c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
369*38c902bcSThomas Lively  ret <4 x float> %res
370*38c902bcSThomas Lively}
371*38c902bcSThomas Lively
372*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v4f32:
373*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
374*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
375*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
376*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, -1{{$}}
377*38c902bcSThomas Lively; CHECK-NEXT: i32.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
378*38c902bcSThomas Lively; CHECK-NEXT: i32x4.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
379*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
380*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
381*38c902bcSThomas Livelydefine <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
382*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
383*38c902bcSThomas Lively  %res = select i1 %c, <4 x float> %x, <4 x float> %y
384*38c902bcSThomas Lively  ret <4 x float> %res
385*38c902bcSThomas Lively}
386*38c902bcSThomas Lively
387*38c902bcSThomas Lively; ==============================================================================
388*38c902bcSThomas Lively; 2 x double
389*38c902bcSThomas Lively; ==============================================================================
390*38c902bcSThomas Lively; CHECK-LABEL: vselect_v2f64:
391*38c902bcSThomas Lively; CHECK-NEXT: .param v128, v128, v128{{$}}
392*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
393*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 63{{$}}
394*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shl $push[[L1:[0-9]+]]=, $0, $pop[[L0]]{{$}}
395*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 63{{$}}
396*38c902bcSThomas Lively; CHECK-NEXT: i64x2.shr_s $push[[L3:[0-9]+]]=, $pop[[L1]], $pop[[L2]]{{$}}
397*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
398*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
399*38c902bcSThomas Livelydefine <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
400*38c902bcSThomas Lively  %res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
401*38c902bcSThomas Lively  ret <2 x double> %res
402*38c902bcSThomas Lively}
403*38c902bcSThomas Lively
404*38c902bcSThomas Lively; CHECK-LABEL: select_v2f64:
405*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
406*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
407*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
408*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
409*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
410*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
411*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
412*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
413*38c902bcSThomas Livelydefine <2 x double> @select_v2f64(i1 %c, <2 x double> %x, <2 x double> %y) {
414*38c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
415*38c902bcSThomas Lively  ret <2 x double> %res
416*38c902bcSThomas Lively}
417*38c902bcSThomas Lively
418*38c902bcSThomas Lively; CHECK-LABEL: select_cmp_v2f64:
419*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
420*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
421*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
422*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
423*38c902bcSThomas Lively; CHECK-NEXT: i32.const $push[[L2:[0-9]+]]=, 0{{$}}
424*38c902bcSThomas Lively; CHECK-NEXT: i32.lt_s $push[[L3:[0-9]+]]=, $0, $pop[[L2]]{{$}}
425*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L4:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $pop[[L3]]{{$}}
426*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L5:[0-9]+]]=, $pop[[L4]]{{$}}
427*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L5]]{{$}}
428*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
429*38c902bcSThomas Livelydefine <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
430*38c902bcSThomas Lively  %c = icmp slt i32 %i, 0
431*38c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
432*38c902bcSThomas Lively  ret <2 x double> %res
433*38c902bcSThomas Lively}
434*38c902bcSThomas Lively
435*38c902bcSThomas Lively; CHECK-LABEL: select_ne_v2f64:
436*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
437*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
438*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, -1{{$}}
439*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, 0{{$}}
440*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
441*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
442*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
443*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
444*38c902bcSThomas Livelydefine <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
445*38c902bcSThomas Lively  %c = icmp ne i32 %i, 0
446*38c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
447*38c902bcSThomas Lively  ret <2 x double> %res
448*38c902bcSThomas Lively}
449*38c902bcSThomas Lively
450*38c902bcSThomas Lively; CHECK-LABEL: select_eq_v2f64:
451*38c902bcSThomas Lively; CHECK-NEXT: .param i32, v128, v128{{$}}
452*38c902bcSThomas Lively; CHECK-NEXT: .result v128{{$}}
453*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 0{{$}}
454*38c902bcSThomas Lively; CHECK-NEXT: i64.const $push[[L1:[0-9]+]]=, -1{{$}}
455*38c902bcSThomas Lively; CHECK-NEXT: i64.select $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]], $0{{$}}
456*38c902bcSThomas Lively; CHECK-NEXT: i64x2.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
457*38c902bcSThomas Lively; CHECK-NEXT: v128.bitselect $push[[R:[0-9]+]]=, $1, $2, $pop[[L3]]{{$}}
458*38c902bcSThomas Lively; CHECK-NEXT: return $pop[[R]]{{$}}
459*38c902bcSThomas Livelydefine <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
460*38c902bcSThomas Lively  %c = icmp eq i32 %i, 0
461*38c902bcSThomas Lively  %res = select i1 %c, <2 x double> %x, <2 x double> %y
462*38c902bcSThomas Lively  ret <2 x double> %res
463*38c902bcSThomas Lively}
464