1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-atomic-cfg-tidy=0 -disable-post-ra -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-atomic-cfg-tidy=0 -fast-isel -fast-isel-abort=1 -disable-post-ra -verify-machineinstrs < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; Get the actual value of the overflow bit. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo1.i32(i32 %v1, i32 %v2, i32* %res) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo1.i32 10*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, w1 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 12*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 13*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 14*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 15*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 16*9880d681SAndroid Build Coastguard Worker ret i1 %obit 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; Test the immediate version. 20*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo2.i32(i32 %v1, i32* %res) { 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo2.i32 23*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, #4 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 25*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 4) 26*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 27*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 28*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 29*9880d681SAndroid Build Coastguard Worker ret i1 %obit 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; Test negative immediates. 33*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo3.i32(i32 %v1, i32* %res) { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo3.i32 36*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{w[0-9]+}}, w0, #4 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 38*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 -4) 39*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 40*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 41*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 42*9880d681SAndroid Build Coastguard Worker ret i1 %obit 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Test immediates that are too large to be encoded. 46*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo4.i32(i32 %v1, i32* %res) { 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo4.i32 49*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, {{w[0-9]+}} 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 51*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 16777215) 52*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 53*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 54*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 55*9880d681SAndroid Build Coastguard Worker ret i1 %obit 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; Test shift folding. 59*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo5.i32(i32 %v1, i32 %v2, i32* %res) { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo5.i32 62*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, w1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 64*9880d681SAndroid Build Coastguard Worker %lsl = shl i32 %v2, 16 65*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %lsl) 66*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 67*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 68*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 69*9880d681SAndroid Build Coastguard Worker ret i1 %obit 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo1.i64(i64 %v1, i64 %v2, i64* %res) { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo1.i64 75*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{x[0-9]+}}, x0, x1 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 77*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 78*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 79*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 80*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 81*9880d681SAndroid Build Coastguard Worker ret i1 %obit 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo2.i64(i64 %v1, i64* %res) { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo2.i64 87*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{x[0-9]+}}, x0, #4 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 89*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 4) 90*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 91*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 92*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 93*9880d681SAndroid Build Coastguard Worker ret i1 %obit 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo3.i64(i64 %v1, i64* %res) { 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo3.i64 99*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{x[0-9]+}}, x0, #4 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 101*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -4) 102*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 103*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 104*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 105*9880d681SAndroid Build Coastguard Worker ret i1 %obit 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) { 109*9880d681SAndroid Build Coastguard Workerentry: 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.i32 111*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, w1 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, hs 113*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 114*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 115*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 116*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 117*9880d681SAndroid Build Coastguard Worker ret i1 %obit 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) { 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.i64 123*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{x[0-9]+}}, x0, x1 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, hs 125*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 126*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 127*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 128*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 129*9880d681SAndroid Build Coastguard Worker ret i1 %obit 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo1.i32(i32 %v1, i32 %v2, i32* %res) { 133*9880d681SAndroid Build Coastguard Workerentry: 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo1.i32 135*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{w[0-9]+}}, w0, w1 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 137*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 138*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 139*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 140*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 141*9880d681SAndroid Build Coastguard Worker ret i1 %obit 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo2.i32(i32 %v1, i32* %res) { 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo2.i32 147*9880d681SAndroid Build Coastguard Worker; CHECK: adds {{w[0-9]+}}, w0, #4 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 149*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 -4) 150*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 151*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 152*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 153*9880d681SAndroid Build Coastguard Worker ret i1 %obit 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) { 157*9880d681SAndroid Build Coastguard Workerentry: 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.i64 159*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{x[0-9]+}}, x0, x1 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 161*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 162*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 163*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 164*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 165*9880d681SAndroid Build Coastguard Worker ret i1 %obit 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) { 169*9880d681SAndroid Build Coastguard Workerentry: 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.i32 171*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{w[0-9]+}}, w0, w1 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, lo 173*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 174*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 175*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 176*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 177*9880d681SAndroid Build Coastguard Worker ret i1 %obit 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) { 181*9880d681SAndroid Build Coastguard Workerentry: 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.i64 183*9880d681SAndroid Build Coastguard Worker; CHECK: subs {{x[0-9]+}}, x0, x1 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, lo 185*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 186*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 187*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 188*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 189*9880d681SAndroid Build Coastguard Worker ret i1 %obit 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) { 193*9880d681SAndroid Build Coastguard Workerentry: 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i32 195*9880d681SAndroid Build Coastguard Worker; CHECK: smull x[[MREG:[0-9]+]], w0, w1 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lsr x[[SREG:[0-9]+]], x[[MREG]], #32 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w[[SREG]], w[[MREG]], asr #31 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, ne 199*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 200*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 201*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 202*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 203*9880d681SAndroid Build Coastguard Worker ret i1 %obit 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) { 207*9880d681SAndroid Build Coastguard Workerentry: 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i64 209*9880d681SAndroid Build Coastguard Worker; CHECK: mul [[MREG:x[0-9]+]], x0, x1 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smulh [[HREG:x[0-9]+]], x0, x1 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[HREG]], [[MREG]], asr #63 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, ne 213*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 214*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 215*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 216*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 217*9880d681SAndroid Build Coastguard Worker ret i1 %obit 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo2.i64(i64 %v1, i64* %res) { 221*9880d681SAndroid Build Coastguard Workerentry: 222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo2.i64 223*9880d681SAndroid Build Coastguard Worker; CHECK: adds [[MREG:x[0-9]+]], x0, x0 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, vs 225*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 2) 226*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 227*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 228*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 229*9880d681SAndroid Build Coastguard Worker ret i1 %obit 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) { 233*9880d681SAndroid Build Coastguard Workerentry: 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i32 235*9880d681SAndroid Build Coastguard Worker; CHECK: umull [[MREG:x[0-9]+]], w0, w1 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp xzr, [[MREG]], lsr #32 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, ne 238*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 239*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 240*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 241*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 242*9880d681SAndroid Build Coastguard Worker ret i1 %obit 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) { 246*9880d681SAndroid Build Coastguard Workerentry: 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i64 248*9880d681SAndroid Build Coastguard Worker; CHECK: umulh [[MREG:x[0-9]+]], x0, x1 249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp xzr, [[MREG]] 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, ne 251*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 252*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 253*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 254*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 255*9880d681SAndroid Build Coastguard Worker ret i1 %obit 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo2.i64(i64 %v1, i64* %res) { 259*9880d681SAndroid Build Coastguard Workerentry: 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo2.i64 261*9880d681SAndroid Build Coastguard Worker; CHECK: adds [[MREG:x[0-9]+]], x0, x0 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset {{w[0-9]+}}, hs 263*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 2) 264*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 265*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 266*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 267*9880d681SAndroid Build Coastguard Worker ret i1 %obit 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; 272*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a select instruction. 273*9880d681SAndroid Build Coastguard Worker; 274*9880d681SAndroid Build Coastguard Workerdefine i32 @saddo.select.i32(i32 %v1, i32 %v2) { 275*9880d681SAndroid Build Coastguard Workerentry: 276*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.select.i32 277*9880d681SAndroid Build Coastguard Worker; CHECK: cmn w0, w1 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, vs 279*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 280*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 281*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 282*9880d681SAndroid Build Coastguard Worker ret i32 %ret 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdefine i64 @saddo.select.i64(i64 %v1, i64 %v2) { 286*9880d681SAndroid Build Coastguard Workerentry: 287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.select.i64 288*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x1 289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, vs 290*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 291*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 292*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 293*9880d681SAndroid Build Coastguard Worker ret i64 %ret 294*9880d681SAndroid Build Coastguard Worker} 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Workerdefine i32 @uaddo.select.i32(i32 %v1, i32 %v2) { 297*9880d681SAndroid Build Coastguard Workerentry: 298*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.select.i32 299*9880d681SAndroid Build Coastguard Worker; CHECK: cmn w0, w1 300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, hs 301*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 302*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 303*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 304*9880d681SAndroid Build Coastguard Worker ret i32 %ret 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerdefine i64 @uaddo.select.i64(i64 %v1, i64 %v2) { 308*9880d681SAndroid Build Coastguard Workerentry: 309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.select.i64 310*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x1 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, hs 312*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 313*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 314*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 315*9880d681SAndroid Build Coastguard Worker ret i64 %ret 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerdefine i32 @ssubo.select.i32(i32 %v1, i32 %v2) { 319*9880d681SAndroid Build Coastguard Workerentry: 320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.select.i32 321*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 322*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, vs 323*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 324*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 325*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 326*9880d681SAndroid Build Coastguard Worker ret i32 %ret 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Workerdefine i64 @ssubo.select.i64(i64 %v1, i64 %v2) { 330*9880d681SAndroid Build Coastguard Workerentry: 331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.select.i64 332*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, x1 333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, vs 334*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 335*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 336*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 337*9880d681SAndroid Build Coastguard Worker ret i64 %ret 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerdefine i32 @usubo.select.i32(i32 %v1, i32 %v2) { 341*9880d681SAndroid Build Coastguard Workerentry: 342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.select.i32 343*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, lo 345*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 346*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 347*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 348*9880d681SAndroid Build Coastguard Worker ret i32 %ret 349*9880d681SAndroid Build Coastguard Worker} 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Workerdefine i64 @usubo.select.i64(i64 %v1, i64 %v2) { 352*9880d681SAndroid Build Coastguard Workerentry: 353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.select.i64 354*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, x1 355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, lo 356*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 357*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 358*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 359*9880d681SAndroid Build Coastguard Worker ret i64 %ret 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdefine i32 @smulo.select.i32(i32 %v1, i32 %v2) { 363*9880d681SAndroid Build Coastguard Workerentry: 364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.select.i32 365*9880d681SAndroid Build Coastguard Worker; CHECK: smull x[[MREG:[0-9]+]], w0, w1 366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lsr x[[SREG:[0-9]+]], x[[MREG]], #32 367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w[[SREG]], w[[MREG]], asr #31 368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, ne 369*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 370*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 371*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 372*9880d681SAndroid Build Coastguard Worker ret i32 %ret 373*9880d681SAndroid Build Coastguard Worker} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerdefine i64 @smulo.select.i64(i64 %v1, i64 %v2) { 376*9880d681SAndroid Build Coastguard Workerentry: 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.select.i64 378*9880d681SAndroid Build Coastguard Worker; CHECK: mul [[MREG:x[0-9]+]], x0, x1 379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smulh [[HREG:x[0-9]+]], x0, x1 380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[HREG]], [[MREG]], asr #63 381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, ne 382*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 383*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 384*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 385*9880d681SAndroid Build Coastguard Worker ret i64 %ret 386*9880d681SAndroid Build Coastguard Worker} 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Workerdefine i32 @umulo.select.i32(i32 %v1, i32 %v2) { 389*9880d681SAndroid Build Coastguard Workerentry: 390*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.select.i32 391*9880d681SAndroid Build Coastguard Worker; CHECK: umull [[MREG:x[0-9]+]], w0, w1 392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp xzr, [[MREG]], lsr #32 393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, w0, w1, ne 394*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 395*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 396*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 397*9880d681SAndroid Build Coastguard Worker ret i32 %ret 398*9880d681SAndroid Build Coastguard Worker} 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Workerdefine i64 @umulo.select.i64(i64 %v1, i64 %v2) { 401*9880d681SAndroid Build Coastguard Workerentry: 402*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.select.i64 403*9880d681SAndroid Build Coastguard Worker; CHECK: umulh [[MREG:x[0-9]+]], x0, x1 404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp xzr, [[MREG]] 405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel x0, x0, x1, ne 406*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 407*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 408*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 409*9880d681SAndroid Build Coastguard Worker ret i64 %ret 410*9880d681SAndroid Build Coastguard Worker} 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Worker; 414*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a branch instruction. 415*9880d681SAndroid Build Coastguard Worker; 416*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) { 417*9880d681SAndroid Build Coastguard Workerentry: 418*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.br.i32 419*9880d681SAndroid Build Coastguard Worker; CHECK: cmn w0, w1 420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.vc 421*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 422*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 423*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 424*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Workeroverflow: 427*9880d681SAndroid Build Coastguard Worker ret i1 false 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Workercontinue: 430*9880d681SAndroid Build Coastguard Worker ret i1 true 431*9880d681SAndroid Build Coastguard Worker} 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) { 434*9880d681SAndroid Build Coastguard Workerentry: 435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.br.i64 436*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x1 437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.vc 438*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 439*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 440*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 441*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Workeroverflow: 444*9880d681SAndroid Build Coastguard Worker ret i1 false 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Workercontinue: 447*9880d681SAndroid Build Coastguard Worker ret i1 true 448*9880d681SAndroid Build Coastguard Worker} 449*9880d681SAndroid Build Coastguard Worker 450*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) { 451*9880d681SAndroid Build Coastguard Workerentry: 452*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.br.i32 453*9880d681SAndroid Build Coastguard Worker; CHECK: cmn w0, w1 454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo 455*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 456*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 457*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 458*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Workeroverflow: 461*9880d681SAndroid Build Coastguard Worker ret i1 false 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Workercontinue: 464*9880d681SAndroid Build Coastguard Worker ret i1 true 465*9880d681SAndroid Build Coastguard Worker} 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) { 468*9880d681SAndroid Build Coastguard Workerentry: 469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.br.i64 470*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x1 471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo 472*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 473*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 474*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 475*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Workeroverflow: 478*9880d681SAndroid Build Coastguard Worker ret i1 false 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Workercontinue: 481*9880d681SAndroid Build Coastguard Worker ret i1 true 482*9880d681SAndroid Build Coastguard Worker} 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) { 485*9880d681SAndroid Build Coastguard Workerentry: 486*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.br.i32 487*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.vc 489*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 490*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 491*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 492*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Workeroverflow: 495*9880d681SAndroid Build Coastguard Worker ret i1 false 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Workercontinue: 498*9880d681SAndroid Build Coastguard Worker ret i1 true 499*9880d681SAndroid Build Coastguard Worker} 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) { 502*9880d681SAndroid Build Coastguard Workerentry: 503*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.br.i64 504*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, x1 505*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.vc 506*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 507*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 508*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 509*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 510*9880d681SAndroid Build Coastguard Worker 511*9880d681SAndroid Build Coastguard Workeroverflow: 512*9880d681SAndroid Build Coastguard Worker ret i1 false 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Workercontinue: 515*9880d681SAndroid Build Coastguard Worker ret i1 true 516*9880d681SAndroid Build Coastguard Worker} 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) { 519*9880d681SAndroid Build Coastguard Workerentry: 520*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.br.i32 521*9880d681SAndroid Build Coastguard Worker; CHECK: cmp w0, w1 522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.hs 523*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 524*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 525*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 526*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Workeroverflow: 529*9880d681SAndroid Build Coastguard Worker ret i1 false 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Workercontinue: 532*9880d681SAndroid Build Coastguard Worker ret i1 true 533*9880d681SAndroid Build Coastguard Worker} 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) { 536*9880d681SAndroid Build Coastguard Workerentry: 537*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.br.i64 538*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x0, x1 539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.hs 540*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 541*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 542*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 543*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Workeroverflow: 546*9880d681SAndroid Build Coastguard Worker ret i1 false 547*9880d681SAndroid Build Coastguard Worker 548*9880d681SAndroid Build Coastguard Workercontinue: 549*9880d681SAndroid Build Coastguard Worker ret i1 true 550*9880d681SAndroid Build Coastguard Worker} 551*9880d681SAndroid Build Coastguard Worker 552*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) { 553*9880d681SAndroid Build Coastguard Workerentry: 554*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.br.i32 555*9880d681SAndroid Build Coastguard Worker; CHECK: smull x[[MREG:[0-9]+]], w0, w1 556*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lsr x[[SREG:[0-9]+]], x8, #32 557*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w[[SREG]], w[[MREG]], asr #31 558*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.eq 559*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 560*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 561*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 562*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 563*9880d681SAndroid Build Coastguard Worker 564*9880d681SAndroid Build Coastguard Workeroverflow: 565*9880d681SAndroid Build Coastguard Worker ret i1 false 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Workercontinue: 568*9880d681SAndroid Build Coastguard Worker ret i1 true 569*9880d681SAndroid Build Coastguard Worker} 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) { 572*9880d681SAndroid Build Coastguard Workerentry: 573*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.br.i64 574*9880d681SAndroid Build Coastguard Worker; CHECK: mul [[MREG:x[0-9]+]], x0, x1 575*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smulh [[HREG:x[0-9]+]], x0, x1 576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[HREG]], [[MREG]], asr #63 577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.eq 578*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 579*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 580*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 581*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Workeroverflow: 584*9880d681SAndroid Build Coastguard Worker ret i1 false 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Workercontinue: 587*9880d681SAndroid Build Coastguard Worker ret i1 true 588*9880d681SAndroid Build Coastguard Worker} 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo2.br.i64(i64 %v1) { 591*9880d681SAndroid Build Coastguard Workerentry: 592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo2.br.i64 593*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x0 594*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.vc 595*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 2) 596*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 597*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 598*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Workeroverflow: 601*9880d681SAndroid Build Coastguard Worker ret i1 false 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Workercontinue: 604*9880d681SAndroid Build Coastguard Worker ret i1 true 605*9880d681SAndroid Build Coastguard Worker} 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) { 608*9880d681SAndroid Build Coastguard Workerentry: 609*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.br.i32 610*9880d681SAndroid Build Coastguard Worker; CHECK: umull [[MREG:x[0-9]+]], w0, w1 611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp xzr, [[MREG]], lsr #32 612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.eq 613*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 614*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 615*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 616*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Workeroverflow: 619*9880d681SAndroid Build Coastguard Worker ret i1 false 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Workercontinue: 622*9880d681SAndroid Build Coastguard Worker ret i1 true 623*9880d681SAndroid Build Coastguard Worker} 624*9880d681SAndroid Build Coastguard Worker 625*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) { 626*9880d681SAndroid Build Coastguard Workerentry: 627*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.br.i64 628*9880d681SAndroid Build Coastguard Worker; CHECK: umulh [[REG:x[0-9]+]], x0, x1 629*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{cbz|cmp}} 630*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 631*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 632*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 633*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Workeroverflow: 636*9880d681SAndroid Build Coastguard Worker ret i1 false 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Workercontinue: 639*9880d681SAndroid Build Coastguard Worker ret i1 true 640*9880d681SAndroid Build Coastguard Worker} 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo2.br.i64(i64 %v1) { 643*9880d681SAndroid Build Coastguard Workerentry: 644*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo2.br.i64 645*9880d681SAndroid Build Coastguard Worker; CHECK: cmn x0, x0 646*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo 647*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 2) 648*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 649*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 650*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard Workeroverflow: 653*9880d681SAndroid Build Coastguard Worker ret i1 false 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Workercontinue: 656*9880d681SAndroid Build Coastguard Worker ret i1 true 657*9880d681SAndroid Build Coastguard Worker} 658*9880d681SAndroid Build Coastguard Worker 659*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone 660*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone 661*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone 662*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone 663*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone 664*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone 665*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone 666*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone 667*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone 668*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone 669*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone 670*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone 671*9880d681SAndroid Build Coastguard Worker 672