1*9880d681SAndroid Build Coastguard Worker; Test compound shifts. 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 a shift right followed by a sign extension. This can use two shifts. 6*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(i32 %a) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: sllg [[REG:%r[0-5]]], %r2, 62 9*9880d681SAndroid Build Coastguard Worker; CHECK: srag %r2, [[REG]], 63 10*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 11*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %a, 1 12*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %shr to i1 13*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %trunc to i64 14*9880d681SAndroid Build Coastguard Worker ret i64 %ext 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; ...and again with the highest shift count that doesn't reduce to an 18*9880d681SAndroid Build Coastguard Worker; ashr/sext pair. 19*9880d681SAndroid Build Coastguard Workerdefine i64 @f2(i32 %a) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: sllg [[REG:%r[0-5]]], %r2, 33 22*9880d681SAndroid Build Coastguard Worker; CHECK: srag %r2, [[REG]], 63 23*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 24*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %a, 30 25*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %shr to i1 26*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %trunc to i64 27*9880d681SAndroid Build Coastguard Worker ret i64 %ext 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; Test a left shift that of an extended right shift in a case where folding 31*9880d681SAndroid Build Coastguard Worker; is possible. 32*9880d681SAndroid Build Coastguard Workerdefine i64 @f3(i32 %a) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r2, 27, 181, 9 35*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 36*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %a, 1 37*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %shr to i64 38*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %ext, 10 39*9880d681SAndroid Build Coastguard Worker %and = and i64 %shl, 137438952960 40*9880d681SAndroid Build Coastguard Worker ret i64 %and 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; ...and again with a larger right shift. 44*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i32 %a) { 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 46*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r2, 30, 158, 3 47*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 48*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %a, 30 49*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %shr to i64 50*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %ext, 33 51*9880d681SAndroid Build Coastguard Worker %and = and i64 %shl, 8589934592 52*9880d681SAndroid Build Coastguard Worker ret i64 %and 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Repeat the previous test in a case where all bits outside the 56*9880d681SAndroid Build Coastguard Worker; bottom 3 matter. 57*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(i32 %a) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 59*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r2, 29, 158, 3 60*9880d681SAndroid Build Coastguard Worker; CHECK: lhi %r2, 7 61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 62*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %a, 30 63*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %shr to i64 64*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %ext, 33 65*9880d681SAndroid Build Coastguard Worker %or = or i64 %shl, 7 66*9880d681SAndroid Build Coastguard Worker ret i64 %or 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; Test that SRA gets replaced with SRL if the sign bit is the only one 70*9880d681SAndroid Build Coastguard Worker; that matters. 71*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(i64 %a) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 73*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r2, %r2, 55, 183, 19 74*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 75*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %a, 10 76*9880d681SAndroid Build Coastguard Worker %shr = ashr i64 %shl, 60 77*9880d681SAndroid Build Coastguard Worker %and = and i64 %shr, 256 78*9880d681SAndroid Build Coastguard Worker ret i64 %and 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; Test another form of f1. 82*9880d681SAndroid Build Coastguard Workerdefine i64 @f7(i32 %a) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 84*9880d681SAndroid Build Coastguard Worker; CHECK: sllg [[REG:%r[0-5]]], %r2, 62 85*9880d681SAndroid Build Coastguard Worker; CHECK: srag %r2, [[REG]], 63 86*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 87*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %a, 30 88*9880d681SAndroid Build Coastguard Worker %sext = ashr i32 %1, 31 89*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %sext to i64 90*9880d681SAndroid Build Coastguard Worker ret i64 %ext 91*9880d681SAndroid Build Coastguard Worker} 92