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) { 85366857a2SPetar Jovanovic case G_ADD: 86021e4c82SPetar Jovanovic case G_LOAD: 87021e4c82SPetar Jovanovic case G_STORE: 88*79df8596SPetar Avramovic case G_ZEXTLOAD: 89*79df8596SPetar Avramovic case G_SEXTLOAD: 90021e4c82SPetar Jovanovic case G_GEP: 913b953c37SPetar Jovanovic case G_AND: 923b953c37SPetar Jovanovic case G_OR: 933b953c37SPetar Jovanovic case G_XOR: 943b953c37SPetar Jovanovic case G_SHL: 953b953c37SPetar Jovanovic case G_ASHR: 963b953c37SPetar Jovanovic case G_LSHR: 970a5e4eb7SPetar Avramovic case G_SDIV: 980a5e4eb7SPetar Avramovic case G_UDIV: 990a5e4eb7SPetar Avramovic case G_SREM: 1000a5e4eb7SPetar Avramovic case G_UREM: 101366857a2SPetar Jovanovic OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 102366857a2SPetar Jovanovic break; 103021e4c82SPetar Jovanovic case G_CONSTANT: 104021e4c82SPetar Jovanovic case G_FRAME_INDEX: 10564c10ba8SPetar Jovanovic case G_GLOBAL_VALUE: 106021e4c82SPetar Jovanovic OperandsMapping = 107021e4c82SPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); 108021e4c82SPetar Jovanovic break; 109ce4dd0aeSPetar Jovanovic case G_ICMP: 110ce4dd0aeSPetar Jovanovic OperandsMapping = 111ce4dd0aeSPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr, 112ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx], 113ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx]}); 114ce4dd0aeSPetar Jovanovic break; 11509dff333SPetar Avramovic case G_SELECT: 11609dff333SPetar Avramovic OperandsMapping = 11709dff333SPetar Avramovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], 11809dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 11909dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 12009dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx]}); 12109dff333SPetar Avramovic break; 122366857a2SPetar Jovanovic default: 123366857a2SPetar Jovanovic return getInvalidInstructionMapping(); 124366857a2SPetar Jovanovic } 125366857a2SPetar Jovanovic 126366857a2SPetar Jovanovic return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, 127366857a2SPetar Jovanovic NumOperands); 128366857a2SPetar Jovanovic } 129