xref: /llvm-project/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llvm-vector-reduce/fadd.ll (revision 67d3ef74b31e1517d4f679e754cc2b3041c95901)
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s
2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3
4; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s
5; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6
7; CHECK-DAG: %[[Half:.*]] = OpTypeFloat 16
8; CHECK-DAG: %[[HalfVec2:.*]] = OpTypeVector %[[Half]] 2
9; CHECK-DAG: %[[HalfVec3:.*]] = OpTypeVector %[[Half]] 3
10
11; CHECK-DAG: %[[Float:.*]] = OpTypeFloat 32
12; CHECK-DAG: %[[FloatVec2:.*]] = OpTypeVector %[[Float]] 2
13; CHECK-DAG: %[[FloatVec3:.*]] = OpTypeVector %[[Float]] 3
14
15; CHECK-DAG: %[[Double:.*]] = OpTypeFloat 64
16; CHECK-DAG: %[[DoubleVec2:.*]] = OpTypeVector %[[Double]] 2
17; CHECK-DAG: %[[DoubleVec3:.*]] = OpTypeVector %[[Double]] 3
18
19; CHECK: OpFunction
20; CHECK: %[[Param2Half:.*]] = OpFunctionParameter %[[Half]]
21; CHECK: %[[ParamVec2Half:.*]] = OpFunctionParameter %[[HalfVec2]]
22; CHECK: %[[Vec2HalfItem0:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec2Half]] 0
23; CHECK: %[[Vec2HalfR1:.*]] = OpFAdd %[[Half]] %[[Param2Half]] %[[Vec2HalfItem0]]
24; CHECK: %[[Vec2HalfItem1:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec2Half]] 1
25; CHECK: %[[Vec2HalfR2:.*]] = OpFAdd %[[Half]] %[[Vec2HalfR1]] %[[Vec2HalfItem1]]
26; CHECK: OpReturnValue %[[Vec2HalfR2]]
27; CHECK: OpFunctionEnd
28
29; CHECK: OpFunction
30; CHECK: %[[Param2Half:.*]] = OpFunctionParameter %[[Half]]
31; CHECK: %[[ParamVec3Half:.*]] = OpFunctionParameter %[[HalfVec3]]
32; CHECK: %[[Vec3HalfItem0:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 0
33; CHECK: %[[Vec3HalfR1:.*]] = OpFAdd %[[Half]] %[[Param2Half]] %[[Vec3HalfItem0]]
34; CHECK: %[[Vec3HalfItem1:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 1
35; CHECK: %[[Vec3HalfR2:.*]] = OpFAdd %[[Half]] %[[Vec3HalfR1]] %[[Vec3HalfItem1]]
36; CHECK: %[[Vec3HalfItem2:.*]] = OpCompositeExtract %[[Half]] %[[ParamVec3Half]] 2
37; CHECK: %[[Vec3HalfR3:.*]] = OpFAdd %[[Half]] %[[Vec3HalfR2]] %[[Vec3HalfItem2]]
38; CHECK: OpReturnValue %[[Vec3HalfR3]]
39; CHECK: OpFunctionEnd
40
41; CHECK: OpFunction
42; CHECK: %[[Param2Float:.*]] = OpFunctionParameter %[[Float]]
43; CHECK: %[[ParamVec2Float:.*]] = OpFunctionParameter %[[FloatVec2]]
44; CHECK: %[[Vec2FloatItem0:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec2Float]] 0
45; CHECK: %[[Vec2FloatR1:.*]] = OpFAdd %[[Float]] %[[Param2Float]] %[[Vec2FloatItem0]]
46; CHECK: %[[Vec2FloatItem1:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec2Float]] 1
47; CHECK: %[[Vec2FloatR2:.*]] = OpFAdd %[[Float]] %[[Vec2FloatR1]] %[[Vec2FloatItem1]]
48; CHECK: OpReturnValue %[[Vec2FloatR2]]
49; CHECK: OpFunctionEnd
50
51; CHECK: OpFunction
52; CHECK: %[[Param2Float:.*]] = OpFunctionParameter %[[Float]]
53; CHECK: %[[ParamVec3Float:.*]] = OpFunctionParameter %[[FloatVec3]]
54; CHECK: %[[Vec3FloatItem0:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 0
55; CHECK: %[[Vec3FloatR1:.*]] = OpFAdd %[[Float]] %[[Param2Float]] %[[Vec3FloatItem0]]
56; CHECK: %[[Vec3FloatItem1:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 1
57; CHECK: %[[Vec3FloatR2:.*]] = OpFAdd %[[Float]] %[[Vec3FloatR1]] %[[Vec3FloatItem1]]
58; CHECK: %[[Vec3FloatItem2:.*]] = OpCompositeExtract %[[Float]] %[[ParamVec3Float]] 2
59; CHECK: %[[Vec3FloatR3:.*]] = OpFAdd %[[Float]] %[[Vec3FloatR2]] %[[Vec3FloatItem2]]
60; CHECK: OpReturnValue %[[Vec3FloatR3]]
61; CHECK: OpFunctionEnd
62
63; CHECK: OpFunction
64; CHECK: %[[Param2Double:.*]] = OpFunctionParameter %[[Double]]
65; CHECK: %[[ParamVec2Double:.*]] = OpFunctionParameter %[[DoubleVec2]]
66; CHECK: %[[Vec2DoubleItem0:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec2Double]] 0
67; CHECK: %[[Vec2DoubleR1:.*]] = OpFAdd %[[Double]] %[[Param2Double]] %[[Vec2DoubleItem0]]
68; CHECK: %[[Vec2DoubleItem1:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec2Double]] 1
69; CHECK: %[[Vec2DoubleR2:.*]] = OpFAdd %[[Double]] %[[Vec2DoubleR1]] %[[Vec2DoubleItem1]]
70; CHECK: OpReturnValue %[[Vec2DoubleR2]]
71; CHECK: OpFunctionEnd
72
73; CHECK: OpFunction
74; CHECK: %[[Param2Double:.*]] = OpFunctionParameter %[[Double]]
75; CHECK: %[[ParamVec3Double:.*]] = OpFunctionParameter %[[DoubleVec3]]
76; CHECK: %[[Vec3DoubleItem0:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 0
77; CHECK: %[[Vec3DoubleR1:.*]] = OpFAdd %[[Double]] %[[Param2Double]] %[[Vec3DoubleItem0]]
78; CHECK: %[[Vec3DoubleItem1:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 1
79; CHECK: %[[Vec3DoubleR2:.*]] = OpFAdd %[[Double]] %[[Vec3DoubleR1]] %[[Vec3DoubleItem1]]
80; CHECK: %[[Vec3DoubleItem2:.*]] = OpCompositeExtract %[[Double]] %[[ParamVec3Double]] 2
81; CHECK: %[[Vec3DoubleR3:.*]] = OpFAdd %[[Double]] %[[Vec3DoubleR2]] %[[Vec3DoubleItem2]]
82; CHECK: OpReturnValue %[[Vec3DoubleR3]]
83; CHECK: OpFunctionEnd
84
85define spir_func half @test_vector_reduce_fadd_v2half(half %sp, <2 x half> %v) {
86entry:
87  %res = call half @llvm.vector.reduce.fadd.v2half(half %sp, <2 x half> %v)
88  ret half %res
89}
90
91define spir_func half @test_vector_reduce_fadd_v3half(half %sp, <3 x half> %v) {
92entry:
93  %res = call half @llvm.vector.reduce.fadd.v3half(half %sp, <3 x half> %v)
94  ret half %res
95}
96
97define spir_func half @test_vector_reduce_fadd_v4half(half %sp, <4 x half> %v) {
98entry:
99  %res = call half @llvm.vector.reduce.fadd.v4half(half %sp, <4 x half> %v)
100  ret half %res
101}
102
103define spir_func half @test_vector_reduce_fadd_v8half(half %sp, <8 x half> %v) {
104entry:
105  %res = call half @llvm.vector.reduce.fadd.v8half(half %sp, <8 x half> %v)
106  ret half %res
107}
108
109define spir_func half @test_vector_reduce_fadd_v16half(half %sp, <16 x half> %v) {
110entry:
111  %res = call half @llvm.vector.reduce.fadd.v16half(half %sp, <16 x half> %v)
112  ret half %res
113}
114
115define spir_func float @test_vector_reduce_fadd_v2float(float %sp, <2 x float> %v) {
116entry:
117  %res = call float @llvm.vector.reduce.fadd.v2float(float %sp, <2 x float> %v)
118  ret float %res
119}
120
121define spir_func float @test_vector_reduce_fadd_v3float(float %sp, <3 x float> %v) {
122entry:
123  %res = call float @llvm.vector.reduce.fadd.v3float(float %sp, <3 x float> %v)
124  ret float %res
125}
126
127define spir_func float @test_vector_reduce_fadd_v4float(float %sp, <4 x float> %v) {
128entry:
129  %res = call float @llvm.vector.reduce.fadd.v4float(float %sp, <4 x float> %v)
130  ret float %res
131}
132
133define spir_func float @test_vector_reduce_fadd_v8float(float %sp, <8 x float> %v) {
134entry:
135  %res = call float @llvm.vector.reduce.fadd.v8float(float %sp, <8 x float> %v)
136  ret float %res
137}
138
139define spir_func float @test_vector_reduce_fadd_v16float(float %sp, <16 x float> %v) {
140entry:
141  %res = call float @llvm.vector.reduce.fadd.v16float(float %sp, <16 x float> %v)
142  ret float %res
143}
144
145
146define spir_func double @test_vector_reduce_fadd_v2double(double %sp, <2 x double> %v) {
147entry:
148  %res = call double @llvm.vector.reduce.fadd.v2double(double %sp, <2 x double> %v)
149  ret double %res
150}
151
152define spir_func double @test_vector_reduce_fadd_v3double(double %sp, <3 x double> %v) {
153entry:
154  %res = call double @llvm.vector.reduce.fadd.v3double(double %sp, <3 x double> %v)
155  ret double %res
156}
157
158define spir_func double @test_vector_reduce_fadd_v4double(double %sp, <4 x double> %v) {
159entry:
160  %res = call double @llvm.vector.reduce.fadd.v4double(double %sp, <4 x double> %v)
161  ret double %res
162}
163
164define spir_func double @test_vector_reduce_fadd_v8double(double %sp, <8 x double> %v) {
165entry:
166  %res = call double @llvm.vector.reduce.fadd.v8double(double %sp, <8 x double> %v)
167  ret double %res
168}
169
170define spir_func double @test_vector_reduce_fadd_v16double(double %sp, <16 x double> %v) {
171entry:
172  %res = call double @llvm.vector.reduce.fadd.v16double(double %sp, <16 x double> %v)
173  ret double %res
174}
175
176declare half @llvm.vector.reduce.fadd.v2half(half, <2 x half>)
177declare half @llvm.vector.reduce.fadd.v3half(half, <3 x half>)
178declare half @llvm.vector.reduce.fadd.v4half(half, <4 x half>)
179declare half @llvm.vector.reduce.fadd.v8half(half, <8 x half>)
180declare half @llvm.vector.reduce.fadd.v16half(half, <16 x half>)
181declare float @llvm.vector.reduce.fadd.v2float(float, <2 x float>)
182declare float @llvm.vector.reduce.fadd.v3float(float, <3 x float>)
183declare float @llvm.vector.reduce.fadd.v4float(float, <4 x float>)
184declare float @llvm.vector.reduce.fadd.v8float(float, <8 x float>)
185declare float @llvm.vector.reduce.fadd.v16float(float, <16 x float>)
186declare double @llvm.vector.reduce.fadd.v2double(double, <2 x double>)
187declare double @llvm.vector.reduce.fadd.v3double(double, <3 x double>)
188declare double @llvm.vector.reduce.fadd.v4double(double, <4 x double>)
189declare double @llvm.vector.reduce.fadd.v8double(double, <8 x double>)
190declare double @llvm.vector.reduce.fadd.v16double(double, <16 x double>)
191