1fac93e28SPetar Jovanovic //===- MipsRegisterBankInfo.cpp ---------------------------------*- C++ -*-===// 2fac93e28SPetar Jovanovic // 3fac93e28SPetar Jovanovic // The LLVM Compiler Infrastructure 4fac93e28SPetar Jovanovic // 5fac93e28SPetar Jovanovic // This file is distributed under the University of Illinois Open Source 6fac93e28SPetar Jovanovic // License. See LICENSE.TXT for details. 7fac93e28SPetar Jovanovic // 8fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===// 9fac93e28SPetar Jovanovic /// \file 10fac93e28SPetar Jovanovic /// This file implements the targeting of the RegisterBankInfo class for Mips. 11fac93e28SPetar Jovanovic /// \todo This should be generated by TableGen. 12fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===// 13fac93e28SPetar Jovanovic 14366857a2SPetar Jovanovic #include "MipsInstrInfo.h" 15fac93e28SPetar Jovanovic #include "MipsRegisterBankInfo.h" 16fac93e28SPetar Jovanovic #include "llvm/CodeGen/MachineRegisterInfo.h" 17fac93e28SPetar Jovanovic 18366857a2SPetar Jovanovic #define GET_TARGET_REGBANK_IMPL 19fac93e28SPetar Jovanovic 20366857a2SPetar Jovanovic #define DEBUG_TYPE "registerbankinfo" 21366857a2SPetar Jovanovic 22366857a2SPetar Jovanovic #include "MipsGenRegisterBank.inc" 23366857a2SPetar Jovanovic 24366857a2SPetar Jovanovic namespace llvm { 25366857a2SPetar Jovanovic namespace Mips { 26366857a2SPetar Jovanovic enum PartialMappingIdx { 27366857a2SPetar Jovanovic PMI_GPR, 28366857a2SPetar Jovanovic PMI_Min = PMI_GPR, 29366857a2SPetar Jovanovic }; 30366857a2SPetar Jovanovic 31366857a2SPetar Jovanovic RegisterBankInfo::PartialMapping PartMappings[]{ 32366857a2SPetar Jovanovic {0, 32, GPRBRegBank} 33366857a2SPetar Jovanovic }; 34366857a2SPetar Jovanovic 35366857a2SPetar Jovanovic enum ValueMappingIdx { InvalidIdx = 0, GPRIdx = 1 }; 36366857a2SPetar Jovanovic 37366857a2SPetar Jovanovic RegisterBankInfo::ValueMapping ValueMappings[] = { 38366857a2SPetar Jovanovic // invalid 39366857a2SPetar Jovanovic {nullptr, 0}, 40366857a2SPetar Jovanovic // 3 operands in GPRs 41366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 42366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 43366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}}; 44366857a2SPetar Jovanovic 45366857a2SPetar Jovanovic } // end namespace Mips 46366857a2SPetar Jovanovic } // end namespace llvm 47366857a2SPetar Jovanovic 48366857a2SPetar Jovanovic using namespace llvm; 49fac93e28SPetar Jovanovic 50fac93e28SPetar Jovanovic MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI) 51fac93e28SPetar Jovanovic : MipsGenRegisterBankInfo() {} 52366857a2SPetar Jovanovic 53366857a2SPetar Jovanovic const RegisterBank &MipsRegisterBankInfo::getRegBankFromRegClass( 54366857a2SPetar Jovanovic const TargetRegisterClass &RC) const { 55366857a2SPetar Jovanovic using namespace Mips; 56366857a2SPetar Jovanovic 57366857a2SPetar Jovanovic switch (RC.getID()) { 58366857a2SPetar Jovanovic case Mips::GPR32RegClassID: 59366857a2SPetar Jovanovic case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID: 60366857a2SPetar Jovanovic case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID: 61*021e4c82SPetar Jovanovic case Mips::SP32RegClassID: 62366857a2SPetar Jovanovic return getRegBank(Mips::GPRBRegBankID); 63366857a2SPetar Jovanovic default: 64366857a2SPetar Jovanovic llvm_unreachable("Register class not supported"); 65366857a2SPetar Jovanovic } 66366857a2SPetar Jovanovic } 67366857a2SPetar Jovanovic 68366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping & 69366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 70366857a2SPetar Jovanovic 71366857a2SPetar Jovanovic unsigned Opc = MI.getOpcode(); 72366857a2SPetar Jovanovic 73366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 74366857a2SPetar Jovanovic if (Mapping.isValid()) 75366857a2SPetar Jovanovic return Mapping; 76366857a2SPetar Jovanovic 77366857a2SPetar Jovanovic using namespace TargetOpcode; 78366857a2SPetar Jovanovic 79366857a2SPetar Jovanovic unsigned NumOperands = MI.getNumOperands(); 80366857a2SPetar Jovanovic const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 81366857a2SPetar Jovanovic 82366857a2SPetar Jovanovic switch (Opc) { 83366857a2SPetar Jovanovic case G_ADD: 84*021e4c82SPetar Jovanovic case G_LOAD: 85*021e4c82SPetar Jovanovic case G_STORE: 86*021e4c82SPetar Jovanovic case G_GEP: 87366857a2SPetar Jovanovic OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 88366857a2SPetar Jovanovic break; 89*021e4c82SPetar Jovanovic case G_CONSTANT: 90*021e4c82SPetar Jovanovic case G_FRAME_INDEX: 91*021e4c82SPetar Jovanovic OperandsMapping = 92*021e4c82SPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); 93*021e4c82SPetar Jovanovic break; 94366857a2SPetar Jovanovic default: 95366857a2SPetar Jovanovic return getInvalidInstructionMapping(); 96366857a2SPetar Jovanovic } 97366857a2SPetar Jovanovic 98366857a2SPetar Jovanovic return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, 99366857a2SPetar Jovanovic NumOperands); 100366857a2SPetar Jovanovic } 101