@@ -359,6 +359,10 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
359
359
setOperationAction (ISD::FCOPYSIGN, MVT::f64 , Custom);
360
360
setOperationAction (ISD::FP_TO_SINT, MVT::i32 , Custom);
361
361
362
+ if (Subtarget.hasMips32r2 () ||
363
+ getTargetMachine ().getTargetTriple ().isOSLinux ())
364
+ setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
365
+
362
366
// Lower fmin/fmax/fclass operations for MIPS R6.
363
367
if (Subtarget.hasMips32r6 ()) {
364
368
setOperationAction (ISD::FMINNUM_IEEE, MVT::f32 , Legal);
@@ -1311,6 +1315,8 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
1311
1315
case ISD::STORE: return lowerSTORE (Op, DAG);
1312
1316
case ISD::EH_DWARF_CFA: return lowerEH_DWARF_CFA (Op, DAG);
1313
1317
case ISD::FP_TO_SINT: return lowerFP_TO_SINT (Op, DAG);
1318
+ case ISD::READCYCLECOUNTER:
1319
+ return lowerREADCYCLECOUNTER (Op, DAG);
1314
1320
}
1315
1321
return SDValue ();
1316
1322
}
@@ -2092,6 +2098,43 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwapPartword(
2092
2098
return exitMBB;
2093
2099
}
2094
2100
2101
+ SDValue MipsTargetLowering::lowerREADCYCLECOUNTER (SDValue Op,
2102
+ SelectionDAG &DAG) const {
2103
+ SmallVector<SDValue, 3 > Results;
2104
+ SDLoc DL (Op);
2105
+ MachineFunction &MF = DAG.getMachineFunction ();
2106
+ unsigned RdhwrOpc, DestReg;
2107
+
2108
+ if (Subtarget.hasMips64 ()) {
2109
+ RdhwrOpc = Mips::RDHWR64;
2110
+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i64 ));
2111
+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i64 , MVT::Glue,
2112
+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2113
+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2114
+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2115
+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2116
+ SDValue ResNode =
2117
+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i64 , Chain.getValue (1 ));
2118
+ Results.push_back (ResNode);
2119
+ Results.push_back (ResNode.getValue (1 ));
2120
+ } else {
2121
+ RdhwrOpc = Mips::RDHWR;
2122
+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i32 ));
2123
+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i32 , MVT::Glue,
2124
+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2125
+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2126
+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2127
+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2128
+ SDValue ResNode =
2129
+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i32 , Chain.getValue (1 ));
2130
+ Results.push_back (DAG.getNode (ISD::BUILD_PAIR, DL, MVT::i64 , ResNode,
2131
+ DAG.getConstant (0 , DL, MVT::i32 )));
2132
+ Results.push_back (ResNode.getValue (1 ));
2133
+ }
2134
+
2135
+ return DAG.getMergeValues (Results, DL);
2136
+ }
2137
+
2095
2138
SDValue MipsTargetLowering::lowerBRCOND (SDValue Op, SelectionDAG &DAG) const {
2096
2139
// The first operand is the chain, the second is the condition, the third is
2097
2140
// the block to branch to if the condition is true.
0 commit comments