@@ -358,6 +358,7 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
358
358
setOperationAction (ISD::FCOPYSIGN, MVT::f32 , Custom);
359
359
setOperationAction (ISD::FCOPYSIGN, MVT::f64 , Custom);
360
360
setOperationAction (ISD::FP_TO_SINT, MVT::i32 , Custom);
361
+ setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
361
362
362
363
// Lower fmin/fmax/fclass operations for MIPS R6.
363
364
if (Subtarget.hasMips32r6 ()) {
@@ -1311,6 +1312,8 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
1311
1312
case ISD::STORE: return lowerSTORE (Op, DAG);
1312
1313
case ISD::EH_DWARF_CFA: return lowerEH_DWARF_CFA (Op, DAG);
1313
1314
case ISD::FP_TO_SINT: return lowerFP_TO_SINT (Op, DAG);
1315
+ case ISD::READCYCLECOUNTER:
1316
+ return lowerREADCYCLECOUNTER (Op, DAG);
1314
1317
}
1315
1318
return SDValue ();
1316
1319
}
@@ -2092,6 +2095,42 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwapPartword(
2092
2095
return exitMBB;
2093
2096
}
2094
2097
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
+
2095
2134
SDValue MipsTargetLowering::lowerBRCOND (SDValue Op, SelectionDAG &DAG) const {
2096
2135
// The first operand is the chain, the second is the condition, the third is
2097
2136
// the block to branch to if the condition is true.
0 commit comments