2014-03-18 22:07:45 +00:00
|
|
|
Pull in r198280 from upstream llvm trunk (by Venkatraman Govindaraju):
|
|
|
|
|
|
|
|
[SparcV9]: Use SRL instead of SLL to clear top 32-bits in ctpop:i32. SLL does not clear top 32 bit, only SRL does.
|
|
|
|
|
2014-05-24 22:27:31 +00:00
|
|
|
Introduced here: http://svnweb.freebsd.org/changeset/base/262261
|
2014-03-18 22:07:45 +00:00
|
|
|
|
|
|
|
Index: lib/Target/Sparc/SparcInstrInfo.td
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/SparcInstrInfo.td
|
|
|
|
+++ lib/Target/Sparc/SparcInstrInfo.td
|
|
|
|
@@ -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
|
|
|
|
Index: test/CodeGen/SPARC/ctpop.ll
|
|
|
|
===================================================================
|
|
|
|
--- test/CodeGen/SPARC/ctpop.ll
|
|
|
|
+++ test/CodeGen/SPARC/ctpop.ll
|
|
|
|
@@ -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
|