1*9880d681SAndroid Build Coastguard Worker; Test an i64 0/-1 SELECTCCC for every floating-point condition. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test CC in { 0 } 6*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(float %a, float %b) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -268435456 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 13*9880d681SAndroid Build Coastguard Worker %cond = fcmp oeq float %a, %b 14*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 15*9880d681SAndroid Build Coastguard Worker ret i64 %res 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Test CC in { 1 } 19*9880d681SAndroid Build Coastguard Workerdefine i64 @f2(float %a, float %b) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xilf [[REG]], 268435456 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -268435456 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 26*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 27*9880d681SAndroid Build Coastguard Worker %cond = fcmp olt float %a, %b 28*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 29*9880d681SAndroid Build Coastguard Worker ret i64 %res 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 1 } 33*9880d681SAndroid Build Coastguard Workerdefine i64 @f3(float %a, float %b) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 35*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -536870912 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 39*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 40*9880d681SAndroid Build Coastguard Worker %cond = fcmp ole float %a, %b 41*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 42*9880d681SAndroid Build Coastguard Worker ret i64 %res 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Test CC in { 2 } 46*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(float %a, float %b) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 48*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xilf [[REG]], 268435456 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], 1342177280 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 54*9880d681SAndroid Build Coastguard Worker %cond = fcmp ogt float %a, %b 55*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 56*9880d681SAndroid Build Coastguard Worker ret i64 %res 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 2 } 60*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(float %a, float %b) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 62*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xilf [[REG]], 4294967295 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 35 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 66*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 67*9880d681SAndroid Build Coastguard Worker %cond = fcmp oge float %a, %b 68*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 69*9880d681SAndroid Build Coastguard Worker ret i64 %res 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; Test CC in { 1, 2 } 73*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(float %a, float %b) { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 75*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], 268435456 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 34 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 79*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 80*9880d681SAndroid Build Coastguard Worker %cond = fcmp one float %a, %b 81*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 82*9880d681SAndroid Build Coastguard Worker ret i64 %res 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 1, 2 } 86*9880d681SAndroid Build Coastguard Workerdefine i64 @f7(float %a, float %b) { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 88*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -805306368 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 93*9880d681SAndroid Build Coastguard Worker %cond = fcmp ord float %a, %b 94*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 95*9880d681SAndroid Build Coastguard Worker ret i64 %res 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; Test CC in { 3 } 99*9880d681SAndroid Build Coastguard Workerdefine i64 @f8(float %a, float %b) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 101*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], 1342177280 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 106*9880d681SAndroid Build Coastguard Worker %cond = fcmp uno float %a, %b 107*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 108*9880d681SAndroid Build Coastguard Worker ret i64 %res 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 3 } 112*9880d681SAndroid Build Coastguard Workerdefine i64 @f9(float %a, float %b) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 114*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -268435456 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 34 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 118*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 119*9880d681SAndroid Build Coastguard Worker %cond = fcmp ueq float %a, %b 120*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 121*9880d681SAndroid Build Coastguard Worker ret i64 %res 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; Test CC in { 1, 3 } 125*9880d681SAndroid Build Coastguard Workerdefine i64 @f10(float %a, float %b) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 127*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 35 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 130*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 131*9880d681SAndroid Build Coastguard Worker %cond = fcmp ult float %a, %b 132*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 133*9880d681SAndroid Build Coastguard Worker ret i64 %res 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 1, 3 } 137*9880d681SAndroid Build Coastguard Workerdefine i64 @f11(float %a, float %b) { 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 139*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xilf [[REG]], 268435456 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], -805306368 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 144*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 145*9880d681SAndroid Build Coastguard Worker %cond = fcmp ule float %a, %b 146*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 147*9880d681SAndroid Build Coastguard Worker ret i64 %res 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; Test CC in { 2, 3 } 151*9880d681SAndroid Build Coastguard Workerdefine i64 @f12(float %a, float %b) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 153*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 34 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 156*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 157*9880d681SAndroid Build Coastguard Worker %cond = fcmp ugt float %a, %b 158*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 159*9880d681SAndroid Build Coastguard Worker ret i64 %res 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; Test CC in { 0, 2, 3 } 163*9880d681SAndroid Build Coastguard Workerdefine i64 @f13(float %a, float %b) { 164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 165*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xilf [[REG]], 268435456 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], 1879048192 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 170*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 171*9880d681SAndroid Build Coastguard Worker %cond = fcmp uge float %a, %b 172*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 173*9880d681SAndroid Build Coastguard Worker ret i64 %res 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker; Test CC in { 1, 2, 3 } 177*9880d681SAndroid Build Coastguard Workerdefine i64 @f14(float %a, float %b) { 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 179*9880d681SAndroid Build Coastguard Worker; CHECK: ipm [[REG:%r[0-5]]] 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: afi [[REG]], 1879048192 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sllg [[REG]], [[REG]], 32 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: srag %r2, [[REG]], 63 183*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 184*9880d681SAndroid Build Coastguard Worker %cond = fcmp une float %a, %b 185*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 -1, i64 0 186*9880d681SAndroid Build Coastguard Worker ret i64 %res 187*9880d681SAndroid Build Coastguard Worker} 188