Path: blob/main/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp
35266 views
//===-- LoongArchTargetTransformInfo.cpp - LoongArch specific TTI ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7/// \file8/// This file implements a TargetTransformInfo analysis pass specific to the9/// LoongArch target machine. It uses the target's detailed information to10/// provide more precise answers to certain TTI queries, while letting the11/// target independent and default TTI implementations handle the rest.12///13//===----------------------------------------------------------------------===//1415#include "LoongArchTargetTransformInfo.h"1617using namespace llvm;1819#define DEBUG_TYPE "loongarchtti"2021TypeSize LoongArchTTIImpl::getRegisterBitWidth(22TargetTransformInfo::RegisterKind K) const {23TypeSize DefSize = TargetTransformInfoImplBase::getRegisterBitWidth(K);24switch (K) {25case TargetTransformInfo::RGK_Scalar:26return TypeSize::getFixed(ST->is64Bit() ? 64 : 32);27case TargetTransformInfo::RGK_FixedWidthVector:28if (ST->hasExtLASX())29return TypeSize::getFixed(256);30if (ST->hasExtLSX())31return TypeSize::getFixed(128);32[[fallthrough]];33case TargetTransformInfo::RGK_ScalableVector:34return DefSize;35}3637llvm_unreachable("Unsupported register kind");38}3940unsigned LoongArchTTIImpl::getNumberOfRegisters(unsigned ClassID) const {41switch (ClassID) {42case LoongArchRegisterClass::GPRRC:43// 30 = 32 GPRs - r0 (zero register) - r21 (non-allocatable)44return 30;45case LoongArchRegisterClass::FPRRC:46return ST->hasBasicF() ? 32 : 0;47case LoongArchRegisterClass::VRRC:48return ST->hasExtLSX() ? 32 : 0;49}50llvm_unreachable("unknown register class");51}5253unsigned LoongArchTTIImpl::getRegisterClassForType(bool Vector,54Type *Ty) const {55if (Vector)56return LoongArchRegisterClass::VRRC;57if (!Ty)58return LoongArchRegisterClass::GPRRC;5960Type *ScalarTy = Ty->getScalarType();61if ((ScalarTy->isFloatTy() && ST->hasBasicF()) ||62(ScalarTy->isDoubleTy() && ST->hasBasicD())) {63return LoongArchRegisterClass::FPRRC;64}6566return LoongArchRegisterClass::GPRRC;67}6869unsigned LoongArchTTIImpl::getMaxInterleaveFactor(ElementCount VF) {70return ST->getMaxInterleaveFactor();71}7273const char *LoongArchTTIImpl::getRegisterClassName(unsigned ClassID) const {74switch (ClassID) {75case LoongArchRegisterClass::GPRRC:76return "LoongArch::GPRRC";77case LoongArchRegisterClass::FPRRC:78return "LoongArch::FPRRC";79case LoongArchRegisterClass::VRRC:80return "LoongArch::VRRC";81}82llvm_unreachable("unknown register class");83}8485// TODO: Implement more hooks to provide TTI machinery for LoongArch.868788