1*9880d681SAndroid Build Coastguard Worker; Test population-count instruction 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 Workerdeclare i32 @llvm.ctpop.i32(i32 %a) 6*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64(i64 %a) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r0, %r2 11*9880d681SAndroid Build Coastguard Worker; CHECK: sllk %r1, %r0, 16 12*9880d681SAndroid Build Coastguard Worker; CHECK: ar %r1, %r0 13*9880d681SAndroid Build Coastguard Worker; CHECK: sllk %r2, %r1, 8 14*9880d681SAndroid Build Coastguard Worker; CHECK: ar %r2, %r1 15*9880d681SAndroid Build Coastguard Worker; CHECK: srl %r2, 24 16*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker %popcnt = call i32 @llvm.ctpop.i32(i32 %a) 19*9880d681SAndroid Build Coastguard Worker ret i32 %popcnt 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 24*9880d681SAndroid Build Coastguard Worker; CHECK: llhr %r0, %r2 25*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r0, %r0 26*9880d681SAndroid Build Coastguard Worker; CHECK: risblg %r2, %r0, 16, 151, 8 27*9880d681SAndroid Build Coastguard Worker; CHECK: ar %r2, %r0 28*9880d681SAndroid Build Coastguard Worker; CHECK: srl %r2, 8 29*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 30*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 65535 31*9880d681SAndroid Build Coastguard Worker %popcnt = call i32 @llvm.ctpop.i32(i32 %and) 32*9880d681SAndroid Build Coastguard Worker ret i32 %popcnt 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 37*9880d681SAndroid Build Coastguard Worker; CHECK: llcr %r0, %r2 38*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r2, %r0 39*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 40*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, 255 41*9880d681SAndroid Build Coastguard Worker %popcnt = call i32 @llvm.ctpop.i32(i32 %and) 42*9880d681SAndroid Build Coastguard Worker ret i32 %popcnt 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i64 %a) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r0, %r2 48*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r0, 32 49*9880d681SAndroid Build Coastguard Worker; CHECK: agr %r1, %r0 50*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r0, %r1, 16 51*9880d681SAndroid Build Coastguard Worker; CHECK: agr %r0, %r1 52*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r0, 8 53*9880d681SAndroid Build Coastguard Worker; CHECK: agr %r1, %r0 54*9880d681SAndroid Build Coastguard Worker; CHECK: srlg %r2, %r1, 56 55*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 56*9880d681SAndroid Build Coastguard Worker %popcnt = call i64 @llvm.ctpop.i64(i64 %a) 57*9880d681SAndroid Build Coastguard Worker ret i64 %popcnt 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(i64 %a) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 62*9880d681SAndroid Build Coastguard Worker; CHECK: llgfr %r0, %r2 63*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r0, %r0 64*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r0, 16 65*9880d681SAndroid Build Coastguard Worker; CHECK: algfr %r0, %r1 66*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r0, 8 67*9880d681SAndroid Build Coastguard Worker; CHECK: algfr %r0, %r1 68*9880d681SAndroid Build Coastguard Worker; CHECK: srlg %r2, %r0, 24 69*9880d681SAndroid Build Coastguard Worker %and = and i64 %a, 4294967295 70*9880d681SAndroid Build Coastguard Worker %popcnt = call i64 @llvm.ctpop.i64(i64 %and) 71*9880d681SAndroid Build Coastguard Worker ret i64 %popcnt 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(i64 %a) { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 76*9880d681SAndroid Build Coastguard Worker; CHECK: llghr %r0, %r2 77*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r0, %r0 78*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r1, %r0, 48, 183, 8 79*9880d681SAndroid Build Coastguard Worker; CHECK: agr %r1, %r0 80*9880d681SAndroid Build Coastguard Worker; CHECK: srlg %r2, %r1, 8 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker %and = and i64 %a, 65535 83*9880d681SAndroid Build Coastguard Worker %popcnt = call i64 @llvm.ctpop.i64(i64 %and) 84*9880d681SAndroid Build Coastguard Worker ret i64 %popcnt 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine i64 @f7(i64 %a) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 89*9880d681SAndroid Build Coastguard Worker; CHECK: llgcr %r0, %r2 90*9880d681SAndroid Build Coastguard Worker; CHECK: popcnt %r2, %r0 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Worker %and = and i64 %a, 255 93*9880d681SAndroid Build Coastguard Worker %popcnt = call i64 @llvm.ctpop.i64(i64 %and) 94*9880d681SAndroid Build Coastguard Worker ret i64 %popcnt 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97