233 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}3 4target triple = "spir64-unknown-unknown"5 6; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 07; CHECK-DAG: %[[CharVec2:.*]] = OpTypeVector %[[Char]] 28; CHECK-DAG: %[[CharVec3:.*]] = OpTypeVector %[[Char]] 39 10; CHECK-DAG: %[[Short:.*]] = OpTypeInt 16 011; CHECK-DAG: %[[ShortVec2:.*]] = OpTypeVector %[[Short]] 212; CHECK-DAG: %[[ShortVec3:.*]] = OpTypeVector %[[Short]] 313 14; CHECK-DAG: %[[Int:.*]] = OpTypeInt 32 015; CHECK-DAG: %[[IntVec2:.*]] = OpTypeVector %[[Int]] 216; CHECK-DAG: %[[IntVec3:.*]] = OpTypeVector %[[Int]] 317 18; CHECK-DAG: %[[Long:.*]] = OpTypeInt 64 019; CHECK-DAG: %[[LongVec2:.*]] = OpTypeVector %[[Long]] 220; CHECK-DAG: %[[LongVec3:.*]] = OpTypeVector %[[Long]] 321 22; CHECK: OpFunction23; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[CharVec2]] %[[#]] %[[#]] 1 0xFFFFFFFF24; CHECK: %[[Added1:.*]] = OpIMul %[[CharVec2]] %[[#]] %[[#]]25; CHECK: %[[Vec2CharR:.*]] = OpCompositeExtract %[[Char]] %[[Added1]] 026; CHECK: OpReturnValue %[[Vec2CharR]]27; CHECK: OpFunctionEnd28 29; CHECK: OpFunction30; CHECK: %[[ParamVec3Char:.*]] = OpFunctionParameter %[[CharVec3]]31; CHECK: %[[Vec3CharItem0:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 032; CHECK: %[[Vec3CharItem1:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 133; CHECK: %[[Vec3CharItem2:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 234; CHECK: %[[Vec3CharR1:.*]] = OpIMul %[[Char]] %[[Vec3CharItem0]] %[[Vec3CharItem1]]35; CHECK: %[[Vec3CharR2:.*]] = OpIMul %[[Char]] %[[Vec3CharR1]] %[[Vec3CharItem2]]36; CHECK: OpReturnValue %[[Vec3CharR2]]37; CHECK: OpFunctionEnd38 39; CHECK: OpFunction40; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[ShortVec2]] %[[#]] %[[#]] 1 0xFFFFFFFF41; CHECK: %[[Added1:.*]] = OpIMul %[[ShortVec2]] %[[#]] %[[#]]42; CHECK: %[[Vec2ShortR:.*]] = OpCompositeExtract %[[Short]] %[[Added1]] 043; CHECK: OpReturnValue %[[Vec2ShortR]]44; CHECK: OpFunctionEnd45 46; CHECK: OpFunction47; CHECK: %[[ParamVec3Short:.*]] = OpFunctionParameter %[[ShortVec3]]48; CHECK: %[[Vec3ShortItem0:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 049; CHECK: %[[Vec3ShortItem1:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 150; CHECK: %[[Vec3ShortItem2:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 251; CHECK: %[[Vec3ShortR1:.*]] = OpIMul %[[Short]] %[[Vec3ShortItem0]] %[[Vec3ShortItem1]]52; CHECK: %[[Vec3ShortR2:.*]] = OpIMul %[[Short]] %[[Vec3ShortR1]] %[[Vec3ShortItem2]]53; CHECK: OpReturnValue %[[Vec3ShortR2]]54; CHECK: OpFunctionEnd55 56; CHECK: OpFunction57; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[IntVec2]] %[[#]] %[[#]] 1 0xFFFFFFFF58; CHECK: %[[Added1:.*]] = OpIMul %[[IntVec2]] %[[#]] %[[#]]59; CHECK: %[[Vec2IntR:.*]] = OpCompositeExtract %[[Int]] %[[Added1]] 060; CHECK: OpReturnValue %[[Vec2IntR]]61; CHECK: OpFunctionEnd62 63; CHECK: OpFunction64; CHECK: %[[ParamVec3Int:.*]] = OpFunctionParameter %[[IntVec3]]65; CHECK: %[[Vec3IntItem0:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 066; CHECK: %[[Vec3IntItem1:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 167; CHECK: %[[Vec3IntItem2:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 268; CHECK: %[[Vec3IntR1:.*]] = OpIMul %[[Int]] %[[Vec3IntItem0]] %[[Vec3IntItem1]]69; CHECK: %[[Vec3IntR2:.*]] = OpIMul %[[Int]] %[[Vec3IntR1]] %[[Vec3IntItem2]]70; CHECK: OpReturnValue %[[Vec3IntR2]]71; CHECK: OpFunctionEnd72 73; CHECK: OpFunction74; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[LongVec2]] %[[#]] %[[#]] 1 0xFFFFFFFF75; CHECK: %[[Added1:.*]] = OpIMul %[[LongVec2]] %[[#]] %[[#]]76; CHECK: %[[Vec2LongR:.*]] = OpCompositeExtract %[[Long]] %[[Added1]] 077; CHECK: OpReturnValue %[[Vec2LongR]]78; CHECK: OpFunctionEnd79 80; CHECK: OpFunction81; CHECK: %[[ParamVec3Long:.*]] = OpFunctionParameter %[[LongVec3]]82; CHECK: %[[Vec3LongItem0:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 083; CHECK: %[[Vec3LongItem1:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 184; CHECK: %[[Vec3LongItem2:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 285; CHECK: %[[Vec3LongR1:.*]] = OpIMul %[[Long]] %[[Vec3LongItem0]] %[[Vec3LongItem1]]86; CHECK: %[[Vec3LongR2:.*]] = OpIMul %[[Long]] %[[Vec3LongR1]] %[[Vec3LongItem2]]87; CHECK: OpReturnValue %[[Vec3LongR2]]88; CHECK: OpFunctionEnd89 90define spir_func i8 @test_vector_reduce_mul_v2i8(<2 x i8> %v) {91entry:92 %res = call i8 @llvm.vector.reduce.mul.v2i8(<2 x i8> %v)93 ret i8 %res94}95 96define spir_func i8 @test_vector_reduce_mul_v3i8(<3 x i8> %v) {97entry:98 %res = call i8 @llvm.vector.reduce.mul.v3i8(<3 x i8> %v)99 ret i8 %res100}101 102define spir_func i8 @test_vector_reduce_mul_v4i8(<4 x i8> %v) {103entry:104 %res = call i8 @llvm.vector.reduce.mul.v4i8(<4 x i8> %v)105 ret i8 %res106}107 108define spir_func i8 @test_vector_reduce_mul_v8i8(<8 x i8> %v) {109entry:110 %res = call i8 @llvm.vector.reduce.mul.v8i8(<8 x i8> %v)111 ret i8 %res112}113 114define spir_func i8 @test_vector_reduce_mul_v16i8(<16 x i8> %v) {115entry:116 %res = call i8 @llvm.vector.reduce.mul.v16i8(<16 x i8> %v)117 ret i8 %res118}119 120define spir_func i16 @test_vector_reduce_mul_v2i16(<2 x i16> %v) {121entry:122 %res = call i16 @llvm.vector.reduce.mul.v2i16(<2 x i16> %v)123 ret i16 %res124}125 126define spir_func i16 @test_vector_reduce_mul_v3i16(<3 x i16> %v) {127entry:128 %res = call i16 @llvm.vector.reduce.mul.v3i16(<3 x i16> %v)129 ret i16 %res130}131 132define spir_func i16 @test_vector_reduce_mul_v4i16(<4 x i16> %v) {133entry:134 %res = call i16 @llvm.vector.reduce.mul.v4i16(<4 x i16> %v)135 ret i16 %res136}137 138define spir_func i16 @test_vector_reduce_mul_v8i16(<8 x i16> %v) {139entry:140 %res = call i16 @llvm.vector.reduce.mul.v8i16(<8 x i16> %v)141 ret i16 %res142}143 144define spir_func i16 @test_vector_reduce_mul_v16i16(<16 x i16> %v) {145entry:146 %res = call i16 @llvm.vector.reduce.mul.v16i16(<16 x i16> %v)147 ret i16 %res148}149 150define spir_func i32 @test_vector_reduce_mul_v2i32(<2 x i32> %v) {151entry:152 %res = call i32 @llvm.vector.reduce.mul.v2i32(<2 x i32> %v)153 ret i32 %res154}155 156define spir_func i32 @test_vector_reduce_mul_v3i32(<3 x i32> %v) {157entry:158 %res = call i32 @llvm.vector.reduce.mul.v3i32(<3 x i32> %v)159 ret i32 %res160}161 162define spir_func i32 @test_vector_reduce_mul_v4i32(<4 x i32> %v) {163entry:164 %res = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %v)165 ret i32 %res166}167 168define spir_func i32 @test_vector_reduce_mul_v8i32(<8 x i32> %v) {169entry:170 %res = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> %v)171 ret i32 %res172}173 174define spir_func i32 @test_vector_reduce_mul_v16i32(<16 x i32> %v) {175entry:176 %res = call i32 @llvm.vector.reduce.mul.v16i32(<16 x i32> %v)177 ret i32 %res178}179 180define spir_func i64 @test_vector_reduce_mul_v2i64(<2 x i64> %v) {181entry:182 %res = call i64 @llvm.vector.reduce.mul.v2i64(<2 x i64> %v)183 ret i64 %res184}185 186define spir_func i64 @test_vector_reduce_mul_v3i64(<3 x i64> %v) {187entry:188 %res = call i64 @llvm.vector.reduce.mul.v3i64(<3 x i64> %v)189 ret i64 %res190}191 192define spir_func i64 @test_vector_reduce_mul_v4i64(<4 x i64> %v) {193entry:194 %res = call i64 @llvm.vector.reduce.mul.v4i64(<4 x i64> %v)195 ret i64 %res196}197 198define spir_func i64 @test_vector_reduce_mul_v8i64(<8 x i64> %v) {199entry:200 %res = call i64 @llvm.vector.reduce.mul.v8i64(<8 x i64> %v)201 ret i64 %res202}203 204define spir_func i64 @test_vector_reduce_mul_v16i64(<16 x i64> %v) {205entry:206 %res = call i64 @llvm.vector.reduce.mul.v16i64(<16 x i64> %v)207 ret i64 %res208}209 210declare i8 @llvm.vector.reduce.mul.v2i8(<2 x i8>)211declare i8 @llvm.vector.reduce.mul.v3i8(<3 x i8>)212declare i8 @llvm.vector.reduce.mul.v4i8(<4 x i8>)213declare i8 @llvm.vector.reduce.mul.v8i8(<8 x i8>)214declare i8 @llvm.vector.reduce.mul.v16i8(<16 x i8>)215 216declare i16 @llvm.vector.reduce.mul.v2i16(<2 x i16>)217declare i16 @llvm.vector.reduce.mul.v3i16(<3 x i16>)218declare i16 @llvm.vector.reduce.mul.v4i16(<4 x i16>)219declare i16 @llvm.vector.reduce.mul.v8i16(<8 x i16>)220declare i16 @llvm.vector.reduce.mul.v16i16(<16 x i16>)221 222declare i32 @llvm.vector.reduce.mul.v2i32(<2 x i32>)223declare i32 @llvm.vector.reduce.mul.v3i32(<3 x i32>)224declare i32 @llvm.vector.reduce.mul.v4i32(<4 x i32>)225declare i32 @llvm.vector.reduce.mul.v8i32(<8 x i32>)226declare i32 @llvm.vector.reduce.mul.v16i32(<16 x i32>)227 228declare i64 @llvm.vector.reduce.mul.v2i64(<2 x i64>)229declare i64 @llvm.vector.reduce.mul.v3i64(<3 x i64>)230declare i64 @llvm.vector.reduce.mul.v4i64(<4 x i64>)231declare i64 @llvm.vector.reduce.mul.v8i64(<8 x i64>)232declare i64 @llvm.vector.reduce.mul.v16i64(<16 x i64>)233