1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SDAG 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=FAST 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefix=KNL 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 Worker; SADDO reg, reg 8*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i8(i8 signext %v1, i8 signext %v2, i8* %res) { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i8 11*9880d681SAndroid Build Coastguard Worker; CHECK: addb %sil, %dil 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 13*9880d681SAndroid Build Coastguard Worker %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2) 14*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i8, i1} %t, 0 15*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i8, i1} %t, 1 16*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %res 17*9880d681SAndroid Build Coastguard Worker ret i1 %obit 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i16(i16 %v1, i16 %v2, i16* %res) { 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i16 23*9880d681SAndroid Build Coastguard Worker; CHECK: addw %si, %di 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 25*9880d681SAndroid Build Coastguard Worker %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2) 26*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i16, i1} %t, 0 27*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i16, i1} %t, 1 28*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %res 29*9880d681SAndroid Build Coastguard Worker ret i1 %obit 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i32(i32 %v1, i32 %v2, i32* %res) { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i32 35*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %edi 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 37*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 38*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 39*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 40*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 41*9880d681SAndroid Build Coastguard Worker ret i1 %obit 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64(i64 %v1, i64 %v2, i64* %res) { 45*9880d681SAndroid Build Coastguard Workerentry: 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i64 47*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rdi 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 49*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 50*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 51*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 52*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 53*9880d681SAndroid Build Coastguard Worker ret i1 %obit 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; SADDO reg, 1 | INC 57*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.inc.i8(i8 %v1, i8* %res) { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.inc.i8 60*9880d681SAndroid Build Coastguard Worker; CHECK: incb %dil 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 62*9880d681SAndroid Build Coastguard Worker %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1) 63*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i8, i1} %t, 0 64*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i8, i1} %t, 1 65*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %res 66*9880d681SAndroid Build Coastguard Worker ret i1 %obit 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.inc.i16(i16 %v1, i16* %res) { 70*9880d681SAndroid Build Coastguard Workerentry: 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.inc.i16 72*9880d681SAndroid Build Coastguard Worker; CHECK: incw %di 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 74*9880d681SAndroid Build Coastguard Worker %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1) 75*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i16, i1} %t, 0 76*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i16, i1} %t, 1 77*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %res 78*9880d681SAndroid Build Coastguard Worker ret i1 %obit 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.inc.i32(i32 %v1, i32* %res) { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.inc.i32 84*9880d681SAndroid Build Coastguard Worker; CHECK: incl %edi 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 86*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1) 87*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 88*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 89*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 90*9880d681SAndroid Build Coastguard Worker ret i1 %obit 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.inc.i64(i64 %v1, i64* %res) { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.inc.i64 96*9880d681SAndroid Build Coastguard Worker; CHECK: incq %rdi 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 98*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1) 99*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 100*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 101*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 102*9880d681SAndroid Build Coastguard Worker ret i1 %obit 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; SADDO reg, imm | imm, reg 106*9880d681SAndroid Build Coastguard Worker; FIXME: DAG doesn't optimize immediates on the LHS. 107*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64imm1(i64 %v1, i64* %res) { 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: saddo.i64imm1 110*9880d681SAndroid Build Coastguard Worker; SDAG: mov 111*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT: addq 112*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT: seto 113*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: saddo.i64imm1 114*9880d681SAndroid Build Coastguard Worker; FAST: addq $2, %rdi 115*9880d681SAndroid Build Coastguard Worker; FAST-NEXT: seto %al 116*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1) 117*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 118*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 119*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 120*9880d681SAndroid Build Coastguard Worker ret i1 %obit 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; Check boundary conditions for large immediates. 124*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64imm2(i64 %v1, i64* %res) { 125*9880d681SAndroid Build Coastguard Workerentry: 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i64imm2 127*9880d681SAndroid Build Coastguard Worker; CHECK: addq $-2147483648, %rdi 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 129*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648) 130*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 131*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 132*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 133*9880d681SAndroid Build Coastguard Worker ret i1 %obit 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64imm3(i64 %v1, i64* %res) { 137*9880d681SAndroid Build Coastguard Workerentry: 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i64imm3 139*9880d681SAndroid Build Coastguard Worker; CHECK: movabsq $-21474836489, %[[REG:[a-z]+]] 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addq %rdi, %[[REG]] 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 142*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489) 143*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 144*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 145*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 146*9880d681SAndroid Build Coastguard Worker ret i1 %obit 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64imm4(i64 %v1, i64* %res) { 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i64imm4 152*9880d681SAndroid Build Coastguard Worker; CHECK: addq $2147483647, %rdi 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 154*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647) 155*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 156*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 157*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 158*9880d681SAndroid Build Coastguard Worker ret i1 %obit 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.i64imm5(i64 %v1, i64* %res) { 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.i64imm5 164*9880d681SAndroid Build Coastguard Worker; CHECK: movl $2147483648 165*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rdi 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 167*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648) 168*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 169*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 170*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 171*9880d681SAndroid Build Coastguard Worker ret i1 %obit 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker; UADDO 175*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.i32 178*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %edi 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setb %al 180*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 181*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 182*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 183*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 184*9880d681SAndroid Build Coastguard Worker ret i1 %obit 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.i64(i64 %v1, i64 %v2, i64* %res) { 188*9880d681SAndroid Build Coastguard Workerentry: 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.i64 190*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rdi 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setb %al 192*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 193*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 194*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 195*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 196*9880d681SAndroid Build Coastguard Worker ret i1 %obit 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; UADDO reg, 1 | NOT INC 200*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.inc.i8(i8 %v1, i8* %res) { 201*9880d681SAndroid Build Coastguard Workerentry: 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.inc.i8 203*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: incb %dil 204*9880d681SAndroid Build Coastguard Worker %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1) 205*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i8, i1} %t, 0 206*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i8, i1} %t, 1 207*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %res 208*9880d681SAndroid Build Coastguard Worker ret i1 %obit 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.inc.i16(i16 %v1, i16* %res) { 212*9880d681SAndroid Build Coastguard Workerentry: 213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.inc.i16 214*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: incw %di 215*9880d681SAndroid Build Coastguard Worker %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1) 216*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i16, i1} %t, 0 217*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i16, i1} %t, 1 218*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %res 219*9880d681SAndroid Build Coastguard Worker ret i1 %obit 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.inc.i32(i32 %v1, i32* %res) { 223*9880d681SAndroid Build Coastguard Workerentry: 224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.inc.i32 225*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: incl %edi 226*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1) 227*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 228*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 229*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 230*9880d681SAndroid Build Coastguard Worker ret i1 %obit 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.inc.i64(i64 %v1, i64* %res) { 234*9880d681SAndroid Build Coastguard Workerentry: 235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.inc.i64 236*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: incq %rdi 237*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1) 238*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 239*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 240*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 241*9880d681SAndroid Build Coastguard Worker ret i1 %obit 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; SSUBO 245*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.i32(i32 %v1, i32 %v2, i32* %res) { 246*9880d681SAndroid Build Coastguard Workerentry: 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.i32 248*9880d681SAndroid Build Coastguard Worker; CHECK: subl %esi, %edi 249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 250*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 251*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 252*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 253*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 254*9880d681SAndroid Build Coastguard Worker ret i1 %obit 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.i64(i64 %v1, i64 %v2, i64* %res) { 258*9880d681SAndroid Build Coastguard Workerentry: 259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.i64 260*9880d681SAndroid Build Coastguard Worker; CHECK: subq %rsi, %rdi 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 262*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 263*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 264*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 265*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 266*9880d681SAndroid Build Coastguard Worker ret i1 %obit 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; USUBO 270*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) { 271*9880d681SAndroid Build Coastguard Workerentry: 272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.i32 273*9880d681SAndroid Build Coastguard Worker; CHECK: subl %esi, %edi 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setb %al 275*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 276*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 277*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 278*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 279*9880d681SAndroid Build Coastguard Worker ret i1 %obit 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.i64(i64 %v1, i64 %v2, i64* %res) { 283*9880d681SAndroid Build Coastguard Workerentry: 284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.i64 285*9880d681SAndroid Build Coastguard Worker; CHECK: subq %rsi, %rdi 286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setb %al 287*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 288*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 289*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 290*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 291*9880d681SAndroid Build Coastguard Worker ret i1 %obit 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker; SMULO 295*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i8(i8 %v1, i8 %v2, i8* %res) { 296*9880d681SAndroid Build Coastguard Workerentry: 297*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i8 298*9880d681SAndroid Build Coastguard Worker; CHECK: movl %edi, %eax 299*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: imulb %sil 300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %cl 301*9880d681SAndroid Build Coastguard Worker %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2) 302*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i8, i1} %t, 0 303*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i8, i1} %t, 1 304*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %res 305*9880d681SAndroid Build Coastguard Worker ret i1 %obit 306*9880d681SAndroid Build Coastguard Worker} 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i16(i16 %v1, i16 %v2, i16* %res) { 309*9880d681SAndroid Build Coastguard Workerentry: 310*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i16 311*9880d681SAndroid Build Coastguard Worker; CHECK: imulw %si, %di 312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 313*9880d681SAndroid Build Coastguard Worker %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2) 314*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i16, i1} %t, 0 315*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i16, i1} %t, 1 316*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %res 317*9880d681SAndroid Build Coastguard Worker ret i1 %obit 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) { 321*9880d681SAndroid Build Coastguard Workerentry: 322*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i32 323*9880d681SAndroid Build Coastguard Worker; CHECK: imull %esi, %edi 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 325*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 326*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 327*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 328*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 329*9880d681SAndroid Build Coastguard Worker ret i1 %obit 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.i64(i64 %v1, i64 %v2, i64* %res) { 333*9880d681SAndroid Build Coastguard Workerentry: 334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.i64 335*9880d681SAndroid Build Coastguard Worker; CHECK: imulq %rsi, %rdi 336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %al 337*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 338*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 339*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 340*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 341*9880d681SAndroid Build Coastguard Worker ret i1 %obit 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker; UMULO 345*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i8(i8 %v1, i8 %v2, i8* %res) { 346*9880d681SAndroid Build Coastguard Workerentry: 347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i8 348*9880d681SAndroid Build Coastguard Worker; CHECK: movl %edi, %eax 349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mulb %sil 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto %cl 351*9880d681SAndroid Build Coastguard Worker %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2) 352*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i8, i1} %t, 0 353*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i8, i1} %t, 1 354*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %res 355*9880d681SAndroid Build Coastguard Worker ret i1 %obit 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i16(i16 %v1, i16 %v2, i16* %res) { 359*9880d681SAndroid Build Coastguard Workerentry: 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i16 361*9880d681SAndroid Build Coastguard Worker; CHECK: mulw %si 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 363*9880d681SAndroid Build Coastguard Worker %t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2) 364*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i16, i1} %t, 0 365*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i16, i1} %t, 1 366*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %res 367*9880d681SAndroid Build Coastguard Worker ret i1 %obit 368*9880d681SAndroid Build Coastguard Worker} 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) { 371*9880d681SAndroid Build Coastguard Workerentry: 372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i32 373*9880d681SAndroid Build Coastguard Worker; CHECK: mull %esi 374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 375*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 376*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 377*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 378*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %res 379*9880d681SAndroid Build Coastguard Worker ret i1 %obit 380*9880d681SAndroid Build Coastguard Worker} 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.i64(i64 %v1, i64 %v2, i64* %res) { 383*9880d681SAndroid Build Coastguard Workerentry: 384*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.i64 385*9880d681SAndroid Build Coastguard Worker; CHECK: mulq %rsi 386*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: seto 387*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 388*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 389*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 390*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %res 391*9880d681SAndroid Build Coastguard Worker ret i1 %obit 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker; 395*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a select instruction. 396*9880d681SAndroid Build Coastguard Worker; 397*9880d681SAndroid Build Coastguard Workerdefine i32 @saddo.select.i32(i32 %v1, i32 %v2) { 398*9880d681SAndroid Build Coastguard Workerentry: 399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.select.i32 400*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %eax 401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovol %edi, %esi 402*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 403*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 404*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 405*9880d681SAndroid Build Coastguard Worker ret i32 %ret 406*9880d681SAndroid Build Coastguard Worker} 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Workerdefine i64 @saddo.select.i64(i64 %v1, i64 %v2) { 409*9880d681SAndroid Build Coastguard Workerentry: 410*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.select.i64 411*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rax 412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovoq %rdi, %rsi 413*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 414*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 415*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 416*9880d681SAndroid Build Coastguard Worker ret i64 %ret 417*9880d681SAndroid Build Coastguard Worker} 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Workerdefine i32 @uaddo.select.i32(i32 %v1, i32 %v2) { 420*9880d681SAndroid Build Coastguard Workerentry: 421*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.select.i32 422*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %eax 423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovbl %edi, %esi 424*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 425*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 426*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 427*9880d681SAndroid Build Coastguard Worker ret i32 %ret 428*9880d681SAndroid Build Coastguard Worker} 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerdefine i64 @uaddo.select.i64(i64 %v1, i64 %v2) { 431*9880d681SAndroid Build Coastguard Workerentry: 432*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.select.i64 433*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rax 434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovbq %rdi, %rsi 435*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 436*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 437*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 438*9880d681SAndroid Build Coastguard Worker ret i64 %ret 439*9880d681SAndroid Build Coastguard Worker} 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Workerdefine i32 @ssubo.select.i32(i32 %v1, i32 %v2) { 442*9880d681SAndroid Build Coastguard Workerentry: 443*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.select.i32 444*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl %esi, %edi 445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovol %edi, %esi 446*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 447*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 448*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 449*9880d681SAndroid Build Coastguard Worker ret i32 %ret 450*9880d681SAndroid Build Coastguard Worker} 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Workerdefine i64 @ssubo.select.i64(i64 %v1, i64 %v2) { 453*9880d681SAndroid Build Coastguard Workerentry: 454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.select.i64 455*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq %rsi, %rdi 456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovoq %rdi, %rsi 457*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 458*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 459*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 460*9880d681SAndroid Build Coastguard Worker ret i64 %ret 461*9880d681SAndroid Build Coastguard Worker} 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Workerdefine i32 @usubo.select.i32(i32 %v1, i32 %v2) { 464*9880d681SAndroid Build Coastguard Workerentry: 465*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.select.i32 466*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl %esi, %edi 467*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovbl %edi, %esi 468*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 469*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 470*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 471*9880d681SAndroid Build Coastguard Worker ret i32 %ret 472*9880d681SAndroid Build Coastguard Worker} 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Workerdefine i64 @usubo.select.i64(i64 %v1, i64 %v2) { 475*9880d681SAndroid Build Coastguard Workerentry: 476*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.select.i64 477*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq %rsi, %rdi 478*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovbq %rdi, %rsi 479*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 480*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 481*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 482*9880d681SAndroid Build Coastguard Worker ret i64 %ret 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Workerdefine i32 @smulo.select.i32(i32 %v1, i32 %v2) { 486*9880d681SAndroid Build Coastguard Workerentry: 487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.select.i32 488*9880d681SAndroid Build Coastguard Worker; CHECK: imull %esi, %eax 489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovol %edi, %esi 490*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 491*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 492*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 493*9880d681SAndroid Build Coastguard Worker ret i32 %ret 494*9880d681SAndroid Build Coastguard Worker} 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Workerdefine i64 @smulo.select.i64(i64 %v1, i64 %v2) { 497*9880d681SAndroid Build Coastguard Workerentry: 498*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.select.i64 499*9880d681SAndroid Build Coastguard Worker; CHECK: imulq %rsi, %rax 500*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovoq %rdi, %rsi 501*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 502*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 503*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 504*9880d681SAndroid Build Coastguard Worker ret i64 %ret 505*9880d681SAndroid Build Coastguard Worker} 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Workerdefine i32 @umulo.select.i32(i32 %v1, i32 %v2) { 508*9880d681SAndroid Build Coastguard Workerentry: 509*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.select.i32 510*9880d681SAndroid Build Coastguard Worker; CHECK: mull %esi 511*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovol %edi, %esi 512*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 513*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 514*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i32 %v1, i32 %v2 515*9880d681SAndroid Build Coastguard Worker ret i32 %ret 516*9880d681SAndroid Build Coastguard Worker} 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Workerdefine i64 @umulo.select.i64(i64 %v1, i64 %v2) { 519*9880d681SAndroid Build Coastguard Workerentry: 520*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.select.i64 521*9880d681SAndroid Build Coastguard Worker; CHECK: mulq %rsi 522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmovoq %rdi, %rsi 523*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 524*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 525*9880d681SAndroid Build Coastguard Worker %ret = select i1 %obit, i64 %v1, i64 %v2 526*9880d681SAndroid Build Coastguard Worker ret i64 %ret 527*9880d681SAndroid Build Coastguard Worker} 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Worker; 531*9880d681SAndroid Build Coastguard Worker; Check the use of the overflow bit in combination with a branch instruction. 532*9880d681SAndroid Build Coastguard Worker; 533*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) { 534*9880d681SAndroid Build Coastguard Workerentry: 535*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.br.i32 536*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %edi 537*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 538*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 539*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 540*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 541*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Workeroverflow: 544*9880d681SAndroid Build Coastguard Worker ret i1 false 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Workercontinue: 547*9880d681SAndroid Build Coastguard Worker ret i1 true 548*9880d681SAndroid Build Coastguard Worker} 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @saddo.br.i64(i64 %v1, i64 %v2) { 551*9880d681SAndroid Build Coastguard Workerentry: 552*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: saddo.br.i64 553*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rdi 554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 555*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 556*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 557*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 558*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Workeroverflow: 561*9880d681SAndroid Build Coastguard Worker ret i1 false 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Workercontinue: 564*9880d681SAndroid Build Coastguard Worker ret i1 true 565*9880d681SAndroid Build Coastguard Worker} 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i32(i32 %v1, i32 %v2) { 568*9880d681SAndroid Build Coastguard Workerentry: 569*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.br.i32 570*9880d681SAndroid Build Coastguard Worker; CHECK: addl %esi, %edi 571*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb 572*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 573*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 574*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 575*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 576*9880d681SAndroid Build Coastguard Worker 577*9880d681SAndroid Build Coastguard Workeroverflow: 578*9880d681SAndroid Build Coastguard Worker ret i1 false 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Workercontinue: 581*9880d681SAndroid Build Coastguard Worker ret i1 true 582*9880d681SAndroid Build Coastguard Worker} 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @uaddo.br.i64(i64 %v1, i64 %v2) { 585*9880d681SAndroid Build Coastguard Workerentry: 586*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uaddo.br.i64 587*9880d681SAndroid Build Coastguard Worker; CHECK: addq %rsi, %rdi 588*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb 589*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 590*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 591*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 592*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 593*9880d681SAndroid Build Coastguard Worker 594*9880d681SAndroid Build Coastguard Workeroverflow: 595*9880d681SAndroid Build Coastguard Worker ret i1 false 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Workercontinue: 598*9880d681SAndroid Build Coastguard Worker ret i1 true 599*9880d681SAndroid Build Coastguard Worker} 600*9880d681SAndroid Build Coastguard Worker 601*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) { 602*9880d681SAndroid Build Coastguard Workerentry: 603*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.br.i32 604*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl %esi, %edi 605*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 606*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 607*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 608*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 609*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Workeroverflow: 612*9880d681SAndroid Build Coastguard Worker ret i1 false 613*9880d681SAndroid Build Coastguard Worker 614*9880d681SAndroid Build Coastguard Workercontinue: 615*9880d681SAndroid Build Coastguard Worker ret i1 true 616*9880d681SAndroid Build Coastguard Worker} 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @ssubo.br.i64(i64 %v1, i64 %v2) { 619*9880d681SAndroid Build Coastguard Workerentry: 620*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ssubo.br.i64 621*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq %rsi, %rdi 622*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 623*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 624*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 625*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 626*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Workeroverflow: 629*9880d681SAndroid Build Coastguard Worker ret i1 false 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Workercontinue: 632*9880d681SAndroid Build Coastguard Worker ret i1 true 633*9880d681SAndroid Build Coastguard Worker} 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) { 636*9880d681SAndroid Build Coastguard Workerentry: 637*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.br.i32 638*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl %esi, %edi 639*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb 640*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 641*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 642*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 643*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 644*9880d681SAndroid Build Coastguard Worker 645*9880d681SAndroid Build Coastguard Workeroverflow: 646*9880d681SAndroid Build Coastguard Worker ret i1 false 647*9880d681SAndroid Build Coastguard Worker 648*9880d681SAndroid Build Coastguard Workercontinue: 649*9880d681SAndroid Build Coastguard Worker ret i1 true 650*9880d681SAndroid Build Coastguard Worker} 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @usubo.br.i64(i64 %v1, i64 %v2) { 653*9880d681SAndroid Build Coastguard Workerentry: 654*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: usubo.br.i64 655*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq %rsi, %rdi 656*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb 657*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 658*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 659*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 660*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Workeroverflow: 663*9880d681SAndroid Build Coastguard Worker ret i1 false 664*9880d681SAndroid Build Coastguard Worker 665*9880d681SAndroid Build Coastguard Workercontinue: 666*9880d681SAndroid Build Coastguard Worker ret i1 true 667*9880d681SAndroid Build Coastguard Worker} 668*9880d681SAndroid Build Coastguard Worker 669*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) { 670*9880d681SAndroid Build Coastguard Workerentry: 671*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.br.i32 672*9880d681SAndroid Build Coastguard Worker; CHECK: imull %esi, %edi 673*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 674*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) 675*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 676*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 677*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 678*9880d681SAndroid Build Coastguard Worker 679*9880d681SAndroid Build Coastguard Workeroverflow: 680*9880d681SAndroid Build Coastguard Worker ret i1 false 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workercontinue: 683*9880d681SAndroid Build Coastguard Worker ret i1 true 684*9880d681SAndroid Build Coastguard Worker} 685*9880d681SAndroid Build Coastguard Worker 686*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @smulo.br.i64(i64 %v1, i64 %v2) { 687*9880d681SAndroid Build Coastguard Workerentry: 688*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: smulo.br.i64 689*9880d681SAndroid Build Coastguard Worker; CHECK: imulq %rsi, %rdi 690*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 691*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) 692*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 693*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 694*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 695*9880d681SAndroid Build Coastguard Worker 696*9880d681SAndroid Build Coastguard Workeroverflow: 697*9880d681SAndroid Build Coastguard Worker ret i1 false 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workercontinue: 700*9880d681SAndroid Build Coastguard Worker ret i1 true 701*9880d681SAndroid Build Coastguard Worker} 702*9880d681SAndroid Build Coastguard Worker 703*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) { 704*9880d681SAndroid Build Coastguard Workerentry: 705*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.br.i32 706*9880d681SAndroid Build Coastguard Worker; CHECK: mull %esi 707*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 708*9880d681SAndroid Build Coastguard Worker %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) 709*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i32, i1} %t, 0 710*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i32, i1} %t, 1 711*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 712*9880d681SAndroid Build Coastguard Worker 713*9880d681SAndroid Build Coastguard Workeroverflow: 714*9880d681SAndroid Build Coastguard Worker ret i1 false 715*9880d681SAndroid Build Coastguard Worker 716*9880d681SAndroid Build Coastguard Workercontinue: 717*9880d681SAndroid Build Coastguard Worker ret i1 true 718*9880d681SAndroid Build Coastguard Worker} 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @umulo.br.i64(i64 %v1, i64 %v2) { 721*9880d681SAndroid Build Coastguard Workerentry: 722*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: umulo.br.i64 723*9880d681SAndroid Build Coastguard Worker; CHECK: mulq %rsi 724*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jo 725*9880d681SAndroid Build Coastguard Worker %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) 726*9880d681SAndroid Build Coastguard Worker %val = extractvalue {i64, i1} %t, 0 727*9880d681SAndroid Build Coastguard Worker %obit = extractvalue {i64, i1} %t, 1 728*9880d681SAndroid Build Coastguard Worker br i1 %obit, label %overflow, label %continue, !prof !0 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Workeroverflow: 731*9880d681SAndroid Build Coastguard Worker ret i1 false 732*9880d681SAndroid Build Coastguard Worker 733*9880d681SAndroid Build Coastguard Workercontinue: 734*9880d681SAndroid Build Coastguard Worker ret i1 true 735*9880d681SAndroid Build Coastguard Worker} 736*9880d681SAndroid Build Coastguard Worker 737*9880d681SAndroid Build Coastguard Workerdefine i1 @bug27873(i64 %c1, i1 %c2) { 738*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: bug27873: 739*9880d681SAndroid Build Coastguard Worker; KNL: ## BB#0: 740*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: andl $1, %esi 741*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: kmovw %esi, %k0 742*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: movl $160, %ecx 743*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: movq %rdi, %rax 744*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: mulq %rcx 745*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: seto %al 746*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: kmovw %eax, %k1 747*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: korw %k1, %k0, %k0 748*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: kmovw %k0, %eax 749*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: # kill 750*9880d681SAndroid Build Coastguard Worker; KNL-NEXT: retq 751*9880d681SAndroid Build Coastguard Worker %mul = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %c1, i64 160) 752*9880d681SAndroid Build Coastguard Worker %mul.overflow = extractvalue { i64, i1 } %mul, 1 753*9880d681SAndroid Build Coastguard Worker %x1 = or i1 %c2, %mul.overflow 754*9880d681SAndroid Build Coastguard Worker ret i1 %x1 755*9880d681SAndroid Build Coastguard Worker} 756*9880d681SAndroid Build Coastguard Worker 757*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone 758*9880d681SAndroid Build Coastguard Workerdeclare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone 759*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone 760*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone 761*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.uadd.with.overflow.i8 (i8, i8 ) nounwind readnone 762*9880d681SAndroid Build Coastguard Workerdeclare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone 763*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone 764*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone 765*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone 766*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone 767*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone 768*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone 769*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.smul.with.overflow.i8 (i8, i8 ) nounwind readnone 770*9880d681SAndroid Build Coastguard Workerdeclare {i16, i1} @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone 771*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone 772*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone 773*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.umul.with.overflow.i8 (i8, i8 ) nounwind readnone 774*9880d681SAndroid Build Coastguard Workerdeclare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone 775*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone 776*9880d681SAndroid Build Coastguard Workerdeclare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone 777*9880d681SAndroid Build Coastguard Worker 778*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 0, i32 2147483647} 779