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