[SparcV9]: Use SRL instead of SLL to clear top 32-bits in ctpop:i32. SLL does not clear top 32 bit, only SRL does.

llvm-svn: 198280
This commit is contained in:
Venkatraman Govindaraju 2014-01-01 19:00:10 +00:00
parent 545b6803c3
commit acf0233a46
2 changed files with 18 additions and 4 deletions

View File

@ -967,13 +967,13 @@ let Predicates = [HasV9] in {
}
// POPCrr - This does a ctpop of a 64-bit register. As such, we have to clear
// the top 32-bits before using it. To do this clearing, we use a SLLri X,0.
// the top 32-bits before using it. To do this clearing, we use a SRLri X,0.
let rs1 = 0 in
def POPCrr : F3_1<2, 0b101110,
(outs IntRegs:$dst), (ins IntRegs:$src),
"popc $src, $dst", []>, Requires<[HasV9]>;
def : Pat<(ctpop i32:$src),
(POPCrr (SLLri $src, 0))>;
(POPCrr (SRLri $src, 0))>;
//===----------------------------------------------------------------------===//
// Non-Instruction Patterns

View File

@ -1,8 +1,22 @@
; RUN: llc < %s -march=sparc -mattr=-v9 | not grep popc
; RUN: llc < %s -march=sparc -mattr=+v9 | grep popc
; RUN: llc < %s -march=sparc -mattr=-v9 | FileCheck %s -check-prefix=V8
; RUN: llc < %s -march=sparc -mattr=+v9 | FileCheck %s -check-prefix=V9
; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=SPARC64
declare i32 @llvm.ctpop.i32(i32)
; V8-LABEL: test
; V8-NOT : popc
; V9-LABEL: test
; V9: srl %o0, 0, %o0
; V9-NEXT: jmp %o7+8
; V9-NEXT: popc %o0, %o0
; SPARC64-LABEL: test
; SPARC64: srl %o0, 0, %o0
; SPARC64: jmp %o7+8
; SPARC64: popc %o0, %o0
define i32 @test(i32 %X) {
%Y = call i32 @llvm.ctpop.i32( i32 %X ) ; <i32> [#uses=1]
ret i32 %Y