Skip to content

Commit a827009

Browse files
authored
[Backport to 14] Implement SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate (#3839)
Backport of #3815
1 parent 6199b4e commit a827009

8 files changed

Lines changed: 218 additions & 10 deletions

File tree

include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ EXT(SPV_INTEL_2d_block_io)
7777
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
7878
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float4)
7979
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float8)
80+
EXT(SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate)
8081
EXT(SPV_KHR_bfloat16)
8182
EXT(SPV_INTEL_bfloat16_arithmetic)
8283
EXT(SPV_INTEL_16bit_atomics)

lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4132,16 +4132,19 @@ class SPIRVSubgroupMatrixMultiplyAccumulateINTELInst
41324132
}
41334133

41344134
protected:
4135+
virtual unsigned getOperandsLiteralIndex() const { return 4; }
4136+
41354137
void validate() const override {
41364138
SPIRVInstTemplateBase::validate();
41374139

41384140
// Check if FP4 or FP8 matrix operands are used
4139-
// Operands parameter is the last operand (index 4)
4141+
// Operands parameter is the last operand.
41404142
auto *NonConstThis =
41414143
const_cast<SPIRVSubgroupMatrixMultiplyAccumulateINTELInst *>(this);
4142-
if (NonConstThis->getOperands().size() > 4) {
4143-
const SPIRVConstant *OperandsConst =
4144-
static_cast<const SPIRVConstant *>(NonConstThis->getOperand(4));
4144+
const unsigned OperandsIdx = getOperandsLiteralIndex();
4145+
if (NonConstThis->getOperands().size() > OperandsIdx) {
4146+
const SPIRVConstant *OperandsConst = static_cast<const SPIRVConstant *>(
4147+
NonConstThis->getOperand(OperandsIdx));
41454148
uint64_t OperandsMask = OperandsConst->getZExtIntValue();
41464149

41474150
// FP4 operand bits
@@ -4162,15 +4165,16 @@ class SPIRVSubgroupMatrixMultiplyAccumulateINTELInst
41624165
spv::internal::
41634166
IMatrixMultiplyAccumulateOperandsMatrixBPackedFloat8E5M2INTELMask;
41644167

4168+
std::string InstName = OpCodeNameMap::map(getOpCode());
4169+
41654170
if ((OperandsMask & FP4Mask) != 0) {
41664171
getModule()->getErrorLog().checkError(
41674172
getModule()->isAllowedToUseExtension(
41684173
ExtensionID::
41694174
SPV_INTEL_subgroup_matrix_multiply_accumulate_float4),
41704175
SPIRVEC_RequiresExtension,
4171-
"SPV_INTEL_subgroup_matrix_multiply_accumulate_float4\n"
4172-
"SubgroupMatrixMultiplyAccumulateINTEL with FP4 operand flags "
4173-
"requires this extension");
4176+
"SPV_INTEL_subgroup_matrix_multiply_accumulate_float4\n" +
4177+
InstName + " with FP4 operand flags requires this extension");
41744178
getModule()->addExtension(
41754179
ExtensionID::SPV_INTEL_subgroup_matrix_multiply_accumulate_float4);
41764180
}
@@ -4181,9 +4185,8 @@ class SPIRVSubgroupMatrixMultiplyAccumulateINTELInst
41814185
ExtensionID::
41824186
SPV_INTEL_subgroup_matrix_multiply_accumulate_float8),
41834187
SPIRVEC_RequiresExtension,
4184-
"SPV_INTEL_subgroup_matrix_multiply_accumulate_float8\n"
4185-
"SubgroupMatrixMultiplyAccumulateINTEL with FP8 operand flags "
4186-
"requires this extension");
4188+
"SPV_INTEL_subgroup_matrix_multiply_accumulate_float8\n" +
4189+
InstName + " with FP8 operand flags requires this extension");
41874190
getModule()->addExtension(
41884191
ExtensionID::SPV_INTEL_subgroup_matrix_multiply_accumulate_float8);
41894192
}
@@ -4202,6 +4205,47 @@ class SPIRVSubgroupMatrixMultiplyAccumulateINTELInst
42024205
_SPIRV_OP(SubgroupMatrixMultiplyAccumulate, true, 7, true, 4)
42034206
#undef _SPIRV_OP
42044207

