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) {
85*7cecadb9SPetar Avramovic   case G_TRUNC:
86366857a2SPetar Jovanovic   case G_ADD:
87*7cecadb9SPetar Avramovic   case G_SUB:
88021e4c82SPetar Jovanovic   case G_LOAD:
89021e4c82SPetar Jovanovic   case G_STORE:
9079df8596SPetar Avramovic   case G_ZEXTLOAD:
9179df8596SPetar Avramovic   case G_SEXTLOAD:
92021e4c82SPetar Jovanovic   case G_GEP:
933b953c37SPetar Jovanovic   case G_AND:
943b953c37SPetar Jovanovic   case G_OR:
953b953c37SPetar Jovanovic   case G_XOR:
963b953c37SPetar Jovanovic   case G_SHL:
973b953c37SPetar Jovanovic   case G_ASHR:
983b953c37SPetar Jovanovic   case G_LSHR:
990a5e4eb7SPetar Avramovic   case G_SDIV:
1000a5e4eb7SPetar Avramovic   case G_UDIV:
1010a5e4eb7SPetar Avramovic   case G_SREM:
1020a5e4eb7SPetar Avramovic   case G_UREM:
103366857a2SPetar Jovanovic     OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx];
104366857a2SPetar Jovanovic     break;
105021e4c82SPetar Jovanovic   case G_CONSTANT:
106021e4c82SPetar Jovanovic   case G_FRAME_INDEX:
10764c10ba8SPetar Jovanovic   case G_GLOBAL_VALUE:
108021e4c82SPetar Jovanovic     OperandsMapping =
109021e4c82SPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr});
110021e4c82SPetar Jovanovic     break;
111ce4dd0aeSPetar Jovanovic   case G_ICMP:
112ce4dd0aeSPetar Jovanovic     OperandsMapping =
113ce4dd0aeSPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr,
114ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx],
115ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx]});
116ce4dd0aeSPetar Jovanovic     break;
11709dff333SPetar Avramovic   case G_SELECT:
11809dff333SPetar Avramovic     OperandsMapping =
11909dff333SPetar Avramovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx],
12009dff333SPetar Avramovic                             &Mips::ValueMappings[Mips::GPRIdx],
12109dff333SPetar Avramovic                             &Mips::ValueMappings[Mips::GPRIdx],
12209dff333SPetar Avramovic                             &Mips::ValueMappings[Mips::GPRIdx]});
12309dff333SPetar Avramovic     break;
124366857a2SPetar Jovanovic   default:
125366857a2SPetar Jovanovic     return getInvalidInstructionMapping();
126366857a2SPetar Jovanovic   }
127366857a2SPetar Jovanovic 
128366857a2SPetar Jovanovic   return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping,
129366857a2SPetar Jovanovic                                NumOperands);
130366857a2SPetar Jovanovic }
131