xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUGenRegisterBankInfo.def (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric//===- AMDGPUGenRegisterBankInfo.def -----------------------------*- C++ -*-==//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric/// \file
90b57cec5SDimitry Andric/// This file defines all the static objects used by AMDGPURegisterBankInfo.
100b57cec5SDimitry Andric/// \todo This should be generated by TableGen.
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricnamespace llvm {
140b57cec5SDimitry Andricnamespace AMDGPU {
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricenum PartialMappingIdx {
170b57cec5SDimitry Andric  None = - 1,
18480093f4SDimitry Andric  PM_SGPR1  = 1,
19480093f4SDimitry Andric  PM_SGPR16 = 5,
20480093f4SDimitry Andric  PM_SGPR32 = 6,
21480093f4SDimitry Andric  PM_SGPR64 = 7,
22480093f4SDimitry Andric  PM_SGPR128 = 8,
23480093f4SDimitry Andric  PM_SGPR256 = 9,
24480093f4SDimitry Andric  PM_SGPR512 = 10,
25480093f4SDimitry Andric  PM_SGPR1024 = 11,
26480093f4SDimitry Andric  PM_VGPR1  = 12,
27480093f4SDimitry Andric  PM_VGPR16 = 16,
28480093f4SDimitry Andric  PM_VGPR32 = 17,
29480093f4SDimitry Andric  PM_VGPR64 = 18,
30480093f4SDimitry Andric  PM_VGPR128 = 19,
31480093f4SDimitry Andric  PM_VGPR256 = 20,
32480093f4SDimitry Andric  PM_VGPR512 = 21,
33480093f4SDimitry Andric  PM_VGPR1024 = 22,
34480093f4SDimitry Andric  PM_SGPR96 = 23,
35480093f4SDimitry Andric  PM_VGPR96 = 24,
36480093f4SDimitry Andric  PM_AGPR96 = 25,
37*bdd1243dSDimitry Andric  PM_SGPR288 = 26,
38*bdd1243dSDimitry Andric  PM_VGPR288 = 27,
39*bdd1243dSDimitry Andric  PM_AGPR288 = 28,
40*bdd1243dSDimitry Andric  PM_SGPR320 = 29,
41*bdd1243dSDimitry Andric  PM_VGPR320 = 30,
42*bdd1243dSDimitry Andric  PM_AGPR320 = 31,
43*bdd1243dSDimitry Andric  PM_SGPR352 = 32,
44*bdd1243dSDimitry Andric  PM_VGPR352 = 33,
45*bdd1243dSDimitry Andric  PM_AGPR352 = 34,
46*bdd1243dSDimitry Andric  PM_SGPR384 = 35,
47*bdd1243dSDimitry Andric  PM_VGPR384 = 36,
48*bdd1243dSDimitry Andric  PM_AGPR384 = 37,
49*bdd1243dSDimitry Andric  PM_AGPR32 = 38,
50*bdd1243dSDimitry Andric  PM_AGPR64 = 39,
51*bdd1243dSDimitry Andric  PM_AGPR128 = 40,
52*bdd1243dSDimitry Andric  PM_AGPR256 = 41,
53*bdd1243dSDimitry Andric  PM_AGPR512 = 42,
54*bdd1243dSDimitry Andric  PM_AGPR1024 = 43
550b57cec5SDimitry Andric};
560b57cec5SDimitry Andric
570b57cec5SDimitry Andricconst RegisterBankInfo::PartialMapping PartMappings[] {
580b57cec5SDimitry Andric  // StartIdx, Length, RegBank
590b57cec5SDimitry Andric  {0, 1,  VCCRegBank},
600b57cec5SDimitry Andric
610b57cec5SDimitry Andric  {0, 1,  SGPRRegBank}, // SGPR begin
620b57cec5SDimitry Andric  {0, 16, SGPRRegBank},
630b57cec5SDimitry Andric  {0, 32, SGPRRegBank},
640b57cec5SDimitry Andric  {0, 64, SGPRRegBank},
650b57cec5SDimitry Andric  {0, 128, SGPRRegBank},
660b57cec5SDimitry Andric  {0, 256, SGPRRegBank},
670b57cec5SDimitry Andric  {0, 512, SGPRRegBank},
688bcb0991SDimitry Andric  {0, 1024, SGPRRegBank},
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric  {0, 1,  VGPRRegBank}, // VGPR begin
710b57cec5SDimitry Andric  {0, 16, VGPRRegBank},
720b57cec5SDimitry Andric  {0, 32, VGPRRegBank},
730b57cec5SDimitry Andric  {0, 64, VGPRRegBank},
740b57cec5SDimitry Andric  {0, 128, VGPRRegBank},
750b57cec5SDimitry Andric  {0, 256, VGPRRegBank},
760b57cec5SDimitry Andric  {0, 512, VGPRRegBank},
778bcb0991SDimitry Andric  {0, 1024, VGPRRegBank},
780b57cec5SDimitry Andric  {0, 96, SGPRRegBank},
79480093f4SDimitry Andric  {0, 96, VGPRRegBank},
80480093f4SDimitry Andric  {0, 96, AGPRRegBank},
81*bdd1243dSDimitry Andric  {0, 288, SGPRRegBank},
82*bdd1243dSDimitry Andric  {0, 288, VGPRRegBank},
83*bdd1243dSDimitry Andric  {0, 288, AGPRRegBank},
84*bdd1243dSDimitry Andric  {0, 320, SGPRRegBank},
85*bdd1243dSDimitry Andric  {0, 320, VGPRRegBank},
86*bdd1243dSDimitry Andric  {0, 320, AGPRRegBank},
87*bdd1243dSDimitry Andric  {0, 352, SGPRRegBank},
88*bdd1243dSDimitry Andric  {0, 352, VGPRRegBank},
89*bdd1243dSDimitry Andric  {0, 352, AGPRRegBank},
90*bdd1243dSDimitry Andric  {0, 384, SGPRRegBank},
91*bdd1243dSDimitry Andric  {0, 384, VGPRRegBank},
92*bdd1243dSDimitry Andric  {0, 384, AGPRRegBank},
93480093f4SDimitry Andric
94480093f4SDimitry Andric  {0, 32, AGPRRegBank}, // AGPR begin
95480093f4SDimitry Andric  {0, 64, AGPRRegBank},
96480093f4SDimitry Andric  {0, 128, AGPRRegBank},
97e8d8bef9SDimitry Andric  {0, 256, AGPRRegBank},
98480093f4SDimitry Andric  {0, 512, AGPRRegBank},
99480093f4SDimitry Andric  {0, 1024, AGPRRegBank}
1000b57cec5SDimitry Andric};
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andricconst RegisterBankInfo::ValueMapping ValMappings[] {
103480093f4SDimitry Andric  // VCC
1040b57cec5SDimitry Andric  {&PartMappings[0], 1},
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andric  // SGPRs
107480093f4SDimitry Andric  {&PartMappings[1], 1}, // 1
1080b57cec5SDimitry Andric  {nullptr, 0}, // Illegal power of 2 sizes
1090b57cec5SDimitry Andric  {nullptr, 0},
1100b57cec5SDimitry Andric  {nullptr, 0},
111480093f4SDimitry Andric  {&PartMappings[2], 1}, // 16
112480093f4SDimitry Andric  {&PartMappings[3], 1}, // 32
113480093f4SDimitry Andric  {&PartMappings[4], 1}, // 64
114480093f4SDimitry Andric  {&PartMappings[5], 1}, // 128
115480093f4SDimitry Andric  {&PartMappings[6], 1}, // 256
116480093f4SDimitry Andric  {&PartMappings[7], 1}, // 512
117480093f4SDimitry Andric  {&PartMappings[8], 1}, // 1024
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andric  // VGPRs
120480093f4SDimitry Andric  {&PartMappings[9], 1}, // 1
1210b57cec5SDimitry Andric  {nullptr, 0},
1220b57cec5SDimitry Andric  {nullptr, 0},
1230b57cec5SDimitry Andric  {nullptr, 0},
124480093f4SDimitry Andric  {&PartMappings[10], 1}, // 16
125480093f4SDimitry Andric  {&PartMappings[11], 1}, // 32
126480093f4SDimitry Andric  {&PartMappings[12], 1}, // 64
127480093f4SDimitry Andric  {&PartMappings[13], 1}, // 128
128480093f4SDimitry Andric  {&PartMappings[14], 1}, // 256
129480093f4SDimitry Andric  {&PartMappings[15], 1}, // 512
130480093f4SDimitry Andric  {&PartMappings[16], 1}, // 1024
131480093f4SDimitry Andric  {&PartMappings[17], 1},
1328bcb0991SDimitry Andric  {&PartMappings[18], 1},
133480093f4SDimitry Andric  {&PartMappings[19], 1},
134*bdd1243dSDimitry Andric  {&PartMappings[20], 1},
135*bdd1243dSDimitry Andric  {&PartMappings[21], 1},
136*bdd1243dSDimitry Andric  {&PartMappings[22], 1},
137*bdd1243dSDimitry Andric  {&PartMappings[23], 1},
138*bdd1243dSDimitry Andric  {&PartMappings[24], 1},
139*bdd1243dSDimitry Andric  {&PartMappings[25], 1},
140*bdd1243dSDimitry Andric  {&PartMappings[26], 1},
141*bdd1243dSDimitry Andric  {&PartMappings[27], 1},
142*bdd1243dSDimitry Andric  {&PartMappings[28], 1},
143*bdd1243dSDimitry Andric  {&PartMappings[29], 1},
144*bdd1243dSDimitry Andric  {&PartMappings[30], 1},
145*bdd1243dSDimitry Andric  {&PartMappings[31], 1},
146480093f4SDimitry Andric
147480093f4SDimitry Andric  // AGPRs
148480093f4SDimitry Andric  {nullptr, 0},
149480093f4SDimitry Andric  {nullptr, 0},
150480093f4SDimitry Andric  {nullptr, 0},
151480093f4SDimitry Andric  {nullptr, 0},
152480093f4SDimitry Andric  {nullptr, 0},
153*bdd1243dSDimitry Andric  {&PartMappings[32], 1}, // 32
154*bdd1243dSDimitry Andric  {&PartMappings[33], 1}, // 64
155*bdd1243dSDimitry Andric  {&PartMappings[34], 1}, // 128
156*bdd1243dSDimitry Andric  {&PartMappings[35], 1}, // 256
157*bdd1243dSDimitry Andric  {&PartMappings[36], 1}, // 512
158*bdd1243dSDimitry Andric  {&PartMappings[37], 1}  // 1024
1590b57cec5SDimitry Andric};
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andricconst RegisterBankInfo::PartialMapping SGPROnly64BreakDown[] {
1628bcb0991SDimitry Andric  {0, 32, SGPRRegBank}, // 32-bit op
1638bcb0991SDimitry Andric  {0, 32, SGPRRegBank}, // 2x32-bit op
1640b57cec5SDimitry Andric  {32, 32, SGPRRegBank},
1658bcb0991SDimitry Andric  {0, 64, SGPRRegBank}, // <2x32-bit> op
1660b57cec5SDimitry Andric
1678bcb0991SDimitry Andric  {0, 32, VGPRRegBank}, // 32-bit op
1688bcb0991SDimitry Andric  {0, 32, VGPRRegBank}, // 2x32-bit op
1690b57cec5SDimitry Andric  {32, 32, VGPRRegBank},
1700b57cec5SDimitry Andric};
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric
1735ffd83dbSDimitry Andric// For some instructions which can operate 64-bit only for the scalar
1745ffd83dbSDimitry Andric// version. Otherwise, these need to be split into 2 32-bit operations.
1750b57cec5SDimitry Andricconst RegisterBankInfo::ValueMapping ValMappingsSGPR64OnlyVGPR32[] {
1760b57cec5SDimitry Andric  /*32-bit sgpr*/     {&SGPROnly64BreakDown[0], 1},
1770b57cec5SDimitry Andric  /*2 x 32-bit sgpr*/ {&SGPROnly64BreakDown[1], 2},
1780b57cec5SDimitry Andric  /*64-bit sgpr */    {&SGPROnly64BreakDown[3], 1},
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andric  /*32-bit vgpr*/     {&SGPROnly64BreakDown[4], 1},
1810b57cec5SDimitry Andric  /*2 x 32-bit vgpr*/ {&SGPROnly64BreakDown[5], 2}
1820b57cec5SDimitry Andric};
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andricenum ValueMappingIdx {
185480093f4SDimitry Andric  SGPRStartIdx = 1,
186480093f4SDimitry Andric  VGPRStartIdx = 12,
187*bdd1243dSDimitry Andric  AGPRStartIdx = 38
1880b57cec5SDimitry Andric};
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andricconst RegisterBankInfo::ValueMapping *getValueMapping(unsigned BankID,
1910b57cec5SDimitry Andric                                                      unsigned Size) {
1920b57cec5SDimitry Andric  unsigned Idx;
1930b57cec5SDimitry Andric  switch (Size) {
1940b57cec5SDimitry Andric  case 1:
1950b57cec5SDimitry Andric    if (BankID == AMDGPU::VCCRegBankID)
196480093f4SDimitry Andric      return &ValMappings[0];
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andric    Idx = BankID == AMDGPU::SGPRRegBankID ? PM_SGPR1 : PM_VGPR1;
1990b57cec5SDimitry Andric    break;
2000b57cec5SDimitry Andric  case 96:
201480093f4SDimitry Andric    switch (BankID) {
202480093f4SDimitry Andric      case AMDGPU::VGPRRegBankID:
203480093f4SDimitry Andric        Idx = PM_VGPR96;
204480093f4SDimitry Andric        break;
205480093f4SDimitry Andric      case AMDGPU::SGPRRegBankID:
206480093f4SDimitry Andric        Idx = PM_SGPR96;
207480093f4SDimitry Andric        break;
208480093f4SDimitry Andric      case AMDGPU::AGPRRegBankID:
209480093f4SDimitry Andric        Idx = PM_AGPR96;
210480093f4SDimitry Andric        break;
211480093f4SDimitry Andric      default: llvm_unreachable("Invalid register bank");
212480093f4SDimitry Andric    }
2130b57cec5SDimitry Andric    break;
214*bdd1243dSDimitry Andric  case 288:
215*bdd1243dSDimitry Andric    switch (BankID) {
216*bdd1243dSDimitry Andric      case AMDGPU::VGPRRegBankID:
217*bdd1243dSDimitry Andric        Idx = PM_VGPR288;
218*bdd1243dSDimitry Andric        break;
219*bdd1243dSDimitry Andric      case AMDGPU::SGPRRegBankID:
220*bdd1243dSDimitry Andric        Idx = PM_SGPR288;
221*bdd1243dSDimitry Andric        break;
222*bdd1243dSDimitry Andric      case AMDGPU::AGPRRegBankID:
223*bdd1243dSDimitry Andric        Idx = PM_AGPR288;
224*bdd1243dSDimitry Andric        break;
225*bdd1243dSDimitry Andric      default: llvm_unreachable("Invalid register bank");
226*bdd1243dSDimitry Andric    }
227*bdd1243dSDimitry Andric    break;
228*bdd1243dSDimitry Andric  case 320:
229*bdd1243dSDimitry Andric    switch (BankID) {
230*bdd1243dSDimitry Andric      case AMDGPU::VGPRRegBankID:
231*bdd1243dSDimitry Andric        Idx = PM_VGPR320;
232*bdd1243dSDimitry Andric        break;
233*bdd1243dSDimitry Andric      case AMDGPU::SGPRRegBankID:
234*bdd1243dSDimitry Andric        Idx = PM_SGPR320;
235*bdd1243dSDimitry Andric        break;
236*bdd1243dSDimitry Andric      case AMDGPU::AGPRRegBankID:
237*bdd1243dSDimitry Andric        Idx = PM_AGPR320;
238*bdd1243dSDimitry Andric        break;
239*bdd1243dSDimitry Andric      default: llvm_unreachable("Invalid register bank");
240*bdd1243dSDimitry Andric    }
241*bdd1243dSDimitry Andric    break;
242*bdd1243dSDimitry Andric  case 352:
243*bdd1243dSDimitry Andric    switch (BankID) {
244*bdd1243dSDimitry Andric      case AMDGPU::VGPRRegBankID:
245*bdd1243dSDimitry Andric        Idx = PM_VGPR352;
246*bdd1243dSDimitry Andric        break;
247*bdd1243dSDimitry Andric      case AMDGPU::SGPRRegBankID:
248*bdd1243dSDimitry Andric        Idx = PM_SGPR352;
249*bdd1243dSDimitry Andric        break;
250*bdd1243dSDimitry Andric      case AMDGPU::AGPRRegBankID:
251*bdd1243dSDimitry Andric        Idx = PM_AGPR352;
252*bdd1243dSDimitry Andric        break;
253*bdd1243dSDimitry Andric      default: llvm_unreachable("Invalid register bank");
254*bdd1243dSDimitry Andric    }
255*bdd1243dSDimitry Andric    break;
256*bdd1243dSDimitry Andric  case 384:
257*bdd1243dSDimitry Andric    switch (BankID) {
258*bdd1243dSDimitry Andric      case AMDGPU::VGPRRegBankID:
259*bdd1243dSDimitry Andric        Idx = PM_VGPR384;
260*bdd1243dSDimitry Andric        break;
261*bdd1243dSDimitry Andric      case AMDGPU::SGPRRegBankID:
262*bdd1243dSDimitry Andric        Idx = PM_SGPR384;
263*bdd1243dSDimitry Andric        break;
264*bdd1243dSDimitry Andric      case AMDGPU::AGPRRegBankID:
265*bdd1243dSDimitry Andric        Idx = PM_AGPR384;
266*bdd1243dSDimitry Andric        break;
267*bdd1243dSDimitry Andric      default: llvm_unreachable("Invalid register bank");
268*bdd1243dSDimitry Andric    }
269*bdd1243dSDimitry Andric    break;
2700b57cec5SDimitry Andric  default:
271480093f4SDimitry Andric    switch (BankID) {
272480093f4SDimitry Andric      case AMDGPU::VGPRRegBankID:
273480093f4SDimitry Andric        Idx = VGPRStartIdx;
274480093f4SDimitry Andric        break;
275480093f4SDimitry Andric      case AMDGPU::SGPRRegBankID:
276480093f4SDimitry Andric        Idx = SGPRStartIdx;
277480093f4SDimitry Andric        break;
278480093f4SDimitry Andric      case AMDGPU::AGPRRegBankID:
279480093f4SDimitry Andric        Idx = AGPRStartIdx;
280480093f4SDimitry Andric        break;
281480093f4SDimitry Andric      default: llvm_unreachable("Invalid register bank");
282480093f4SDimitry Andric    }
2830b57cec5SDimitry Andric    Idx += Log2_32_Ceil(Size);
2840b57cec5SDimitry Andric    break;
2850b57cec5SDimitry Andric  }
2860b57cec5SDimitry Andric
2870b57cec5SDimitry Andric  assert(Log2_32_Ceil(Size) == Log2_32_Ceil(ValMappings[Idx].BreakDown->Length));
2880b57cec5SDimitry Andric  assert(BankID == ValMappings[Idx].BreakDown->RegBank->getID());
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andric  return &ValMappings[Idx];
2910b57cec5SDimitry Andric}
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andricconst RegisterBankInfo::ValueMapping *getValueMappingSGPR64Only(unsigned BankID,
2940b57cec5SDimitry Andric                                                                unsigned Size) {
2950b57cec5SDimitry Andric  if (Size != 64)
2960b57cec5SDimitry Andric    return getValueMapping(BankID, Size);
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andric  if (BankID == AMDGPU::VGPRRegBankID)
2990b57cec5SDimitry Andric    return &ValMappingsSGPR64OnlyVGPR32[4];
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric  assert(BankID == AMDGPU::SGPRRegBankID);
3020b57cec5SDimitry Andric  return &ValMappingsSGPR64OnlyVGPR32[2];
3030b57cec5SDimitry Andric}
3040b57cec5SDimitry Andric
3055ffd83dbSDimitry Andric/// Split any 64-bit value into 2 32-bit pieces. Unlike
3065ffd83dbSDimitry Andric/// getValueMappingSGPR64Only, this splits both VGPRs and SGPRs.
3075ffd83dbSDimitry Andricconst RegisterBankInfo::ValueMapping *getValueMappingSplit64(unsigned BankID,
3085ffd83dbSDimitry Andric                                                             unsigned Size) {
3095ffd83dbSDimitry Andric  assert(Size == 64);
3105ffd83dbSDimitry Andric  if (BankID == AMDGPU::VGPRRegBankID)
3115ffd83dbSDimitry Andric    return &ValMappingsSGPR64OnlyVGPR32[4];
3120b57cec5SDimitry Andric
3135ffd83dbSDimitry Andric  assert(BankID == AMDGPU::SGPRRegBankID);
3145ffd83dbSDimitry Andric  return &ValMappingsSGPR64OnlyVGPR32[1];
3150b57cec5SDimitry Andric}
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andric} // End AMDGPU namespace.
3190b57cec5SDimitry Andric} // End llvm namespace.
320