//===-- RISCVInsertReadWriteCSR.cpp - Insert Read/Write of RISC-V CSR -----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // This file implements the machine function pass to insert read/write of CSR-s // of the RISC-V instructions. // // Currently the pass implements: // -Writing and saving frm before an RVV floating-point instruction with a // static rounding mode and restores the value after. // //===----------------------------------------------------------------------===// #include "MCTargetDesc/RISCVBaseInfo.h" #include "RISCV.h" #include "RISCVSubtarget.h" #include "llvm/CodeGen/MachineFunctionPass.h" usingnamespacellvm; #define DEBUG_TYPE … #define RISCV_INSERT_READ_WRITE_CSR_NAME … static cl::opt<bool> DisableFRMInsertOpt("riscv-disable-frm-insert-opt", cl::init(false), cl::Hidden, cl::desc("Disable optimized frm insertion.")); namespace { class RISCVInsertReadWriteCSR : public MachineFunctionPass { … }; } // end anonymous namespace char RISCVInsertReadWriteCSR::ID = …; INITIALIZE_PASS(…) // TODO: Use more accurate rounding mode at the start of MBB. bool RISCVInsertReadWriteCSR::emitWriteRoundingModeOpt(MachineBasicBlock &MBB) { … } // This function also swaps frm and restores it when encountering an RVV // floating point instruction with a static rounding mode. bool RISCVInsertReadWriteCSR::emitWriteRoundingMode(MachineBasicBlock &MBB) { … } bool RISCVInsertReadWriteCSR::runOnMachineFunction(MachineFunction &MF) { … } FunctionPass *llvm::createRISCVInsertReadWriteCSRPass() { … }