@@ -358,6 +358,7 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
358358 setOperationAction (ISD::FCOPYSIGN, MVT::f32 , Custom);
359359 setOperationAction (ISD::FCOPYSIGN, MVT::f64 , Custom);
360360 setOperationAction (ISD::FP_TO_SINT, MVT::i32 , Custom);
361+ setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
361362
362363 // Lower fmin/fmax/fclass operations for MIPS R6.
363364 if (Subtarget.hasMips32r6 ()) {
@@ -1311,6 +1312,8 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
13111312 case ISD::STORE: return lowerSTORE (Op, DAG);
13121313 case ISD::EH_DWARF_CFA: return lowerEH_DWARF_CFA (Op, DAG);
13131314 case ISD::FP_TO_SINT: return lowerFP_TO_SINT (Op, DAG);
1315+ case ISD::READCYCLECOUNTER:
1316+ return lowerREADCYCLECOUNTER (Op, DAG);
13141317 }
13151318 return SDValue ();
13161319}
@@ -2092,6 +2095,43 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwapPartword(
20922095 return exitMBB;
20932096}
20942097
2098+ SDValue MipsTargetLowering::lowerREADCYCLECOUNTER (SDValue Op,
2099+ SelectionDAG &DAG) const {
2100+ SmallVector<SDValue, 3 > Results;
2101+ SDLoc DL (Op);
2102+ MachineFunction &MF = DAG.getMachineFunction ();
2103+ unsigned RdhwrOpc, DestReg;
2104+
2105+ if (Subtarget.hasMips64 ()) {
2106+ RdhwrOpc = Mips::RDHWR64;
2107+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i64 ));
2108+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i64 , MVT::Glue,
2109+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2110+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2111+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2112+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2113+ SDValue ResNode =
2114+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i64 , Chain.getValue (1 ));
2115+ Results.push_back (ResNode);
2116+ Results.push_back (ResNode.getValue (1 ));
2117+ } else {
2118+ RdhwrOpc = Mips::RDHWR;
2119+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i32 ));
2120+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i32 , MVT::Glue,
2121+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2122+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2123+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2124+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2125+ SDValue ResNode =
2126+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i32 , Chain.getValue (1 ));
2127+ Results.push_back (DAG.getNode (ISD::BUILD_PAIR, DL, MVT::i64 , ResNode,
2128+ DAG.getConstant (0 , DL, MVT::i32 )));
2129+ Results.push_back (ResNode.getValue (1 ));
2130+ }
2131+
2132+ return DAG.getMergeValues (Results, DL);
2133+ }
2134+
20952135SDValue MipsTargetLowering::lowerBRCOND (SDValue Op, SelectionDAG &DAG) const {
20962136 // The first operand is the chain, the second is the condition, the third is
20972137 // the block to branch to if the condition is true.
0 commit comments