1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -fast-isel-abort=1 -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_imm(i32 %a) nounwind ssp { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_imm 6*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, #31 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, eq 8*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, 31 9*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 10*9880d681SAndroid Build Coastguard Worker ret i32 %conv 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_neg_imm(i32 %a) nounwind ssp { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_neg_imm 16*9880d681SAndroid Build Coastguard Worker; CHECK: cmn w0, #7 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, eq 18*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, -7 19*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 20*9880d681SAndroid Build Coastguard Worker ret i32 %conv 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_i32(i32 %a, i32 %b) nounwind ssp { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i32 26*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, eq 28*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, %b 29*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 30*9880d681SAndroid Build Coastguard Worker ret i32 %conv 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ne(i32 %a, i32 %b) nounwind ssp { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ne 36*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, ne 38*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %a, %b 39*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 40*9880d681SAndroid Build Coastguard Worker ret i32 %conv 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_ptr(i8* %a) { 44*9880d681SAndroid Build Coastguard Workerentry: 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_ptr 46*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, #0 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{.+}}, eq 48*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8* %a, null 49*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 50*9880d681SAndroid Build Coastguard Worker ret i32 %conv 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ne_ptr(i8* %a) { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ne_ptr 56*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, #0 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{.+}}, ne 58*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %a, null 59*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 60*9880d681SAndroid Build Coastguard Worker ret i32 %conv 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ugt(i32 %a, i32 %b) nounwind ssp { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ugt 66*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, hi 68*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i32 %a, %b 69*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 70*9880d681SAndroid Build Coastguard Worker ret i32 %conv 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_uge(i32 %a, i32 %b) nounwind ssp { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_uge 76*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, hs 78*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge i32 %a, %b 79*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 80*9880d681SAndroid Build Coastguard Worker ret i32 %conv 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ult(i32 %a, i32 %b) nounwind ssp { 84*9880d681SAndroid Build Coastguard Workerentry: 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ult 86*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, lo 88*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %a, %b 89*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 90*9880d681SAndroid Build Coastguard Worker ret i32 %conv 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ule(i32 %a, i32 %b) nounwind ssp { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ule 96*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, ls 98*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %a, %b 99*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 100*9880d681SAndroid Build Coastguard Worker ret i32 %conv 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sgt(i32 %a, i32 %b) nounwind ssp { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sgt 106*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, gt 108*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %a, %b 109*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 110*9880d681SAndroid Build Coastguard Worker ret i32 %conv 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sge(i32 %a, i32 %b) nounwind ssp { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sge 116*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, ge 118*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i32 %a, %b 119*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 120*9880d681SAndroid Build Coastguard Worker ret i32 %conv 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_slt(i32 %a, i32 %b) nounwind ssp { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_slt 126*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, lt 128*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %a, %b 129*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 130*9880d681SAndroid Build Coastguard Worker ret i32 %conv 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sle(i32 %a, i32 %b) nounwind ssp { 134*9880d681SAndroid Build Coastguard Workerentry: 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sle 136*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, le 138*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %a, %b 139*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 140*9880d681SAndroid Build Coastguard Worker ret i32 %conv 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i64(i64 %a, i64 %b) nounwind ssp { 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i64 146*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, x1 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w{{[0-9]+}}, le 148*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i64 %a, %b 149*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 150*9880d681SAndroid Build Coastguard Worker ret i32 %conv 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @icmp_eq_i16(i16 %a, i16 %b) nounwind ssp { 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i16 156*9880d681SAndroid Build Coastguard Worker; CHECK: sxth w0, w0 157*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1, sxth 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, eq 159*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i16 %a, %b 160*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @icmp_eq_i8(i8 %a, i8 %b) nounwind ssp { 164*9880d681SAndroid Build Coastguard Workerentry: 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i8 166*9880d681SAndroid Build Coastguard Worker; CHECK: sxtb w0, w0 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w0, w1, sxtb 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, eq 169*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %a, %b 170*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i16_unsigned(i16 %a, i16 %b) nounwind { 174*9880d681SAndroid Build Coastguard Workerentry: 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i16_unsigned 176*9880d681SAndroid Build Coastguard Worker; CHECK: uxth w0, w0 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w0, w1, uxth 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, lo 179*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i16 %a, %b 180*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 181*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i8_signed(i8 %a, i8 %b) nounwind { 185*9880d681SAndroid Build Coastguard Workerentry: 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i8_signed 187*9880d681SAndroid Build Coastguard Worker; CHECK: sxtb w0, w0 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w0, w1, sxtb 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, gt 190*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i8 %a, %b 191*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 192*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i1_signed(i1 %a, i1 %b) nounwind { 196*9880d681SAndroid Build Coastguard Workerentry: 197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i1_signed 198*9880d681SAndroid Build Coastguard Worker; CHECK: sbfx [[REG1:w[0-9]+]], w0, #0, #1 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbfx [[REG2:w[0-9]+]], w1, #0, #1 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[REG1]], [[REG2]] 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, gt 202*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i1 %a, %b 203*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 204*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i16_signed_const(i16 %a) nounwind { 208*9880d681SAndroid Build Coastguard Workerentry: 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i16_signed_const 210*9880d681SAndroid Build Coastguard Worker; CHECK: sxth w0, w0 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmn w0, #233 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, lt 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and w0, w0, #0x1 214*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i16 %a, -233 215*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 216*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i8_signed_const(i8 %a) nounwind { 220*9880d681SAndroid Build Coastguard Workerentry: 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i8_signed_const 222*9880d681SAndroid Build Coastguard Worker; CHECK: sxtb w0, w0 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w0, #124 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, gt 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and w0, w0, #0x1 226*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i8 %a, 124 227*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 228*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i1_unsigned_const(i1 %a) nounwind { 232*9880d681SAndroid Build Coastguard Workerentry: 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i1_unsigned_const 234*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w0, #0 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset w0, lo 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and w0, w0, #0x1 238*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i1 %a, 0 239*9880d681SAndroid Build Coastguard Worker %conv2 = zext i1 %cmp to i32 240*9880d681SAndroid Build Coastguard Worker ret i32 %conv2 241*9880d681SAndroid Build Coastguard Worker} 242