8 #include <unordered_map>
10 #include <llvm/ADT/DenseMap.h>
11 #include <llvm/Analysis/OptimizationRemarkEmitter.h>
12 #include <llvm/CodeGen/MachineBasicBlock.h>
13 #include <llvm/IR/Module.h>
14 #include <llvm/IR/Type.h>
15 #include <llvm/Pass.h>
16 #include <llvm/Target/RISCV/RISCVInstrInfo.h>
17 #include <llvm/Target/RISCV/RISCVISelDAGToDAG.h>
18 #include <llvm/Target/RISCV/RISCVMachineFunctionInfo.h>
19 #include <llvm/Target/RISCV/RISCVRegisterInfo.h>
20 #include <llvm/Target/RISCV/RISCVSubtarget.h>
21 #include <llvm/Target/RISCV/RISCVTargetMachine.h>
23 #include "core/insts.h"
24 #include "emitter/isel.h"
25 #include "emitter/riscv/riscvcall.h"
41 llvm::RISCVTargetMachine &tm,
42 llvm::CodeGenOpt::Level ol,
43 llvm::MachineFunction &mf
49 llvm::SelectionDAG &
GetDAG()
const {
return *CurDAG; }
53 return CurDAG->getMachineFunction().getSubtarget().getTargetLowering();
58 llvm::RISCVTargetMachine &tm_;
72 llvm::RISCVTargetMachine &tm,
73 llvm::TargetLibraryInfo &libInfo,
75 llvm::CodeGenOpt::Level ol,
81 void Lower(llvm::MachineFunction &mf)
override
87 SDValue GetRegArch(Register reg)
override;
90 void LowerArch(
const Inst *inst)
override;
93 void LowerSyscall(
const SyscallInst *inst)
override;
95 void LowerClone(
const CloneInst *inst)
override;
97 void LowerReturn(
const ReturnInst *inst)
override;
99 void LowerRaise(
const RaiseInst *inst)
override;
101 void LowerSpawn(
const SpawnInst *inst)
override;
103 void LowerLandingPad(
const LandingPadInst *inst)
override;
105 void LowerSet(
const SetInst *inst)
override;
107 void LowerXchg(
const RISCV_XchgInst *inst);
109 void LowerCmpXchg(
const RISCV_CmpXchgInst *inst);
111 void LowerFence(
const RISCV_FenceInst *inst);
113 void LowerGP(
const RISCV_GpInst *inst);
116 void LowerArguments(
bool hasVAStart)
override;
122 llvm::SelectionDAG &GetDAG()
const override {
return m_->GetDAG(); }
124 void PreprocessISelDAG()
override { m_->PreprocessISelDAG(); }
126 void PostprocessISelDAG()
override { m_->PostprocessISelDAG(); }
128 void Select(SDNode *node)
override { m_->Select(node); }
131 llvm::Register GetStackRegister()
const override {
return llvm::RISCV::X2; }
135 void SaveVarArgRegisters(
const RISCVCall &ci,
bool isWin64);
139 void LowerCallSite(llvm::SDValue chain,
const CallSite *call)
override;
143 llvm::RISCVTargetMachine &tm_;
145 std::unique_ptr<RISCVMatcher> m_;
147 llvm::Function *trampoline_;