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