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