18#include "llvm/IR/IntrinsicsNVPTX.h"
26#define Check(C, ...) \
29 VS.CheckFailed(__VA_ARGS__); \
39 unsigned NumRegisters;
43struct SPOperandLayout {
44 unsigned MetadataSize;
45 unsigned CompressedDataSize;
56 return ElemSize == 8 || ElemSize == 16;
60 return IdxSize == 2 || IdxSize == 4;
70 return NumTgt == 2 || NumTgt == 4 || NumTgt == 8 || NumTgt == 16;
72 return NumTgt == 4 || NumTgt == 8 || NumTgt == 16;
74 return NumTgt == 8 || NumTgt == 16;
80static std::optional<SPOperandLayout>
82 unsigned RepeatFactor) {
87 SPOperandLayout Layout = {
divideCeil(RepeatFactor * IdxSize, ElemSize),
88 RepeatFactor, RepeatFactor * 2};
89 if (Layout.MetadataSize + Layout.CompressedDataSize + Layout.DataSize >
95static std::optional<SPOperandLayout>
97 unsigned IdxSize,
unsigned RepeatFactor) {
101 (IdxSize == 2 && NumTgt > 4))
104 unsigned DataBits = NumTgt * ElemSize * RepeatFactor;
105 if (DataBits < 32 || DataBits > 4096)
108 SPOperandLayout Layout = {
divideCeil(NumSrc * IdxSize * RepeatFactor, 32),
109 divideCeil(NumSrc * ElemSize * RepeatFactor, 32),
111 if (Layout.MetadataSize + Layout.CompressedDataSize + Layout.DataSize >
124 unsigned ElemSize =
ElemTy->getBitWidth();
125 if (ElemSize != 8 && ElemSize != 16)
127 unsigned NumElements = VT->getNumElements();
128 return SPVectorInfo{ElemSize, NumElements,
133 if (Ty->isIntegerTy(32))
136 if (!VT || !VT->getElementType()->isIntegerTy(32) || VT->getNumElements() < 2)
138 return VT->getNumElements();
143 Check(ResultTy && ResultTy->getNumElements() == 2,
144 "invalid llvm.nvvm.spcompress result type", &
Call);
149 Check(MDataRegs && CData &&
Data && CData->ElemSize ==
Data->ElemSize,
150 "invalid llvm.nvvm.spcompress operand or result type", &
Call);
157 Check(NumTgt == 4 &&
Data->NumElements % NumTgt == 0 &&
158 CData->NumElements == 2 * (
Data->NumElements / NumTgt) &&
159 Data->NumRegisters % 2 == 0,
160 "invalid llvm.nvvm.spcompress layout", &
Call);
162 unsigned RepeatFactor =
Data->NumRegisters / 2;
166 Check(Layout && *MDataRegs == Layout->MetadataSize &&
167 CData->NumRegisters == Layout->CompressedDataSize &&
168 Data->NumRegisters == Layout->DataSize,
169 "invalid llvm.nvvm.spcompress layout", &
Call);
176 Check(
Data && MDataRegs && CData &&
Data->ElemSize == CData->ElemSize,
177 "invalid llvm.nvvm.spdecompress operand or result type", &
Call);
182 Check(NumTgt != 0 &&
Data->NumElements % NumTgt == 0,
183 "invalid llvm.nvvm.spdecompress layout", &
Call);
185 unsigned RepeatFactor =
Data->NumElements / NumTgt;
187 Check(RepeatFactor != 0 && CData->NumElements % RepeatFactor == 0,
188 "invalid llvm.nvvm.spdecompress layout", &
Call);
190 unsigned NumSrc = CData->NumElements / RepeatFactor;
195 Check(Layout && *MDataRegs == Layout->MetadataSize &&
196 CData->NumRegisters == Layout->CompressedDataSize &&
197 Data->NumRegisters == Layout->DataSize,
198 "invalid llvm.nvvm.spdecompress layout", &
Call);
208 const bool IsVector = Ty->isVectorTy();
210 if (IsVector && (!VTy || VTy->getNumElements() != 2))
217 switch (Ty->getScalarType()->getTypeID()) {
221 return IsRN && !IsSat && !IsFTZ;
223 return !IsRelu && !(IsVector && IsSat);
225 return !IsVector && !IsSat && !IsFTZ && !IsRelu;
238 formatv(
"{} with rounding mode {} and operand type {} is not supported",
249 case Intrinsic::nvvm_spcompress:
252 case Intrinsic::nvvm_spdecompress:
255 case Intrinsic::nvvm_fadd:
256 case Intrinsic::nvvm_fadd_ftz:
257 case Intrinsic::nvvm_fadd_sat:
258 case Intrinsic::nvvm_fadd_ftz_sat:
259 case Intrinsic::nvvm_fma:
260 case Intrinsic::nvvm_fma_ftz:
261 case Intrinsic::nvvm_fma_sat:
262 case Intrinsic::nvvm_fma_ftz_sat:
263 case Intrinsic::nvvm_fma_relu:
264 case Intrinsic::nvvm_fma_ftz_relu:
265 case Intrinsic::nvvm_fmul:
266 case Intrinsic::nvvm_fmul_ftz:
267 case Intrinsic::nvvm_fmul_sat:
268 case Intrinsic::nvvm_fmul_ftz_sat:
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file contains the definitions of the enumerations and flags associated with NVVM Intrinsics,...
static bool isSupportedFPArith(Intrinsic::ID ID, Type *Ty, APFloat::roundingMode RoundingMode)
static std::optional< SPOperandLayout > getSPCompressLayout(unsigned ElemSize, unsigned IdxSize, unsigned RepeatFactor)
static std::optional< unsigned > getSPMetadataRegisters(Type *Ty)
constexpr unsigned MaxSPOperandRegisters
static std::optional< SPOperandLayout > getSPDecompressLayout(unsigned NumSrc, unsigned NumTgt, unsigned ElemSize, unsigned IdxSize, unsigned RepeatFactor)
static void verifyFPArith(VerifierSupport &VS, Intrinsic::ID ID, CallBase &Call)
static bool isValidSPRepeatFactor(unsigned RepeatFactor)
static bool isValidSPIdxSize(unsigned IdxSize)
static bool isValidSPDecompressFactor(unsigned NumSrc, unsigned NumTgt)
static std::optional< SPVectorInfo > getSPVectorInfo(Type *Ty)
static void verifySPCompress(VerifierSupport &VS, CallBase &Call)
static bool isValidSPElemSize(unsigned ElemSize)
static void verifySPDecompress(VerifierSupport &VS, CallBase &Call)
llvm::RoundingMode roundingMode
IEEE-754R 4.3: Rounding-direction attributes.
static constexpr roundingMode rmNearestTiesToEven
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
The instances of the Type class are immutable: once they are created, they are never changed.
@ HalfTyID
16-bit floating point type
@ FloatTyID
32-bit floating point type
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
LLVM_ABI StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
APFloat::roundingMode GetRoundingModeFromImmArg(const Value *ImmArgVal)
StringRef GetRoundingModeName(APFloat::roundingMode RM)
bool FPArithIsSaturating(Intrinsic::ID IntrinsicID)
bool FPArithShouldFTZ(Intrinsic::ID IntrinsicID)
bool FPArithIsRelu(Intrinsic::ID IntrinsicID)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
RoundingMode
Rounding mode.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void verifyNVVMIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID, CallBase &Call)