1 ! RUN: %flang_fc1 -flang-experimental-hlfir -emit-llvm %s -o - | FileCheck --check-prefixes="LLVMIR" %s
2 ! REQUIRES: target=powerpc{{.*}}
6 ! CHECK-LABEL: vec_max_testf32
7 subroutine vec_max_testf32(x
, y
)
8 vector(real(4)) :: vmax
, x
, y
11 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
12 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
13 ! LLVMIR: %[[vmax:.*]] = call contract <4 x float> @llvm.ppc.vsx.xvmaxsp(<4 x float> %[[x]], <4 x float> %[[y]])
14 ! LLVMIR: store <4 x float> %[[vmax]], ptr %{{[0-9]}}, align 16
15 end subroutine vec_max_testf32
17 ! CHECK-LABEL: vec_max_testf64
18 subroutine vec_max_testf64(x
, y
)
19 vector(real(8)) :: vmax
, x
, y
22 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
23 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
24 ! LLVMIR: %[[vmax:.*]] = call contract <2 x double> @llvm.ppc.vsx.xvmaxdp(<2 x double> %[[x]], <2 x double> %[[y]])
25 ! LLVMIR: store <2 x double> %[[vmax]], ptr %{{[0-9]}}, align 16
26 end subroutine vec_max_testf64
28 ! CHECK-LABEL: vec_max_testi8
29 subroutine vec_max_testi8(x
, y
)
30 vector(integer(1)) :: vmax
, x
, y
33 ! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
34 ! LLVMIR: %[[y:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
35 ! LLVMIR: %[[vmax:.*]] = call <16 x i8> @llvm.ppc.altivec.vmaxsb(<16 x i8> %[[x]], <16 x i8> %[[y]])
36 ! LLVMIR: store <16 x i8> %[[vmax]], ptr %{{[0-9]}}, align 16
37 end subroutine vec_max_testi8
39 ! CHECK-LABEL: vec_max_testi16
40 subroutine vec_max_testi16(x
, y
)
41 vector(integer(2)) :: vmax
, x
, y
44 ! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
45 ! LLVMIR: %[[y:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
46 ! LLVMIR: %[[vmax:.*]] = call <8 x i16> @llvm.ppc.altivec.vmaxsh(<8 x i16> %[[x]], <8 x i16> %[[y]])
47 ! LLVMIR: store <8 x i16> %[[vmax]], ptr %{{[0-9]}}, align 16
48 end subroutine vec_max_testi16
50 ! CHECK-LABEL: vec_max_testi32
51 subroutine vec_max_testi32(x
, y
)
52 vector(integer(4)) :: vmax
, x
, y
55 ! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
56 ! LLVMIR: %[[y:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
57 ! LLVMIR: %[[vmax:.*]] = call <4 x i32> @llvm.ppc.altivec.vmaxsw(<4 x i32> %[[x]], <4 x i32> %[[y]])
58 ! LLVMIR: store <4 x i32> %[[vmax]], ptr %{{[0-9]}}, align 16
59 end subroutine vec_max_testi32
61 ! CHECK-LABEL: vec_max_testi64
62 subroutine vec_max_testi64(x
, y
)
63 vector(integer(8)) :: vmax
, x
, y
66 ! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
67 ! LLVMIR: %[[y:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
68 ! LLVMIR: %[[vmax:.*]] = call <2 x i64> @llvm.ppc.altivec.vmaxsd(<2 x i64> %[[x]], <2 x i64> %[[y]])
69 ! LLVMIR: store <2 x i64> %[[vmax]], ptr %{{[0-9]}}, align 16
70 end subroutine vec_max_testi64
72 ! CHECK-LABEL: vec_max_testui8
73 subroutine vec_max_testui8(x
, y
)
74 vector(unsigned(1)) :: vmax
, x
, y
77 ! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
78 ! LLVMIR: %[[y:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
79 ! LLVMIR: %[[vmax:.*]] = call <16 x i8> @llvm.ppc.altivec.vmaxub(<16 x i8> %[[x]], <16 x i8> %[[y]])
80 ! LLVMIR: store <16 x i8> %[[vmax]], ptr %{{[0-9]}}, align 16
81 end subroutine vec_max_testui8
83 ! CHECK-LABEL: vec_max_testui16
84 subroutine vec_max_testui16(x
, y
)
85 vector(unsigned(2)) :: vmax
, x
, y
88 ! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
89 ! LLVMIR: %[[y:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
90 ! LLVMIR: %[[vmax:.*]] = call <8 x i16> @llvm.ppc.altivec.vmaxuh(<8 x i16> %[[x]], <8 x i16> %[[y]])
91 ! LLVMIR: store <8 x i16> %[[vmax]], ptr %{{[0-9]}}, align 16
92 end subroutine vec_max_testui16
94 ! CHECK-LABEL: vec_max_testui32
95 subroutine vec_max_testui32(x
, y
)
96 vector(unsigned(4)) :: vmax
, x
, y
99 ! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
100 ! LLVMIR: %[[y:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
101 ! LLVMIR: %[[vmax:.*]] = call <4 x i32> @llvm.ppc.altivec.vmaxuw(<4 x i32> %[[x]], <4 x i32> %[[y]])
102 ! LLVMIR: store <4 x i32> %[[vmax]], ptr %{{[0-9]}}, align 16
103 end subroutine vec_max_testui32
105 ! CHECK-LABEL: vec_max_testui64
106 subroutine vec_max_testui64(x
, y
)
107 vector(unsigned(8)) :: vmax
, x
, y
110 ! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
111 ! LLVMIR: %[[y:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
112 ! LLVMIR: %[[vmax:.*]] = call <2 x i64> @llvm.ppc.altivec.vmaxud(<2 x i64> %[[x]], <2 x i64> %[[y]])
113 ! LLVMIR: store <2 x i64> %[[vmax]], ptr %{{[0-9]}}, align 16
114 end subroutine vec_max_testui64
118 ! CHECK-LABEL: vec_min_testf32
119 subroutine vec_min_testf32(x
, y
)
120 vector(real(4)) :: vmin
, x
, y
123 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
124 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
125 ! LLVMIR: %[[vmin:.*]] = call contract <4 x float> @llvm.ppc.vsx.xvminsp(<4 x float> %[[x]], <4 x float> %[[y]])
126 ! LLVMIR: store <4 x float> %[[vmin]], ptr %{{[0-9]}}, align 16
127 end subroutine vec_min_testf32
129 ! CHECK-LABEL: vec_min_testf64
130 subroutine vec_min_testf64(x
, y
)
131 vector(real(8)) :: vmin
, x
, y
134 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
135 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
136 ! LLVMIR: %[[vmin:.*]] = call contract <2 x double> @llvm.ppc.vsx.xvmindp(<2 x double> %[[x]], <2 x double> %[[y]])
137 ! LLVMIR: store <2 x double> %[[vmin]], ptr %{{[0-9]}}, align 16
138 end subroutine vec_min_testf64
140 ! CHECK-LABEL: vec_min_testi8
141 subroutine vec_min_testi8(x
, y
)
142 vector(integer(1)) :: vmin
, x
, y
145 ! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
146 ! LLVMIR: %[[y:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
147 ! LLVMIR: %[[vmin:.*]] = call <16 x i8> @llvm.ppc.altivec.vminsb(<16 x i8> %[[x]], <16 x i8> %[[y]])
148 ! LLVMIR: store <16 x i8> %[[vmin]], ptr %{{[0-9]}}, align 16
149 end subroutine vec_min_testi8
151 ! CHECK-LABEL: vec_min_testi16
152 subroutine vec_min_testi16(x
, y
)
153 vector(integer(2)) :: vmin
, x
, y
156 ! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
157 ! LLVMIR: %[[y:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
158 ! LLVMIR: %[[vmin:.*]] = call <8 x i16> @llvm.ppc.altivec.vminsh(<8 x i16> %[[x]], <8 x i16> %[[y]])
159 ! LLVMIR: store <8 x i16> %[[vmin]], ptr %{{[0-9]}}, align 16
160 end subroutine vec_min_testi16
162 ! CHECK-LABEL: vec_min_testi32
163 subroutine vec_min_testi32(x
, y
)
164 vector(integer(4)) :: vmin
, x
, y
167 ! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
168 ! LLVMIR: %[[y:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
169 ! LLVMIR: %[[vmin:.*]] = call <4 x i32> @llvm.ppc.altivec.vminsw(<4 x i32> %[[x]], <4 x i32> %[[y]])
170 ! LLVMIR: store <4 x i32> %[[vmin]], ptr %{{[0-9]}}, align 16
171 end subroutine vec_min_testi32
173 ! CHECK-LABEL: vec_min_testi64
174 subroutine vec_min_testi64(x
, y
)
175 vector(integer(8)) :: vmin
, x
, y
178 ! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
179 ! LLVMIR: %[[y:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
180 ! LLVMIR: %[[vmin:.*]] = call <2 x i64> @llvm.ppc.altivec.vminsd(<2 x i64> %[[x]], <2 x i64> %[[y]])
181 ! LLVMIR: store <2 x i64> %[[vmin]], ptr %{{[0-9]}}, align 16
182 end subroutine vec_min_testi64
184 ! CHECK-LABEL: vec_min_testui8
185 subroutine vec_min_testui8(x
, y
)
186 vector(unsigned(1)) :: vmin
, x
, y
189 ! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
190 ! LLVMIR: %[[y:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16
191 ! LLVMIR: %[[vmin:.*]] = call <16 x i8> @llvm.ppc.altivec.vminub(<16 x i8> %[[x]], <16 x i8> %[[y]])
192 ! LLVMIR: store <16 x i8> %[[vmin]], ptr %{{[0-9]}}, align 16
193 end subroutine vec_min_testui8
195 ! CHECK-LABEL: vec_min_testui16
196 subroutine vec_min_testui16(x
, y
)
197 vector(unsigned(2)) :: vmin
, x
, y
200 ! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
201 ! LLVMIR: %[[y:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16
202 ! LLVMIR: %[[vmin:.*]] = call <8 x i16> @llvm.ppc.altivec.vminuh(<8 x i16> %[[x]], <8 x i16> %[[y]])
203 ! LLVMIR: store <8 x i16> %[[vmin]], ptr %{{[0-9]}}, align 16
204 end subroutine vec_min_testui16
206 ! CHECK-LABEL: vec_min_testui32
207 subroutine vec_min_testui32(x
, y
)
208 vector(unsigned(4)) :: vmin
, x
, y
211 ! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
212 ! LLVMIR: %[[y:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16
213 ! LLVMIR: %[[vmin:.*]] = call <4 x i32> @llvm.ppc.altivec.vminuw(<4 x i32> %[[x]], <4 x i32> %[[y]])
214 ! LLVMIR: store <4 x i32> %[[vmin]], ptr %{{[0-9]}}, align 16
215 end subroutine vec_min_testui32
217 ! CHECK-LABEL: vec_min_testui64
218 subroutine vec_min_testui64(x
, y
)
219 vector(unsigned(8)) :: vmin
, x
, y
222 ! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
223 ! LLVMIR: %[[y:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16
224 ! LLVMIR: %[[vmin:.*]] = call <2 x i64> @llvm.ppc.altivec.vminud(<2 x i64> %[[x]], <2 x i64> %[[y]])
225 ! LLVMIR: store <2 x i64> %[[vmin]], ptr %{{[0-9]}}, align 16
226 end subroutine vec_min_testui64
230 ! CHECK-LABEL: vec_madd_testf32
231 subroutine vec_madd_testf32(x
, y
, z
)
232 vector(real(4)) :: vmsum
, x
, y
, z
233 vmsum
= vec_madd(x
, y
, z
)
235 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
236 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
237 ! LLVMIR: %[[z:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
238 ! LLVMIR: %[[vmsum:.*]] = call contract <4 x float> @llvm.fma.v4f32(<4 x float> %[[x]], <4 x float> %[[y]], <4 x float> %[[z]])
239 ! LLVMIR: store <4 x float> %[[vmsum]], ptr %{{[0-9]}}, align 16
240 end subroutine vec_madd_testf32
242 ! CHECK-LABEL: vec_madd_testf64
243 subroutine vec_madd_testf64(x
, y
, z
)
244 vector(real(8)) :: vmsum
, x
, y
, z
245 vmsum
= vec_madd(x
, y
, z
)
247 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
248 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
249 ! LLVMIR: %[[z:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
250 ! LLVMIR: %[[vmsum:.*]] = call contract <2 x double> @llvm.fma.v2f64(<2 x double> %[[x]], <2 x double> %[[y]], <2 x double> %[[z]])
251 ! LLVMIR: store <2 x double> %[[vmsum]], ptr %{{[0-9]}}, align 16
252 end subroutine vec_madd_testf64
256 ! CHECK-LABEL: vec_nmsub_testf32
257 subroutine vec_nmsub_testf32(x
, y
, z
)
258 vector(real(4)) :: vnmsub
, x
, y
, z
259 vnmsub
= vec_nmsub(x
, y
, z
)
261 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
262 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
263 ! LLVMIR: %[[z:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
264 ! LLVMIR: %[[vnmsub:.*]] = call contract <4 x float> @llvm.ppc.fnmsub.v4f32(<4 x float> %[[x]], <4 x float> %[[y]], <4 x float> %[[z]])
265 ! LLVMIR: store <4 x float> %[[vnmsub]], ptr %{{[0-9]}}, align 16
266 end subroutine vec_nmsub_testf32
268 ! CHECK-LABEL: vec_nmsub_testf64
269 subroutine vec_nmsub_testf64(x
, y
, z
)
270 vector(real(8)) :: vnmsub
, x
, y
, z
271 vnmsub
= vec_nmsub(x
, y
, z
)
273 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
274 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
275 ! LLVMIR: %[[z:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
276 ! LLVMIR: %[[vnmsub:.*]] = call contract <2 x double> @llvm.ppc.fnmsub.v2f64(<2 x double> %[[x]], <2 x double> %[[y]], <2 x double> %[[z]])
277 ! LLVMIR: store <2 x double> %[[vnmsub]], ptr %{{[0-9]}}, align 16
278 end subroutine vec_nmsub_testf64
282 ! CHECK-LABEL: vec_msub_testf32
283 subroutine vec_msub_testf32(x
, y
, z
)
284 vector(real(4)) :: vmsub
, x
, y
, z
285 vmsub
= vec_msub(x
, y
, z
)
287 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
288 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
289 ! LLVMIR: %[[z:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
290 ! LLVMIR: %[[nz:.*]] = fneg contract <4 x float> %[[z]]
291 ! LLVMIR: %[[vmsub:.*]] = call contract <4 x float> @llvm.fma.v4f32(<4 x float> %[[x]], <4 x float> %[[y]], <4 x float> %[[nz]])
292 ! LLVMIR: store <4 x float> %[[vmsub]], ptr %{{[0-9]}}, align 16
293 end subroutine vec_msub_testf32
295 ! CHECK-LABEL: vec_msub_testf64
296 subroutine vec_msub_testf64(x
, y
, z
)
297 vector(real(8)) :: vmsub
, x
, y
, z
298 vmsub
= vec_msub(x
, y
, z
)
300 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
301 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
302 ! LLVMIR: %[[z:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
303 ! LLVMIR: %[[nz:.*]] = fneg contract <2 x double> %[[z]]
304 ! LLVMIR: %[[vmsub:.*]] = call contract <2 x double> @llvm.fma.v2f64(<2 x double> %[[x]], <2 x double> %[[y]], <2 x double> %[[nz]])
305 ! LLVMIR: store <2 x double> %[[vmsub]], ptr %{{[0-9]}}, align 16
306 end subroutine vec_msub_testf64
310 ! CHECK-LABEL: vec_nmadd_testf32
311 subroutine vec_nmadd_testf32(x
, y
, z
)
312 vector(real(4)) :: vnmsum
, x
, y
, z
313 vnmsum
= vec_nmadd(x
, y
, z
)
315 ! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
316 ! LLVMIR: %[[y:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
317 ! LLVMIR: %[[z:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16
318 ! LLVMIR: %[[msum:.*]] = call contract <4 x float> @llvm.fma.v4f32(<4 x float> %[[x]], <4 x float> %[[y]], <4 x float> %[[z]])
319 ! LLVMIR: %[[vnmsum:.*]] = fneg contract <4 x float> %[[msum]]
320 ! LLVMIR: store <4 x float> %[[vnmsum]], ptr %{{[0-9]}}, align 16
321 end subroutine vec_nmadd_testf32
323 ! CHECK-LABEL: vec_nmadd_testf64
324 subroutine vec_nmadd_testf64(x
, y
, z
)
325 vector(real(8)) :: vnmsum
, x
, y
, z
326 vnmsum
= vec_nmadd(x
, y
, z
)
328 ! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
329 ! LLVMIR: %[[y:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
330 ! LLVMIR: %[[z:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16
331 ! LLVMIR: %[[msum:.*]] = call contract <2 x double> @llvm.fma.v2f64(<2 x double> %[[x]], <2 x double> %[[y]], <2 x double> %[[z]])
332 ! LLVMIR: %[[vnmsum:.*]] = fneg contract <2 x double> %[[msum]]
333 ! LLVMIR: store <2 x double> %[[vnmsum]], ptr %{{[0-9]}}, align 16
334 end subroutine vec_nmadd_testf64