@@ -656,6 +656,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
656656 setOperationAction(ISD::GET_FPENV, XLenVT, Custom);
657657 setOperationAction(ISD::SET_FPENV, XLenVT, Custom);
658658 setOperationAction(ISD::RESET_FPENV, MVT::Other, Custom);
659+ setOperationAction(ISD::GET_FPMODE, XLenVT, Custom);
660+ setOperationAction(ISD::SET_FPMODE, XLenVT, Custom);
661+ setOperationAction(ISD::RESET_FPMODE, MVT::Other, Custom);
659662 }
660663
661664 setOperationAction({ISD::GlobalAddress, ISD::BlockAddress, ISD::ConstantPool,
@@ -8226,6 +8229,12 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
82268229 return lowerSET_FPENV(Op, DAG);
82278230 case ISD::RESET_FPENV:
82288231 return lowerRESET_FPENV(Op, DAG);
8232+ case ISD::GET_FPMODE:
8233+ return lowerGET_FPMODE(Op, DAG);
8234+ case ISD::SET_FPMODE:
8235+ return lowerSET_FPMODE(Op, DAG);
8236+ case ISD::RESET_FPMODE:
8237+ return lowerRESET_FPMODE(Op, DAG);
82298238 case ISD::EH_DWARF_CFA:
82308239 return lowerEH_DWARF_CFA(Op, DAG);
82318240 case ISD::VP_MERGE:
@@ -13998,6 +14007,55 @@ SDValue RISCVTargetLowering::lowerRESET_FPENV(SDValue Op,
1399814007 EnvValue);
1399914008}
1400014009
14010+ const uint64_t ModeMask64 = ~RISCVExceptFlags::ALL;
14011+ const uint32_t ModeMask32 = ~RISCVExceptFlags::ALL;
14012+
14013+ SDValue RISCVTargetLowering::lowerGET_FPMODE(SDValue Op,
14014+ SelectionDAG &DAG) const {
14015+ const MVT XLenVT = Subtarget.getXLenVT();
14016+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14017+ SDLoc DL(Op);
14018+ SDValue Chain = Op->getOperand(0);
14019+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14020+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14021+ SDVTList VTs = DAG.getVTList(XLenVT, MVT::Other);
14022+ SDValue Result = DAG.getNode(RISCVISD::READ_CSR, DL, VTs, Chain, SysRegNo);
14023+ Chain = Result.getValue(1);
14024+ Result = DAG.getNode(ISD::AND, DL, XLenVT, Result, ModeMask);
14025+ return DAG.getMergeValues({Result, Chain}, DL);
14026+ }
14027+
14028+ SDValue RISCVTargetLowering::lowerSET_FPMODE(SDValue Op,
14029+ SelectionDAG &DAG) const {
14030+ const MVT XLenVT = Subtarget.getXLenVT();
14031+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14032+ SDLoc DL(Op);
14033+ SDValue Chain = Op->getOperand(0);
14034+ SDValue EnvValue = Op->getOperand(1);
14035+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14036+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14037+
14038+ EnvValue = DAG.getNode(ISD::ZERO_EXTEND, DL, XLenVT, EnvValue);
14039+ EnvValue = DAG.getNode(ISD::AND, DL, XLenVT, EnvValue, ModeMask);
14040+ Chain = DAG.getNode(RISCVISD::CLEAR_CSR, DL, MVT::Other, Chain, SysRegNo,
14041+ ModeMask);
14042+ return DAG.getNode(RISCVISD::SET_CSR, DL, MVT::Other, Chain, SysRegNo,
14043+ EnvValue);
14044+ }
14045+
14046+ SDValue RISCVTargetLowering::lowerRESET_FPMODE(SDValue Op,
14047+ SelectionDAG &DAG) const {
14048+ const MVT XLenVT = Subtarget.getXLenVT();
14049+ const uint64_t ModeMaskValue = Subtarget.is64Bit() ? ModeMask64 : ModeMask32;
14050+ SDLoc DL(Op);
14051+ SDValue Chain = Op->getOperand(0);
14052+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
14053+ SDValue ModeMask = DAG.getConstant(ModeMaskValue, DL, XLenVT);
14054+
14055+ return DAG.getNode(RISCVISD::CLEAR_CSR, DL, MVT::Other, Chain, SysRegNo,
14056+ ModeMask);
14057+ }
14058+
1400114059SDValue RISCVTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
1400214060 SelectionDAG &DAG) const {
1400314061 MachineFunction &MF = DAG.getMachineFunction();
0 commit comments