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