| //===- 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); |
| } |