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: 60852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirstRegClassID: 61852dd83bSSimon Atanasyan case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID: 62366857a2SPetar Jovanovic case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID: 63852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID: 64021e4c82SPetar Jovanovic case Mips::SP32RegClassID: 65366857a2SPetar Jovanovic return getRegBank(Mips::GPRBRegBankID); 66366857a2SPetar Jovanovic default: 67366857a2SPetar Jovanovic llvm_unreachable("Register class not supported"); 68366857a2SPetar Jovanovic } 69366857a2SPetar Jovanovic } 70366857a2SPetar Jovanovic 71366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping & 72366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 73366857a2SPetar Jovanovic 74366857a2SPetar Jovanovic unsigned Opc = MI.getOpcode(); 75366857a2SPetar Jovanovic 76366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 77366857a2SPetar Jovanovic if (Mapping.isValid()) 78366857a2SPetar Jovanovic return Mapping; 79366857a2SPetar Jovanovic 80366857a2SPetar Jovanovic using namespace TargetOpcode; 81366857a2SPetar Jovanovic 82366857a2SPetar Jovanovic unsigned NumOperands = MI.getNumOperands(); 83366857a2SPetar Jovanovic const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 84366857a2SPetar Jovanovic 85366857a2SPetar Jovanovic switch (Opc) { 86366857a2SPetar Jovanovic case G_ADD: 87021e4c82SPetar Jovanovic case G_LOAD: 88021e4c82SPetar Jovanovic case G_STORE: 89021e4c82SPetar Jovanovic case G_GEP: 903b953c37SPetar Jovanovic case G_AND: 913b953c37SPetar Jovanovic case G_OR: 923b953c37SPetar Jovanovic case G_XOR: 933b953c37SPetar Jovanovic case G_SHL: 943b953c37SPetar Jovanovic case G_ASHR: 953b953c37SPetar Jovanovic case G_LSHR: 960a5e4eb7SPetar Avramovic case G_SDIV: 970a5e4eb7SPetar Avramovic case G_UDIV: 980a5e4eb7SPetar Avramovic case G_SREM: 990a5e4eb7SPetar Avramovic case G_UREM: 100366857a2SPetar Jovanovic OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 101366857a2SPetar Jovanovic break; 102021e4c82SPetar Jovanovic case G_CONSTANT: 103021e4c82SPetar Jovanovic case G_FRAME_INDEX: 10464c10ba8SPetar Jovanovic case G_GLOBAL_VALUE: 105021e4c82SPetar Jovanovic OperandsMapping = 106021e4c82SPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); 107021e4c82SPetar Jovanovic break; 108ce4dd0aeSPetar Jovanovic case G_ICMP: 109ce4dd0aeSPetar Jovanovic OperandsMapping = 110ce4dd0aeSPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr, 111ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx], 112ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx]}); 113ce4dd0aeSPetar Jovanovic break; 114*09dff333SPetar Avramovic case G_SELECT: 115*09dff333SPetar Avramovic OperandsMapping = 116*09dff333SPetar Avramovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], 117*09dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 118*09dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 119*09dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx]}); 120*09dff333SPetar Avramovic break; 121366857a2SPetar Jovanovic default: 122366857a2SPetar Jovanovic return getInvalidInstructionMapping(); 123366857a2SPetar Jovanovic } 124366857a2SPetar Jovanovic 125366857a2SPetar Jovanovic return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, 126366857a2SPetar Jovanovic NumOperands); 127366857a2SPetar Jovanovic } 128