| //===- 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: | |
| case G_GLOBAL_VALUE: | |
| OperandsMapping = | |
| getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); | |
| break; | |
| default: | |
| return getInvalidInstructionMapping(); | |
| } | |
| return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, | |
| NumOperands); | |
| } |