1*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s 2*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} 3540d2551SVyacheslav Levytskyy 4*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s 5*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 6540d2551SVyacheslav Levytskyy 7540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Half:.*]] = OpTypeFloat 16 8540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[HalfVec2:.*]] = OpTypeVector %[[Half]] 2 9540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[HalfVec3:.*]] = OpTypeVector %[[Half]] 3 10540d2551SVyacheslav Levytskyy 11540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Float:.*]] = OpTypeFloat 32 12540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[FloatVec2:.*]] = OpTypeVector %[[Float]] 2 13540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[FloatVec3:.*]] = OpTypeVector %[[Float]] 3 14540d2551SVyacheslav Levytskyy 15540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Double:.*]] = OpTypeFloat 64 16540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[DoubleVec2:.*]] = OpTypeVector %[[Double]] 2 17540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[DoubleVec3:.*]] = OpTypeVector %[[Double]] 3 18540d2551SVyacheslav Levytskyy 19540d2551SVyacheslav Levytskyy; CHECK: OpFunction 20540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Half:.*]] = OpFunctionParameter %[[Half]] 21540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec2Half:.*]] = OpFunctionParameter %[[HalfVec2]] 22540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2HalfItem0:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec2Half]] 0 23540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2HalfR1:.*]] = OpFAdd %[[Half]] %[[Param2Half]] %[[Vec2HalfItem0]] 24540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2HalfItem1:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec2Half]] 1 25540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2HalfR2:.*]] = OpFAdd %[[Half]] %[[Vec2HalfR1]] %[[Vec2HalfItem1]] 26540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2HalfR2]] 27540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 28540d2551SVyacheslav Levytskyy 29540d2551SVyacheslav Levytskyy; CHECK: OpFunction 30540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Half:.*]] = OpFunctionParameter %[[Half]] 31540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Half:.*]] = OpFunctionParameter %[[HalfVec3]] 32540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfItem0:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 0 33540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfR1:.*]] = OpFAdd %[[Half]] %[[Param2Half]] %[[Vec3HalfItem0]] 34540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfItem1:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 1 35540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfR2:.*]] = OpFAdd %[[Half]] %[[Vec3HalfR1]] %[[Vec3HalfItem1]] 36540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfItem2:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 2 37540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3HalfR3:.*]] = OpFAdd %[[Half]] %[[Vec3HalfR2]] %[[Vec3HalfItem2]] 38540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3HalfR3]] 39540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 40540d2551SVyacheslav Levytskyy 41540d2551SVyacheslav Levytskyy; CHECK: OpFunction 42540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Float:.*]] = OpFunctionParameter %[[Float]] 43540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec2Float:.*]] = OpFunctionParameter %[[FloatVec2]] 44540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2FloatItem0:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec2Float]] 0 45540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2FloatR1:.*]] = OpFAdd %[[Float]] %[[Param2Float]] %[[Vec2FloatItem0]] 46540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2FloatItem1:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec2Float]] 1 47540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2FloatR2:.*]] = OpFAdd %[[Float]] %[[Vec2FloatR1]] %[[Vec2FloatItem1]] 48540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2FloatR2]] 49540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 50540d2551SVyacheslav Levytskyy 51540d2551SVyacheslav Levytskyy; CHECK: OpFunction 52540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Float:.*]] = OpFunctionParameter %[[Float]] 53540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Float:.*]] = OpFunctionParameter %[[FloatVec3]] 54540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatItem0:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 0 55540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatR1:.*]] = OpFAdd %[[Float]] %[[Param2Float]] %[[Vec3FloatItem0]] 56540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatItem1:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 1 57540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatR2:.*]] = OpFAdd %[[Float]] %[[Vec3FloatR1]] %[[Vec3FloatItem1]] 58540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatItem2:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 2 59540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3FloatR3:.*]] = OpFAdd %[[Float]] %[[Vec3FloatR2]] %[[Vec3FloatItem2]] 60540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3FloatR3]] 61540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 62540d2551SVyacheslav Levytskyy 63540d2551SVyacheslav Levytskyy; CHECK: OpFunction 64540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Double:.*]] = OpFunctionParameter %[[Double]] 65540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec2Double:.*]] = OpFunctionParameter %[[DoubleVec2]] 66540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2DoubleItem0:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec2Double]] 0 67540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2DoubleR1:.*]] = OpFAdd %[[Double]] %[[Param2Double]] %[[Vec2DoubleItem0]] 68540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2DoubleItem1:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec2Double]] 1 69540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2DoubleR2:.*]] = OpFAdd %[[Double]] %[[Vec2DoubleR1]] %[[Vec2DoubleItem1]] 70540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2DoubleR2]] 71540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 72540d2551SVyacheslav Levytskyy 73540d2551SVyacheslav Levytskyy; CHECK: OpFunction 74540d2551SVyacheslav Levytskyy; CHECK: %[[Param2Double:.*]] = OpFunctionParameter %[[Double]] 75540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Double:.*]] = OpFunctionParameter %[[DoubleVec3]] 76540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleItem0:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 0 77540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleR1:.*]] = OpFAdd %[[Double]] %[[Param2Double]] %[[Vec3DoubleItem0]] 78540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleItem1:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 1 79540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleR2:.*]] = OpFAdd %[[Double]] %[[Vec3DoubleR1]] %[[Vec3DoubleItem1]] 80540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleItem2:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 2 81540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3DoubleR3:.*]] = OpFAdd %[[Double]] %[[Vec3DoubleR2]] %[[Vec3DoubleItem2]] 82540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3DoubleR3]] 83540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 84540d2551SVyacheslav Levytskyy 85540d2551SVyacheslav Levytskyydefine spir_func half @test_vector_reduce_fadd_v2half(half %sp, <2 x half> %v) { 86540d2551SVyacheslav Levytskyyentry: 87540d2551SVyacheslav Levytskyy %res = call half @llvm.vector.reduce.fadd.v2half(half %sp, <2 x half> %v) 88540d2551SVyacheslav Levytskyy ret half %res 89540d2551SVyacheslav Levytskyy} 90540d2551SVyacheslav Levytskyy 91540d2551SVyacheslav Levytskyydefine spir_func half @test_vector_reduce_fadd_v3half(half %sp, <3 x half> %v) { 92540d2551SVyacheslav Levytskyyentry: 93540d2551SVyacheslav Levytskyy %res = call half @llvm.vector.reduce.fadd.v3half(half %sp, <3 x half> %v) 94540d2551SVyacheslav Levytskyy ret half %res 95540d2551SVyacheslav Levytskyy} 96540d2551SVyacheslav Levytskyy 97540d2551SVyacheslav Levytskyydefine spir_func half @test_vector_reduce_fadd_v4half(half %sp, <4 x half> %v) { 98540d2551SVyacheslav Levytskyyentry: 99540d2551SVyacheslav Levytskyy %res = call half @llvm.vector.reduce.fadd.v4half(half %sp, <4 x half> %v) 100540d2551SVyacheslav Levytskyy ret half %res 101540d2551SVyacheslav Levytskyy} 102540d2551SVyacheslav Levytskyy 103540d2551SVyacheslav Levytskyydefine spir_func half @test_vector_reduce_fadd_v8half(half %sp, <8 x half> %v) { 104540d2551SVyacheslav Levytskyyentry: 105540d2551SVyacheslav Levytskyy %res = call half @llvm.vector.reduce.fadd.v8half(half %sp, <8 x half> %v) 106540d2551SVyacheslav Levytskyy ret half %res 107540d2551SVyacheslav Levytskyy} 108540d2551SVyacheslav Levytskyy 109540d2551SVyacheslav Levytskyydefine spir_func half @test_vector_reduce_fadd_v16half(half %sp, <16 x half> %v) { 110540d2551SVyacheslav Levytskyyentry: 111540d2551SVyacheslav Levytskyy %res = call half @llvm.vector.reduce.fadd.v16half(half %sp, <16 x half> %v) 112540d2551SVyacheslav Levytskyy ret half %res 113540d2551SVyacheslav Levytskyy} 114540d2551SVyacheslav Levytskyy 115540d2551SVyacheslav Levytskyydefine spir_func float @test_vector_reduce_fadd_v2float(float %sp, <2 x float> %v) { 116540d2551SVyacheslav Levytskyyentry: 117540d2551SVyacheslav Levytskyy %res = call float @llvm.vector.reduce.fadd.v2float(float %sp, <2 x float> %v) 118540d2551SVyacheslav Levytskyy ret float %res 119540d2551SVyacheslav Levytskyy} 120540d2551SVyacheslav Levytskyy 121540d2551SVyacheslav Levytskyydefine spir_func float @test_vector_reduce_fadd_v3float(float %sp, <3 x float> %v) { 122540d2551SVyacheslav Levytskyyentry: 123540d2551SVyacheslav Levytskyy %res = call float @llvm.vector.reduce.fadd.v3float(float %sp, <3 x float> %v) 124540d2551SVyacheslav Levytskyy ret float %res 125540d2551SVyacheslav Levytskyy} 126540d2551SVyacheslav Levytskyy 127540d2551SVyacheslav Levytskyydefine spir_func float @test_vector_reduce_fadd_v4float(float %sp, <4 x float> %v) { 128540d2551SVyacheslav Levytskyyentry: 129540d2551SVyacheslav Levytskyy %res = call float @llvm.vector.reduce.fadd.v4float(float %sp, <4 x float> %v) 130540d2551SVyacheslav Levytskyy ret float %res 131540d2551SVyacheslav Levytskyy} 132540d2551SVyacheslav Levytskyy 133540d2551SVyacheslav Levytskyydefine spir_func float @test_vector_reduce_fadd_v8float(float %sp, <8 x float> %v) { 134540d2551SVyacheslav Levytskyyentry: 135540d2551SVyacheslav Levytskyy %res = call float @llvm.vector.reduce.fadd.v8float(float %sp, <8 x float> %v) 136540d2551SVyacheslav Levytskyy ret float %res 137540d2551SVyacheslav Levytskyy} 138540d2551SVyacheslav Levytskyy 139540d2551SVyacheslav Levytskyydefine spir_func float @test_vector_reduce_fadd_v16float(float %sp, <16 x float> %v) { 140540d2551SVyacheslav Levytskyyentry: 141540d2551SVyacheslav Levytskyy %res = call float @llvm.vector.reduce.fadd.v16float(float %sp, <16 x float> %v) 142540d2551SVyacheslav Levytskyy ret float %res 143540d2551SVyacheslav Levytskyy} 144540d2551SVyacheslav Levytskyy 145540d2551SVyacheslav Levytskyy 146540d2551SVyacheslav Levytskyydefine spir_func double @test_vector_reduce_fadd_v2double(double %sp, <2 x double> %v) { 147540d2551SVyacheslav Levytskyyentry: 148540d2551SVyacheslav Levytskyy %res = call double @llvm.vector.reduce.fadd.v2double(double %sp, <2 x double> %v) 149540d2551SVyacheslav Levytskyy ret double %res 150540d2551SVyacheslav Levytskyy} 151540d2551SVyacheslav Levytskyy 152540d2551SVyacheslav Levytskyydefine spir_func double @test_vector_reduce_fadd_v3double(double %sp, <3 x double> %v) { 153540d2551SVyacheslav Levytskyyentry: 154540d2551SVyacheslav Levytskyy %res = call double @llvm.vector.reduce.fadd.v3double(double %sp, <3 x double> %v) 155540d2551SVyacheslav Levytskyy ret double %res 156540d2551SVyacheslav Levytskyy} 157540d2551SVyacheslav Levytskyy 158540d2551SVyacheslav Levytskyydefine spir_func double @test_vector_reduce_fadd_v4double(double %sp, <4 x double> %v) { 159540d2551SVyacheslav Levytskyyentry: 160540d2551SVyacheslav Levytskyy %res = call double @llvm.vector.reduce.fadd.v4double(double %sp, <4 x double> %v) 161540d2551SVyacheslav Levytskyy ret double %res 162540d2551SVyacheslav Levytskyy} 163540d2551SVyacheslav Levytskyy 164540d2551SVyacheslav Levytskyydefine spir_func double @test_vector_reduce_fadd_v8double(double %sp, <8 x double> %v) { 165540d2551SVyacheslav Levytskyyentry: 166540d2551SVyacheslav Levytskyy %res = call double @llvm.vector.reduce.fadd.v8double(double %sp, <8 x double> %v) 167540d2551SVyacheslav Levytskyy ret double %res 168540d2551SVyacheslav Levytskyy} 169540d2551SVyacheslav Levytskyy 170540d2551SVyacheslav Levytskyydefine spir_func double @test_vector_reduce_fadd_v16double(double %sp, <16 x double> %v) { 171540d2551SVyacheslav Levytskyyentry: 172540d2551SVyacheslav Levytskyy %res = call double @llvm.vector.reduce.fadd.v16double(double %sp, <16 x double> %v) 173540d2551SVyacheslav Levytskyy ret double %res 174540d2551SVyacheslav Levytskyy} 175540d2551SVyacheslav Levytskyy 176540d2551SVyacheslav Levytskyydeclare half @llvm.vector.reduce.fadd.v2half(half, <2 x half>) 177540d2551SVyacheslav Levytskyydeclare half @llvm.vector.reduce.fadd.v3half(half, <3 x half>) 178540d2551SVyacheslav Levytskyydeclare half @llvm.vector.reduce.fadd.v4half(half, <4 x half>) 179540d2551SVyacheslav Levytskyydeclare half @llvm.vector.reduce.fadd.v8half(half, <8 x half>) 180540d2551SVyacheslav Levytskyydeclare half @llvm.vector.reduce.fadd.v16half(half, <16 x half>) 181540d2551SVyacheslav Levytskyydeclare float @llvm.vector.reduce.fadd.v2float(float, <2 x float>) 182540d2551SVyacheslav Levytskyydeclare float @llvm.vector.reduce.fadd.v3float(float, <3 x float>) 183540d2551SVyacheslav Levytskyydeclare float @llvm.vector.reduce.fadd.v4float(float, <4 x float>) 184540d2551SVyacheslav Levytskyydeclare float @llvm.vector.reduce.fadd.v8float(float, <8 x float>) 185540d2551SVyacheslav Levytskyydeclare float @llvm.vector.reduce.fadd.v16float(float, <16 x float>) 186540d2551SVyacheslav Levytskyydeclare double @llvm.vector.reduce.fadd.v2double(double, <2 x double>) 187540d2551SVyacheslav Levytskyydeclare double @llvm.vector.reduce.fadd.v3double(double, <3 x double>) 188540d2551SVyacheslav Levytskyydeclare double @llvm.vector.reduce.fadd.v4double(double, <4 x double>) 189540d2551SVyacheslav Levytskyydeclare double @llvm.vector.reduce.fadd.v8double(double, <8 x double>) 190540d2551SVyacheslav Levytskyydeclare double @llvm.vector.reduce.fadd.v16double(double, <16 x double>) 191