diff options
Diffstat (limited to 'llvm/lib/Target/Sparc/SparcISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/Sparc/SparcISelLowering.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp index 1eabc0b7e45..7236d75ecd3 100644 --- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp +++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp @@ -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. |