@@ -374,6 +374,7 @@ const static char ConvertHandleToImageINTEL[] = "ConvertHandleToImageINTEL";
374374const static char ConvertHandleToSamplerINTEL[] = " ConvertHandleToSamplerINTEL" ;
375375const static char ConvertHandleToSampledImageINTEL[] =
376376 " ConvertHandleToSampledImageINTEL" ;
377+ const static char InternalBuiltinPrefix[] = " __builtin_spirv_" ;
377378} // namespace kSPIRVName
378379
379380namespace kSPIRVPostfix {
@@ -666,7 +667,7 @@ Op getSPIRVFuncOC(StringRef Name, SmallVectorImpl<std::string> *Dec = nullptr);
666667bool getSPIRVBuiltin (const std::string &Name, spv::BuiltIn &Builtin);
667668
668669// / \param Name LLVM function name
669- // / \param DemangledName demanged name of the OpenCL built-in function
670+ // / \param DemangledName demangled name of the OpenCL built-in function
670671// / \returns true if Name is the name of the OpenCL built-in function,
671672// / false for other functions
672673bool oclIsBuiltin (StringRef Name, StringRef &DemangledName, bool IsCpp = false );
@@ -729,6 +730,9 @@ CallInst *addCallInst(Module *M, StringRef FuncName, Type *RetTy,
729730 StringRef InstName = SPIR_TEMP_NAME_PREFIX_CALL,
730731 bool TakeFuncName = true );
731732
733+ // / Check if an LLVM type is spirv.CooperativeMatrixKHR.
734+ bool isLLVMCooperativeMatrixType (llvm::Type *Ty);
735+
732736// / Add a call instruction for SPIR-V builtin function.
733737CallInst *addCallInstSPIRV (Module *M, StringRef FuncName, Type *RetTy,
734738 ArrayRef<Value *> Args, AttributeList *Attrs,
@@ -1030,6 +1034,84 @@ bool postProcessBuiltinsReturningStruct(Module *M, bool IsCpp = false);
10301034
10311035bool postProcessBuiltinsWithArrayArguments (Module *M, bool IsCpp = false );
10321036
1037+ // / \param MangledName LLVM function name.
1038+ // / \param DemangledName demangled name of the input function if it is the
1039+ // / translator's internal built-in function.
1040+ // / \returns true if MangledName is the name of the translator's internal
1041+ // / built-in function, false for other functions.
1042+ // / Used for 'mini'-floats conversion functions
1043+ bool isInternalSPIRVBuiltin (StringRef MangledName, StringRef &DemangledName);
1044+
1045+ // Wrapper around SPIR-V 1.6.4 FP Encoding to be used in the conversion
1046+ // descriptor
1047+ enum FPEncodingWrap {
1048+ Integer = FPEncoding::FPEncodingMax - 1 ,
1049+ IEEE754 = FPEncoding::FPEncodingMax,
1050+ BF16 = FPEncoding::FPEncodingBFloat16KHR,
1051+ E4M3 = FPEncoding::FPEncodingFloat8E4M3EXT,
1052+ E5M2 = FPEncoding::FPEncodingFloat8E5M2EXT,
1053+ };
1054+
1055+ // Structure describing non-trivial conversions (FP8 and int4)
1056+ struct FPConversionDesc {
1057+ FPEncodingWrap SrcEncoding;
1058+ FPEncodingWrap DstEncoding;
1059+ SPIRVWord ConvOpCode;
1060+
1061+ // To use as a key in std::map
1062+ bool operator ==(const FPConversionDesc &Other) const {
1063+ return SrcEncoding == Other.SrcEncoding &&
1064+ DstEncoding == Other.DstEncoding && ConvOpCode == Other.ConvOpCode ;
1065+ }
1066+
1067+ bool operator <(const FPConversionDesc &Other) const {
1068+ if (ConvOpCode != Other.ConvOpCode )
1069+ return ConvOpCode < Other.ConvOpCode ;
1070+ if (SrcEncoding != Other.SrcEncoding )
1071+ return SrcEncoding < Other.SrcEncoding ;
1072+ return DstEncoding < Other.DstEncoding ;
1073+ }
1074+ };
1075+
1076+ // Maps internal builtin name to conversion descriptor
1077+ typedef SPIRVMap<llvm::StringRef, FPConversionDesc> FPConvertToEncodingMap;
1078+
1079+ // clang-format off
1080+ template <> inline void FPConvertToEncodingMap::init () {
1081+ // 8-bit conversions
1082+ add (" ConvertE4M3ToFP16EXT" ,
1083+ {FPEncodingWrap::E4M3, FPEncodingWrap::IEEE754, OpFConvert});
1084+ add (" ConvertE5M2ToFP16EXT" ,
1085+ {FPEncodingWrap::E5M2, FPEncodingWrap::IEEE754, OpFConvert});
1086+ add (" ConvertE4M3ToBF16EXT" ,
1087+ {FPEncodingWrap::E4M3, FPEncodingWrap::BF16, OpFConvert});
1088+ add (" ConvertE5M2ToBF16EXT" ,
1089+ {FPEncodingWrap::E5M2, FPEncodingWrap::BF16, OpFConvert});
1090+ add (" ConvertFP16ToE4M3EXT" ,
1091+ {FPEncodingWrap::IEEE754, FPEncodingWrap::E4M3, OpFConvert});
1092+ add (" ConvertFP16ToE5M2EXT" ,
1093+ {FPEncodingWrap::IEEE754, FPEncodingWrap::E5M2, OpFConvert});
1094+ add (" ConvertBF16ToE4M3EXT" ,
1095+ {FPEncodingWrap::BF16, FPEncodingWrap::E4M3, OpFConvert});
1096+ add (" ConvertBF16ToE5M2EXT" ,
1097+ {FPEncodingWrap::BF16, FPEncodingWrap::E5M2, OpFConvert});
1098+
1099+ add (" ConvertInt4ToE4M3INTEL" ,
1100+ {FPEncodingWrap::Integer, FPEncodingWrap::E4M3, OpConvertSToF});
1101+ add (" ConvertInt4ToE5M2INTEL" ,
1102+ {FPEncodingWrap::Integer, FPEncodingWrap::E5M2, OpConvertSToF});
1103+ add (" ConvertInt4ToFP16INTEL" ,
1104+ {FPEncodingWrap::Integer, FPEncodingWrap::IEEE754, OpConvertSToF});
1105+ add (" ConvertInt4ToBF16INTEL" ,
1106+ {FPEncodingWrap::Integer, FPEncodingWrap::BF16, OpConvertSToF});
1107+ add (" ConvertFP16ToInt4INTEL" ,
1108+ {FPEncodingWrap::IEEE754, FPEncodingWrap::Integer, OpConvertFToS});
1109+ add (" ConvertBF16ToInt4INTEL" ,
1110+ {FPEncodingWrap::BF16, FPEncodingWrap::Integer, OpConvertFToS});
1111+ }
1112+
1113+ // clang-format on
1114+
10331115} // namespace SPIRV
10341116
10351117#endif // SPIRV_SPIRVINTERNAL_H
0 commit comments