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, 271af05df3SPetar Avramovic PMI_SPR, 281af05df3SPetar Avramovic PMI_DPR, 29366857a2SPetar Jovanovic PMI_Min = PMI_GPR, 30366857a2SPetar Jovanovic }; 31366857a2SPetar Jovanovic 32366857a2SPetar Jovanovic RegisterBankInfo::PartialMapping PartMappings[]{ 331af05df3SPetar Avramovic {0, 32, GPRBRegBank}, 341af05df3SPetar Avramovic {0, 32, FPRBRegBank}, 351af05df3SPetar Avramovic {0, 64, FPRBRegBank} 36366857a2SPetar Jovanovic }; 37366857a2SPetar Jovanovic 381af05df3SPetar Avramovic enum ValueMappingIdx { 391af05df3SPetar Avramovic InvalidIdx = 0, 401af05df3SPetar Avramovic GPRIdx = 1, 411af05df3SPetar Avramovic SPRIdx = 4, 421af05df3SPetar Avramovic DPRIdx = 7 431af05df3SPetar Avramovic }; 44366857a2SPetar Jovanovic 45366857a2SPetar Jovanovic RegisterBankInfo::ValueMapping ValueMappings[] = { 46366857a2SPetar Jovanovic // invalid 47366857a2SPetar Jovanovic {nullptr, 0}, 481af05df3SPetar Avramovic // up to 3 operands in GPRs 49366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 50366857a2SPetar Jovanovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 511af05df3SPetar Avramovic {&PartMappings[PMI_GPR - PMI_Min], 1}, 521af05df3SPetar Avramovic // up to 3 ops operands FPRs - single precission 531af05df3SPetar Avramovic {&PartMappings[PMI_SPR - PMI_Min], 1}, 541af05df3SPetar Avramovic {&PartMappings[PMI_SPR - PMI_Min], 1}, 551af05df3SPetar Avramovic {&PartMappings[PMI_SPR - PMI_Min], 1}, 561af05df3SPetar Avramovic // up to 3 ops operands FPRs - double precission 571af05df3SPetar Avramovic {&PartMappings[PMI_DPR - PMI_Min], 1}, 581af05df3SPetar Avramovic {&PartMappings[PMI_DPR - PMI_Min], 1}, 591af05df3SPetar Avramovic {&PartMappings[PMI_DPR - PMI_Min], 1} 601af05df3SPetar Avramovic }; 61366857a2SPetar Jovanovic 62366857a2SPetar Jovanovic } // end namespace Mips 63366857a2SPetar Jovanovic } // end namespace llvm 64366857a2SPetar Jovanovic 65366857a2SPetar Jovanovic using namespace llvm; 66fac93e28SPetar Jovanovic 67fac93e28SPetar Jovanovic MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI) 68fac93e28SPetar Jovanovic : MipsGenRegisterBankInfo() {} 69366857a2SPetar Jovanovic 70366857a2SPetar Jovanovic const RegisterBank &MipsRegisterBankInfo::getRegBankFromRegClass( 71366857a2SPetar Jovanovic const TargetRegisterClass &RC) const { 72366857a2SPetar Jovanovic using namespace Mips; 73366857a2SPetar Jovanovic 74366857a2SPetar Jovanovic switch (RC.getID()) { 75366857a2SPetar Jovanovic case Mips::GPR32RegClassID: 76366857a2SPetar Jovanovic case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID: 77852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirstRegClassID: 78852dd83bSSimon Atanasyan case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID: 79366857a2SPetar Jovanovic case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID: 80852dd83bSSimon Atanasyan case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID: 81021e4c82SPetar Jovanovic case Mips::SP32RegClassID: 82366857a2SPetar Jovanovic return getRegBank(Mips::GPRBRegBankID); 833dfa368dSPetar Avramovic case Mips::FGRCCRegClassID: 84*afa3afa3SPetar Avramovic case Mips::FGR32RegClassID: 853dfa368dSPetar Avramovic case Mips::FGR64RegClassID: 863dfa368dSPetar Avramovic case Mips::AFGR64RegClassID: 873dfa368dSPetar Avramovic return getRegBank(Mips::FPRBRegBankID); 88366857a2SPetar Jovanovic default: 89366857a2SPetar Jovanovic llvm_unreachable("Register class not supported"); 90366857a2SPetar Jovanovic } 91366857a2SPetar Jovanovic } 92366857a2SPetar Jovanovic 93366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping & 94366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 95366857a2SPetar Jovanovic 96366857a2SPetar Jovanovic unsigned Opc = MI.getOpcode(); 971af05df3SPetar Avramovic const MachineFunction &MF = *MI.getParent()->getParent(); 981af05df3SPetar Avramovic const MachineRegisterInfo &MRI = MF.getRegInfo(); 99366857a2SPetar Jovanovic 100366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 101366857a2SPetar Jovanovic if (Mapping.isValid()) 102366857a2SPetar Jovanovic return Mapping; 103366857a2SPetar Jovanovic 104366857a2SPetar Jovanovic using namespace TargetOpcode; 105366857a2SPetar Jovanovic 106366857a2SPetar Jovanovic unsigned NumOperands = MI.getNumOperands(); 107366857a2SPetar Jovanovic const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 108366857a2SPetar Jovanovic 109366857a2SPetar Jovanovic switch (Opc) { 1107cecadb9SPetar Avramovic case G_TRUNC: 111366857a2SPetar Jovanovic case G_ADD: 1127cecadb9SPetar Avramovic case G_SUB: 11356dc218dSPetar Avramovic case G_MUL: 114a48285a1SPetar Avramovic case G_UMULH: 115021e4c82SPetar Jovanovic case G_LOAD: 116021e4c82SPetar Jovanovic case G_STORE: 11779df8596SPetar Avramovic case G_ZEXTLOAD: 11879df8596SPetar Avramovic case G_SEXTLOAD: 119021e4c82SPetar Jovanovic case G_GEP: 1203b953c37SPetar Jovanovic case G_AND: 1213b953c37SPetar Jovanovic case G_OR: 1223b953c37SPetar Jovanovic case G_XOR: 1233b953c37SPetar Jovanovic case G_SHL: 1243b953c37SPetar Jovanovic case G_ASHR: 1253b953c37SPetar Jovanovic case G_LSHR: 1260a5e4eb7SPetar Avramovic case G_SDIV: 1270a5e4eb7SPetar Avramovic case G_UDIV: 1280a5e4eb7SPetar Avramovic case G_SREM: 1290a5e4eb7SPetar Avramovic case G_UREM: 130366857a2SPetar Jovanovic OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx]; 131366857a2SPetar Jovanovic break; 132*afa3afa3SPetar Avramovic case G_FADD: 133*afa3afa3SPetar Avramovic case G_FSUB: 134*afa3afa3SPetar Avramovic case G_FMUL: 135*afa3afa3SPetar Avramovic case G_FDIV: { 136*afa3afa3SPetar Avramovic unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 137*afa3afa3SPetar Avramovic assert((Size == 32 || Size == 64) && "Unsupported floating point size"); 138*afa3afa3SPetar Avramovic OperandsMapping = Size == 32 ? &Mips::ValueMappings[Mips::SPRIdx] 139*afa3afa3SPetar Avramovic : &Mips::ValueMappings[Mips::DPRIdx]; 140*afa3afa3SPetar Avramovic break; 141*afa3afa3SPetar Avramovic } 1421af05df3SPetar Avramovic case G_FCONSTANT: { 143*afa3afa3SPetar Avramovic unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 144*afa3afa3SPetar Avramovic assert((Size == 32 || Size == 64) && "Unsupported floating point size"); 1451af05df3SPetar Avramovic const RegisterBankInfo::ValueMapping *FPRValueMapping = 1461af05df3SPetar Avramovic Size == 32 ? &Mips::ValueMappings[Mips::SPRIdx] 1471af05df3SPetar Avramovic : &Mips::ValueMappings[Mips::DPRIdx]; 1481af05df3SPetar Avramovic OperandsMapping = getOperandsMapping({FPRValueMapping, nullptr}); 1491af05df3SPetar Avramovic break; 1501af05df3SPetar Avramovic } 151021e4c82SPetar Jovanovic case G_CONSTANT: 152021e4c82SPetar Jovanovic case G_FRAME_INDEX: 15364c10ba8SPetar Jovanovic case G_GLOBAL_VALUE: 1545d9b8eedSPetar Avramovic case G_BRCOND: 155021e4c82SPetar Jovanovic OperandsMapping = 156021e4c82SPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr}); 157021e4c82SPetar Jovanovic break; 158ce4dd0aeSPetar Jovanovic case G_ICMP: 159ce4dd0aeSPetar Jovanovic OperandsMapping = 160ce4dd0aeSPetar Jovanovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr, 161ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx], 162ce4dd0aeSPetar Jovanovic &Mips::ValueMappings[Mips::GPRIdx]}); 163ce4dd0aeSPetar Jovanovic break; 16409dff333SPetar Avramovic case G_SELECT: 16509dff333SPetar Avramovic OperandsMapping = 16609dff333SPetar Avramovic getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], 16709dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 16809dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx], 16909dff333SPetar Avramovic &Mips::ValueMappings[Mips::GPRIdx]}); 17009dff333SPetar Avramovic break; 171366857a2SPetar Jovanovic default: 172366857a2SPetar Jovanovic return getInvalidInstructionMapping(); 173366857a2SPetar Jovanovic } 174366857a2SPetar Jovanovic 175366857a2SPetar Jovanovic return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping, 176366857a2SPetar Jovanovic NumOperands); 177366857a2SPetar Jovanovic } 178