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