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