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:
60366857a2SPetar Jovanovic   case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID:
61021e4c82SPetar Jovanovic   case Mips::SP32RegClassID:
62366857a2SPetar Jovanovic     return getRegBank(Mips::GPRBRegBankID);
63366857a2SPetar Jovanovic   default:
64366857a2SPetar Jovanovic     llvm_unreachable("Register class not supported");
65366857a2SPetar Jovanovic   }
66366857a2SPetar Jovanovic }
67366857a2SPetar Jovanovic 
68366857a2SPetar Jovanovic const RegisterBankInfo::InstructionMapping &
69366857a2SPetar Jovanovic MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
70366857a2SPetar Jovanovic 
71366857a2SPetar Jovanovic   unsigned Opc = MI.getOpcode();
72366857a2SPetar Jovanovic 
73366857a2SPetar Jovanovic   const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
74366857a2SPetar Jovanovic   if (Mapping.isValid())
75366857a2SPetar Jovanovic     return Mapping;
76366857a2SPetar Jovanovic 
77366857a2SPetar Jovanovic   using namespace TargetOpcode;
78366857a2SPetar Jovanovic 
79366857a2SPetar Jovanovic   unsigned NumOperands = MI.getNumOperands();
80366857a2SPetar Jovanovic   const ValueMapping *OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx];
81366857a2SPetar Jovanovic 
82366857a2SPetar Jovanovic   switch (Opc) {
83366857a2SPetar Jovanovic   case G_ADD:
84021e4c82SPetar Jovanovic   case G_LOAD:
85021e4c82SPetar Jovanovic   case G_STORE:
86021e4c82SPetar Jovanovic   case G_GEP:
873b953c37SPetar Jovanovic   case G_AND:
883b953c37SPetar Jovanovic   case G_OR:
893b953c37SPetar Jovanovic   case G_XOR:
903b953c37SPetar Jovanovic   case G_SHL:
913b953c37SPetar Jovanovic   case G_ASHR:
923b953c37SPetar Jovanovic   case G_LSHR:
93366857a2SPetar Jovanovic     OperandsMapping = &Mips::ValueMappings[Mips::GPRIdx];
94366857a2SPetar Jovanovic     break;
95021e4c82SPetar Jovanovic   case G_CONSTANT:
96021e4c82SPetar Jovanovic   case G_FRAME_INDEX:
9764c10ba8SPetar Jovanovic   case G_GLOBAL_VALUE:
98021e4c82SPetar Jovanovic     OperandsMapping =
99021e4c82SPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr});
100021e4c82SPetar Jovanovic     break;
101*ce4dd0aeSPetar Jovanovic   case G_ICMP:
102*ce4dd0aeSPetar Jovanovic     OperandsMapping =
103*ce4dd0aeSPetar Jovanovic         getOperandsMapping({&Mips::ValueMappings[Mips::GPRIdx], nullptr,
104*ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx],
105*ce4dd0aeSPetar Jovanovic                             &Mips::ValueMappings[Mips::GPRIdx]});
106*ce4dd0aeSPetar Jovanovic     break;
107366857a2SPetar Jovanovic   default:
108366857a2SPetar Jovanovic     return getInvalidInstructionMapping();
109366857a2SPetar Jovanovic   }
110366857a2SPetar Jovanovic 
111366857a2SPetar Jovanovic   return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping,
112366857a2SPetar Jovanovic                                NumOperands);
113366857a2SPetar Jovanovic }
114