diff options
-rw-r--r-- | lib/Target/Sparc/Sparc.td | 9 | ||||
-rw-r--r-- | lib/Target/Sparc/SparcISelLowering.cpp | 5 | ||||
-rw-r--r-- | lib/Target/Sparc/SparcSubtarget.cpp | 3 | ||||
-rw-r--r-- | lib/Target/Sparc/SparcSubtarget.h | 2 | ||||
-rw-r--r-- | test/CodeGen/SPARC/ctpop.ll | 12 |
5 files changed, 19 insertions, 12 deletions
diff --git a/lib/Target/Sparc/Sparc.td b/lib/Target/Sparc/Sparc.td index 9f6992de2f..ab86dc9c31 100644 --- a/lib/Target/Sparc/Sparc.td +++ b/lib/Target/Sparc/Sparc.td @@ -34,6 +34,9 @@ def FeatureHardQuad : SubtargetFeature<"hard-quad-float", "HasHardQuad", "true", "Enable quad-word floating point instructions">; +def UsePopc : SubtargetFeature<"popc", "UsePopc", "true", + "Use the popc (population count) instruction">; + //===----------------------------------------------------------------------===// // Register File, Calling Conv, Instruction Descriptions //===----------------------------------------------------------------------===// @@ -69,9 +72,9 @@ def : Proc<"v9", [FeatureV9]>; def : Proc<"ultrasparc", [FeatureV9, FeatureV8Deprecated]>; def : Proc<"ultrasparc3", [FeatureV9, FeatureV8Deprecated]>; def : Proc<"niagara", [FeatureV9, FeatureV8Deprecated]>; -def : Proc<"niagara2", [FeatureV9, FeatureV8Deprecated]>; -def : Proc<"niagara3", [FeatureV9, FeatureV8Deprecated]>; -def : Proc<"niagara4", [FeatureV9, FeatureV8Deprecated]>; +def : Proc<"niagara2", [FeatureV9, FeatureV8Deprecated, UsePopc]>; +def : Proc<"niagara3", [FeatureV9, FeatureV8Deprecated, UsePopc]>; +def : Proc<"niagara4", [FeatureV9, FeatureV8Deprecated, UsePopc]>; //===----------------------------------------------------------------------===// diff --git a/lib/Target/Sparc/SparcISelLowering.cpp b/lib/Target/Sparc/SparcISelLowering.cpp index b555049666..9bec9113b5 100644 --- a/lib/Target/Sparc/SparcISelLowering.cpp +++ b/lib/Target/Sparc/SparcISelLowering.cpp @@ -1463,7 +1463,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM) setOperationAction(ISD::BR_CC, MVT::i64, Custom); setOperationAction(ISD::SELECT_CC, MVT::i64, Custom); - setOperationAction(ISD::CTPOP, MVT::i64, Legal); + if (Subtarget->usePopc()) + setOperationAction(ISD::CTPOP, MVT::i64, Legal); setOperationAction(ISD::CTTZ , MVT::i64, Expand); setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand); setOperationAction(ISD::CTLZ , MVT::i64, Expand); @@ -1569,7 +1570,7 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM) setStackPointerRegisterToSaveRestore(SP::O6); - if (Subtarget->isV9()) + if (Subtarget->isV9() && Subtarget->usePopc()) setOperationAction(ISD::CTPOP, MVT::i32, Legal); if (Subtarget->isV9() && Subtarget->hasHardQuad()) { diff --git a/lib/Target/Sparc/SparcSubtarget.cpp b/lib/Target/Sparc/SparcSubtarget.cpp index 7032d7f3fb..7373613eb2 100644 --- a/lib/Target/Sparc/SparcSubtarget.cpp +++ b/lib/Target/Sparc/SparcSubtarget.cpp @@ -31,7 +31,8 @@ SparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU, V8DeprecatedInsts(false), IsVIS(false), Is64Bit(is64Bit), - HasHardQuad(false) { + HasHardQuad(false), + UsePopc(false) { // Determine default and user specified characteristics std::string CPUName = CPU; diff --git a/lib/Target/Sparc/SparcSubtarget.h b/lib/Target/Sparc/SparcSubtarget.h index 012aca7d92..154afb55f8 100644 --- a/lib/Target/Sparc/SparcSubtarget.h +++ b/lib/Target/Sparc/SparcSubtarget.h @@ -30,6 +30,7 @@ class SparcSubtarget : public SparcGenSubtargetInfo { bool IsVIS; bool Is64Bit; bool HasHardQuad; + bool UsePopc; public: SparcSubtarget(const std::string &TT, const std::string &CPU, @@ -39,6 +40,7 @@ public: bool isVIS() const { return IsVIS; } bool useDeprecatedV8Instructions() const { return V8DeprecatedInsts; } bool hasHardQuad() const { return HasHardQuad; } + bool usePopc() const { return UsePopc; } /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. diff --git a/test/CodeGen/SPARC/ctpop.ll b/test/CodeGen/SPARC/ctpop.ll index 665b44b8f6..3a373404b9 100644 --- a/test/CodeGen/SPARC/ctpop.ll +++ b/test/CodeGen/SPARC/ctpop.ll @@ -1,13 +1,13 @@ ; 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=sparc -mcpu=v9 | FileCheck %s -check-prefix=V9 -; RUN: llc < %s -march=sparc -mcpu=ultrasparc | FileCheck %s -check-prefix=V9 -; RUN: llc < %s -march=sparc -mcpu=ultrasparc3 | FileCheck %s -check-prefix=V9 -; RUN: llc < %s -march=sparc -mcpu=niagara | FileCheck %s -check-prefix=V9 +; RUN: llc < %s -march=sparc -mattr=+v9,+popc | FileCheck %s -check-prefix=V9 +; RUN: llc < %s -march=sparc -mcpu=v9 | FileCheck %s -check-prefix=V8 +; RUN: llc < %s -march=sparc -mcpu=ultrasparc | FileCheck %s -check-prefix=V8 +; RUN: llc < %s -march=sparc -mcpu=ultrasparc3 | FileCheck %s -check-prefix=V8 +; RUN: llc < %s -march=sparc -mcpu=niagara | FileCheck %s -check-prefix=V8 ; RUN: llc < %s -march=sparc -mcpu=niagara2 | FileCheck %s -check-prefix=V9 ; RUN: llc < %s -march=sparc -mcpu=niagara3 | FileCheck %s -check-prefix=V9 ; RUN: llc < %s -march=sparc -mcpu=niagara4 | FileCheck %s -check-prefix=V9 -; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=SPARC64 +; RUN: llc < %s -march=sparcv9 -mattr=+popc | FileCheck %s -check-prefix=SPARC64 declare i32 @llvm.ctpop.i32(i32) |