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