1*9880d681SAndroid Build Coastguard Worker; Test 32-bit ANDs in which the second operand is constant. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; ANDs with 1 can use NILF. 6*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 1 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 1 11*9880d681SAndroid Build Coastguard Worker ret i32 %and 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; ...but RISBLG is available as a three-address form. 15*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 17*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 31, 159, 0 18*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 19*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 1 20*9880d681SAndroid Build Coastguard Worker ret i32 %and 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; ...same for 4. 24*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 26*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 29, 157, 0 27*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 28*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 4 29*9880d681SAndroid Build Coastguard Worker ret i32 %and 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; ANDs with 5 must use NILF. 33*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 35*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 5 36*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 37*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 5 38*9880d681SAndroid Build Coastguard Worker ret i32 %and 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; ...a single RISBLG isn't enough. 42*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 44*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: risb 45*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 46*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 5 47*9880d681SAndroid Build Coastguard Worker ret i32 %and 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; Check the highest 16-bit constant that must be handled by NILF. 51*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 53*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 65533 54*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 55*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 65533 56*9880d681SAndroid Build Coastguard Worker ret i32 %and 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; ...a single RISBLG isn't enough. 60*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: risb 63*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 64*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 65533 65*9880d681SAndroid Build Coastguard Worker ret i32 %and 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Check the next highest value, which can use NILF. 69*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 71*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 65534 72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 73*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 65534 74*9880d681SAndroid Build Coastguard Worker ret i32 %and 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; ...although the three-address case should use RISBLG. 78*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(i32 %a, i32 %b) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 80*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 16, 158, 0 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 65534 83*9880d681SAndroid Build Coastguard Worker ret i32 %and 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; ANDs of 0xffff are zero extensions from i16. 87*9880d681SAndroid Build Coastguard Workerdefine i32 @f10(i32 %a, i32 %b) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 89*9880d681SAndroid Build Coastguard Worker; CHECK: llhr %r2, %r3 90*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 91*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 65535 92*9880d681SAndroid Build Coastguard Worker ret i32 %and 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; Check the next value up, which must again use NILF. 96*9880d681SAndroid Build Coastguard Workerdefine i32 @f11(i32 %a) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 98*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 65536 99*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 100*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 65536 101*9880d681SAndroid Build Coastguard Worker ret i32 %and 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; ...but the three-address case can use RISBLG. 105*9880d681SAndroid Build Coastguard Workerdefine i32 @f12(i32 %a, i32 %b) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 107*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 15, 143, 0 108*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 109*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 65536 110*9880d681SAndroid Build Coastguard Worker ret i32 %and 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; Check the lowest useful NILH value. 114*9880d681SAndroid Build Coastguard Workerdefine i32 @f13(i32 %a) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 116*9880d681SAndroid Build Coastguard Worker; CHECK: nilh %r2, 1 117*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 118*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 131071 119*9880d681SAndroid Build Coastguard Worker ret i32 %and 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; ...but RISBLG is OK in the three-address case. 123*9880d681SAndroid Build Coastguard Workerdefine i32 @f14(i32 %a, i32 %b) { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 125*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 15, 159, 0 126*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 127*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, 131071 128*9880d681SAndroid Build Coastguard Worker ret i32 %and 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Check the highest useful NILF value. 132*9880d681SAndroid Build Coastguard Workerdefine i32 @f15(i32 %a) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 134*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 4294901758 135*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 136*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -65538 137*9880d681SAndroid Build Coastguard Worker ret i32 %and 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; Check the next value up, which is the highest useful NILH value. 141*9880d681SAndroid Build Coastguard Workerdefine i32 @f16(i32 %a) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 143*9880d681SAndroid Build Coastguard Worker; CHECK: nilh %r2, 65534 144*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 145*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -65537 146*9880d681SAndroid Build Coastguard Worker ret i32 %and 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; Check the next value up, which is the first useful NILL value. 150*9880d681SAndroid Build Coastguard Workerdefine i32 @f17(i32 %a) { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 152*9880d681SAndroid Build Coastguard Worker; CHECK: nill %r2, 0 153*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 154*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -65536 155*9880d681SAndroid Build Coastguard Worker ret i32 %and 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; ...although the three-address case should use RISBLG. 159*9880d681SAndroid Build Coastguard Workerdefine i32 @f18(i32 %a, i32 %b) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 161*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 0, 143, 0 162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 163*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, -65536 164*9880d681SAndroid Build Coastguard Worker ret i32 %and 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker; Check the next value up again, which can still use NILL. 168*9880d681SAndroid Build Coastguard Workerdefine i32 @f19(i32 %a) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 170*9880d681SAndroid Build Coastguard Worker; CHECK: nill %r2, 1 171*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 172*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -65535 173*9880d681SAndroid Build Coastguard Worker ret i32 %and 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker; Check the next value up again, which cannot use RISBLG. 177*9880d681SAndroid Build Coastguard Workerdefine i32 @f20(i32 %a, i32 %b) { 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20: 179*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: risb 180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 181*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, -65534 182*9880d681SAndroid Build Coastguard Worker ret i32 %and 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; Check the last useful mask, which can use NILL. 186*9880d681SAndroid Build Coastguard Workerdefine i32 @f21(i32 %a) { 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21: 188*9880d681SAndroid Build Coastguard Worker; CHECK: nill %r2, 65534 189*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 190*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, -2 191*9880d681SAndroid Build Coastguard Worker ret i32 %and 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker; ...or RISBLG for the three-address case. 195*9880d681SAndroid Build Coastguard Workerdefine i32 @f22(i32 %a, i32 %b) { 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22: 197*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 0, 158, 0 198*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 199*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, -2 200*9880d681SAndroid Build Coastguard Worker ret i32 %and 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; Test that RISBLG can be used when inserting a non-wraparound mask 204*9880d681SAndroid Build Coastguard Worker; into another register. 205*9880d681SAndroid Build Coastguard Workerdefine i64 @f23(i64 %a, i32 %b) { 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23: 207*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 30, 158, 0 208*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 209*9880d681SAndroid Build Coastguard Worker %and1 = and i64 %a, -4294967296 210*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %b, 2 211*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %and2 to i64 212*9880d681SAndroid Build Coastguard Worker %or = or i64 %and1, %ext 213*9880d681SAndroid Build Coastguard Worker ret i64 %or 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; ...and when inserting a wrap-around mask. 217*9880d681SAndroid Build Coastguard Workerdefine i64 @f24(i64 %a, i32 %b) { 218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24: 219*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r3, 30, 156 220*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 221*9880d681SAndroid Build Coastguard Worker %and1 = and i64 %a, -4294967296 222*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %b, -5 223*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %and2 to i64 224*9880d681SAndroid Build Coastguard Worker %or = or i64 %and1, %ext 225*9880d681SAndroid Build Coastguard Worker ret i64 %or 226*9880d681SAndroid Build Coastguard Worker} 227