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