@@ -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,42 @@ 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+ unsigned RdhwrOpc, DestReg;
2103+
2104+ if (Subtarget.hasMips64 ()) {
2105+ RdhwrOpc = Mips::RDHWR64;
2106+ DestReg = Mips::V1_64;
2107+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i64 , MVT::Glue,
2108+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2109+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2110+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2111+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2112+ SDValue ResNode =
2113+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i64 , Chain.getValue (1 ));
2114+ Results.push_back (ResNode);
2115+ Results.push_back (ResNode.getValue (1 ));
2116+ } else {
2117+ RdhwrOpc = Mips::RDHWR;
2118+ DestReg = Mips::V1;
2119+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i32 , MVT::Glue,
2120+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2121+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2122+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2123+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2124+ SDValue ResNode =
2125+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i32 , Chain.getValue (1 ));
2126+ Results.push_back (DAG.getNode (ISD::BUILD_PAIR, DL, MVT::i64 , ResNode,
2127+ DAG.getConstant (0 , DL, MVT::i32 )));
2128+ Results.push_back (ResNode.getValue (1 ));
2129+ }
2130+
2131+ return DAG.getMergeValues (Results, DL);
2132+ }
2133+
20952134SDValue MipsTargetLowering::lowerBRCOND (SDValue Op, SelectionDAG &DAG) const {
20962135 // The first operand is the chain, the second is the condition, the third is
20972136 // the block to branch to if the condition is true.
0 commit comments