1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=corei7 | FileCheck %s 3 4 declare i64 @llvm.ctpop.i64(i64) nounwind readnone 5 6 define i32 @test1(i64 %x) nounwind readnone { 7 ; CHECK-LABEL: test1: 8 ; CHECK: # BB#0: 9 ; CHECK-NEXT: leaq -1(%rdi), %rcx 10 ; CHECK-NEXT: xorl %eax, %eax 11 ; CHECK-NEXT: testq %rcx, %rdi 12 ; CHECK-NEXT: setne %al 13 ; CHECK-NEXT: retq 14 %count = tail call i64 @llvm.ctpop.i64(i64 %x) 15 %cast = trunc i64 %count to i32 16 %cmp = icmp ugt i32 %cast, 1 17 %conv = zext i1 %cmp to i32 18 ret i32 %conv 19 } 20 21 22 define i32 @test2(i64 %x) nounwind readnone { 23 ; CHECK-LABEL: test2: 24 ; CHECK: # BB#0: 25 ; CHECK-NEXT: leaq -1(%rdi), %rcx 26 ; CHECK-NEXT: xorl %eax, %eax 27 ; CHECK-NEXT: testq %rcx, %rdi 28 ; CHECK-NEXT: sete %al 29 ; CHECK-NEXT: retq 30 %count = tail call i64 @llvm.ctpop.i64(i64 %x) 31 %cmp = icmp ult i64 %count, 2 32 %conv = zext i1 %cmp to i32 33 ret i32 %conv 34 } 35 36 define i32 @test3(i64 %x) nounwind readnone { 37 ; CHECK-LABEL: test3: 38 ; CHECK: # BB#0: 39 ; CHECK-NEXT: popcntq %rdi, %rax 40 ; CHECK-NEXT: andb $63, %al 41 ; CHECK-NEXT: cmpb $2, %al 42 ; CHECK-NEXT: sbbl %eax, %eax 43 ; CHECK-NEXT: andl $1, %eax 44 ; CHECK-NEXT: retq 45 %count = tail call i64 @llvm.ctpop.i64(i64 %x) 46 %cast = trunc i64 %count to i6 ; Too small for 0-64 47 %cmp = icmp ult i6 %cast, 2 48 %conv = zext i1 %cmp to i32 49 ret i32 %conv 50 } 51