From ca0ef6fe4f34f416c5ac1e20d004064eaf92ca1f Mon Sep 17 00:00:00 2001 From: Venkatraman Govindaraju Date: Wed, 1 Jan 2014 19:00:10 +0000 Subject: [PATCH] [SparcV9]: Use SRL instead of SLL to clear top 32-bits in ctpop:i32. SLL does not clear top 32 bit, only SRL does. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198280 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Sparc/SparcInstrInfo.td | 4 ++-- test/CodeGen/SPARC/ctpop.ll | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/Target/Sparc/SparcInstrInfo.td b/lib/Target/Sparc/SparcInstrInfo.td index 12a0962cac1..3b2b17191fe 100644 --- a/lib/Target/Sparc/SparcInstrInfo.td +++ b/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/test/CodeGen/SPARC/ctpop.ll b/test/CodeGen/SPARC/ctpop.ll index 916a41496e2..eab1de6c952 100644 --- a/test/CodeGen/SPARC/ctpop.ll +++ b/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 ) ; [#uses=1] ret i32 %Y