@@ -649,6 +649,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
649649
650650 setOperationAction(ISD::GET_ROUNDING, XLenVT, Custom);
651651 setOperationAction(ISD::SET_ROUNDING, MVT::Other, Custom);
652+ setOperationAction(ISD::GET_FPENV, XLenVT, Custom);
653+ setOperationAction(ISD::SET_FPENV, XLenVT, Custom);
654+ setOperationAction(ISD::RESET_FPENV, MVT::Other, Custom);
652655 }
653656
654657 setOperationAction({ISD::GlobalAddress, ISD::BlockAddress, ISD::ConstantPool,
@@ -8159,6 +8162,12 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
81598162 return lowerGET_ROUNDING(Op, DAG);
81608163 case ISD::SET_ROUNDING:
81618164 return lowerSET_ROUNDING(Op, DAG);
8165+ case ISD::GET_FPENV:
8166+ return lowerGET_FPENV(Op, DAG);
8167+ case ISD::SET_FPENV:
8168+ return lowerSET_FPENV(Op, DAG);
8169+ case ISD::RESET_FPENV:
8170+ return lowerRESET_FPENV(Op, DAG);
81628171 case ISD::EH_DWARF_CFA:
81638172 return lowerEH_DWARF_CFA(Op, DAG);
81648173 case ISD::VP_MERGE:
@@ -13799,6 +13808,41 @@ SDValue RISCVTargetLowering::lowerSET_ROUNDING(SDValue Op,
1379913808 RMValue);
1380013809}
1380113810
13811+ SDValue RISCVTargetLowering::lowerGET_FPENV(SDValue Op,
13812+ SelectionDAG &DAG) const {
13813+ const MVT XLenVT = Subtarget.getXLenVT();
13814+ SDLoc DL(Op);
13815+ SDValue Chain = Op->getOperand(0);
13816+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
13817+ SDVTList VTs = DAG.getVTList(XLenVT, MVT::Other);
13818+ return DAG.getNode(RISCVISD::READ_CSR, DL, VTs, Chain, SysRegNo);
13819+ }
13820+
13821+ SDValue RISCVTargetLowering::lowerSET_FPENV(SDValue Op,
13822+ SelectionDAG &DAG) const {
13823+ const MVT XLenVT = Subtarget.getXLenVT();
13824+ SDLoc DL(Op);
13825+ SDValue Chain = Op->getOperand(0);
13826+ SDValue EnvValue = Op->getOperand(1);
13827+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
13828+
13829+ EnvValue = DAG.getNode(ISD::ZERO_EXTEND, DL, XLenVT, EnvValue);
13830+ return DAG.getNode(RISCVISD::WRITE_CSR, DL, MVT::Other, Chain, SysRegNo,
13831+ EnvValue);
13832+ }
13833+
13834+ SDValue RISCVTargetLowering::lowerRESET_FPENV(SDValue Op,
13835+ SelectionDAG &DAG) const {
13836+ const MVT XLenVT = Subtarget.getXLenVT();
13837+ SDLoc DL(Op);
13838+ SDValue Chain = Op->getOperand(0);
13839+ SDValue EnvValue = DAG.getRegister(RISCV::X0, XLenVT);
13840+ SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::fcsr, DL, XLenVT);
13841+
13842+ return DAG.getNode(RISCVISD::WRITE_CSR, DL, MVT::Other, Chain, SysRegNo,
13843+ EnvValue);
13844+ }
13845+
1380213846SDValue RISCVTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
1380313847 SelectionDAG &DAG) const {
1380413848 MachineFunction &MF = DAG.getMachineFunction();
0 commit comments