Skip to content

Commit 7ca6bc5

Browse files
committed
Update DX intrinsic expansion for new llvm intrinsics
The new LLVM integer intrinsics replace the previous dx intrinsics. This updates the DXIL intrinsic expansion code and tests to use and expect the new integer intrinsics and the flattened DX floating vector size variants only after op lowering. Part of #88056
1 parent 6fde4bc commit 7ca6bc5

File tree

5 files changed

+96
-96
lines changed

5 files changed

+96
-96
lines changed

llvm/include/llvm/IR/IntrinsicsDirectX.td

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,18 @@ def int_dx_any : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_any_ty]>;
2525
def int_dx_clamp : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
2626
def int_dx_uclamp : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
2727

28-
def int_dx_dot2 :
29-
Intrinsic<[LLVMVectorElementType<0>],
28+
def int_dx_dot2 :
29+
Intrinsic<[LLVMVectorElementType<0>],
3030
[llvm_anyfloat_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>],
3131
[IntrNoMem, IntrWillReturn, Commutative] >;
32-
def int_dx_dot3 :
33-
Intrinsic<[LLVMVectorElementType<0>],
32+
def int_dx_dot3 :
33+
Intrinsic<[LLVMVectorElementType<0>],
3434
[llvm_anyfloat_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>],
3535
[IntrNoMem, IntrWillReturn, Commutative] >;
36-
def int_dx_dot4 :
37-
Intrinsic<[LLVMVectorElementType<0>],
36+
def int_dx_dot4 :
37+
Intrinsic<[LLVMVectorElementType<0>],
3838
[llvm_anyfloat_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>],
3939
[IntrNoMem, IntrWillReturn, Commutative] >;
40-
def int_dx_sdot :
41-
Intrinsic<[LLVMVectorElementType<0>],
42-
[llvm_anyint_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>],
43-
[IntrNoMem, IntrWillReturn, Commutative] >;
44-
def int_dx_udot :
45-
Intrinsic<[LLVMVectorElementType<0>],
46-
[llvm_anyint_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>],
47-
[IntrNoMem, IntrWillReturn, Commutative] >;
4840

4941
def int_dx_frac : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
5042

