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 | |
22 | 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(ExactSize: ST->is64Bit() ? 64 : 32); |
28 | case TargetTransformInfo::RGK_FixedWidthVector: |
29 | if (!ST->hasExpAutoVec()) |
30 | return DefSize; |
31 | if (ST->hasExtLASX()) |
32 | return TypeSize::getFixed(ExactSize: 256); |
33 | if (ST->hasExtLSX()) |
34 | return TypeSize::getFixed(ExactSize: 128); |
35 | [[fallthrough]]; |
36 | case TargetTransformInfo::RGK_ScalableVector: |
37 | return DefSize; |
38 | } |
39 | |
40 | llvm_unreachable("Unsupported register kind"); |
41 | } |
42 | |
43 | unsigned LoongArchTTIImpl::getNumberOfRegisters(unsigned ClassID) const { |
44 | switch (ClassID) { |
45 | case LoongArchRegisterClass::GPRRC: |
46 | // 30 = 32 GPRs - r0 (zero register) - r21 (non-allocatable) |
47 | return 30; |
48 | case LoongArchRegisterClass::FPRRC: |
49 | return ST->hasBasicF() ? 32 : 0; |
50 | case LoongArchRegisterClass::VRRC: |
51 | return ST->hasExtLSX() ? 32 : 0; |
52 | } |
53 | llvm_unreachable("unknown register class"); |
54 | } |
55 | |
56 | unsigned LoongArchTTIImpl::getRegisterClassForType(bool Vector, |
57 | Type *Ty) const { |
58 | if (Vector) |
59 | return LoongArchRegisterClass::VRRC; |
60 | if (!Ty) |
61 | return LoongArchRegisterClass::GPRRC; |
62 | |
63 | Type *ScalarTy = Ty->getScalarType(); |
64 | if ((ScalarTy->isFloatTy() && ST->hasBasicF()) || |
65 | (ScalarTy->isDoubleTy() && ST->hasBasicD())) { |
66 | return LoongArchRegisterClass::FPRRC; |
67 | } |
68 | |
69 | return LoongArchRegisterClass::GPRRC; |
70 | } |
71 | |
72 | const char *LoongArchTTIImpl::getRegisterClassName(unsigned ClassID) const { |
73 | switch (ClassID) { |
74 | case LoongArchRegisterClass::GPRRC: |
75 | return "LoongArch::GPRRC"; |
76 | case LoongArchRegisterClass::FPRRC: |
77 | return "LoongArch::FPRRC"; |
78 | case LoongArchRegisterClass::VRRC: |
79 | return "LoongArch::VRRC"; |
80 | } |
81 | llvm_unreachable("unknown register class"); |
82 | } |
83 | |
84 | // TODO: Implement more hooks to provide TTI machinery for LoongArch. |
85 |