@@ -655,6 +655,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
655655 setOperationAction(ISD::GET_FPENV, XLenVT, Custom);
656656 setOperationAction(ISD::SET_FPENV, XLenVT, Custom);
657657 setOperationAction(ISD::RESET_FPENV, MVT::Other, Custom);
658+ setOperationAction(ISD::GET_FPMODE, XLenVT, Custom);
659+ setOperationAction(ISD::SET_FPMODE, XLenVT, Custom);
660+ setOperationAction(ISD::RESET_FPMODE, MVT::Other, Custom);
658661 }
659662
660663 setOperationAction({ISD::GlobalAddress, ISD::BlockAddress, ISD::ConstantPool,
@@ -8225,6 +8228,12 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
82258228 return lowerSET_FPENV(Op, DAG);
82268229 case ISD::RESET_FPENV:
82278230 return lowerRESET_FPENV(Op, DAG);
8231+ case ISD::GET_FPMODE:
8232+ return lowerGET_FPMODE(Op, DAG);
8233+ case ISD::SET_FPMODE:
8234+ return lowerSET_FPMODE(Op, DAG);
8235+ case ISD::RESET_FPMODE:
8236+ return lowerRESET_FPMODE(Op, DAG);
82288237 case ISD::EH_DWARF_CFA:
82298238 return lowerEH_DWARF_CFA(Op, DAG);
82308239 case ISD::VP_MERGE:
@@ -14002,6 +14011,54 @@ SDValue RISCVTargetLowering::lowerRESET_FPENV(SDValue Op,
1400214011 EnvValue);
1400314012}
1400414013
14014+ const uint64_t ModeMask64 = ~RISCVExceptFlags::ALL;
14015+ const uint32_t ModeMask32 = ~RISCVExceptFlags::ALL;
14016+
14017+ SDValue RISCVTargetLowering::lowerGET_FPMODE(SDValue Op,
14018+ SelectionDAG &DAG) const {
14019+ const MVT XLenVT = Subtarget.getXLenVT();
14020+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14021+ SDLoc DL(Op);
14022+ SDValue Chain = Op->getOperand(0);
14023+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14024+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14025+ SDVTList VTs = DAG.getVTList(XLenVT, MVT::Other);
14026+ SDValue Result = DAG.getNode(RISCVISD::READ_CSR, DL, VTs, Chain, SysRegNo);
14027+ Chain = Result.getValue(1);
14028+ return DAG.getMergeValues({Result, Chain}, DL);
14029+ }
14030+
14031+ SDValue RISCVTargetLowering::lowerSET_FPMODE(SDValue Op,
14032+ SelectionDAG &DAG) const {
14033+ const MVT XLenVT = Subtarget.getXLenVT();
14034+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14035+ SDLoc DL(Op);
14036+ SDValue Chain = Op->getOperand(0);
14037+ SDValue EnvValue = Op->getOperand(1);
14038+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14039+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14040+
14041+ EnvValue = DAG.getNode(ISD::ZERO_EXTEND, DL, XLenVT, EnvValue);
14042+ EnvValue = DAG.getNode(ISD::AND, DL, XLenVT, EnvValue, ModeMask);
14043+ Chain = DAG.getNode(RISCVISD::CLEAR_CSR, DL, MVT::Other, Chain, SysRegNo,
14044+ ModeMask);
14045+ return DAG.getNode(RISCVISD::SET_CSR, DL, MVT::Other, Chain, SysRegNo,
14046+ EnvValue);
14047+ }
14048+
14049+ SDValue RISCVTargetLowering::lowerRESET_FPMODE(SDValue Op,
14050+ SelectionDAG &DAG) const {
14051+ const MVT XLenVT = Subtarget.getXLenVT();
14052+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14053+ SDLoc DL(Op);
14054+ SDValue Chain = Op->getOperand(0);
14055+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14056+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14057+
14058+ return DAG.getNode(RISCVISD::CLEAR_CSR, DL, MVT::Other, Chain, SysRegNo,
14059+ ModeMask);
14060+ }
14061+
1400514062SDValue RISCVTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
1400614063 SelectionDAG &DAG) const {
1400714064 MachineFunction &MF = DAG.getMachineFunction();
0 commit comments