// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_REGISTERBANKINFO_H #define RCC_CODEGEN_REGISTERBANKINFO_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/CodeGen/Register.h" #include "rcc/Support/Error.h" #include #include namespace rcc { class MachineFunction; class MachineInstr; class TargetDescription; struct VirtualRegisterInfo; struct RegisterBankSelection final { RegisterBankID Bank; bool IsConstrained = false; }; using RegisterBankInstructionMapping = std::vector>; class RegisterBankInfo { public: virtual ~RegisterBankInfo() = default; [[nodiscard]] virtual Expected selectBank(const MachineFunction &Function, Register Reg, const VirtualRegisterInfo &Info, const MachineInstr *Context, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected getInstructionMapping(const MachineInstr &, const MachineFunction &, const TargetDescription &) const { return RegisterBankInstructionMapping{}; } // This hook rejects invalid mappings before register-bank state is published. [[nodiscard]] virtual Expected validateInstruction(const MachineInstr &, const MachineFunction &, const TargetDescription &) const { return {}; } }; } // namespace rcc #endif // RCC_CODEGEN_REGISTERBANKINFO_H