summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>2014-01-01 19:00:10 +0000
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>2014-01-01 19:00:10 +0000
commitacf0233a467510afd225d2b7117e43b0300be7ef (patch)
tree1615507f469a592a1fa05961b1211cdcb6414164 /llvm
parent545b6803c3beb49a2cb7cfc8c0f516ad5be7c5d7 (diff)
downloadbcm5719-llvm-acf0233a467510afd225d2b7117e43b0300be7ef.tar.gz
bcm5719-llvm-acf0233a467510afd225d2b7117e43b0300be7ef.zip
[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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/Sparc/SparcInstrInfo.td4
-rw-r--r--llvm/test/CodeGen/SPARC/ctpop.ll18
2 files changed, 18 insertions, 4 deletions
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td
index 12a0962cac1..3b2b17191fe 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.td
+++ b/llvm/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
diff --git a/llvm/test/CodeGen/SPARC/ctpop.ll b/llvm/test/CodeGen/SPARC/ctpop.ll
index 916a41496e2..eab1de6c952 100644
--- a/llvm/test/CodeGen/SPARC/ctpop.ll
+++ b/llvm/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
OpenPOWER on IntegriCloud