LCOV - code coverage report
Current view: top level - lib/Target/AArch64 - AArch64GenRegisterBankInfo.def (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 30 50 60.0 %
Date: 2018-10-20 13:21:21 Functions: 4 7 57.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- AArch64GenRegisterBankInfo.def ----------------------------*- C++ -*-==//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : /// \file
      10             : /// This file defines all the static objects used by AArch64RegisterBankInfo.
      11             : /// \todo This should be generated by TableGen.
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : namespace llvm {
      15             : RegisterBankInfo::PartialMapping AArch64GenRegisterBankInfo::PartMappings[]{
      16             :     /* StartIdx, Length, RegBank */
      17             :     // 0: FPR 16-bit value.
      18             :     {0, 16, AArch64::FPRRegBank},
      19             :     // 1: FPR 32-bit value.
      20             :     {0, 32, AArch64::FPRRegBank},
      21             :     // 2: FPR 64-bit value.
      22             :     {0, 64, AArch64::FPRRegBank},
      23             :     // 3: FPR 128-bit value.
      24             :     {0, 128, AArch64::FPRRegBank},
      25             :     // 4: FPR 256-bit value.
      26             :     {0, 256, AArch64::FPRRegBank},
      27             :     // 5: FPR 512-bit value.
      28             :     {0, 512, AArch64::FPRRegBank},
      29             :     // 6: GPR 32-bit value.
      30             :     {0, 32, AArch64::GPRRegBank},
      31             :     // 7: GPR 64-bit value.
      32             :     {0, 64, AArch64::GPRRegBank},
      33             : };
      34             : 
      35             : // ValueMappings.
      36             : RegisterBankInfo::ValueMapping AArch64GenRegisterBankInfo::ValMappings[]{
      37             :     /* BreakDown, NumBreakDowns */
      38             :     // 0: invalid
      39             :     {nullptr, 0},
      40             :     // 3-operands instructions (all binary operations should end up with one of
      41             :     // those mapping).
      42             :     // 1: FPR 16-bit value. <-- This must match First3OpsIdx.
      43             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
      44             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
      45             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
      46             :     // 4: FPR 32-bit value. <-- This must match First3OpsIdx.
      47             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
      48             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
      49             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
      50             :     // 7: FPR 64-bit value.
      51             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
      52             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
      53             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
      54             :     // 10: FPR 128-bit value.
      55             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR128 - PMI_Min], 1},
      56             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR128 - PMI_Min], 1},
      57             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR128 - PMI_Min], 1},
      58             :     // 13: FPR 256-bit value.
      59             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR256 - PMI_Min], 1},
      60             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR256 - PMI_Min], 1},
      61             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR256 - PMI_Min], 1},
      62             :     // 16: FPR 512-bit value.
      63             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR512 - PMI_Min], 1},
      64             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR512 - PMI_Min], 1},
      65             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR512 - PMI_Min], 1},
      66             :     // 19: GPR 32-bit value.
      67             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      68             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      69             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      70             :     // 22: GPR 64-bit value. <-- This must match Last3OpsIdx.
      71             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR64 - PMI_Min], 1},
      72             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR64 - PMI_Min], 1},
      73             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR64 - PMI_Min], 1},
      74             :     // Cross register bank copies.
      75             :     // 25: FPR 16-bit value to GPR 16-bit. <-- This must match
      76             :     //                                         FirstCrossRegCpyIdx.
      77             :     // Note: This is the kind of copy we see with physical registers.
      78             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
      79             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      80             :     // 27: FPR 32-bit value to GPR 32-bit value.
      81             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
      82             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      83             :     // 29: FPR 64-bit value to GPR 64-bit value.
      84             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
      85             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR64 - PMI_Min], 1},
      86             :     // 31: FPR 128-bit value to GPR 128-bit value (invalid)
      87             :     {nullptr, 1},
      88             :     {nullptr, 1},
      89             :     // 33: FPR 256-bit value to GPR 256-bit value (invalid)
      90             :     {nullptr, 1},
      91             :     {nullptr, 1},
      92             :     // 35: FPR 512-bit value to GPR 512-bit value (invalid)
      93             :     {nullptr, 1},
      94             :     {nullptr, 1},
      95             :     // 37: GPR 32-bit value to FPR 32-bit value.
      96             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR32 - PMI_Min], 1},
      97             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
      98             :     // 39: GPR 64-bit value to FPR 64-bit value. <-- This must match
      99             :     //                                               LastCrossRegCpyIdx.
     100             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_GPR64 - PMI_Min], 1},
     101             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
     102             :     // 41: FPExt: 16 to 32. <-- This must match FPExt16To32Idx.
     103             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
     104             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
     105             :     // 43: FPExt: 16 to 32. <-- This must match FPExt16To64Idx.
     106             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
     107             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR16 - PMI_Min], 1},
     108             :     // 45: FPExt: 32 to 64. <-- This must match FPExt32To64Idx.
     109             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
     110             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR32 - PMI_Min], 1},
     111             :     // 47: FPExt vector: 64 to 128. <-- This must match FPExt64To128Idx.
     112             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR128 - PMI_Min], 1},
     113             :     {&AArch64GenRegisterBankInfo::PartMappings[PMI_FPR64 - PMI_Min], 1},
     114             : };
     115             : 
     116           0 : bool AArch64GenRegisterBankInfo::checkPartialMap(unsigned Idx,
     117             :                                                  unsigned ValStartIdx,
     118             :                                                  unsigned ValLength,
     119             :                                                  const RegisterBank &RB) {
     120           0 :   const PartialMapping &Map = PartMappings[Idx - PartialMappingIdx::PMI_Min];
     121           0 :   return Map.StartIdx == ValStartIdx && Map.Length == ValLength &&
     122           0 :          Map.RegBank == &RB;
     123             : }
     124             : 
     125           0 : bool AArch64GenRegisterBankInfo::checkValueMapImpl(unsigned Idx,
     126             :                                                    unsigned FirstInBank,
     127             :                                                    unsigned Size,
     128             :                                                    unsigned Offset) {
     129           0 :   unsigned PartialMapBaseIdx = Idx - PartialMappingIdx::PMI_Min;
     130             :   const ValueMapping &Map =
     131           0 :       AArch64GenRegisterBankInfo::getValueMapping((PartialMappingIdx)FirstInBank, Size)[Offset];
     132           0 :   return Map.BreakDown == &PartMappings[PartialMapBaseIdx] &&
     133           0 :          Map.NumBreakDowns == 1;
     134             : }
     135             : 
     136           0 : bool AArch64GenRegisterBankInfo::checkPartialMappingIdx(
     137             :     PartialMappingIdx FirstAlias, PartialMappingIdx LastAlias,
     138             :     ArrayRef<PartialMappingIdx> Order) {
     139           0 :   if (Order.front() != FirstAlias)
     140             :     return false;
     141           0 :   if (Order.back() != LastAlias)
     142             :     return false;
     143           0 :   if (Order.front() > Order.back())
     144             :     return false;
     145             : 
     146             :   PartialMappingIdx Previous = Order.front();
     147             :   bool First = true;
     148           0 :   for (const auto &Current : Order) {
     149           0 :     if (First) {
     150             :       First = false;
     151             :       continue;
     152             :     }
     153           0 :     if (Previous + 1 != Current)
     154             :       return false;
     155             :     Previous = Current;
     156             :   }
     157             :   return true;
     158             : }
     159             : 
     160       14311 : unsigned AArch64GenRegisterBankInfo::getRegBankBaseIdxOffset(unsigned RBIdx,
     161             :                                                              unsigned Size) {
     162       14311 :   if (RBIdx == PMI_FirstGPR) {
     163        7819 :     if (Size <= 32)
     164             :       return 0;
     165        4367 :     if (Size <= 64)
     166             :       return 1;
     167           0 :     return -1;
     168             :   }
     169        6492 :   if (RBIdx == PMI_FirstFPR) {
     170        6492 :     if (Size <= 16)
     171             :       return 0;
     172        6478 :     if (Size <= 32)
     173             :       return 1;
     174        3263 :     if (Size <= 64)
     175             :       return 2;
     176          34 :     if (Size <= 128)
     177             :       return 3;
     178           0 :     if (Size <= 256)
     179             :       return 4;
     180           0 :     if (Size <= 512)
     181             :       return 5;
     182           0 :     return -1;
     183             :   }
     184             :   return -1;
     185             : }
     186             : 
     187             : const RegisterBankInfo::ValueMapping *
     188        8060 : AArch64GenRegisterBankInfo::getValueMapping(PartialMappingIdx RBIdx,
     189             :                                             unsigned Size) {
     190             :   assert(RBIdx != PartialMappingIdx::PMI_None && "No mapping needed for that");
     191        8060 :   unsigned BaseIdxOffset = getRegBankBaseIdxOffset(RBIdx, Size);
     192        8060 :   if (BaseIdxOffset == -1u)
     193             :     return &ValMappings[InvalidIdx];
     194             : 
     195        8060 :   unsigned ValMappingIdx =
     196        8060 :       First3OpsIdx + (RBIdx - PartialMappingIdx::PMI_Min + BaseIdxOffset) *
     197             :                          ValueMappingIdx::DistanceBetweenRegBanks;
     198             :   assert(ValMappingIdx >= First3OpsIdx && ValMappingIdx <= Last3OpsIdx &&
     199             :          "Mapping out of bound");
     200             : 
     201        8060 :   return &ValMappings[ValMappingIdx];
     202             : }
     203             : 
     204             : AArch64GenRegisterBankInfo::PartialMappingIdx
     205             :     AArch64GenRegisterBankInfo::BankIDToCopyMapIdx[]{
     206             :         PMI_None,     // CCR
     207             :         PMI_FirstFPR, // FPR
     208             :         PMI_FirstGPR, // GPR
     209             :     };
     210             : 
     211             : const RegisterBankInfo::ValueMapping *
     212       12795 : AArch64GenRegisterBankInfo::getCopyMapping(unsigned DstBankID,
     213             :                                            unsigned SrcBankID, unsigned Size) {
     214             :   assert(DstBankID < AArch64::NumRegisterBanks && "Invalid bank ID");
     215             :   assert(SrcBankID < AArch64::NumRegisterBanks && "Invalid bank ID");
     216       12795 :   PartialMappingIdx DstRBIdx = BankIDToCopyMapIdx[DstBankID];
     217       12795 :   PartialMappingIdx SrcRBIdx = BankIDToCopyMapIdx[SrcBankID];
     218             :   assert(DstRBIdx != PMI_None && "No such mapping");
     219             :   assert(SrcRBIdx != PMI_None && "No such mapping");
     220             : 
     221       12795 :   if (DstRBIdx == SrcRBIdx)
     222        6544 :     return getValueMapping(DstRBIdx, Size);
     223             : 
     224             :   assert(Size <= 64 && "GPR cannot handle that size");
     225             :   unsigned ValMappingIdx =
     226        6251 :       FirstCrossRegCpyIdx +
     227        6251 :       (DstRBIdx - PMI_Min + getRegBankBaseIdxOffset(DstRBIdx, Size)) *
     228        6251 :           ValueMappingIdx::DistanceBetweenCrossRegCpy;
     229             :   assert(ValMappingIdx >= FirstCrossRegCpyIdx &&
     230             :          ValMappingIdx <= LastCrossRegCpyIdx && "Mapping out of bound");
     231        6251 :   return &ValMappings[ValMappingIdx];
     232             : }
     233             : 
     234             : const RegisterBankInfo::ValueMapping *
     235        6221 : AArch64GenRegisterBankInfo::getFPExtMapping(unsigned DstSize,
     236             :                                          unsigned SrcSize) {
     237             :   // We support:
     238             :   // - For Scalar:
     239             :   //   - 16 to 32.
     240             :   //   - 16 to 64.
     241             :   //   - 32 to 64.
     242             :   // => FPR 16 to FPR 32|64
     243             :   // => FPR 32 to FPR 64
     244             :   // - For vectors:
     245             :   //   - v4f16 to v4f32
     246             :   //   - v2f32 to v2f64
     247             :   // => FPR 64 to FPR 128
     248             : 
     249             :   // Check that we have been asked sensible sizes.
     250        6221 :   if (SrcSize == 16) {
     251             :     assert((DstSize == 32 || DstSize == 64) && "Unexpected half extension");
     252        3110 :     if (DstSize == 32)
     253             :       return &ValMappings[FPExt16To32Idx];
     254        1555 :     return &ValMappings[FPExt16To64Idx];
     255             :   }
     256             : 
     257        3111 :   if (SrcSize == 32) {
     258             :     assert(DstSize == 64 && "Unexpected float extension");
     259        1558 :     return &ValMappings[FPExt32To64Idx];
     260             :   }
     261             :   assert((SrcSize == 64 || DstSize == 128) && "Unexpected vector extension");
     262             :   return &ValMappings[FPExt64To128Idx];
     263             : }
     264             : } // End llvm namespace.

Generated by: LCOV version 1.13