1fac93e28SPetar Jovanovic //===- MipsRegisterBankInfo.cpp ---------------------------------*- C++ -*-===// 2fac93e28SPetar Jovanovic // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fac93e28SPetar Jovanovic // 7fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===// 8fac93e28SPetar Jovanovic /// \file 9fac93e28SPetar Jovanovic /// This file implements the targeting of the RegisterBankInfo class for Mips. 10fac93e28SPetar Jovanovic /// \todo This should be generated by TableGen. 11fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===// 12fac93e28SPetar Jovanovic 13366857a2SPetar Jovanovic #include "MipsInstrInfo.h" 14fac93e28SPetar Jovanovic #include "MipsRegisterBankInfo.h" 15fac93e28SPetar Jovanovic #include "llvm/CodeGen/MachineRegisterInfo.h" 16fac93e28SPetar Jovanovic 17366857a2SPetar Jovanovic #define GET_TARGET_REGBANK_IMPL 18fac93e28SPetar Jovanovic 19366857a2SPetar Jovanovic #define DEBUG_TYPE "registerbankinfo" 20366857a2SPetar Jovanovic 21366857a2SPetar Jovanovic #include "MipsGenRegisterBank.inc" 22366857a2SPetar Jovanovic 23366857a2SPetar Jovanovic namespace llvm { 24366857a2SPetar Jovanovic namespace Mips { 25366857a2SPetar Jovanovic enum PartialMappingIdx { 26366857a2SPetar Jovanovic PMI_GPR, 27366857a2SPetar Jovanovic PMI_Min = PMI_GPR, 28366857a2SPetar Jovanovic }; 29366857a2SPetar Jovanovic 30366857a2SPetar Jovanovic RegisterBankInfo::PartialMapping PartMappings[]{ 31366857a2SPetar Jovanovic {0, 32, GPRBRegBank} 32366857a2SPetar Jovanovic }; 33366857a2SPetar Jovanovic 34366857a2SPetar Jovanovic enum ValueMappingIdx { InvalidIdx = 0, GPRIdx = 1 }; 35366857a2SPetar Jovanovic 36366857a2SPetar Jovanovic RegisterBankInfo::ValueMapping ValueMappings[] = { 37366857a2SPetar Jovanovic // invalid 38366857a2SPetar Jovanovic {nullptr, 0}, 39366857a2SPetar Jovanovic // 3 operands in GPRs 40366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 41366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 42366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}}; 43366857a2SPetar Jovanovic 44366857a2SPetar Jovanovic } // end namespace Mips 45366857a2SPetar Jovanovic } // end namespace llvm 46366857a2SPetar Jovanovic 47366857a2SPetar Jovanovic using namespace llvm; 48fac93e28SPetar Jovanovic 49fac93e28SPetar Jovanovic MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI) 50fac93e28SPetar Jovanovic : MipsGenRegisterBankInfo() {} 51366857a2SPetar Jovanovic 52366857a2SPetar Jovanovic const RegisterBank &MipsRegisterBankInfo::getRegBankFromRegClass( 53366857a2SPetar Jovanovic const TargetRegisterClass &RC) const { 54366857a2SPetar Jovanovic using namespace Mips; 55366857a2SPetar Jovanovic 56366857a2SPetar Jovanovic switch (RC.getID()) { 57366857a2SPetar Jovanovic case Mips::GPR32RegClassID: 58366857a2SPetar Jovanovic case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID: 59852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirstRegClassID: 60852dd83bSSimon Atanasyan case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID: 61366857a2SPetar Jovanovic case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID: 62852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID: 63021e4c82SPetar Jovanovic case Mips::SP32RegClassID: 64366857a2SPetar Jovanovic return getRegBank(Mips::GPRBRegBankID); 65366857a2SPetar Jovanovic default: 66366857a2SPetar Jovanovic llvm_unreachable("Register class not supported"); 67366857a2SPetar Jovanovic } 68366857a2SPetar Jovanovic } 69366857a2SPetar Jovanovic 70366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping & 71366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 72366857a2SPetar Jovanovic 73366857a2SPetar Jovanovic unsigned Opc = MI.getOpcode(); 74366857a2SPetar Jovanovic 75366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 76366857a2SPetar Jovanovic if (Mapping.isValid()) 77366857a2SPetar Jovanovic return Mapping; 78366857a2SPetar Jovanovic 79366857a2SPetar Jovanovic using namespace TargetOpcode; 80366857a2SPetar Jovanovic 81366857a2SPetar Jovanovic unsigned NumOperands = MI.getNumOperands(); 82366857a2SPetar Jovanovic const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 83366857a2SPetar Jovanovic 84366857a2SPetar Jovanovic switch (Opc) { 857cecadb9SPetar Avramovic case G_TRUNC: 86366857a2SPetar Jovanovic case G_ADD: 877cecadb9SPetar Avramovic case G_SUB: 8856dc218dSPetar Avramovic case G_MUL: 89*a48285a1SPetar Avramovic case G_UMULH: 90021e4c82SPetar Jovanovic case G_LOAD: 91021e4c82SPetar Jovanovic case G_STORE: 9279df8596SPetar Avramovic case G_ZEXTLOAD: 9379df8596SPetar Avramovic case G_SEXTLOAD: 94021e4c82SPetar Jovanovic case G_GEP: 953b953c37SPetar Jovanovic case G_AND: 963b953c37SPetar Jovanovic case G_OR: 973b953c37SPetar Jovanovic case G_XOR: 983b953c37SPetar Jovanovic case G_SHL: 993b953c37SPetar Jovanovic case G_ASHR: 1003b953c37SPetar Jovanovic case G_LSHR: 1010a5e4eb7SPetar Avramovic case G_SDIV: 1020a5e4eb7SPetar Avramovic case G_UDIV: 1030a5e4eb7SPetar Avramovic case G_SREM: 1040a5e4eb7SPetar Avramovic case G_UREM: 105366857a2SPetar Jovanovic OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 106366857a2SPetar Jovanovic break; 107021e4c82SPetar Jovanovic case G_CONSTANT: 108021e4c82SPetar Jovanovic case G_FRAME_INDEX: 10964c10ba8SPetar Jovanovic case G_GLOBAL_VALUE: 1105d9b8eedSPetar Avramovic case G_BRCOND: 111021e4c82SPetar Jovanovic OperandsMapping = 112021e4c82SPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); 113021e4c82SPetar Jovanovic break; 114ce4dd0aeSPetar Jovanovic case G_ICMP: 115ce4dd0aeSPetar Jovanovic OperandsMapping = 116ce4dd0aeSPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr, 117ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx], 118ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx]}); 119ce4dd0aeSPetar Jovanovic break; 12009dff333SPetar Avramovic case G_SELECT: 12109dff333SPetar Avramovic OperandsMapping = 12209dff333SPetar Avramovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], 12309dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 12409dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 12509dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx]}); 12609dff333SPetar Avramovic break; 127366857a2SPetar Jovanovic default: 128366857a2SPetar Jovanovic return getInvalidInstructionMapping(); 129366857a2SPetar Jovanovic } 130366857a2SPetar Jovanovic 131366857a2SPetar Jovanovic return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, 132366857a2SPetar Jovanovic NumOperands); 133366857a2SPetar Jovanovic } 134