diff options
author | Petar Jovanovic <petar.jovanovic@mips.com> | 2018-04-11 15:12:32 +0000 |
---|---|---|
committer | Petar Jovanovic <petar.jovanovic@mips.com> | 2018-04-11 15:12:32 +0000 |
commit | 5e1362e54638e57bbe0f262d0948eeb4af4d3437 (patch) | |
tree | 52d62e1a39e2e8169db3ae09219c5ca5d484eb13 /llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp | |
parent | fa97d2aad77f44e9c483ab75b4d40c364f1e9804 (diff) |
[MIPS GlobalISel] Select add i32, i32
Add the minimal support necessary to lower a function that returns the
sum of two i32 values.
Support argument/return lowering of i32 values through registers only.
Add tablegen for regbankselect and instructionselect.
Patch by Petar Avramovic.
Differential Revision: https://reviews.llvm.org/D44304
Diffstat (limited to 'llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp b/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp index d148c50e287..705c234362b 100644 --- a/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp +++ b/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp @@ -11,16 +11,84 @@ /// \todo This should be generated by TableGen. //===----------------------------------------------------------------------===// +#include "MipsInstrInfo.h" #include "MipsRegisterBankInfo.h" #include "llvm/CodeGen/GlobalISel/RegisterBank.h" #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetRegisterInfo.h" -using namespace llvm; +#define GET_TARGET_REGBANK_IMPL + +#define DEBUG_TYPE "registerbankinfo" + +#include "MipsGenRegisterBank.inc" + +namespace llvm { +namespace Mips { +enum PartialMappingIdx { + PMI_GPR, + PMI_Min = PMI_GPR, +}; + +RegisterBankInfo::PartialMapping PartMappings[]{ + {0, 32, GPRBRegBank} +}; -MipsGenRegisterBankInfo::MipsGenRegisterBankInfo() - : RegisterBankInfo(nullptr, 0) {} +enum ValueMappingIdx { InvalidIdx = 0, GPRIdx = 1 }; + +RegisterBankInfo::ValueMapping ValueMappings[] = { + // invalid + {nullptr, 0}, + // 3 operands in GPRs + {&PartMappings[PMI_GPR - PMI_Min], 1}, + {&PartMappings[PMI_GPR - PMI_Min], 1}, + {&PartMappings[PMI_GPR - PMI_Min], 1}}; + +} // end namespace Mips +} // end namespace llvm + +using namespace llvm; MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI) : MipsGenRegisterBankInfo() {} + +const RegisterBank &MipsRegisterBankInfo::getRegBankFromRegClass( + const TargetRegisterClass &RC) const { + using namespace Mips; + + switch (RC.getID()) { + case Mips::GPR32RegClassID: + case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID: + case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID: + return getRegBank(Mips::GPRBRegBankID); + default: + llvm_unreachable("Register class not supported"); + } +} + +const RegisterBankInfo::InstructionMapping & +MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { + + unsigned Opc = MI.getOpcode(); + + const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); + if (Mapping.isValid()) + return Mapping; + + using namespace TargetOpcode; + + unsigned NumOperands = MI.getNumOperands(); + const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; + + switch (Opc) { + case G_ADD: + OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; + break; + default: + return getInvalidInstructionMapping(); + } + + return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, + NumOperands); +} |