diff options
Diffstat (limited to 'contrib/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp b/contrib/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp new file mode 100644 index 000000000000..cef21f447205 --- /dev/null +++ b/contrib/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp @@ -0,0 +1,100 @@ +//===- MipsRegisterBankInfo.cpp ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// \file +/// This file implements the targeting of the RegisterBankInfo class for Mips. +/// \todo This should be generated by TableGen. +//===----------------------------------------------------------------------===// + +#include "MipsInstrInfo.h" +#include "MipsRegisterBankInfo.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" + +#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} +}; + +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: + case Mips::SP32RegClassID: + 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: + case G_LOAD: + case G_STORE: + case G_GEP: + OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; + break; + case G_CONSTANT: + case G_FRAME_INDEX: + OperandsMapping = + getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); + break; + default: + return getInvalidInstructionMapping(); + } + + return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, + NumOperands); +} |
