xref: /freebsd/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===-- LoongArchTargetTransformInfo.cpp - LoongArch specific TTI ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 /// This file implements a TargetTransformInfo analysis pass specific to the
10 /// LoongArch target machine. It uses the target's detailed information to
11 /// provide more precise answers to certain TTI queries, while letting the
12 /// target independent and default TTI implementations handle the rest.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #include "LoongArchTargetTransformInfo.h"
17 
18 using namespace llvm;
19 
20 #define DEBUG_TYPE "loongarchtti"
21 
getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const22 TypeSize LoongArchTTIImpl::getRegisterBitWidth(
23     TargetTransformInfo::RegisterKind K) const {
24   TypeSize DefSize = TargetTransformInfoImplBase::getRegisterBitWidth(K);
25   switch (K) {
26   case TargetTransformInfo::RGK_Scalar:
27     return TypeSize::getFixed(ST->is64Bit() ? 64 : 32);
28   case TargetTransformInfo::RGK_FixedWidthVector:
29     if (ST->hasExtLASX())
30       return TypeSize::getFixed(256);
31     if (ST->hasExtLSX())
32       return TypeSize::getFixed(128);
33     [[fallthrough]];
34   case TargetTransformInfo::RGK_ScalableVector:
35     return DefSize;
36   }
37 
38   llvm_unreachable("Unsupported register kind");
39 }
40 
getNumberOfRegisters(unsigned ClassID) const41 unsigned LoongArchTTIImpl::getNumberOfRegisters(unsigned ClassID) const {
42   switch (ClassID) {
43   case LoongArchRegisterClass::GPRRC:
44     // 30 = 32 GPRs - r0 (zero register) - r21 (non-allocatable)
45     return 30;
46   case LoongArchRegisterClass::FPRRC:
47     return ST->hasBasicF() ? 32 : 0;
48   case LoongArchRegisterClass::VRRC:
49     return ST->hasExtLSX() ? 32 : 0;
50   }
51   llvm_unreachable("unknown register class");
52 }
53 
getRegisterClassForType(bool Vector,Type * Ty) const54 unsigned LoongArchTTIImpl::getRegisterClassForType(bool Vector,
55                                                    Type *Ty) const {
56   if (Vector)
57     return LoongArchRegisterClass::VRRC;
58   if (!Ty)
59     return LoongArchRegisterClass::GPRRC;
60 
61   Type *ScalarTy = Ty->getScalarType();
62   if ((ScalarTy->isFloatTy() && ST->hasBasicF()) ||
63       (ScalarTy->isDoubleTy() && ST->hasBasicD())) {
64     return LoongArchRegisterClass::FPRRC;
65   }
66 
67   return LoongArchRegisterClass::GPRRC;
68 }
69 
getMaxInterleaveFactor(ElementCount VF)70 unsigned LoongArchTTIImpl::getMaxInterleaveFactor(ElementCount VF) {
71   return ST->getMaxInterleaveFactor();
72 }
73 
getRegisterClassName(unsigned ClassID) const74 const char *LoongArchTTIImpl::getRegisterClassName(unsigned ClassID) const {
75   switch (ClassID) {
76   case LoongArchRegisterClass::GPRRC:
77     return "LoongArch::GPRRC";
78   case LoongArchRegisterClass::FPRRC:
79     return "LoongArch::FPRRC";
80   case LoongArchRegisterClass::VRRC:
81     return "LoongArch::VRRC";
82   }
83   llvm_unreachable("unknown register class");
84 }
85 
86 // TODO: Implement more hooks to provide TTI machinery for LoongArch.
87