1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr7 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 6*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test1(float %v1, float %v2) #0 { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge float %v1, %v2 9*9880d681SAndroid Build Coastguard Worker %cmp2 = fcmp ole float %v2, 0.000000e+00 10*9880d681SAndroid Build Coastguard Worker %and5 = and i1 %cmp, %cmp2 11*9880d681SAndroid Build Coastguard Worker ret i1 %and5 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 14*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 1, 2 15*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG1:[0-9]+]], 1 16*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs [[REG2:[0-9]+]], 17*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 2, [[REG2]] 18*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 19*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 20*9880d681SAndroid Build Coastguard Worker; CHECK: crnand [[REG4:[0-9]+]], 21*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG1]], [[REG4]] 22*9880d681SAndroid Build Coastguard Worker; CHECK: blr 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 26*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test2(float %v1, float %v2) #0 { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge float %v1, %v2 29*9880d681SAndroid Build Coastguard Worker %cmp2 = fcmp ole float %v2, 0.000000e+00 30*9880d681SAndroid Build Coastguard Worker %xor5 = xor i1 %cmp, %cmp2 31*9880d681SAndroid Build Coastguard Worker ret i1 %xor5 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 34*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 1, 2 35*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG1:[0-9]+]], 1 36*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs [[REG2:[0-9]+]], 37*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 2, [[REG2]] 38*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 39*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 40*9880d681SAndroid Build Coastguard Worker; CHECK: creqv [[REG4:[0-9]+]], 41*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG1]], [[REG4]] 42*9880d681SAndroid Build Coastguard Worker; CHECK: blr 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 46*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test3(float %v1, float %v2, i32 signext %x) #0 { 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge float %v1, %v2 49*9880d681SAndroid Build Coastguard Worker %cmp2 = fcmp ole float %v2, 0.000000e+00 50*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i32 %x, -2 51*9880d681SAndroid Build Coastguard Worker %and7 = and i1 %cmp2, %cmp4 52*9880d681SAndroid Build Coastguard Worker %xor8 = xor i1 %cmp, %and7 53*9880d681SAndroid Build Coastguard Worker ret i1 %xor8 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 1, 2 57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG1:[0-9]+]], 1 58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs [[REG2:[0-9]+]], 59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmpu {{[0-9]+}}, 2, [[REG2]] 60*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 61*9880d681SAndroid Build Coastguard Worker; CHECK: crnor 62*9880d681SAndroid Build Coastguard Worker; CHECK: crandc 63*9880d681SAndroid Build Coastguard Worker; CHECK: creqv [[REG4:[0-9]+]], 64*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG1]], [[REG4]] 65*9880d681SAndroid Build Coastguard Worker; CHECK: blr 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 69*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test4(i1 zeroext %v1, i1 zeroext %v2, i1 zeroext %v3) #0 { 70*9880d681SAndroid Build Coastguard Workerentry: 71*9880d681SAndroid Build Coastguard Worker %and8 = and i1 %v1, %v2 72*9880d681SAndroid Build Coastguard Worker %or9 = or i1 %and8, %v3 73*9880d681SAndroid Build Coastguard Worker ret i1 %or9 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: @test4 76*9880d681SAndroid Build Coastguard Worker; CHECK: and [[REG1:[0-9]+]], 3, 4 77*9880d681SAndroid Build Coastguard Worker; CHECK: or 3, [[REG1]], 5 78*9880d681SAndroid Build Coastguard Worker; CHECK: blr 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 82*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test5(i1 zeroext %v1, i1 zeroext %v2, i32 signext %v3) #0 { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker %and6 = and i1 %v1, %v2 85*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %v3, -2 86*9880d681SAndroid Build Coastguard Worker %or7 = or i1 %and6, %cmp 87*9880d681SAndroid Build Coastguard Worker ret i1 %or7 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 90*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[REG1:[0-9]+]], 3, 4 91*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmpwi {{[0-9]+}}, 5, -2 92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG3:[0-9]+]], 1 93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: andi. {{[0-9]+}}, [[REG1]], 1 94*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: crandc [[REG5:[0-9]+]], 95*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG3]], [[REG5]] 96*9880d681SAndroid Build Coastguard Worker; CHECK: blr 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 100*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test6(i1 zeroext %v1, i1 zeroext %v2, i32 signext %v3) #0 { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %v3, -2 103*9880d681SAndroid Build Coastguard Worker %or6 = or i1 %cmp, %v2 104*9880d681SAndroid Build Coastguard Worker %and7 = and i1 %or6, %v1 105*9880d681SAndroid Build Coastguard Worker ret i1 %and7 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 108*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: andi. {{[0-9]+}}, 3, 1 109*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmpwi {{[0-9]+}}, 5, -2 110*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: crmove [[REG1:[0-9]+]], 1 111*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: andi. {{[0-9]+}}, 4, 1 112*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG2:[0-9]+]], 1 113*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: crorc [[REG4:[0-9]+]], 1, 114*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: crnand [[REG5:[0-9]+]], [[REG4]], [[REG1]] 115*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG2]], [[REG5]] 116*9880d681SAndroid Build Coastguard Worker; CHECK: blr 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 120*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test7(i1 zeroext %v2, i32 signext %i1, i32 signext %i2) #0 { 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker %cond = select i1 %v2, i32 %i1, i32 %i2 123*9880d681SAndroid Build Coastguard Worker ret i32 %cond 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 126*9880d681SAndroid Build Coastguard Worker; CHECK: andi. {{[0-9]+}}, 3, 1 127*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 4, 5, 1 128*9880d681SAndroid Build Coastguard Worker; CHECK: blr 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine signext i32 @exttest7(i32 signext %a) #0 { 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, 5 134*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 7, i32 8 135*9880d681SAndroid Build Coastguard Worker ret i32 %cond 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exttest7 138*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmplwi {{[0-9]+}}, 3, 5 139*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG1:[0-9]+]], 8 140*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG2:[0-9]+]], 7 141*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, [[REG2]], [[REG1]], 142*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rldicl 143*9880d681SAndroid Build Coastguard Worker; CHECK: blr 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @exttest8() #0 { 147*9880d681SAndroid Build Coastguard Workerentry: 148*9880d681SAndroid Build Coastguard Worker %v0 = load i64, i64* undef, align 8 149*9880d681SAndroid Build Coastguard Worker %sub = sub i64 80, %v0 150*9880d681SAndroid Build Coastguard Worker %div = lshr i64 %sub, 1 151*9880d681SAndroid Build Coastguard Worker %conv13 = trunc i64 %div to i32 152*9880d681SAndroid Build Coastguard Worker %cmp14 = icmp ugt i32 %conv13, 80 153*9880d681SAndroid Build Coastguard Worker %.conv13 = select i1 %cmp14, i32 0, i32 %conv13 154*9880d681SAndroid Build Coastguard Worker ret i32 %.conv13 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exttest8 156*9880d681SAndroid Build Coastguard Worker; This is a don't-crash test: %conv13 is both one of the possible select output 157*9880d681SAndroid Build Coastguard Worker; values and also an input to the conditional feeding it. 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 161*9880d681SAndroid Build Coastguard Workerdefine float @test8(i1 zeroext %v2, float %v1, float %v3) #0 { 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker %cond = select i1 %v2, float %v1, float %v3 164*9880d681SAndroid Build Coastguard Worker ret float %cond 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 167*9880d681SAndroid Build Coastguard Worker; CHECK: andi. {{[0-9]+}}, 3, 1 168*9880d681SAndroid Build Coastguard Worker; CHECK: bclr 12, 1, 0 169*9880d681SAndroid Build Coastguard Worker; CHECK: fmr 1, 2 170*9880d681SAndroid Build Coastguard Worker; CHECK: blr 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 174*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test10(i32 signext %v1, i32 signext %v2) #0 { 175*9880d681SAndroid Build Coastguard Workerentry: 176*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %v1, 0 177*9880d681SAndroid Build Coastguard Worker %lnot = icmp eq i32 %v2, 0 178*9880d681SAndroid Build Coastguard Worker %and3 = and i1 %tobool, %lnot 179*9880d681SAndroid Build Coastguard Worker %and = zext i1 %and3 to i32 180*9880d681SAndroid Build Coastguard Worker ret i32 %and 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 183*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmpwi {{[0-9]+}}, 3, 0 184*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmpwi {{[0-9]+}}, 4, 0 185*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[REG2:[0-9]+]], 1 186*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: crorc [[REG3:[0-9]+]], 187*9880d681SAndroid Build Coastguard Worker; CHECK: isel 3, 0, [[REG2]], [[REG3]] 188*9880d681SAndroid Build Coastguard Worker; CHECK: blr 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 192*9880d681SAndroid Build Coastguard Worker 193