diff options
author | Daniel Cederman <cederman@gaisler.com> | 2018-08-13 10:49:48 +0000 |
---|---|---|
committer | Daniel Cederman <cederman@gaisler.com> | 2018-08-13 10:49:48 +0000 |
commit | 1bfbc62022290f282aef2765c5878ad82a4a4c46 (patch) | |
tree | 87424e3fefa457fe9bd69de3356acf650dce1a47 /llvm/lib | |
parent | c1ef96f593adc6bcf4f63ceeb5d0748e757d15ee (diff) | |
download | bcm5719-llvm-1bfbc62022290f282aef2765c5878ad82a4a4c46.tar.gz bcm5719-llvm-1bfbc62022290f282aef2765c5878ad82a4a4c46.zip |
[Sparc] Add support for the cycle counter available in GR740
Summary: The GR740 provides an up cycle counter in the
registers ASR22 and ASR23. As these registers can not be
read together atomically we only use the value of ASR23
for llvm.readcyclecounter(). The ASR23 register holds the
32 LSBs of the up-counter.
Reviewers: jyknight, venkatra
Reviewed By: jyknight
Subscribers: fedor.sergeev, jrtc27, llvm-commits
Differential Revision: https://reviews.llvm.org/D48638
llvm-svn: 339551
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Sparc/LeonFeatures.td | 4 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/Sparc.td | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/SparcISelLowering.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/SparcSubtarget.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/SparcSubtarget.h | 2 |
5 files changed, 21 insertions, 2 deletions
diff --git a/llvm/lib/Target/Sparc/LeonFeatures.td b/llvm/lib/Target/Sparc/LeonFeatures.td index a7dea068cb1..61e5f16e0a1 100644 --- a/llvm/lib/Target/Sparc/LeonFeatures.td +++ b/llvm/lib/Target/Sparc/LeonFeatures.td @@ -58,3 +58,7 @@ def FixAllFDIVSQRT : SubtargetFeature< "true", "LEON erratum fix: Fix FDIVS/FDIVD/FSQRTS/FSQRTD instructions with NOPs and floating-point store" >; + +def LeonCycleCounter + : SubtargetFeature<"leoncyclecounter", "HasLeonCycleCounter", "true", + "Use the Leon cycle counter register">; diff --git a/llvm/lib/Target/Sparc/Sparc.td b/llvm/lib/Target/Sparc/Sparc.td index 2f9b57f7604..0c69605fd7b 100644 --- a/llvm/lib/Target/Sparc/Sparc.td +++ b/llvm/lib/Target/Sparc/Sparc.td @@ -159,7 +159,7 @@ def : Processor<"leon4", LEON4Itineraries, // LEON 4 FT (GR740) // TO DO: Place-holder: Processor specific features will be added *very* soon here. def : Processor<"gr740", LEON4Itineraries, - [FeatureLeon, UMACSMACSupport, LeonCASA]>; + [FeatureLeon, UMACSMACSupport, LeonCASA, LeonCycleCounter]>; //===----------------------------------------------------------------------===// // Declare the target which we are implementing diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp index b04c6b11268..420eba36f96 100644 --- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp +++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp @@ -1841,6 +1841,9 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM, setOperationAction(ISD::FMUL, MVT::f32, Promote); } + if (Subtarget->hasLeonCycleCounter()) + setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom); + setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom); setMinFunctionAlignment(2); @@ -3587,7 +3590,16 @@ void SparcTargetLowering::ReplaceNodeResults(SDNode *N, getLibcallName(libCall), 1)); return; - + case ISD::READCYCLECOUNTER: { + assert(Subtarget->hasLeonCycleCounter()); + SDValue Lo = DAG.getCopyFromReg(N->getOperand(0), dl, SP::ASR23, MVT::i32); + SDValue Hi = DAG.getCopyFromReg(Lo, dl, SP::G0, MVT::i32); + SDValue Ops[] = { Lo, Hi }; + SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops); + Results.push_back(Pair); + Results.push_back(N->getOperand(0)); + return; + } case ISD::SINT_TO_FP: case ISD::UINT_TO_FP: // Custom lower only if it involves f128 or i64. diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp index 40c5683f849..f3a2049ce38 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp +++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp @@ -47,6 +47,7 @@ SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(StringRef CPU, InsertNOPLoad = false; FixAllFDIVSQRT = false; DetectRoundChange = false; + HasLeonCycleCounter = false; // Determine default and user specified characteristics std::string CPUName = CPU; diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.h b/llvm/lib/Target/Sparc/SparcSubtarget.h index 588a6765bcd..65627f4f70f 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.h +++ b/llvm/lib/Target/Sparc/SparcSubtarget.h @@ -50,6 +50,7 @@ class SparcSubtarget : public SparcGenSubtargetInfo { bool InsertNOPLoad; bool FixAllFDIVSQRT; bool DetectRoundChange; + bool HasLeonCycleCounter; SparcInstrInfo InstrInfo; SparcTargetLowering TLInfo; @@ -95,6 +96,7 @@ public: bool insertNOPLoad() const { return InsertNOPLoad; } bool fixAllFDIVSQRT() const { return FixAllFDIVSQRT; } bool detectRoundChange() const { return DetectRoundChange; } + bool hasLeonCycleCounter() const { return HasLeonCycleCounter; } /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. |