| //===-- SparcTargetTransformInfo.cpp - SPARC specific TTI -----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SparcTargetTransformInfo.h" |
| #include "llvm/Support/MathExtras.h" |
| |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "sparctti" |
| |
| TargetTransformInfo::PopcntSupportKind |
| SparcTTIImpl::getPopcntSupport(unsigned TyWidth) const { |
| assert(isPowerOf2_32(TyWidth) && "Type width must be power of 2"); |
| if (ST->usePopc()) |
| return TTI::PSK_FastHardware; |
| return TTI::PSK_Software; |
| } |
| |
| unsigned SparcTTIImpl::getRegisterClassForType(bool Vector, Type *Ty) const { |
| if (Vector) |
| return VRRC; |
| if (Ty && |
| (Ty->getScalarType()->isFloatTy() || Ty->getScalarType()->isDoubleTy())) |
| return FPRRC; |
| if (Ty && (Ty->getScalarType()->isFP128Ty())) |
| return FP128RRC; |
| return GPRRC; |
| } |
| |
| unsigned SparcTTIImpl::getNumberOfRegisters(unsigned ClassID) const { |
| switch (ClassID) { |
| case GPRRC: |
| // %g0, %g6, %g7, %o6, %i6, and %i7 are used for special purposes so we |
| // discount them here. |
| return 26; |
| case FPRRC: |
| return 32; |
| case FP128RRC: |
| return 16; |
| case VRRC: |
| // TODO We have vector capabilities as part of the VIS extensions, but the |
| // codegen doesn't currently use it. Revisit this when vector codegen is |
| // ready. |
| return 0; |
| } |
| |
| llvm_unreachable("Unsupported register class"); |
| } |
| |
| TypeSize |
| SparcTTIImpl::getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const { |
| switch (K) { |
| case TargetTransformInfo::RGK_Scalar: |
| // TODO When targeting V8+ ABI, G and O registers are 64-bit. |
| return TypeSize::getFixed(ST->is64Bit() ? 64 : 32); |
| case TargetTransformInfo::RGK_FixedWidthVector: |
| // TODO We have vector capabilities as part of the VIS extensions, but the |
| // codegen doesn't currently use it. Revisit this when vector codegen is |
| // ready. |
| return TypeSize::getFixed(0); |
| case TargetTransformInfo::RGK_ScalableVector: |
| return TypeSize::getScalable(0); |
| } |
| |
| llvm_unreachable("Unsupported register kind"); |
| } |