llvm/lib/Target/DirectX/DXIL.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ def UMad : DXILOp<49, tertiary> {
637637

638638
def Dot2 : DXILOp<54, dot2> {
639639
let Doc = "dot product of two float vectors Dot(a,b) = a[0]*b[0] + ... + "
640-
"a[n]*b[n] where n is between 0 and 1";
640+
"a[n]*b[n] where n is 0 to 1 inclusive";
641641
let LLVMIntrinsic = int_dx_dot2;
642642
let arguments = !listsplat(overloadTy, 4);
643643
let result = overloadTy;
@@ -648,7 +648,7 @@ def Dot2 : DXILOp<54, dot2> {
648648

649649
def Dot3 : DXILOp<55, dot3> {
650650
let Doc = "dot product of two float vectors Dot(a,b) = a[0]*b[0] + ... + "
651-
"a[n]*b[n] where n is between 0 and 2";
651+
"a[n]*b[n] where n is 0 to 2 inclusive";
652652
let LLVMIntrinsic = int_dx_dot3;
653653
let arguments = !listsplat(overloadTy, 6);
654654
let result = overloadTy;
@@ -659,7 +659,7 @@ def Dot3 : DXILOp<55, dot3> {
659659

660660
def Dot4 : DXILOp<56, dot4> {
661661
let Doc = "dot product of two float vectors Dot(a,b) = a[0]*b[0] + ... + "
662-
"a[n]*b[n] where n is between 0 and 3";
662+
"a[n]*b[n] where n is 0 to 3 inclusive";
663663
let LLVMIntrinsic = int_dx_dot4;
664664
let arguments = !listsplat(overloadTy, 8);
665665
let result = overloadTy;

llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ static bool isIntrinsicExpansion(Function &F) {
4343
case Intrinsic::dx_uclamp:
4444
case Intrinsic::dx_lerp:
4545
case Intrinsic::dx_length:
46-
case Intrinsic::dx_sdot:
47-
case Intrinsic::dx_udot:
46+
case Intrinsic::sdot:
47+
case Intrinsic::udot:
4848
case Intrinsic::fdot:
4949
return true;
5050
}
@@ -72,10 +72,11 @@ static bool expandAbs(CallInst *Orig) {
7272
}
7373

7474
static bool expandDotIntrinsic(CallInst *Orig, Intrinsic::ID DotIntrinsic) {
75-
assert(DotIntrinsic == Intrinsic::dx_sdot ||
76-
DotIntrinsic == Intrinsic::dx_udot || DotIntrinsic == Intrinsic::fdot);
75+
assert(DotIntrinsic == Intrinsic::sdot || DotIntrinsic == Intrinsic::udot ||
76+
DotIntrinsic == Intrinsic::fdot);
7777
Value *A = Orig->getOperand(0);
7878
Value *B = Orig->getOperand(1);
79+
7980
[[maybe_unused]] Type *ATy = A->getType();
8081
[[maybe_unused]] Type *BTy = B->getType();
8182
assert(ATy->isVectorTy() && BTy->isVectorTy());
@@ -88,7 +89,7 @@ static bool expandDotIntrinsic(CallInst *Orig, Intrinsic::ID DotIntrinsic) {
8889
Value *Result;
8990
if (EltTy->isIntegerTy()) {
9091
// Expand integer dot product to multiply and add ops
91-
Intrinsic::ID MadIntrinsic = DotIntrinsic == Intrinsic::dx_sdot
92+
Intrinsic::ID MadIntrinsic = DotIntrinsic == Intrinsic::sdot
9293
? Intrinsic::dx_imad
9394
: Intrinsic::dx_umad;
9495
Value *Elt0 = Builder.CreateExtractElement(A, (uint64_t)0);
@@ -340,9 +341,9 @@ static bool expandIntrinsic(Function &F, CallInst *Orig) {
340341
return expandLerpIntrinsic(Orig);
341342
case Intrinsic::dx_length:
342343
return expandLengthIntrinsic(Orig);
343-
case Intrinsic::dx_sdot:
344-
case Intrinsic::dx_udot:
345344
case Intrinsic::fdot:
345+
case Intrinsic::sdot:
346+
case Intrinsic::udot:
346347
return expandDotIntrinsic(Orig, F.getIntrinsicID());
347348
}
348349
return false;

llvm/test/CodeGen/DirectX/fdot.ll

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,101 @@
1+
; RUN: opt -S -dxil-intrinsic-expansion -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,EXPCHECK
12
; RUN: opt -S -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
23

3-
; Make sure dxil operation function calls for dot are generated for int/uint vectors.
4+
; Make sure dxil operation function calls for dot are generated for float type vectors.
45

56
; CHECK-LABEL: dot_half2
67
define noundef half @dot_half2(<2 x half> noundef %a, <2 x half> noundef %b) {
78
entry:
8-
; CHECK: extractelement <2 x half> %a, i32 0
9-
; CHECK: extractelement <2 x half> %a, i32 1
10-
; CHECK: extractelement <2 x half> %b, i32 0
11-
; CHECK: extractelement <2 x half> %b, i32 1
12-
; CHECK: call half @dx.op.dot2.f16(i32 54, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
13-
%dx.dot = call half @llvm.dx.dot2.v2f16(<2 x half> %a, <2 x half> %b)
9+
; DOPCHECK: extractelement <2 x half> %a, i32 0
10+
; DOPCHECK: extractelement <2 x half> %a, i32 1
11+
; DOPCHECK: extractelement <2 x half> %b, i32 0
12+
; DOPCHECK: extractelement <2 x half> %b, i32 1
13+
; DOPCHECK: call half @dx.op.dot2.f16(i32 54, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
14+
; EXPCHECK: call half @llvm.dx.dot2.v2f16(<2 x half> %a, <2 x half> %b)
15+
%dx.dot = call half @llvm.fdot.v2f16(<2 x half> %a, <2 x half> %b)
1416
ret half %dx.dot
1517
}
1618

1719
; CHECK-LABEL: dot_half3
1820
define noundef half @dot_half3(<3 x half> noundef %a, <3 x half> noundef %b) {
1921
entry:
20-
; CHECK: extractelement <3 x half> %a, i32 0
21-
; CHECK: extractelement <3 x half> %a, i32 1
22-
; CHECK: extractelement <3 x half> %a, i32 2
23-
; CHECK: extractelement <3 x half> %b, i32 0
24-
; CHECK: extractelement <3 x half> %b, i32 1
25-
; CHECK: extractelement <3 x half> %b, i32 2
26-
; CHECK: call half @dx.op.dot3.f16(i32 55, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
27-
%dx.dot = call half @llvm.dx.dot3.v3f16(<3 x half> %a, <3 x half> %b)
22+
; DOPCHECK: extractelement <3 x half> %a, i32 0
23+
; DOPCHECK: extractelement <3 x half> %a, i32 1
24+
; DOPCHECK: extractelement <3 x half> %a, i32 2
25+
; DOPCHECK: extractelement <3 x half> %b, i32 0
26+
; DOPCHECK: extractelement <3 x half> %b, i32 1
27+
; DOPCHECK: extractelement <3 x half> %b, i32 2
28+
; DOPCHECK: call half @dx.op.dot3.f16(i32 55, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
29+
; EXPCHECK: call half @llvm.dx.dot3.v3f16(<3 x half> %a, <3 x half> %b)
30+
%dx.dot = call half @llvm.fdot.v3f16(<3 x half> %a, <3 x half> %b)
2831
ret half %dx.dot
2932
}
3033

3134
; CHECK-LABEL: dot_half4
3235
define noundef half @dot_half4(<4 x half> noundef %a, <4 x half> noundef %b) {
3336
entry:
34-
; CHECK: extractelement <4 x half> %a, i32 0
35-
; CHECK: extractelement <4 x half> %a, i32 1
36-
; CHECK: extractelement <4 x half> %a, i32 2
37-
; CHECK: extractelement <4 x half> %a, i32 3
38-
; CHECK: extractelement <4 x half> %b, i32 0
39-
; CHECK: extractelement <4 x half> %b, i32 1
40-
; CHECK: extractelement <4 x half> %b, i32 2
41-
; CHECK: extractelement <4 x half> %b, i32 3
42-
; CHECK: call half @dx.op.dot4.f16(i32 56, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
43-
%dx.dot = call half @llvm.dx.dot4.v4f16(<4 x half> %a, <4 x half> %b)
37+
; DOPCHECK: extractelement <4 x half> %a, i32 0
38+
; DOPCHECK: extractelement <4 x half> %a, i32 1
39+
; DOPCHECK: extractelement <4 x half> %a, i32 2
40+
; DOPCHECK: extractelement <4 x half> %a, i32 3
41+
; DOPCHECK: extractelement <4 x half> %b, i32 0
42+
; DOPCHECK: extractelement <4 x half> %b, i32 1
43+
; DOPCHECK: extractelement <4 x half> %b, i32 2
44+
; DOPCHECK: extractelement <4 x half> %b, i32 3
45+
; DOPCHECK: call half @dx.op.dot4.f16(i32 56, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
46+
; EXPCHECK: call half @llvm.dx.dot4.v4f16(<4 x half> %a, <4 x half> %b)
47+
%dx.dot = call half @llvm.fdot.v4f16(<4 x half> %a, <4 x half> %b)
4448
ret half %dx.dot
4549
}
4650

4751
; CHECK-LABEL: dot_float2
4852
define noundef float @dot_float2(<2 x float> noundef %a, <2 x float> noundef %b) {
4953
entry:
50-
; CHECK: extractelement <2 x float> %a, i32 0
51-
; CHECK: extractelement <2 x float> %a, i32 1
52-
; CHECK: extractelement <2 x float> %b, i32 0
53-
; CHECK: extractelement <2 x float> %b, i32 1
54-
; CHECK: call float @dx.op.dot2.f32(i32 54, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
55-
%dx.dot = call float @llvm.dx.dot2.v2f32(<2 x float> %a, <2 x float> %b)
54+
; DOPCHECK: extractelement <2 x float> %a, i32 0
55+
; DOPCHECK: extractelement <2 x float> %a, i32 1
56+
; DOPCHECK: extractelement <2 x float> %b, i32 0
57+
; DOPCHECK: extractelement <2 x float> %b, i32 1
58+
; DOPCHECK: call float @dx.op.dot2.f32(i32 54, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
59+
; EXPCHECK: call float @llvm.dx.dot2.v2f32(<2 x float> %a, <2 x float> %b)
60+
%dx.dot = call float @llvm.fdot.v2f32(<2 x float> %a, <2 x float> %b)
5661
ret float %dx.dot
5762
}
5863

5964
; CHECK-LABEL: dot_float3
6065
define noundef float @dot_float3(<3 x float> noundef %a, <3 x float> noundef %b) {
6166
entry:
62-
; CHECK: extractelement <3 x float> %a, i32 0
63-
; CHECK: extractelement <3 x float> %a, i32 1
64-
; CHECK: extractelement <3 x float> %a, i32 2
65-
; CHECK: extractelement <3 x float> %b, i32 0
66-
; CHECK: extractelement <3 x float> %b, i32 1
67-
; CHECK: extractelement <3 x float> %b, i32 2
68-
; CHECK: call float @dx.op.dot3.f32(i32 55, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
69-
%dx.dot = call float @llvm.dx.dot3.v3f32(<3 x float> %a, <3 x float> %b)
67+
; DOPCHECK: extractelement <3 x float> %a, i32 0
68+
; DOPCHECK: extractelement <3 x float> %a, i32 1
69+
; DOPCHECK: extractelement <3 x float> %a, i32 2
70+
; DOPCHECK: extractelement <3 x float> %b, i32 0
71+
; DOPCHECK: extractelement <3 x float> %b, i32 1
72+
; DOPCHECK: extractelement <3 x float> %b, i32 2
73+
; DOPCHECK: call float @dx.op.dot3.f32(i32 55, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
74+
; EXPCHECK: call float @llvm.dx.dot3.v3f32(<3 x float> %a, <3 x float> %b)
75+
%dx.dot = call float @llvm.fdot.v3f32(<3 x float> %a, <3 x float> %b)
7076
ret float %dx.dot
7177
}
7278

7379
; CHECK-LABEL: dot_float4
7480
define noundef float @dot_float4(<4 x float> noundef %a, <4 x float> noundef %b) {
7581
entry:
76-
; CHECK: extractelement <4 x float> %a, i32 0
77-
; CHECK: extractelement <4 x float> %a, i32 1
78-
; CHECK: extractelement <4 x float> %a, i32 2
79-
; CHECK: extractelement <4 x float> %a, i32 3
80-
; CHECK: extractelement <4 x float> %b, i32 0
81-
; CHECK: extractelement <4 x float> %b, i32 1
82-
; CHECK: extractelement <4 x float> %b, i32 2
83-
; CHECK: extractelement <4 x float> %b, i32 3
84-
; CHECK: call float @dx.op.dot4.f32(i32 56, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
85-
%dx.dot = call float @llvm.dx.dot4.v4f32(<4 x float> %a, <4 x float> %b)
82+
; DOPCHECK: extractelement <4 x float> %a, i32 0
83+
; DOPCHECK: extractelement <4 x float> %a, i32 1
84+
; DOPCHECK: extractelement <4 x float> %a, i32 2
85+
; DOPCHECK: extractelement <4 x float> %a, i32 3
86+
; DOPCHECK: extractelement <4 x float> %b, i32 0
87+
; DOPCHECK: extractelement <4 x float> %b, i32 1
88+
; DOPCHECK: extractelement <4 x float> %b, i32 2
89+
; DOPCHECK: extractelement <4 x float> %b, i32 3
90+
; DOPCHECK: call float @dx.op.dot4.f32(i32 56, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
91+
; EXPCHECK: call float @llvm.dx.dot4.v4f32(<4 x float> %a, <4 x float> %b)
92+
%dx.dot = call float @llvm.fdot.v4f32(<4 x float> %a, <4 x float> %b)
8693
ret float %dx.dot
8794
}
8895

89-
declare half @llvm.dx.dot.v2f16(<2 x half> , <2 x half> )
90-
declare half @llvm.dx.dot.v3f16(<3 x half> , <3 x half> )
91-
declare half @llvm.dx.dot.v4f16(<4 x half> , <4 x half> )
92-
declare float @llvm.dx.dot.v2f32(<2 x float>, <2 x float>)
93-
declare float @llvm.dx.dot.v3f32(<3 x float>, <3 x float>)
94-
declare float @llvm.dx.dot.v4f32(<4 x float>, <4 x float>)
96+
declare half @llvm.fdot.v2f16(<2 x half> , <2 x half> )
97+
declare half @llvm.fdot.v3f16(<3 x half> , <3 x half> )
98+
declare half @llvm.fdot.v4f16(<4 x half> , <4 x half> )
99+
declare float @llvm.fdot.v2f32(<2 x float>, <2 x float>)
100+
declare float @llvm.fdot.v3f32(<3 x float>, <3 x float>)
101+
declare float @llvm.fdot.v4f32(<4 x float>, <4 x float>)

llvm/test/CodeGen/DirectX/idot.ll

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ entry:
1313
; CHECK: extractelement <2 x i16> %b, i64 1
1414
; EXPCHECK: call i16 @llvm.dx.imad.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
1515
; DOPCHECK: call i16 @dx.op.tertiary.i16(i32 48, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
16-
%dx.dot = call i16 @llvm.dx.sdot.v3i16(<2 x i16> %a, <2 x i16> %b)
17-
ret i16 %dx.dot
16+
%dot = call i16 @llvm.sdot.v3i16(<2 x i16> %a, <2 x i16> %b)
17+
ret i16 %dot
1818
}
1919

20-
; CHECK-LABEL: sdot_int4
21-
define noundef i32 @sdot_int4(<4 x i32> noundef %a, <4 x i32> noundef %b) {
20+
; CHECK-LABEL: dot_int4
21+
define noundef i32 @dot_int4(<4 x i32> noundef %a, <4 x i32> noundef %b) {
2222
entry:
2323
; CHECK: extractelement <4 x i32> %a, i64 0
2424
; CHECK: extractelement <4 x i32> %b, i64 0
@@ -35,8 +35,8 @@ entry:
3535
; CHECK: extractelement <4 x i32> %b, i64 3
3636
; EXPCHECK: call i32 @llvm.dx.imad.i32(i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}})
3737
; DOPCHECK: call i32 @dx.op.tertiary.i32(i32 48, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}})
38-
%dx.dot = call i32 @llvm.dx.sdot.v4i32(<4 x i32> %a, <4 x i32> %b)
39-
ret i32 %dx.dot
38+
%dot = call i32 @llvm.sdot.v4i32(<4 x i32> %a, <4 x i32> %b)
39+
ret i32 %dot
4040
}
4141

4242
; CHECK-LABEL: dot_uint16_t3
@@ -53,8 +53,8 @@ entry:
5353
; CHECK: extractelement <3 x i16> %b, i64 2
5454
; EXPCHECK: call i16 @llvm.dx.umad.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
5555
; DOPCHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
56-
%dx.dot = call i16 @llvm.dx.udot.v3i16(<3 x i16> %a, <3 x i16> %b)
57-
ret i16 %dx.dot
56+
%dot = call i16 @llvm.udot.v3i16(<3 x i16> %a, <3 x i16> %b)
57+
ret i16 %dot
5858
}
5959

6060
; CHECK-LABEL: dot_uint4
@@ -75,8 +75,8 @@ entry:
7575
; CHECK: extractelement <4 x i32> %b, i64 3
7676
; EXPCHECK: call i32 @llvm.dx.umad.i32(i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}})
7777
; DOPCHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}})
78-
%dx.dot = call i32 @llvm.dx.udot.v4i32(<4 x i32> %a, <4 x i32> %b)
79-
ret i32 %dx.dot
78+
%dot = call i32 @llvm.udot.v4i32(<4 x i32> %a, <4 x i32> %b)
79+
ret i32 %dot
8080
}
8181

8282
; CHECK-LABEL: dot_uint64_t4
@@ -89,12 +89,12 @@ entry:
8989
; CHECK: extractelement <2 x i64> %b, i64 1
9090
; EXPCHECK: call i64 @llvm.dx.umad.i64(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
9191
; DOPCHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
92-
%dx.dot = call i64 @llvm.dx.udot.v2i64(<2 x i64> %a, <2 x i64> %b)
93-
ret i64 %dx.dot
92+
%dot = call i64 @llvm.udot.v2i64(<2 x i64> %a, <2 x i64> %b)
93+
ret i64 %dot
9494
}
9595

96-
declare i16 @llvm.dx.sdot.v2i16(<2 x i16>, <2 x i16>)
97-
declare i32 @llvm.dx.sdot.v4i32(<4 x i32>, <4 x i32>)
98-
declare i16 @llvm.dx.udot.v3i32(<3 x i16>, <3 x i16>)
99-
declare i32 @llvm.dx.udot.v4i32(<4 x i32>, <4 x i32>)
100-
declare i64 @llvm.dx.udot.v2i64(<2 x i64>, <2 x i64>)
96+
declare i16 @llvm.sdot.v2i16(<2 x i16>, <2 x i16>)
97+
declare i32 @llvm.sdot.v4i32(<4 x i32>, <4 x i32>)
98+
declare i16 @llvm.udot.v3i32(<3 x i16>, <3 x i16>)
99+
declare i32 @llvm.udot.v4i32(<4 x i32>, <4 x i32>)
100+
declare i64 @llvm.udot.v2i64(<2 x i64>, <2 x i64>)

0 commit comments

Comments
 (0)