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