@@ -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,47 @@ 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
+ MachineFunction &MF = DAG.getMachineFunction ();
2103
+ unsigned RdhwrOpc, DestReg;
2104
+
2105
+ if (!Subtarget.hasMips32r6 () &&
2106
+ !getTargetMachine ().getTargetTriple ().isOSLinux ())
2107
+ return Op;
2108
+
2109
+ if (Subtarget.hasMips64 ()) {
2110
+ RdhwrOpc = Mips::RDHWR64;
2111
+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i64 ));
2112
+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i64 , MVT::Glue,
2113
+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2114
+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2115
+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2116
+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2117
+ SDValue ResNode =
2118
+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i64 , Chain.getValue (1 ));
2119
+ Results.push_back (ResNode);
2120
+ Results.push_back (ResNode.getValue (1 ));
2121
+ } else {
2122
+ RdhwrOpc = Mips::RDHWR;
2123
+ DestReg = MF.getRegInfo ().createVirtualRegister (getRegClassFor (MVT::i32 ));
2124
+ SDNode *Rdhwr = DAG.getMachineNode (RdhwrOpc, DL, MVT::i32 , MVT::Glue,
2125
+ DAG.getRegister (Mips::HWR2, MVT::i32 ),
2126
+ DAG.getTargetConstant (0 , DL, MVT::i32 ));
2127
+ SDValue Chain = DAG.getCopyToReg (DAG.getEntryNode (), DL, DestReg,
2128
+ SDValue (Rdhwr, 0 ), SDValue (Rdhwr, 1 ));
2129
+ SDValue ResNode =
2130
+ DAG.getCopyFromReg (Chain, DL, DestReg, MVT::i32 , Chain.getValue (1 ));
2131
+ Results.push_back (DAG.getNode (ISD::BUILD_PAIR, DL, MVT::i64 , ResNode,
2132
+ DAG.getConstant (0 , DL, MVT::i32 )));
2133
+ Results.push_back (ResNode.getValue (1 ));
2134
+ }
2135
+
2136
+ return DAG.getMergeValues (Results, DL);
2137
+ }
2138
+
2095
2139
SDValue MipsTargetLowering::lowerBRCOND (SDValue Op, SelectionDAG &DAG) const {
2096
2140
// The first operand is the chain, the second is the condition, the third is
2097
2141
// the block to branch to if the condition is true.
0 commit comments