1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; First test the different supported value types for select. 5*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @select_i1(i1 zeroext %c, i1 zeroext %a, i1 zeroext %b) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_i1 7*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel {{w[0-9]+}}, w1, w2, ne 9*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i1 %a, i1 %b 10*9880d681SAndroid Build Coastguard Worker ret i1 %1 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @select_i8(i1 zeroext %c, i8 zeroext %a, i8 zeroext %b) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_i8 15*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel {{w[0-9]+}}, w1, w2, ne 17*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i8 %a, i8 %b 18*9880d681SAndroid Build Coastguard Worker ret i8 %1 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @select_i16(i1 zeroext %c, i16 zeroext %a, i16 zeroext %b) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_i16 23*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel {{w[0-9]+}}, w1, w2, ne 25*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i16 %a, i16 %b 26*9880d681SAndroid Build Coastguard Worker ret i16 %1 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @select_i32(i1 zeroext %c, i32 %a, i32 %b) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_i32 31*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel {{w[0-9]+}}, w1, w2, ne 33*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i32 %a, i32 %b 34*9880d681SAndroid Build Coastguard Worker ret i32 %1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i64 @select_i64(i1 zeroext %c, i64 %a, i64 %b) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_i64 39*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel {{x[0-9]+}}, x1, x2, ne 41*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i64 %a, i64 %b 42*9880d681SAndroid Build Coastguard Worker ret i64 %1 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine float @select_f32(i1 zeroext %c, float %a, float %b) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_f32 47*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, ne 49*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, float %a, float %b 50*9880d681SAndroid Build Coastguard Worker ret float %1 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine double @select_f64(i1 zeroext %c, double %a, double %b) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_f64 55*9880d681SAndroid Build Coastguard Worker; CHECK: {{cmp w0, #0|tst w0, #0x1}} 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{d[0-9]+}}, d0, d1, ne 57*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, double %a, double %b 58*9880d681SAndroid Build Coastguard Worker ret double %1 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; Now test the folding of all compares. 62*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_false(float %x, float %a, float %b) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_false 64*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b {{v[0-9]+}}, v2 65*9880d681SAndroid Build Coastguard Worker %1 = fcmp ogt float %x, %x 66*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 67*9880d681SAndroid Build Coastguard Worker ret float %2 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ogt(float %x, float %y, float %a, float %b) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ogt 72*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, gt 74*9880d681SAndroid Build Coastguard Worker %1 = fcmp ogt float %x, %y 75*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 76*9880d681SAndroid Build Coastguard Worker ret float %2 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_oge(float %x, float %y, float %a, float %b) { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_oge 81*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, ge 83*9880d681SAndroid Build Coastguard Worker %1 = fcmp oge float %x, %y 84*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 85*9880d681SAndroid Build Coastguard Worker ret float %2 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_olt(float %x, float %y, float %a, float %b) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_olt 90*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, mi 92*9880d681SAndroid Build Coastguard Worker %1 = fcmp olt float %x, %y 93*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 94*9880d681SAndroid Build Coastguard Worker ret float %2 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ole(float %x, float %y, float %a, float %b) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ole 99*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, ls 101*9880d681SAndroid Build Coastguard Worker %1 = fcmp ole float %x, %y 102*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 103*9880d681SAndroid Build Coastguard Worker ret float %2 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_one(float %x, float %y, float %a, float %b) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_one 108*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel [[REG:s[0-9]+]], s2, s3, mi 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, [[REG]], gt 111*9880d681SAndroid Build Coastguard Worker %1 = fcmp one float %x, %y 112*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 113*9880d681SAndroid Build Coastguard Worker ret float %2 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ord(float %x, float %y, float %a, float %b) { 117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ord 118*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, vc 120*9880d681SAndroid Build Coastguard Worker %1 = fcmp ord float %x, %y 121*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 122*9880d681SAndroid Build Coastguard Worker ret float %2 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_uno(float %x, float %y, float %a, float %b) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uno 127*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, vs 129*9880d681SAndroid Build Coastguard Worker %1 = fcmp uno float %x, %y 130*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 131*9880d681SAndroid Build Coastguard Worker ret float %2 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ueq(float %x, float %y, float %a, float %b) { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ueq 136*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel [[REG:s[0-9]+]], s2, s3, eq 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, [[REG]], vs 139*9880d681SAndroid Build Coastguard Worker %1 = fcmp ueq float %x, %y 140*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 141*9880d681SAndroid Build Coastguard Worker ret float %2 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ugt(float %x, float %y, float %a, float %b) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ugt 146*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, hi 148*9880d681SAndroid Build Coastguard Worker %1 = fcmp ugt float %x, %y 149*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 150*9880d681SAndroid Build Coastguard Worker ret float %2 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_uge(float %x, float %y, float %a, float %b) { 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uge 155*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, pl 157*9880d681SAndroid Build Coastguard Worker %1 = fcmp uge float %x, %y 158*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 159*9880d681SAndroid Build Coastguard Worker ret float %2 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ult(float %x, float %y, float %a, float %b) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ult 164*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, lt 166*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %x, %y 167*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 168*9880d681SAndroid Build Coastguard Worker ret float %2 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ule(float %x, float %y, float %a, float %b) { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ule 174*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, le 176*9880d681SAndroid Build Coastguard Worker %1 = fcmp ule float %x, %y 177*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 178*9880d681SAndroid Build Coastguard Worker ret float %2 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_une(float %x, float %y, float %a, float %b) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_une 183*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s2, s3, ne 185*9880d681SAndroid Build Coastguard Worker %1 = fcmp une float %x, %y 186*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 187*9880d681SAndroid Build Coastguard Worker ret float %2 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_true(float %x, float %a, float %b) { 191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_true 192*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b {{v[0-9]+}}, v1 193*9880d681SAndroid Build Coastguard Worker %1 = fcmp ueq float %x, %x 194*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 195*9880d681SAndroid Build Coastguard Worker ret float %2 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_eq(i32 %x, i32 %y, float %a, float %b) { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_eq 200*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, eq 202*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %x, %y 203*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 204*9880d681SAndroid Build Coastguard Worker ret float %2 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_ne(i32 %x, i32 %y, float %a, float %b) { 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_ne 209*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, ne 211*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i32 %x, %y 212*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 213*9880d681SAndroid Build Coastguard Worker ret float %2 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_ugt(i32 %x, i32 %y, float %a, float %b) { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_ugt 218*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, hi 220*9880d681SAndroid Build Coastguard Worker %1 = icmp ugt i32 %x, %y 221*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 222*9880d681SAndroid Build Coastguard Worker ret float %2 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_uge(i32 %x, i32 %y, float %a, float %b) { 226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_uge 227*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, hs 229*9880d681SAndroid Build Coastguard Worker %1 = icmp uge i32 %x, %y 230*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 231*9880d681SAndroid Build Coastguard Worker ret float %2 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_ult(i32 %x, i32 %y, float %a, float %b) { 235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_ult 236*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, lo 238*9880d681SAndroid Build Coastguard Worker %1 = icmp ult i32 %x, %y 239*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 240*9880d681SAndroid Build Coastguard Worker ret float %2 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_ule(i32 %x, i32 %y, float %a, float %b) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_ule 245*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, ls 247*9880d681SAndroid Build Coastguard Worker %1 = icmp ule i32 %x, %y 248*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 249*9880d681SAndroid Build Coastguard Worker ret float %2 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_sgt(i32 %x, i32 %y, float %a, float %b) { 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_sgt 254*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, gt 256*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %x, %y 257*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 258*9880d681SAndroid Build Coastguard Worker ret float %2 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_sge(i32 %x, i32 %y, float %a, float %b) { 262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_sge 263*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, ge 265*9880d681SAndroid Build Coastguard Worker %1 = icmp sge i32 %x, %y 266*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 267*9880d681SAndroid Build Coastguard Worker ret float %2 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_slt(i32 %x, i32 %y, float %a, float %b) { 271*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_slt 272*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, lt 274*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %x, %y 275*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 276*9880d681SAndroid Build Coastguard Worker ret float %2 277*9880d681SAndroid Build Coastguard Worker} 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Workerdefine float @select_icmp_sle(i32 %x, i32 %y, float %a, float %b) { 280*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_icmp_sle 281*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel {{s[0-9]+}}, s0, s1, le 283*9880d681SAndroid Build Coastguard Worker %1 = icmp sle i32 %x, %y 284*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float %b 285*9880d681SAndroid Build Coastguard Worker ret float %2 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker; Test peephole optimizations for select. 289*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @select_opt1(i1 zeroext %c, i1 zeroext %a) { 290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_opt1 291*9880d681SAndroid Build Coastguard Worker; CHECK: orr {{w[0-9]+}}, w0, w1 292*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i1 true, i1 %a 293*9880d681SAndroid Build Coastguard Worker ret i1 %1 294*9880d681SAndroid Build Coastguard Worker} 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @select_opt2(i1 zeroext %c, i1 zeroext %a) { 297*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_opt2 298*9880d681SAndroid Build Coastguard Worker; CHECK: eor [[REG:w[0-9]+]], w0, #0x1 299*9880d681SAndroid Build Coastguard Worker; CHECK: orr {{w[0-9]+}}, [[REG]], w1 300*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i1 %a, i1 true 301*9880d681SAndroid Build Coastguard Worker ret i1 %1 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @select_opt3(i1 zeroext %c, i1 zeroext %a) { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_opt3 306*9880d681SAndroid Build Coastguard Worker; CHECK: bic {{w[0-9]+}}, w1, w0 307*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i1 false, i1 %a 308*9880d681SAndroid Build Coastguard Worker ret i1 %1 309*9880d681SAndroid Build Coastguard Worker} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @select_opt4(i1 zeroext %c, i1 zeroext %a) { 312*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_opt4 313*9880d681SAndroid Build Coastguard Worker; CHECK: and {{w[0-9]+}}, w0, w1 314*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, i1 %a, i1 false 315*9880d681SAndroid Build Coastguard Worker ret i1 %1 316*9880d681SAndroid Build Coastguard Worker} 317