1 ; RUN: llc < %s -march=x86-64 -mcpu=yonah | FileCheck %s
3 declare i32 @llvm.cttz.i32(i32, i1)
4 declare i8 @llvm.ctlz.i8(i8, i1)
5 declare i16 @llvm.ctlz.i16(i16, i1)
6 declare i32 @llvm.ctlz.i32(i32, i1)
7 declare i64 @llvm.ctlz.i64(i64, i1)
9 define i32 @cttz_i32(i32 %x) {
10 %tmp = call i32 @llvm.cttz.i32( i32 %x, i1 true )
18 define i8 @ctlz_i8(i8 %x) {
20 %tmp2 = call i8 @llvm.ctlz.i8( i8 %x, i1 true )
29 define i16 @ctlz_i16(i16 %x) {
31 %tmp2 = call i16 @llvm.ctlz.i16( i16 %x, i1 true )
40 define i32 @ctlz_i32(i32 %x) {
41 %tmp = call i32 @llvm.ctlz.i32( i32 %x, i1 true )
50 define i64 @ctlz_i64(i64 %x) {
51 %tmp = call i64 @llvm.ctlz.i64( i64 %x, i1 true )
60 define i32 @ctlz_i32_cmov(i32 %n) {
62 ; Generate a cmov to handle zero inputs when necessary.
63 ; CHECK: ctlz_i32_cmov:
68 %tmp1 = call i32 @llvm.ctlz.i32(i32 %n, i1 false)
72 define i32 @ctlz_i32_fold_cmov(i32 %n) {
74 ; Don't generate the cmovne when the source is known non-zero (and bsr would
77 ; CHECK: ctlz_i32_fold_cmov:
83 %tmp1 = call i32 @llvm.ctlz.i32(i32 %or, i1 false)
87 define i32 @ctlz_bsr(i32 %n) {
89 ; Don't generate any xors when a 'ctlz' intrinsic is actually used to compute
90 ; the most significant bit, which is what 'bsr' does natively.
95 %ctlz = call i32 @llvm.ctlz.i32(i32 %n, i1 true)
96 %bsr = xor i32 %ctlz, 31
100 define i32 @ctlz_bsr_cmov(i32 %n) {
102 ; Same as ctlz_bsr, but ensure this happens even when there is a potential
104 ; CHECK: ctlz_bsr_cmov:
108 %ctlz = call i32 @llvm.ctlz.i32(i32 %n, i1 false)
109 %bsr = xor i32 %ctlz, 31