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