xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-neon-select_cc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc  -mtriple=arm64-none-linux-gnu -mattr=+neon -fp-contract=fast \
2*9880d681SAndroid Build Coastguard Worker; RUN:        < %s -verify-machineinstrs -asm-verbose=false | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine <8x i8> @test_select_cc_v8i8_i8(i8 %a, i8 %b, <8x i8> %c, <8x i8> %d ) {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v8i8_i8:
6*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
7*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
8*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].8b, v[[LHS]].8b, v[[RHS]].8b
9*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].8b, [[MASK]].b[0]
10*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].8b, v0.8b, v1.8b
11*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i8 %a, %b
12*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <8x i8> %c, <8x i8> %d
13*9880d681SAndroid Build Coastguard Worker  ret <8x i8> %e
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine <8x i8> @test_select_cc_v8i8_f32(float %a, float %b, <8x i8> %c, <8x i8> %d ) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v8i8_f32:
18*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].2s, v0.2s, v1.2s
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup [[DUPMASK:v[0-9]+]].2s, [[MASK]].s[0]
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[DUPMASK]].8b, v2.8b, v3.8b
21*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq float %a, %b
22*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <8x i8> %c, <8x i8> %d
23*9880d681SAndroid Build Coastguard Worker  ret <8x i8> %e
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine <8x i8> @test_select_cc_v8i8_f64(double %a, double %b, <8x i8> %c, <8x i8> %d ) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v8i8_f64:
28*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq d[[MASK:[0-9]+]], d0, d1
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl v[[MASK]].8b, v2.8b, v3.8b
30*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq double %a, %b
31*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <8x i8> %c, <8x i8> %d
32*9880d681SAndroid Build Coastguard Worker  ret <8x i8> %e
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine <16x i8> @test_select_cc_v16i8_i8(i8 %a, i8 %b, <16x i8> %c, <16x i8> %d ) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v16i8_i8:
37*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
39*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].16b, v[[LHS]].16b, v[[RHS]].16b
40*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].16b, [[MASK]].b[0]
41*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v0.16b, v1.16b
42*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i8 %a, %b
43*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <16x i8> %c, <16x i8> %d
44*9880d681SAndroid Build Coastguard Worker  ret <16x i8> %e
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine <16x i8> @test_select_cc_v16i8_f32(float %a, float %b, <16x i8> %c, <16x i8> %d ) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v16i8_f32:
49*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].4s, v0.4s, v1.4s
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup [[DUPMASK:v[0-9]+]].4s, [[MASK]].s[0]
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[DUPMASK]].16b, v2.16b, v3.16b
52*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq float %a, %b
53*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <16x i8> %c, <16x i8> %d
54*9880d681SAndroid Build Coastguard Worker  ret <16x i8> %e
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine <16x i8> @test_select_cc_v16i8_f64(double %a, double %b, <16x i8> %c, <16x i8> %d ) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v16i8_f64:
59*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].2d, v0.2d, v1.2d
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup [[DUPMASK:v[0-9]+]].2d, [[MASK]].d[0]
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[DUPMASK]].16b, v2.16b, v3.16b
62*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq double %a, %b
63*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <16x i8> %c, <16x i8> %d
64*9880d681SAndroid Build Coastguard Worker  ret <16x i8> %e
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine <4x i16> @test_select_cc_v4i16(i16 %a, i16 %b, <4x i16> %c, <4x i16> %d ) {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v4i16:
69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
70*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
71*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].4h, v[[LHS]].4h, v[[RHS]].4h
72*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].4h, [[MASK]].h[0]
73*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].8b, v0.8b, v1.8b
74*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i16 %a, %b
75*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <4x i16> %c, <4x i16> %d
76*9880d681SAndroid Build Coastguard Worker  ret <4x i16> %e
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine <8x i16> @test_select_cc_v8i16(i16 %a, i16 %b, <8x i16> %c, <8x i16> %d ) {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v8i16:
81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
83*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].8h, v[[LHS]].8h, v[[RHS]].8h
84*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].8h, [[MASK]].h[0]
85*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v0.16b, v1.16b
86*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i16 %a, %b
87*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <8x i16> %c, <8x i16> %d
88*9880d681SAndroid Build Coastguard Worker  ret <8x i16> %e
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine <2x i32> @test_select_cc_v2i32(i32 %a, i32 %b, <2x i32> %c, <2x i32> %d ) {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v2i32:
93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
94*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
95*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].2s, v[[LHS]].2s, v[[RHS]].2s
96*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].2s, [[MASK]].s[0]
97*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].8b, v0.8b, v1.8b
98*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i32 %a, %b
99*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <2x i32> %c, <2x i32> %d
100*9880d681SAndroid Build Coastguard Worker  ret <2x i32> %e
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine <4x i32> @test_select_cc_v4i32(i32 %a, i32 %b, <4x i32> %c, <4x i32> %d ) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v4i32:
105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
106*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
107*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].4s, v[[LHS]].4s, v[[RHS]].4s
108*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].4s, [[MASK]].s[0]
109*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v0.16b, v1.16b
110*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i32 %a, %b
111*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <4x i32> %c, <4x i32> %d
112*9880d681SAndroid Build Coastguard Worker  ret <4x i32> %e
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine <1x i64> @test_select_cc_v1i64(i64 %a, i64 %b, <1x i64> %c, <1x i64> %d ) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v1i64:
117*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov d[[LHS:[0-9]+]], x0
118*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov d[[RHS:[0-9]+]], x1
119*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq d[[MASK:[0-9]+]], d[[LHS]], d[[RHS]]
120*9880d681SAndroid Build Coastguard Worker; CHECK: bsl v[[MASK]].8b, v0.8b, v1.8b
121*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i64 %a, %b
122*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <1x i64> %c, <1x i64> %d
123*9880d681SAndroid Build Coastguard Worker  ret <1x i64> %e
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine <2x i64> @test_select_cc_v2i64(i64 %a, i64 %b, <2x i64> %c, <2x i64> %d ) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v2i64:
128*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov d[[LHS:[0-9]+]], x0
129*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov d[[RHS:[0-9]+]], x1
130*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].2d, v[[LHS]].2d, v[[RHS]].2d
131*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].2d, [[MASK]].d[0]
132*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v0.16b, v1.16b
133*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i64 %a, %b
134*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <2x i64> %c, <2x i64> %d
135*9880d681SAndroid Build Coastguard Worker  ret <2x i64> %e
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test_select_cc_v1f32(float %a, float %b, <1 x float> %c, <1 x float> %d ) {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v1f32:
140*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].2s, v0.2s, v1.2s
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[MASK]].8b, v2.8b, v3.8b
142*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq float %a, %b
143*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <1 x float> %c, <1 x float> %d
144*9880d681SAndroid Build Coastguard Worker  ret <1 x float> %e
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_select_cc_v2f32(float %a, float %b, <2 x float> %c, <2 x float> %d ) {
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v2f32:
149*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].2s, v0.2s, v1.2s
150*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].2s, [[MASK]].s[0]
151*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].8b, v2.8b, v3.8b
152*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq float %a, %b
153*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <2 x float> %c, <2 x float> %d
154*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %e
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine <4x float> @test_select_cc_v4f32(float %a, float %b, <4x float> %c, <4x float> %d ) {
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v4f32:
159*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].4s, v0.4s, v1.4s
160*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].4s, [[MASK]].s[0]
161*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v2.16b, v3.16b
162*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq float %a, %b
163*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <4x float> %c, <4x float> %d
164*9880d681SAndroid Build Coastguard Worker  ret <4x float> %e
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine <4x float> @test_select_cc_v4f32_icmp(i32 %a, i32 %b, <4x float> %c, <4x float> %d ) {
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v4f32_icmp:
169*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[LHS:[0-9]+]], w0
170*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[RHS:[0-9]+]], w1
171*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq [[MASK:v[0-9]+]].4s, v[[LHS]].4s, v[[RHS]].4s
172*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].4s, [[MASK]].s[0]
173*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v0.16b, v1.16b
174*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i32 %a, %b
175*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <4x float> %c, <4x float> %d
176*9880d681SAndroid Build Coastguard Worker  ret <4x float> %e
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_select_cc_v1f64(double %a, double %b, <1 x double> %c, <1 x double> %d ) {
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v1f64:
181*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq d[[MASK:[0-9]+]], d0, d1
182*9880d681SAndroid Build Coastguard Worker; CHECK: bsl v[[MASK]].8b, v2.8b, v3.8b
183*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq double %a, %b
184*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <1 x double> %c, <1 x double> %d
185*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %e
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_select_cc_v1f64_icmp(i64 %a, i64 %b, <1 x double> %c, <1 x double> %d ) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v1f64_icmp:
190*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov [[LHS:d[0-9]+]], x0
191*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov [[RHS:d[0-9]+]], x1
192*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq d[[MASK:[0-9]+]], [[LHS]], [[RHS]]
193*9880d681SAndroid Build Coastguard Worker; CHECK: bsl v[[MASK]].8b, v0.8b, v1.8b
194*9880d681SAndroid Build Coastguard Worker  %cmp31 = icmp eq i64 %a, %b
195*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <1 x double> %c, <1 x double> %d
196*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %e
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_select_cc_v2f64(double %a, double %b, <2 x double> %c, <2 x double> %d ) {
200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v2f64:
201*9880d681SAndroid Build Coastguard Worker; CHECK: fcmeq [[MASK:v[0-9]+]].2d, v0.2d, v1.2d
202*9880d681SAndroid Build Coastguard Worker; CHECK: dup [[DUPMASK:v[0-9]+]].2d, [[MASK]].d[0]
203*9880d681SAndroid Build Coastguard Worker; CHECK: bsl [[DUPMASK]].16b, v2.16b, v3.16b
204*9880d681SAndroid Build Coastguard Worker  %cmp31 = fcmp oeq double %a, %b
205*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp31, <2 x double> %c, <2 x double> %d
206*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %e
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; Special case: when the select condition is an icmp with i1 operands, don't
210*9880d681SAndroid Build Coastguard Worker; do the comparison on vectors.
211*9880d681SAndroid Build Coastguard Worker; Part of PR21549.
212*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_select_cc_v2i32_icmpi1(i1 %cc, <2 x i32> %a, <2 x i32> %b) {
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v2i32_icmpi1:
214*9880d681SAndroid Build Coastguard Worker; CHECK: tst   w0, #0x1
215*9880d681SAndroid Build Coastguard Worker; CHECK: csetm [[MASK:w[0-9]+]], ne
216*9880d681SAndroid Build Coastguard Worker; CHECK: dup   [[DUPMASK:v[0-9]+]].2s, [[MASK]]
217*9880d681SAndroid Build Coastguard Worker; CHECK: bsl   [[DUPMASK]].8b, v0.8b, v1.8b
218*9880d681SAndroid Build Coastguard Worker; CHECK: mov   v0.16b, [[DUPMASK]].16b
219*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i1 %cc, 0
220*9880d681SAndroid Build Coastguard Worker  %e = select i1 %cmp, <2 x i32> %a, <2 x i32> %b
221*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %e
222*9880d681SAndroid Build Coastguard Worker}
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; Also make sure we support irregular/non-power-of-2 types such as v3f32.
225*9880d681SAndroid Build Coastguard Workerdefine <3 x float> @test_select_cc_v3f32_fcmp_f32(<3 x float> %a, <3 x float> %b, float %c1, float %c2) #0 {
226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v3f32_fcmp_f32:
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmeq [[MASK:v[0-9]+]].4s, v2.4s, v3.4s
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup [[DUPMASK:v[0-9]+]].4s, [[MASK]].s[0]
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[DUPMASK:v[0-9]+]].16b, v0.16b, v1.16b
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov v0.16b, [[DUPMASK]].16b
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
232*9880d681SAndroid Build Coastguard Worker  %cc = fcmp oeq float %c1, %c2
233*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cc, <3 x float> %a, <3 x float> %b
234*9880d681SAndroid Build Coastguard Worker  ret <3 x float> %r
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine <3 x float> @test_select_cc_v3f32_fcmp_f64(<3 x float> %a, <3 x float> %b, double %c1, double %c2) #0 {
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_v3f32_fcmp_f64:
239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmeq [[MASK:v[0-9]+]].2d, v2.2d, v3.2d
240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup [[DUPMASK:v[0-9]+]].2d, [[MASK]].d[0]
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsl [[DUPMASK:v[0-9]+]].16b, v0.16b, v1.16b
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov v0.16b, [[DUPMASK]].16b
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
244*9880d681SAndroid Build Coastguard Worker  %cc = fcmp oeq double %c1, %c2
245*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cc, <3 x float> %a, <3 x float> %b
246*9880d681SAndroid Build Coastguard Worker  ret <3 x float> %r
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind}
250