4208+
class SPIRVSubgroupScaledMatrixMultiplyAccumulateINTELInst
4209+
: public SPIRVSubgroupMatrixMultiplyAccumulateINTELInst {
4210+
public:
4211+
llvm::Optional<ExtensionID> getRequiredExtension() const override {
4212+
return ExtensionID::SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate;
4213+
}
4214+
4215+
protected:
4216+
unsigned getOperandsLiteralIndex() const override { return 6; }
4217+
4218+
void validate() const override {
4219+
SPIRVSubgroupMatrixMultiplyAccumulateINTELInst::validate();
4220+
4221+
// The Matrix Multiply Accumulate Operands literal is defined by the parent
4222+
// extension, so its extension and capability must be present too.
4223+
getModule()->getErrorLog().checkError(
4224+
getModule()->isAllowedToUseExtension(
4225+
ExtensionID::SPV_INTEL_subgroup_matrix_multiply_accumulate),
4226+
SPIRVEC_RequiresExtension,
4227+
"SPV_INTEL_subgroup_matrix_multiply_accumulate\n"
4228+
"SubgroupScaledMatrixMultiplyAccumulateINTEL depends on this "
4229+
"extension");
4230+
getModule()->addExtension(
4231+
ExtensionID::SPV_INTEL_subgroup_matrix_multiply_accumulate);
4232+
getModule()->addCapability(CapabilitySubgroupMatrixMultiplyAccumulateINTEL);
4233+
}
4234+
4235+
SPIRVCapVec getRequiredCapability() const override {
4236+
return getVec(
4237+
internal::CapabilitySubgroupScaledMatrixMultiplyAccumulateINTEL);
4238+
}
4239+
};
4240+
4241+
#define _SPIRV_OP(x, ...) \
4242+
typedef SPIRVInstTemplate< \
4243+
SPIRVSubgroupScaledMatrixMultiplyAccumulateINTELInst, \
4244+
internal::Op##x##INTEL, __VA_ARGS__> \
4245+
SPIRV##x##INTEL;
4246+
_SPIRV_OP(SubgroupScaledMatrixMultiplyAccumulate, true, 9, true, 6)
4247+
#undef _SPIRV_OP
4248+
42054249
class SPIRVPredicatedIOINTELInst : public SPIRVInstTemplateBase {
42064250
public:
42074251
llvm::Optional<ExtensionID> getRequiredExtension() const override {

lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
674674
"FloatConversionsFtoFINTEL");
675675
add(internal::CapabilityFloatConversionsFtoSINTEL,
676676
"FloatConversionsFtoSINTEL");
677+
add(internal::CapabilitySubgroupScaledMatrixMultiplyAccumulateINTEL,
678+
"SubgroupScaledMatrixMultiplyAccumulateINTEL");
677679
add(CapabilityRoundedDivideSqrtINTEL, "RoundedDivideSqrtINTEL");
678680
}
679681
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)

lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,5 @@ _SPIRV_OP_INTERNAL(ClampConvertFToSINTEL,
4242
internal::OpClampConvertFToSINTEL)
4343
_SPIRV_OP_INTERNAL(ClampStochasticRoundFToSINTEL,
4444
internal::OpClampStochasticRoundFToSINTEL)
45+
_SPIRV_OP_INTERNAL(SubgroupScaledMatrixMultiplyAccumulateINTEL,
46+
internal::OpSubgroupScaledMatrixMultiplyAccumulateINTEL)

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ enum InternalOp {
7474
IOpCooperativeMatrixConstructCheckedINTEL = 6195,
7575
IOpStochasticRoundFToFINTEL = 6217,
7676
IOpClampStochasticRoundFToSINTEL = 6219,
77+
IOpSubgroupScaledMatrixMultiplyAccumulateINTEL = 6264,
7778
IOpJointMatrixWorkItemLengthINTEL = 6410,
7879
IOpComplexFMulINTEL = 6415,
7980
IOpComplexFDivINTEL = 6416,
@@ -129,6 +130,7 @@ enum InternalCapability {
129130
ICapabilityAtomicInt16CompareExchangeINTEL = 6260,
130131
ICapabilityInt16AtomicsINTEL = 6261,
131132
ICapabilityAtomicBFloat16LoadStoreINTEL = 6262,
133+
ICapabilitySubgroupScaledMatrixMultiplyAccumulateINTEL = 6263,
132134
ICapabilityCooperativeMatrixPrefetchINTEL = 6411,
133135
ICapabilityComplexFloatMulDivINTEL = 6414,
134136
ICapabilityTensorFloat32RoundingINTEL = 6425,
@@ -182,6 +184,9 @@ enum InternalMatrixMultiplyAccumulateOperandsMask {
182184
// FP4 matrix operands
183185
IMatrixMultiplyAccumulateOperandsMatrixAPackedFloat4E2M1INTELMask = 0x40000,
184186
IMatrixMultiplyAccumulateOperandsMatrixBPackedFloat4E2M1INTELMask = 0x80000,
187+
// Scale factors for SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate.
188+
IMatrixMultiplyAccumulateOperandsScaleAFloat8E8M0INTELMask = 0x100000,
189+
IMatrixMultiplyAccumulateOperandsScaleBFloat8E8M0INTELMask = 0x200000,
185190
};
186191

187192
enum class LoadCacheControlINTEL {
@@ -261,6 +266,9 @@ _SPIRV_OP(Op, StochasticRoundFToFINTEL)
261266
_SPIRV_OP(Capability, FloatConversionsFtoSINTEL)
262267
_SPIRV_OP(Op, ClampConvertFToSINTEL)
263268
_SPIRV_OP(Op, ClampStochasticRoundFToSINTEL)
269+
270+
_SPIRV_OP(Capability, SubgroupScaledMatrixMultiplyAccumulateINTEL)
271+
_SPIRV_OP(Op, SubgroupScaledMatrixMultiplyAccumulateINTEL)
264272
#undef _SPIRV_OP
265273

266274
constexpr SourceLanguage SourceLanguagePython =
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; TODO: add spirv-val once SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
2+
; is registered with Khronos and SPIRV-Tools recognizes its capability/opcode.
3+
4+
; RUN: llvm-as %s -o %t.bc
5+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate,+SPV_INTEL_subgroup_matrix_multiply_accumulate_float4,+SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
6+
; RUN: llvm-spirv %t.spv --to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
7+
8+
; RUN: llvm-spirv %t.spv -r --spirv-target-env=SPV-IR -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-LLVM
9+
10+
; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate,+SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate -o %t.fail.spv 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR-FP4
11+
; CHECK-ERROR-FP4: RequiresExtension: Feature requires the following SPIR-V extension:
12+
; CHECK-ERROR-FP4: SPV_INTEL_subgroup_matrix_multiply_accumulate_float4
13+
; CHECK-ERROR-FP4: SubgroupScaledMatrixMultiplyAccumulateINTEL with FP4 operand flags
14+
15+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
16+
target triple = "spir64-unknown-unknown"
17+
18+
; CHECK-SPIRV-DAG: Capability SubgroupMatrixMultiplyAccumulateINTEL
19+
; CHECK-SPIRV-DAG: Capability SubgroupScaledMatrixMultiplyAccumulateINTEL
20+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_matrix_multiply_accumulate"
21+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_matrix_multiply_accumulate_float4"
22+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate"
23+
24+
; CHECK-SPIRV: SubgroupScaledMatrixMultiplyAccumulateINTEL
25+
26+
; CHECK-LLVM: %{{.*}} = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fDv2_cS2_i(i32 64, <8 x i16> %{{.*}}, <8 x i32> %{{.*}}, <8 x float> %{{.*}}, <2 x i8> %{{.*}}, <2 x i8> %{{.*}}, i32 3932160)
27+
28+
define spir_func void @foo(<8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8,
29+
<2 x i8> %sA, <2 x i8> %sB) {
30+
entry:
31+
; Operands: ScaleA/BFloat8E8M0INTEL (0x300000) | MatrixAPackedFloat4E2M1INTEL (0x40000) | MatrixBPackedFloat4E2M1INTEL (0x80000)
32+
; = 0x3C0000 = 3932160
33+
%call = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fDv2_cS2_i(i32 64, <8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8, <2 x i8> %sA, <2 x i8> %sB, i32 3932160)
34+
ret void
35+
}
36+
37+
declare spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fDv2_cS2_i(i32, <8 x i16>, <8 x i32>, <8 x float>, <2 x i8>, <2 x i8>, i32)
38+
39+
!opencl.spir.version = !{!0}
40+
!spirv.Source = !{!1}
41+
42+
!0 = !{i32 1, i32 0}
43+
!1 = !{i32 4, i32 100000}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; TODO: add spirv-val once SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
2+
; is registered with Khronos and SPIRV-Tools recognizes its capability/opcode.
3+
4+
; RUN: llvm-as %s -o %t.bc
5+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate,+SPV_INTEL_subgroup_matrix_multiply_accumulate_float8,+SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
6+
; RUN: llvm-spirv %t.spv --to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
7+
8+
; RUN: llvm-spirv %t.spv -r --spirv-target-env=SPV-IR -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-LLVM
9+
10+
; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate,+SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate -o %t.fail.spv 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR-FP8
11+
; CHECK-ERROR-FP8: RequiresExtension: Feature requires the following SPIR-V extension:
12+
; CHECK-ERROR-FP8: SPV_INTEL_subgroup_matrix_multiply_accumulate_float8
13+
; CHECK-ERROR-FP8: SubgroupScaledMatrixMultiplyAccumulateINTEL with FP8 operand flags
14+
15+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
16+
target triple = "spir64-unknown-unknown"
17+
18+
; CHECK-SPIRV-DAG: Capability SubgroupMatrixMultiplyAccumulateINTEL
19+
; CHECK-SPIRV-DAG: Capability SubgroupScaledMatrixMultiplyAccumulateINTEL
20+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_matrix_multiply_accumulate"
21+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_matrix_multiply_accumulate_float8"
22+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate"
23+
24+
; CHECK-SPIRV: SubgroupScaledMatrixMultiplyAccumulateINTEL
25+
26+
; CHECK-LLVM: %{{.*}} = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32 32, <8 x i16> %{{.*}}, <8 x i32> %{{.*}}, <8 x float> %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, i32 3194880)
27+
28+
define spir_func void @foo(<8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8,
29+
i8 %sA, i8 %sB) {
30+
entry:
31+
; Operands: ScaleA/BFloat8E8M0INTEL (0x300000) | MatrixAPackedFloat8E4M3INTEL (0x4000) | MatrixBPackedFloat8E4M3INTEL (0x8000)
32+
; = 0x30C000 = 3194880
33+
%call = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32 32, <8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8, i8 %sA, i8 %sB, i32 3194880)
34+
ret void
35+
}
36+
37+
declare spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32, <8 x i16>, <8 x i32>, <8 x float>, i8, i8, i32)
38+
39+
!opencl.spir.version = !{!0}
40+
!spirv.Source = !{!1}
41+
42+
!0 = !{i32 1, i32 0}
43+
!1 = !{i32 4, i32 100000}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; Source (OpenCL C, conceptual):
2+
; float8 __spirv_SubgroupScaledMatrixMultiplyAccumulateINTEL(
3+
; int K_Dim, short8 Matrix_A, int8 Matrix_B, float8 Matrix_C,
4+
; uchar Scale_A, uchar Scale_B, int Operands);
5+
; int __spirv_SubgroupScaledMatrixMultiplyAccumulateINTEL(
6+
; int K_Dim, int Matrix_A, int8 Matrix_B, int Matrix_C,
7+
; uchar Scale_A, uchar Scale_B);
8+
9+
; TODO: add spirv-val once SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
10+
; is registered with Khronos and SPIRV-Tools recognizes its capability/opcode.
11+
12+
; RUN: llvm-as %s -o %t.bc
13+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate,+SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
14+
; RUN: llvm-spirv %t.spv --to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
15+
16+
; RUN: llvm-spirv %t.spv -r --spirv-target-env=SPV-IR -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-LLVM
17+
18+
; RUN: not llvm-spirv %t.bc -o %t.fail.spv 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
19+
; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V extension:
20+
; CHECK-ERROR: SPV_INTEL_subgroup_matrix_multiply_accumulate
21+
22+
; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_matrix_multiply_accumulate -o %t.fail.spv 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR-NEW
23+
; CHECK-ERROR-NEW: RequiresExtension: Feature requires the following SPIR-V extension:
24+
; CHECK-ERROR-NEW: SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate
25+
26+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
27+
target triple = "spir64-unknown-unknown"
28+
29+
; CHECK-SPIRV-DAG: Capability SubgroupMatrixMultiplyAccumulateINTEL
30+
; CHECK-SPIRV-DAG: Capability SubgroupScaledMatrixMultiplyAccumulateINTEL
31+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_matrix_multiply_accumulate"
32+
; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_scaled_matrix_multiply_accumulate"
33+
34+
; CHECK-SPIRV-DAG: TypeInt [[#Int32Ty:]] 32 0
35+
; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Const16:]] 16
36+
; CHECK-SPIRV-DAG: TypeFloat [[#FloatTy:]] 32
37+
; CHECK-SPIRV-DAG: TypeVector [[#Vec8FloatTy:]] [[#FloatTy]] 8
38+
39+
; fp16 x fp16 + fp32 with e8m0 scales (operands mask = 0x30000A: MatrixA/BPackedFloat16 (0xA) + ScaleA/BFloat8E8M0 (0x300000)).
40+
; CHECK-SPIRV: SubgroupScaledMatrixMultiplyAccumulateINTEL [[#Vec8FloatTy]] [[#]] [[#Const16]] [[#]] [[#iM8:]] [[#]] [[#sA:]] [[#sB:]] {{[0-9]+}}
41+
; CHECK-SPIRV: SubgroupScaledMatrixMultiplyAccumulateINTEL [[#Int32Ty]] [[#]] [[#Const16]] [[#]] [[#iM8]] [[#]] [[#sA]] [[#sB]] {{$}}
42+
43+
; CHECK-LLVM: %{{.*}} = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32 16, <8 x i16> %{{.*}}, <8 x i32> %{{.*}}, <8 x float> %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, i32 3145738)
44+
; CHECK-LLVM: %{{.*}} = call spir_func i32 @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiiDv8_iicc(i32 16, i32 %{{.*}}, <8 x i32> %{{.*}}, i32 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
45+
46+
define spir_func void @foo(<8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8,
47+
i8 %sA, i8 %sB, i32 %iA, i32 %iC) {
48+
entry:
49+
; Operands: ScaleAFloat8E8M0INTEL (0x100000) | ScaleBFloat8E8M0INTEL (0x200000)
50+
; | MatrixAPackedFloat16INTEL (0x2) | MatrixBPackedFloat16INTEL (0x8)
51+
; = 0x30000A = 3145738
52+
%call = call spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32 16, <8 x i16> %sM8, <8 x i32> %iM8, <8 x float> %fM8, i8 %sA, i8 %sB, i32 3145738)
53+
%call2 = call spir_func i32 @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiiDv8_iicc(i32 16, i32 %iA, <8 x i32> %iM8, i32 %iC, i8 %sA, i8 %sB)
54+
ret void
55+
}
56+
57+
declare spir_func <8 x float> @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiDv8_sDv8_iDv8_fcci(i32, <8 x i16>, <8 x i32>, <8 x float>, i8, i8, i32)
58+
59+
declare spir_func i32 @_Z51__spirv_SubgroupScaledMatrixMultiplyAccumulateINTELiiDv8_iicc(i32, i32, <8 x i32>, i32, i8, i8)
60+
61+
!opencl.spir.version = !{!0}
62+
!spirv.Source = !{!1}
63+
64+
!0 = !{i32 1, i32 0}
65+
!1 = !{i32 4, i32 100000}

0 commit comments

Comments
 (0)