1fac93e28SPetar Jovanovic //===- MipsRegisterBankInfo.cpp ---------------------------------*- C++ -*-===//
2fac93e28SPetar Jovanovic //
3fac93e28SPetar Jovanovic //                     The LLVM Compiler Infrastructure
4fac93e28SPetar Jovanovic //
5fac93e28SPetar Jovanovic // This file is distributed under the University of Illinois Open Source
6fac93e28SPetar Jovanovic // License. See LICENSE.TXT for details.
7fac93e28SPetar Jovanovic //
8fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===//
9fac93e28SPetar Jovanovic /// \file
10fac93e28SPetar Jovanovic /// This file implements the targeting of the RegisterBankInfo class for Mips.
11fac93e28SPetar Jovanovic /// \todo This should be generated by TableGen.
12fac93e28SPetar Jovanovic //===----------------------------------------------------------------------===//
13fac93e28SPetar Jovanovic 
14366857a2SPetar Jovanovic #include "MipsInstrInfo.h"
15fac93e28SPetar Jovanovic #include "MipsRegisterBankInfo.h"
16fac93e28SPetar Jovanovic #include "llvm/CodeGen/MachineRegisterInfo.h"
17fac93e28SPetar Jovanovic 
18366857a2SPetar Jovanovic #define GET_TARGET_REGBANK_IMPL
19fac93e28SPetar Jovanovic 
20366857a2SPetar Jovanovic #define DEBUG_TYPE "registerbankinfo"
21366857a2SPetar Jovanovic 
22366857a2SPetar Jovanovic #include "MipsGenRegisterBank.inc"
23366857a2SPetar Jovanovic 
24366857a2SPetar Jovanovic namespace llvm {
25366857a2SPetar Jovanovic namespace Mips {
26366857a2SPetar Jovanovic enum PartialMappingIdx {
27366857a2SPetar Jovanovic   PMI_GPR,
28366857a2SPetar Jovanovic   PMI_Min = PMI_GPR,
29366857a2SPetar Jovanovic };
30366857a2SPetar Jovanovic 
31366857a2SPetar Jovanovic RegisterBankInfo::PartialMapping PartMappings[]{
32366857a2SPetar Jovanovic     {0, 32, GPRBRegBank}
33366857a2SPetar Jovanovic };
34366857a2SPetar Jovanovic 
35366857a2SPetar Jovanovic enum ValueMappingIdx { InvalidIdx = 0, GPRIdx = 1 };
36366857a2SPetar Jovanovic 
37366857a2SPetar Jovanovic RegisterBankInfo::ValueMapping ValueMappings[] = {
38366857a2SPetar Jovanovic     // invalid
39366857a2SPetar Jovanovic     {nullptr, 0},
40366857a2SPetar Jovanovic     // 3 operands in GPRs
41366857a2SPetar Jovanovic     {&PartMappings[PMI_GPR - PMI_Min], 1},
42366857a2SPetar Jovanovic     {&PartMappings[PMI_GPR - PMI_Min], 1},
43366857a2SPetar Jovanovic     {&PartMappings[PMI_GPR - PMI_Min], 1}};
44366857a2SPetar Jovanovic 
45366857a2SPetar Jovanovic } // end namespace Mips
46366857a2SPetar Jovanovic } // end namespace llvm
47366857a2SPetar Jovanovic 
48366857a2SPetar Jovanovic using namespace llvm;
49fac93e28SPetar Jovanovic 
50fac93e28SPetar Jovanovic MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI)
51fac93e28SPetar Jovanovic     : MipsGenRegisterBankInfo() {}
52366857a2SPetar Jovanovic 
53366857a2SPetar Jovanovic const RegisterBank &MipsRegisterBankInfo::getRegBankFromRegClass(
54366857a2SPetar Jovanovic     const TargetRegisterClass &RC) const {
55366857a2SPetar Jovanovic   using namespace Mips;
56366857a2SPetar Jovanovic 
57366857a2SPetar Jovanovic   switch (RC.getID()) {
58366857a2SPetar Jovanovic   case Mips::GPR32RegClassID:
59366857a2SPetar Jovanovic   case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID:
60852dd83bSSimon Atanasyan   case Mips::GPRMM16MovePPairFirstRegClassID:
61852dd83bSSimon Atanasyan   case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID:
62366857a2SPetar Jovanovic   case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID:
63852dd83bSSimon Atanasyan   case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID:
64021e4c82SPetar Jovanovic   case Mips::SP32RegClassID:
65366857a2SPetar Jovanovic     return getRegBank(Mips::GPRBRegBankID);
66366857a2SPetar Jovanovic   default:
67366857a2SPetar Jovanovic     llvm_unreachable("Register class not supported");
68366857a2SPetar Jovanovic   }
69366857a2SPetar Jovanovic }
70366857a2SPetar Jovanovic 
71366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &
72366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
73366857a2SPetar Jovanovic 
74366857a2SPetar Jovanovic   unsigned Opc = MI.getOpcode();
75366857a2SPetar Jovanovic 
76366857a2SPetar Jovanovic   const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
77366857a2SPetar Jovanovic   if (Mapping.isValid())
78366857a2SPetar Jovanovic     return Mapping;
79366857a2SPetar Jovanovic 
80366857a2SPetar Jovanovic   using namespace TargetOpcode;
81366857a2SPetar Jovanovic 
82366857a2SPetar Jovanovic   unsigned NumOperands = MI.getNumOperands();
83366857a2SPetar Jovanovic   const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx];
84366857a2SPetar Jovanovic 
85366857a2SPetar Jovanovic   switch (Opc) {
86366857a2SPetar Jovanovic   case G_ADD:
87021e4c82SPetar Jovanovic   case G_LOAD:
88021e4c82SPetar Jovanovic   case G_STORE:
89021e4c82SPetar Jovanovic   case G_GEP:
903b953c37SPetar Jovanovic   case G_AND:
913b953c37SPetar Jovanovic   case G_OR:
923b953c37SPetar Jovanovic   case G_XOR:
933b953c37SPetar Jovanovic   case G_SHL:
943b953c37SPetar Jovanovic   case G_ASHR:
953b953c37SPetar Jovanovic   case G_LSHR:
96*0a5e4eb7SPetar Avramovic   case G_SDIV:
97*0a5e4eb7SPetar Avramovic   case G_UDIV:
98*0a5e4eb7SPetar Avramovic   case G_SREM:
99*0a5e4eb7SPetar Avramovic   case G_UREM:
100366857a2SPetar Jovanovic     OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx];
101366857a2SPetar Jovanovic     break;
102021e4c82SPetar Jovanovic   case G_CONSTANT:
103021e4c82SPetar Jovanovic   case G_FRAME_INDEX:
10464c10ba8SPetar Jovanovic   case G_GLOBAL_VALUE:
105021e4c82SPetar Jovanovic     OperandsMapping =
106021e4c82SPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr});
107021e4c82SPetar Jovanovic     break;
108ce4dd0aeSPetar Jovanovic   case G_ICMP:
109ce4dd0aeSPetar Jovanovic     OperandsMapping =
110ce4dd0aeSPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr,
111ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx],
112ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx]});
113ce4dd0aeSPetar Jovanovic     break;
114366857a2SPetar Jovanovic   default:
115366857a2SPetar Jovanovic     return getInvalidInstructionMapping();
116366857a2SPetar Jovanovic   }
117366857a2SPetar Jovanovic 
118366857a2SPetar Jovanovic   return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping,
119366857a2SPetar Jovanovic                                NumOperands);
120366857a2SPetar Jovanovic }
121