@@ -208,6 +208,44 @@ TEST_F(ValidateInvalidType, Bfloat16InvalidGroupNonUniformShuffle) {
208208 HasSubstr (" GroupNonUniformShuffle doesn't support BFloat16 type." ));
209209}
210210
211+ TEST_F (ValidateInvalidType, Bfloat16ExtInstruction) {
212+ const std::string body = R"(
213+ %15 = OpExtInst %bfloat16 %1 FClamp %bf16_1 %bf16_1 %bf16_1
214+ )" ;
215+
216+ CompileSuccessfully (GenerateBFloatCode (body).c_str (), SPV_ENV_VULKAN_1_3 );
217+ EXPECT_EQ (SPV_ERROR_INVALID_DATA ,
218+ ValidateInstructions (SPV_ENV_UNIVERSAL_1_6 ));
219+ EXPECT_THAT (getDiagnosticString (),
220+ HasSubstr (" FClamp: doesn't support BFloat16 type." ));
221+ }
222+
223+ TEST_F (ValidateInvalidType, Bfloat16ExtInstructionRequiresExtension) {
224+ const std::string spirv = R"(
225+ OpCapability Shader
226+ %1 = OpExtInstImport "GLSL.std.450"
227+ OpMemoryModel Logical GLSL450
228+ OpEntryPoint GLCompute %main "main"
229+ OpExecutionMode %main LocalSize 1 1 1
230+ %void = OpTypeVoid
231+ %func = OpTypeFunction %void
232+ %bfloat16 = OpTypeFloat 16 BFloat16KHR
233+ %bf16_1 = OpConstant %bfloat16 1
234+ %main = OpFunction %void None %func
235+ %entry = OpLabel
236+ %15 = OpExtInst %bfloat16 %1 FClamp %bf16_1 %bf16_1 %bf16_1
237+ OpReturn
238+ OpFunctionEnd
239+ )" ;
240+
241+ CompileSuccessfully (spirv.c_str (), SPV_ENV_VULKAN_1_3 );
242+ EXPECT_EQ (SPV_ERROR_INVALID_CAPABILITY ,
243+ ValidateInstructions (SPV_ENV_UNIVERSAL_1_6 ));
244+ EXPECT_THAT (getDiagnosticString (),
245+ HasSubstr (" Operand 3 of TypeFloat requires one of these "
246+ " capabilities: BFloat16TypeKHR" ));
247+ }
248+
211249std::string GenerateFP8Code (const std::string& main_body) {
212250 const std::string prefix =
213251 R"(
@@ -401,6 +439,56 @@ TEST_F(ValidateInvalidType, FP8E5M2InvalidGroupNonUniformShuffle) {
401439 HasSubstr (" GroupNonUniformShuffle doesn't support FP8 E4M3/E5M2 types." ));
402440}
403441
442+ TEST_F (ValidateInvalidType, FP8E4M3ExtInstruction) {
443+ const std::string body = R"(
444+ %15 = OpExtInst %fp8e4m3 %1 FClamp %fp8e4m3_1 %fp8e4m3_1 %fp8e4m3_1
445+ )" ;
446+
447+ CompileSuccessfully (GenerateFP8Code (body).c_str (), SPV_ENV_VULKAN_1_3 );
448+ EXPECT_EQ (SPV_ERROR_INVALID_DATA ,
449+ ValidateInstructions (SPV_ENV_UNIVERSAL_1_6 ));
450+ EXPECT_THAT (getDiagnosticString (),
451+ HasSubstr (" FClamp: doesn't support FP8 E4M3/E5M2 types." ));
452+ }
453+
454+ TEST_F (ValidateInvalidType, FP8E5M2ExtInstruction) {
455+ const std::string body = R"(
456+ %15 = OpExtInst %fp8e5m2 %1 FClamp %fp8e5m2_1 %fp8e5m2_1 %fp8e5m2_1
457+ )" ;
458+
459+ CompileSuccessfully (GenerateFP8Code (body).c_str (), SPV_ENV_VULKAN_1_3 );
460+ EXPECT_EQ (SPV_ERROR_INVALID_DATA ,
461+ ValidateInstructions (SPV_ENV_UNIVERSAL_1_6 ));
462+ EXPECT_THAT (getDiagnosticString (),
463+ HasSubstr (" FClamp: doesn't support FP8 E4M3/E5M2 types." ));
464+ }
465+
466+ TEST_F (ValidateInvalidType, FP8ExtInstructionRequiresExtension) {
467+ const std::string spirv = R"(
468+ OpCapability Shader
469+ %1 = OpExtInstImport "GLSL.std.450"
470+ OpMemoryModel Logical GLSL450
471+ OpEntryPoint GLCompute %main "main"
472+ OpExecutionMode %main LocalSize 1 1 1
473+ %void = OpTypeVoid
474+ %func = OpTypeFunction %void
475+ %fp8e4m3 = OpTypeFloat 8 Float8E4M3EXT
476+ %fp8e4m3_1 = OpConstant %fp8e4m3 1
477+ %main = OpFunction %void None %func
478+ %entry = OpLabel
479+ %15 = OpExtInst %fp8e4m3 %1 FClamp %fp8e4m3_1 %fp8e4m3_1 %fp8e4m3_1
480+ OpReturn
481+ OpFunctionEnd
482+ )" ;
483+
484+ CompileSuccessfully (spirv.c_str (), SPV_ENV_VULKAN_1_3 );
485+ EXPECT_EQ (SPV_ERROR_INVALID_CAPABILITY ,
486+ ValidateInstructions (SPV_ENV_UNIVERSAL_1_6 ));
487+ EXPECT_THAT (getDiagnosticString (),
488+ HasSubstr (" Operand 3 of TypeFloat requires one of these "
489+ " capabilities: Float8EXT" ));
490+ }
491+
404492struct OCPMicroscalingCase {
405493 const char * capability;
406494 const char * type_decl;
0 commit comments