xref: /llvm-project/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/idot.ll (revision dcd69ddefb66c0627f41547b5fdc166030d76ccb)
1*dcd69ddeSFinn Plummer; RUN: llc -O0 -mtriple=spirv1.5-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP
2*dcd69ddeSFinn Plummer; RUN: llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT
3*dcd69ddeSFinn Plummer; RUN: llc -O0 -mtriple=spirv1.5-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT
4*dcd69ddeSFinn Plummer; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.5-unknown-unknown %s -o - -filetype=obj | spirv-val %}
5*dcd69ddeSFinn Plummer; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6*dcd69ddeSFinn Plummer; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.5-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %}
7319c7a42SGreg Roth
8319c7a42SGreg Roth; Make sure dxil operation function calls for dot are generated for int/uint vectors.
9319c7a42SGreg Roth
10*dcd69ddeSFinn Plummer; CHECK-DAG: OpCapability Int8
11*dcd69ddeSFinn Plummer; CHECK-DOT-DAG: OpCapability DotProduct
12*dcd69ddeSFinn Plummer; CHECK-DOT-DAG: OpCapability DotProductInputAll
13*dcd69ddeSFinn Plummer; CHECK-DOT-DAG: OpCapability DotProductInput4x8Bit
14*dcd69ddeSFinn Plummer; CHECK-EXT-DAG: OpExtension "SPV_KHR_integer_dot_product"
15*dcd69ddeSFinn Plummer
16*dcd69ddeSFinn Plummer; CHECK-DAG: %[[#int_8:]] = OpTypeInt 8
17*dcd69ddeSFinn Plummer; CHECK-DAG: %[[#vec4_int_8:]] = OpTypeVector %[[#int_8]] 4
18319c7a42SGreg Roth; CHECK-DAG: %[[#int_16:]] = OpTypeInt 16
19319c7a42SGreg Roth; CHECK-DAG: %[[#vec2_int_16:]] = OpTypeVector %[[#int_16]] 2
20319c7a42SGreg Roth; CHECK-DAG: %[[#vec3_int_16:]] = OpTypeVector %[[#int_16]] 3
21319c7a42SGreg Roth; CHECK-DAG: %[[#int_32:]] = OpTypeInt 32
22319c7a42SGreg Roth; CHECK-DAG: %[[#vec4_int_32:]] = OpTypeVector %[[#int_32]] 4
23319c7a42SGreg Roth; CHECK-DAG: %[[#int_64:]] = OpTypeInt 64
24319c7a42SGreg Roth; CHECK-DAG: %[[#vec2_int_64:]] = OpTypeVector %[[#int_64]] 2
25319c7a42SGreg Roth
26*dcd69ddeSFinn Plummerdefine noundef i8 @dot_int8_t4(<4 x i8> noundef %a, <4 x i8> noundef %b) {
27*dcd69ddeSFinn Plummerentry:
28*dcd69ddeSFinn Plummer; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec4_int_8]]
29*dcd69ddeSFinn Plummer; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec4_int_8]]
30*dcd69ddeSFinn Plummer
31*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpSDot %[[#int_8]] %[[#arg0]] %[[#arg1]]
32*dcd69ddeSFinn Plummer
33*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec4_int_8]] %[[#arg0]] %[[#arg1]]
34*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_8]] %[[#mul_vec]] 0
35*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_8]] %[[#mul_vec]] 1
36*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum:]] = OpIAdd %[[#int_8]] %[[#elt0]] %[[#elt1]]
37*dcd69ddeSFinn Plummer  %dot = call i8 @llvm.spv.sdot.v4i8(<4 x i8> %a, <4 x i8> %b)
38*dcd69ddeSFinn Plummer  ret i8 %dot
39*dcd69ddeSFinn Plummer}
40*dcd69ddeSFinn Plummer
41319c7a42SGreg Rothdefine noundef i16 @dot_int16_t2(<2 x i16> noundef %a, <2 x i16> noundef %b) {
42319c7a42SGreg Rothentry:
43319c7a42SGreg Roth; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec2_int_16]]
44319c7a42SGreg Roth; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec2_int_16]]
45*dcd69ddeSFinn Plummer
46*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpSDot %[[#int_16]] %[[#arg0]] %[[#arg1]]
47*dcd69ddeSFinn Plummer
48*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec2_int_16]] %[[#arg0]] %[[#arg1]]
49*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_16]] %[[#mul_vec]] 0
50*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_16]] %[[#mul_vec]] 1
51*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum:]] = OpIAdd %[[#int_16]] %[[#elt0]] %[[#elt1]]
52319c7a42SGreg Roth  %dot = call i16 @llvm.spv.sdot.v3i16(<2 x i16> %a, <2 x i16> %b)
53319c7a42SGreg Roth  ret i16 %dot
54319c7a42SGreg Roth}
55319c7a42SGreg Roth
56319c7a42SGreg Rothdefine noundef i32 @dot_int4(<4 x i32> noundef %a, <4 x i32> noundef %b) {
57319c7a42SGreg Rothentry:
58319c7a42SGreg Roth; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec4_int_32]]
59319c7a42SGreg Roth; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec4_int_32]]
60*dcd69ddeSFinn Plummer
61*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpSDot %[[#int_32]] %[[#arg0]] %[[#arg1]]
62*dcd69ddeSFinn Plummer
63*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec4_int_32]] %[[#arg0]] %[[#arg1]]
64*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 0
65*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 1
66*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum0:]] = OpIAdd %[[#int_32]] %[[#elt0]] %[[#elt1]]
67*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt2:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 2
68*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum1:]] = OpIAdd %[[#int_32]] %[[#sum0]] %[[#elt2]]
69*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt3:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 3
70*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum2:]] = OpIAdd %[[#int_32]] %[[#sum1]] %[[#elt3]]
71319c7a42SGreg Roth  %dot = call i32 @llvm.spv.sdot.v4i32(<4 x i32> %a, <4 x i32> %b)
72319c7a42SGreg Roth  ret i32 %dot
73319c7a42SGreg Roth}
74319c7a42SGreg Roth
75*dcd69ddeSFinn Plummerdefine noundef i8 @dot_uint8_t4(<4 x i8> noundef %a, <4 x i8> noundef %b) {
76*dcd69ddeSFinn Plummerentry:
77*dcd69ddeSFinn Plummer; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec4_int_8]]
78*dcd69ddeSFinn Plummer; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec4_int_8]]
79*dcd69ddeSFinn Plummer
80*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpUDot %[[#int_8]] %[[#arg0]] %[[#arg1]]
81*dcd69ddeSFinn Plummer
82*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec4_int_8]] %[[#arg0]] %[[#arg1]]
83*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_8]] %[[#mul_vec]] 0
84*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_8]] %[[#mul_vec]] 1
85*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum:]] = OpIAdd %[[#int_8]] %[[#elt0]] %[[#elt1]]
86*dcd69ddeSFinn Plummer  %dot = call i8 @llvm.spv.udot.v4i8(<4 x i8> %a, <4 x i8> %b)
87*dcd69ddeSFinn Plummer  ret i8 %dot
88*dcd69ddeSFinn Plummer}
89*dcd69ddeSFinn Plummer
90319c7a42SGreg Rothdefine noundef i16 @dot_uint16_t3(<3 x i16> noundef %a, <3 x i16> noundef %b) {
91319c7a42SGreg Rothentry:
92319c7a42SGreg Roth; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec3_int_16]]
93319c7a42SGreg Roth; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec3_int_16]]
94*dcd69ddeSFinn Plummer
95*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpUDot %[[#int_16]] %[[#arg0]] %[[#arg1]]
96*dcd69ddeSFinn Plummer
97*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec3_int_16]] %[[#arg0]] %[[#arg1]]
98*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_16]] %[[#mul_vec]] 0
99*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_16]] %[[#mul_vec]] 1
100*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum0:]] = OpIAdd %[[#int_16]] %[[#elt0]] %[[#elt1]]
101*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt2:]] = OpCompositeExtract %[[#int_16]] %[[#mul_vec]] 2
102*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum1:]] = OpIAdd %[[#int_16]] %[[#sum0]] %[[#elt2]]
103319c7a42SGreg Roth  %dot = call i16 @llvm.spv.udot.v3i16(<3 x i16> %a, <3 x i16> %b)
104319c7a42SGreg Roth  ret i16 %dot
105319c7a42SGreg Roth}
106319c7a42SGreg Roth
107319c7a42SGreg Rothdefine noundef i32 @dot_uint4(<4 x i32> noundef %a, <4 x i32> noundef %b) {
108319c7a42SGreg Rothentry:
109319c7a42SGreg Roth; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec4_int_32]]
110319c7a42SGreg Roth; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec4_int_32]]
111*dcd69ddeSFinn Plummer
112*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpUDot %[[#int_32]] %[[#arg0]] %[[#arg1]]
113*dcd69ddeSFinn Plummer
114*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec4_int_32]] %[[#arg0]] %[[#arg1]]
115*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 0
116*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 1
117*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum0:]] = OpIAdd %[[#int_32]] %[[#elt0]] %[[#elt1]]
118*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt2:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 2
119*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum1:]] = OpIAdd %[[#int_32]] %[[#sum0]] %[[#elt2]]
120*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt3:]] = OpCompositeExtract %[[#int_32]] %[[#mul_vec]] 3
121*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum2:]] = OpIAdd %[[#int_32]] %[[#sum1]] %[[#elt3]]
122319c7a42SGreg Roth  %dot = call i32 @llvm.spv.udot.v4i32(<4 x i32> %a, <4 x i32> %b)
123319c7a42SGreg Roth  ret i32 %dot
124319c7a42SGreg Roth}
125319c7a42SGreg Roth
126319c7a42SGreg Rothdefine noundef i64 @dot_uint64_t4(<2 x i64> noundef %a, <2 x i64> noundef %b) {
127319c7a42SGreg Rothentry:
128319c7a42SGreg Roth; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#vec2_int_64]]
129319c7a42SGreg Roth; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#vec2_int_64]]
130*dcd69ddeSFinn Plummer
131*dcd69ddeSFinn Plummer; CHECK-DOT: %[[#dot:]] = OpUDot %[[#int_64]] %[[#arg0]] %[[#arg1]]
132*dcd69ddeSFinn Plummer
133*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#mul_vec:]] = OpIMul %[[#vec2_int_64]] %[[#arg0]] %[[#arg1]]
134*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt0:]] = OpCompositeExtract %[[#int_64]] %[[#mul_vec]] 0
135*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#elt1:]] = OpCompositeExtract %[[#int_64]] %[[#mul_vec]] 1
136*dcd69ddeSFinn Plummer; CHECK-EXP: %[[#sum0:]] = OpIAdd %[[#int_64]] %[[#elt0]] %[[#elt1]]
137319c7a42SGreg Roth  %dot = call i64 @llvm.spv.udot.v2i64(<2 x i64> %a, <2 x i64> %b)
138319c7a42SGreg Roth  ret i64 %dot
139319c7a42SGreg Roth}
140319c7a42SGreg Roth
141*dcd69ddeSFinn Plummerdeclare i8 @llvm.spv.sdot.v4i8(<4 x i8>, <4 x i8>)
142319c7a42SGreg Rothdeclare i16 @llvm.spv.sdot.v2i16(<2 x i16>, <2 x i16>)
143319c7a42SGreg Rothdeclare i32 @llvm.spv.sdot.v4i32(<4 x i32>, <4 x i32>)
144*dcd69ddeSFinn Plummerdeclare i8 @llvm.spv.udot.v4i8(<4 x i8>, <4 x i8>)
145319c7a42SGreg Rothdeclare i16 @llvm.spv.udot.v3i32(<3 x i16>, <3 x i16>)
146319c7a42SGreg Rothdeclare i32 @llvm.spv.udot.v4i32(<4 x i32>, <4 x i32>)
147319c7a42SGreg Rothdeclare i64 @llvm.spv.udot.v2i64(<2 x i64>, <2 x i64>)
148