mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-26 14:16:12 +00:00
[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: jfb, fedor.sergeev, jrtc27, llvm-commits Differential Revision: https://reviews.llvm.org/D48638 llvm-svn: 340733
This commit is contained in:
parent
611c04b0b8
commit
6a6f9554e3
@ -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">;
|
||||
|
@ -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
|
||||
|
@ -1803,6 +1803,9 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
|
||||
if (!Subtarget->is64Bit())
|
||||
setTargetDAGCombine(ISD::BITCAST);
|
||||
|
||||
if (Subtarget->hasLeonCycleCounter())
|
||||
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom);
|
||||
|
||||
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
|
||||
|
||||
setMinFunctionAlignment(2);
|
||||
@ -3578,7 +3581,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.
|
||||
|
@ -95,6 +95,10 @@ BitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
}
|
||||
}
|
||||
|
||||
// Reserve ASR1-ASR31
|
||||
for (unsigned n = 0; n < 31; n++)
|
||||
Reserved.set(SP::ASR1 + n);
|
||||
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
11
test/CodeGen/SPARC/readcycle.ll
Normal file
11
test/CodeGen/SPARC/readcycle.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: llc < %s -march=sparc -mcpu=gr740 -verify-machineinstrs | FileCheck %s
|
||||
; CHECK: rd %asr23, %o1
|
||||
; CHECK: mov %g0, %o0
|
||||
|
||||
define i64 @test() {
|
||||
entry:
|
||||
%0 = call i64 @llvm.readcyclecounter()
|
||||
ret i64 %0
|
||||
}
|
||||
|
||||
declare i64 @llvm.readcyclecounter()
|
Loading…
x
Reference in New Issue
Block a user