diff options
Diffstat (limited to 'test/CodeGen')
-rw-r--r-- | test/CodeGen/X86/clz.ll | 27 | ||||
-rw-r--r-- | test/CodeGen/X86/lzcnt.ll | 28 |
2 files changed, 54 insertions, 1 deletions
diff --git a/test/CodeGen/X86/clz.ll b/test/CodeGen/X86/clz.ll index 4e08030..ad47bde 100644 --- a/test/CodeGen/X86/clz.ll +++ b/test/CodeGen/X86/clz.ll @@ -31,7 +31,7 @@ entry: ; CHECK: t3: ; CHECK: bsrw ; CHECK-NOT: cmov -; CHECK: xorw $15, +; CHECK: xorl $15, ; CHECK: ret } @@ -63,3 +63,28 @@ entry: %tmp1 = tail call i32 @llvm.ctlz.i32(i32 %or, i1 false) ret i32 %tmp1 } + +define i32 @t6(i32 %n) nounwind { +entry: +; Don't generate any xors when a 'ctlz' intrinsic is actually used to compute +; the most significant bit, which is what 'bsr' does natively. +; CHECK: t6: +; CHECK: bsrl +; CHECK-NOT: xorl +; CHECK: ret + %ctlz = tail call i32 @llvm.ctlz.i32(i32 %n, i1 true) + %bsr = xor i32 %ctlz, 31 + ret i32 %bsr +} + +define i32 @t7(i32 %n) nounwind { +entry: +; Same as t6, but ensure this happens even when there is a potential zero. +; CHECK: t7: +; CHECK: bsrl +; CHECK-NOT: xorl +; CHECK: ret + %ctlz = tail call i32 @llvm.ctlz.i32(i32 %n, i1 false) + %bsr = xor i32 %ctlz, 31 + ret i32 %bsr +} diff --git a/test/CodeGen/X86/lzcnt.ll b/test/CodeGen/X86/lzcnt.ll index c2b3e68..eb010d7 100644 --- a/test/CodeGen/X86/lzcnt.ll +++ b/test/CodeGen/X86/lzcnt.ll @@ -32,3 +32,31 @@ define i64 @t4(i64 %x) nounwind { ; CHECK: t4: ; CHECK: lzcntq } + +define i8 @t5(i8 %x) nounwind { + %tmp = tail call i8 @llvm.ctlz.i8( i8 %x, i1 true ) + ret i8 %tmp +; CHECK: t5: +; CHECK: lzcntw +} + +define i16 @t6(i16 %x) nounwind { + %tmp = tail call i16 @llvm.ctlz.i16( i16 %x, i1 true ) + ret i16 %tmp +; CHECK: t6: +; CHECK: lzcntw +} + +define i32 @t7(i32 %x) nounwind { + %tmp = tail call i32 @llvm.ctlz.i32( i32 %x, i1 true ) + ret i32 %tmp +; CHECK: t7: +; CHECK: lzcntl +} + +define i64 @t8(i64 %x) nounwind { + %tmp = tail call i64 @llvm.ctlz.i64( i64 %x, i1 true ) + ret i64 %tmp +; CHECK: t8: +; CHECK: lzcntq +} |