Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / vecreduce-fmul.ll
blob67b4ebb338248726a7266fc5dbc06202b4218955
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16
3 ; RUN: llc -mtriple=aarch64-none-eabi -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
4 ; RUN: llc -mtriple=aarch64-none-eabi -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
5 ; RUN: llc -mtriple=aarch64-none-eabi -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
7 define float @mul_HalfS(<2 x float> %bin.rdx)  {
8 ; CHECK-SD-LABEL: mul_HalfS:
9 ; CHECK-SD:       // %bb.0:
10 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
11 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
12 ; CHECK-SD-NEXT:    ret
14 ; CHECK-GI-LABEL: mul_HalfS:
15 ; CHECK-GI:       // %bb.0:
16 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
17 ; CHECK-GI-NEXT:    mov s1, v0.s[1]
18 ; CHECK-GI-NEXT:    fmul s0, s0, s1
19 ; CHECK-GI-NEXT:    ret
20   %r = call fast float @llvm.vector.reduce.fmul.f32.v2f32(float 1.0, <2 x float> %bin.rdx)
21   ret float %r
24 define half @mul_HalfH(<4 x half> %bin.rdx)  {
25 ; CHECK-SD-NOFP16-LABEL: mul_HalfH:
26 ; CHECK-SD-NOFP16:       // %bb.0:
27 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
28 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
29 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
30 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
31 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s2, s1
32 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[2]
33 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[3]
34 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
35 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
36 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
37 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
38 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
39 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
40 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
41 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s1, s0
42 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
43 ; CHECK-SD-NOFP16-NEXT:    ret
45 ; CHECK-SD-FP16-LABEL: mul_HalfH:
46 ; CHECK-SD-FP16:       // %bb.0:
47 ; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
48 ; CHECK-SD-FP16-NEXT:    fmul h1, h0, v0.h[1]
49 ; CHECK-SD-FP16-NEXT:    fmul h1, h1, v0.h[2]
50 ; CHECK-SD-FP16-NEXT:    fmul h0, h1, v0.h[3]
51 ; CHECK-SD-FP16-NEXT:    ret
53 ; CHECK-GI-NOFP16-LABEL: mul_HalfH:
54 ; CHECK-GI-NOFP16:       // %bb.0:
55 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
56 ; CHECK-GI-NOFP16-NEXT:    mov d1, v0.d[1]
57 ; CHECK-GI-NOFP16-NEXT:    fmul v0.2s, v0.2s, v1.2s
58 ; CHECK-GI-NOFP16-NEXT:    mov s1, v0.s[1]
59 ; CHECK-GI-NOFP16-NEXT:    fmul s0, s0, s1
60 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
61 ; CHECK-GI-NOFP16-NEXT:    ret
63 ; CHECK-GI-FP16-LABEL: mul_HalfH:
64 ; CHECK-GI-FP16:       // %bb.0:
65 ; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
66 ; CHECK-GI-FP16-NEXT:    mov h1, v0.h[1]
67 ; CHECK-GI-FP16-NEXT:    mov h2, v0.h[2]
68 ; CHECK-GI-FP16-NEXT:    mov h3, v0.h[3]
69 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
70 ; CHECK-GI-FP16-NEXT:    fmul h1, h2, h3
71 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
72 ; CHECK-GI-FP16-NEXT:    ret
73   %r = call fast half @llvm.vector.reduce.fmul.f16.v4f16(half 1.0, <4 x half> %bin.rdx)
74   ret half %r
78 define half @mul_H(<8 x half> %bin.rdx)  {
79 ; CHECK-SD-NOFP16-LABEL: mul_H:
80 ; CHECK-SD-NOFP16:       // %bb.0:
81 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
82 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
83 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
84 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s2, s1
85 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[2]
86 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
87 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
88 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
89 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
90 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[3]
91 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
92 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
93 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
94 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
95 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[4]
96 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
97 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
98 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
99 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
100 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[5]
101 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
102 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
103 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
104 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
105 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
106 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
107 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
108 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
109 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
110 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
111 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s1, s2
112 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
113 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
114 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s1, s0
115 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
116 ; CHECK-SD-NOFP16-NEXT:    ret
118 ; CHECK-SD-FP16-LABEL: mul_H:
119 ; CHECK-SD-FP16:       // %bb.0:
120 ; CHECK-SD-FP16-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
121 ; CHECK-SD-FP16-NEXT:    fmul v0.4h, v0.4h, v1.4h
122 ; CHECK-SD-FP16-NEXT:    fmul h1, h0, v0.h[1]
123 ; CHECK-SD-FP16-NEXT:    fmul h1, h1, v0.h[2]
124 ; CHECK-SD-FP16-NEXT:    fmul h0, h1, v0.h[3]
125 ; CHECK-SD-FP16-NEXT:    ret
127 ; CHECK-GI-NOFP16-LABEL: mul_H:
128 ; CHECK-GI-NOFP16:       // %bb.0:
129 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
130 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
131 ; CHECK-GI-NOFP16-NEXT:    fmul v0.4s, v1.4s, v0.4s
132 ; CHECK-GI-NOFP16-NEXT:    mov d1, v0.d[1]
133 ; CHECK-GI-NOFP16-NEXT:    fmul v0.2s, v0.2s, v1.2s
134 ; CHECK-GI-NOFP16-NEXT:    mov s1, v0.s[1]
135 ; CHECK-GI-NOFP16-NEXT:    fmul s0, s0, s1
136 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
137 ; CHECK-GI-NOFP16-NEXT:    ret
139 ; CHECK-GI-FP16-LABEL: mul_H:
140 ; CHECK-GI-FP16:       // %bb.0:
141 ; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
142 ; CHECK-GI-FP16-NEXT:    fmul v0.4h, v0.4h, v1.4h
143 ; CHECK-GI-FP16-NEXT:    mov h1, v0.h[1]
144 ; CHECK-GI-FP16-NEXT:    mov h2, v0.h[2]
145 ; CHECK-GI-FP16-NEXT:    mov h3, v0.h[3]
146 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
147 ; CHECK-GI-FP16-NEXT:    fmul h1, h2, h3
148 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
149 ; CHECK-GI-FP16-NEXT:    ret
150   %r = call fast half @llvm.vector.reduce.fmul.f16.v8f16(half 1.0, <8 x half> %bin.rdx)
151   ret half %r
154 define float @mul_S(<4 x float> %bin.rdx)  {
155 ; CHECK-SD-LABEL: mul_S:
156 ; CHECK-SD:       // %bb.0:
157 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
158 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
159 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
160 ; CHECK-SD-NEXT:    ret
162 ; CHECK-GI-LABEL: mul_S:
163 ; CHECK-GI:       // %bb.0:
164 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
165 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v1.2s
166 ; CHECK-GI-NEXT:    mov s1, v0.s[1]
167 ; CHECK-GI-NEXT:    fmul s0, s0, s1
168 ; CHECK-GI-NEXT:    ret
169   %r = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %bin.rdx)
170   ret float %r
173 define double @mul_D(<2 x double> %bin.rdx)  {
174 ; CHECK-LABEL: mul_D:
175 ; CHECK:       // %bb.0:
176 ; CHECK-NEXT:    fmul d0, d0, v0.d[1]
177 ; CHECK-NEXT:    ret
178   %r = call fast double @llvm.vector.reduce.fmul.f64.v2f64(double 1.0, <2 x double> %bin.rdx)
179   ret double %r
182 define half @mul_2H(<16 x half> %bin.rdx)  {
183 ; CHECK-SD-NOFP16-LABEL: mul_2H:
184 ; CHECK-SD-NOFP16:       // %bb.0:
185 ; CHECK-SD-NOFP16-NEXT:    mov h2, v1.h[1]
186 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[1]
187 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h1
188 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h0
189 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
190 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
191 ; CHECK-SD-NOFP16-NEXT:    fmul s4, s5, s4
192 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
193 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s3, s2
194 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[2]
195 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
196 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
197 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
198 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
199 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
200 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
201 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s5, s3
202 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[3]
203 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s4, s2
204 ; CHECK-SD-NOFP16-NEXT:    mov h4, v1.h[3]
205 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
206 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
207 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
208 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
209 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
210 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
211 ; CHECK-SD-NOFP16-NEXT:    fmul s4, s5, s4
212 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[4]
213 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s3
214 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[4]
215 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
216 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
217 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
218 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
219 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
220 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
221 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s5, s3
222 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[5]
223 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
224 ; CHECK-SD-NOFP16-NEXT:    mov h4, v1.h[5]
225 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
226 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
227 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
228 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
229 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
230 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
231 ; CHECK-SD-NOFP16-NEXT:    fmul s4, s5, s4
232 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[6]
233 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
234 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s3
235 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s4
236 ; CHECK-SD-NOFP16-NEXT:    mov h4, v1.h[6]
237 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
238 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
239 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
240 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
241 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
242 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
243 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
244 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
245 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s0, s1
246 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s3
247 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s5, s4
248 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
249 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
250 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
251 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
252 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
253 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
254 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s3
255 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
256 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
257 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s1, s0
258 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
259 ; CHECK-SD-NOFP16-NEXT:    ret
261 ; CHECK-SD-FP16-LABEL: mul_2H:
262 ; CHECK-SD-FP16:       // %bb.0:
263 ; CHECK-SD-FP16-NEXT:    fmul v0.8h, v0.8h, v1.8h
264 ; CHECK-SD-FP16-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
265 ; CHECK-SD-FP16-NEXT:    fmul v0.4h, v0.4h, v1.4h
266 ; CHECK-SD-FP16-NEXT:    fmul h1, h0, v0.h[1]
267 ; CHECK-SD-FP16-NEXT:    fmul h1, h1, v0.h[2]
268 ; CHECK-SD-FP16-NEXT:    fmul h0, h1, v0.h[3]
269 ; CHECK-SD-FP16-NEXT:    ret
271 ; CHECK-GI-NOFP16-LABEL: mul_2H:
272 ; CHECK-GI-NOFP16:       // %bb.0:
273 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
274 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
275 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
276 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
277 ; CHECK-GI-NOFP16-NEXT:    fmul v0.4s, v2.4s, v0.4s
278 ; CHECK-GI-NOFP16-NEXT:    fmul v1.4s, v3.4s, v1.4s
279 ; CHECK-GI-NOFP16-NEXT:    fmul v0.4s, v0.4s, v1.4s
280 ; CHECK-GI-NOFP16-NEXT:    mov d1, v0.d[1]
281 ; CHECK-GI-NOFP16-NEXT:    fmul v0.2s, v0.2s, v1.2s
282 ; CHECK-GI-NOFP16-NEXT:    mov s1, v0.s[1]
283 ; CHECK-GI-NOFP16-NEXT:    fmul s0, s0, s1
284 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
285 ; CHECK-GI-NOFP16-NEXT:    ret
287 ; CHECK-GI-FP16-LABEL: mul_2H:
288 ; CHECK-GI-FP16:       // %bb.0:
289 ; CHECK-GI-FP16-NEXT:    fmul v0.8h, v0.8h, v1.8h
290 ; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
291 ; CHECK-GI-FP16-NEXT:    fmul v0.4h, v0.4h, v1.4h
292 ; CHECK-GI-FP16-NEXT:    mov h1, v0.h[1]
293 ; CHECK-GI-FP16-NEXT:    mov h2, v0.h[2]
294 ; CHECK-GI-FP16-NEXT:    mov h3, v0.h[3]
295 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
296 ; CHECK-GI-FP16-NEXT:    fmul h1, h2, h3
297 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
298 ; CHECK-GI-FP16-NEXT:    ret
299   %r = call fast half @llvm.vector.reduce.fmul.f16.v16f16(half 1.0, <16 x half> %bin.rdx)
300   ret half %r
303 define float @mul_2S(<8 x float> %bin.rdx)  {
304 ; CHECK-SD-LABEL: mul_2S:
305 ; CHECK-SD:       // %bb.0:
306 ; CHECK-SD-NEXT:    fmul v0.4s, v0.4s, v1.4s
307 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
308 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
309 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
310 ; CHECK-SD-NEXT:    ret
312 ; CHECK-GI-LABEL: mul_2S:
313 ; CHECK-GI:       // %bb.0:
314 ; CHECK-GI-NEXT:    fmul v0.4s, v0.4s, v1.4s
315 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
316 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v1.2s
317 ; CHECK-GI-NEXT:    mov s1, v0.s[1]
318 ; CHECK-GI-NEXT:    fmul s0, s0, s1
319 ; CHECK-GI-NEXT:    ret
320   %r = call fast float @llvm.vector.reduce.fmul.f32.v8f32(float 1.0, <8 x float> %bin.rdx)
321   ret float %r
324 define double @mul_2D(<4 x double> %bin.rdx)  {
325 ; CHECK-LABEL: mul_2D:
326 ; CHECK:       // %bb.0:
327 ; CHECK-NEXT:    fmul v0.2d, v0.2d, v1.2d
328 ; CHECK-NEXT:    fmul d0, d0, v0.d[1]
329 ; CHECK-NEXT:    ret
330   %r = call fast double @llvm.vector.reduce.fmul.f64.v4f64(double 1.0, <4 x double> %bin.rdx)
331   ret double %r
334 ; added at least one test where the start value is not 1.0.
335 define float @mul_S_init_42(<4 x float> %bin.rdx)  {
336 ; CHECK-SD-LABEL: mul_S_init_42:
337 ; CHECK-SD:       // %bb.0:
338 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
339 ; CHECK-SD-NEXT:    mov w8, #1109917696 // =0x42280000
340 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
341 ; CHECK-SD-NEXT:    fmov s1, w8
342 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
343 ; CHECK-SD-NEXT:    fmul s0, s0, s1
344 ; CHECK-SD-NEXT:    ret
346 ; CHECK-GI-LABEL: mul_S_init_42:
347 ; CHECK-GI:       // %bb.0:
348 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
349 ; CHECK-GI-NEXT:    mov w8, #1109917696 // =0x42280000
350 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v1.2s
351 ; CHECK-GI-NEXT:    mov s1, v0.s[1]
352 ; CHECK-GI-NEXT:    fmul s0, s0, s1
353 ; CHECK-GI-NEXT:    fmov s1, w8
354 ; CHECK-GI-NEXT:    fmul s0, s0, s1
355 ; CHECK-GI-NEXT:    ret
356   %r = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 42.0, <4 x float> %bin.rdx)
357   ret float %r
361 define half @fmul_reduct_reassoc_v8f16(<8 x half> %a, <8 x half> %b) {
362 ; CHECK-SD-NOFP16-LABEL: fmul_reduct_reassoc_v8f16:
363 ; CHECK-SD-NOFP16:       // %bb.0:
364 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
365 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
366 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
367 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h1
368 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
369 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
370 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s4, s2
371 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s5, s3
372 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[2]
373 ; CHECK-SD-NOFP16-NEXT:    mov h5, v1.h[2]
374 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
375 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
376 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
377 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
378 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
379 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
380 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
381 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s3, s5
382 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
383 ; CHECK-SD-NOFP16-NEXT:    mov h5, v1.h[3]
384 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
385 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
386 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
387 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
388 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
389 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
390 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
391 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s3, s5
392 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[4]
393 ; CHECK-SD-NOFP16-NEXT:    mov h5, v1.h[4]
394 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
395 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
396 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
397 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
398 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
399 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
400 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
401 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s3, s5
402 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[5]
403 ; CHECK-SD-NOFP16-NEXT:    mov h5, v1.h[5]
404 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
405 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
406 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
407 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
408 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
409 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
410 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
411 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s3, s5
412 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[6]
413 ; CHECK-SD-NOFP16-NEXT:    mov h5, v1.h[6]
414 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
415 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
416 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
417 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
418 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
419 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
420 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
421 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
422 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
423 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
424 ; CHECK-SD-NOFP16-NEXT:    fmul s2, s2, s4
425 ; CHECK-SD-NOFP16-NEXT:    fmul s3, s3, s5
426 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
427 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
428 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
429 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
430 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s2, s0
431 ; CHECK-SD-NOFP16-NEXT:    fmul s1, s3, s1
432 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
433 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
434 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
435 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
436 ; CHECK-SD-NOFP16-NEXT:    fmul s0, s0, s1
437 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
438 ; CHECK-SD-NOFP16-NEXT:    ret
440 ; CHECK-SD-FP16-LABEL: fmul_reduct_reassoc_v8f16:
441 ; CHECK-SD-FP16:       // %bb.0:
442 ; CHECK-SD-FP16-NEXT:    fmul v0.8h, v0.8h, v1.8h
443 ; CHECK-SD-FP16-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
444 ; CHECK-SD-FP16-NEXT:    fmul v0.4h, v0.4h, v1.4h
445 ; CHECK-SD-FP16-NEXT:    fmul h1, h0, v0.h[1]
446 ; CHECK-SD-FP16-NEXT:    fmul h1, h1, v0.h[2]
447 ; CHECK-SD-FP16-NEXT:    fmul h0, h1, v0.h[3]
448 ; CHECK-SD-FP16-NEXT:    ret
450 ; CHECK-GI-NOFP16-LABEL: fmul_reduct_reassoc_v8f16:
451 ; CHECK-GI-NOFP16:       // %bb.0:
452 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
453 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
454 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
455 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
456 ; CHECK-GI-NOFP16-NEXT:    fmul v0.4s, v2.4s, v0.4s
457 ; CHECK-GI-NOFP16-NEXT:    fmul v1.4s, v3.4s, v1.4s
458 ; CHECK-GI-NOFP16-NEXT:    mov d2, v0.d[1]
459 ; CHECK-GI-NOFP16-NEXT:    mov d3, v1.d[1]
460 ; CHECK-GI-NOFP16-NEXT:    fmul v0.2s, v0.2s, v2.2s
461 ; CHECK-GI-NOFP16-NEXT:    fmul v1.2s, v1.2s, v3.2s
462 ; CHECK-GI-NOFP16-NEXT:    mov s2, v0.s[1]
463 ; CHECK-GI-NOFP16-NEXT:    mov s3, v1.s[1]
464 ; CHECK-GI-NOFP16-NEXT:    fmul s0, s0, s2
465 ; CHECK-GI-NOFP16-NEXT:    fmul s1, s1, s3
466 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
467 ; CHECK-GI-NOFP16-NEXT:    fcvt h1, s1
468 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
469 ; CHECK-GI-NOFP16-NEXT:    fcvt s1, h1
470 ; CHECK-GI-NOFP16-NEXT:    fmul s0, s0, s1
471 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
472 ; CHECK-GI-NOFP16-NEXT:    ret
474 ; CHECK-GI-FP16-LABEL: fmul_reduct_reassoc_v8f16:
475 ; CHECK-GI-FP16:       // %bb.0:
476 ; CHECK-GI-FP16-NEXT:    mov d2, v0.d[1]
477 ; CHECK-GI-FP16-NEXT:    mov d3, v1.d[1]
478 ; CHECK-GI-FP16-NEXT:    fmul v0.4h, v0.4h, v2.4h
479 ; CHECK-GI-FP16-NEXT:    fmul v1.4h, v1.4h, v3.4h
480 ; CHECK-GI-FP16-NEXT:    mov h2, v0.h[1]
481 ; CHECK-GI-FP16-NEXT:    mov h3, v0.h[2]
482 ; CHECK-GI-FP16-NEXT:    mov h4, v0.h[3]
483 ; CHECK-GI-FP16-NEXT:    mov h5, v1.h[1]
484 ; CHECK-GI-FP16-NEXT:    mov h6, v1.h[2]
485 ; CHECK-GI-FP16-NEXT:    mov h7, v1.h[3]
486 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h2
487 ; CHECK-GI-FP16-NEXT:    fmul h2, h3, h4
488 ; CHECK-GI-FP16-NEXT:    fmul h1, h1, h5
489 ; CHECK-GI-FP16-NEXT:    fmul h3, h6, h7
490 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h2
491 ; CHECK-GI-FP16-NEXT:    fmul h1, h1, h3
492 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
493 ; CHECK-GI-FP16-NEXT:    ret
494   %r1 = call fast half @llvm.vector.reduce.fmul.f16.v8f16(half 1.0, <8 x half> %a)
495   %r2 = call fast half @llvm.vector.reduce.fmul.f16.v8f16(half 1.0, <8 x half> %b)
496   %r = fmul fast half %r1, %r2
497   ret half %r
500 define float @fmul_reduct_reassoc_v8f32(<8 x float> %a, <8 x float> %b) {
501 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v8f32:
502 ; CHECK-SD:       // %bb.0:
503 ; CHECK-SD-NEXT:    fmul v2.4s, v2.4s, v3.4s
504 ; CHECK-SD-NEXT:    fmul v0.4s, v0.4s, v1.4s
505 ; CHECK-SD-NEXT:    fmul v0.4s, v0.4s, v2.4s
506 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
507 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
508 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
509 ; CHECK-SD-NEXT:    ret
511 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v8f32:
512 ; CHECK-GI:       // %bb.0:
513 ; CHECK-GI-NEXT:    fmul v0.4s, v0.4s, v1.4s
514 ; CHECK-GI-NEXT:    fmul v1.4s, v2.4s, v3.4s
515 ; CHECK-GI-NEXT:    mov d2, v0.d[1]
516 ; CHECK-GI-NEXT:    mov d3, v1.d[1]
517 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v2.2s
518 ; CHECK-GI-NEXT:    fmul v1.2s, v1.2s, v3.2s
519 ; CHECK-GI-NEXT:    mov s2, v0.s[1]
520 ; CHECK-GI-NEXT:    mov s3, v1.s[1]
521 ; CHECK-GI-NEXT:    fmul s0, s0, s2
522 ; CHECK-GI-NEXT:    fmul s1, s1, s3
523 ; CHECK-GI-NEXT:    fmul s0, s0, s1
524 ; CHECK-GI-NEXT:    ret
525   %r1 = call fast float @llvm.vector.reduce.fmul.f32.v8f32(float 1.0, <8 x float> %a)
526   %r2 = call fast float @llvm.vector.reduce.fmul.f32.v8f32(float 1.0, <8 x float> %b)
527   %r = fmul fast float %r1, %r2
528   ret float %r
531 define float @fmul_reduct_reassoc_v4f32(<4 x float> %a, <4 x float> %b) {
532 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v4f32:
533 ; CHECK-SD:       // %bb.0:
534 ; CHECK-SD-NEXT:    fmul v0.4s, v0.4s, v1.4s
535 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
536 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
537 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
538 ; CHECK-SD-NEXT:    ret
540 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v4f32:
541 ; CHECK-GI:       // %bb.0:
542 ; CHECK-GI-NEXT:    mov d2, v0.d[1]
543 ; CHECK-GI-NEXT:    mov d3, v1.d[1]
544 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v2.2s
545 ; CHECK-GI-NEXT:    fmul v1.2s, v1.2s, v3.2s
546 ; CHECK-GI-NEXT:    mov s2, v0.s[1]
547 ; CHECK-GI-NEXT:    mov s3, v1.s[1]
548 ; CHECK-GI-NEXT:    fmul s0, s0, s2
549 ; CHECK-GI-NEXT:    fmul s1, s1, s3
550 ; CHECK-GI-NEXT:    fmul s0, s0, s1
551 ; CHECK-GI-NEXT:    ret
552   %r1 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %a)
553   %r2 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %b)
554   %r = fmul fast float %r1, %r2
555   ret float %r
558 define float @fmul_reduct_reassoc_v4f32_init(float %i, <4 x float> %a, <4 x float> %b) {
559 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v4f32_init:
560 ; CHECK-SD:       // %bb.0:
561 ; CHECK-SD-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
562 ; CHECK-SD-NEXT:    fmul v1.2s, v1.2s, v3.2s
563 ; CHECK-SD-NEXT:    ext v3.16b, v2.16b, v2.16b, #8
564 ; CHECK-SD-NEXT:    fmul s1, s1, v1.s[1]
565 ; CHECK-SD-NEXT:    fmul v2.2s, v2.2s, v3.2s
566 ; CHECK-SD-NEXT:    fmul s0, s0, s1
567 ; CHECK-SD-NEXT:    fmul s1, s2, v2.s[1]
568 ; CHECK-SD-NEXT:    fmul s0, s0, s1
569 ; CHECK-SD-NEXT:    ret
571 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v4f32_init:
572 ; CHECK-GI:       // %bb.0:
573 ; CHECK-GI-NEXT:    mov d3, v1.d[1]
574 ; CHECK-GI-NEXT:    fmul v1.2s, v1.2s, v3.2s
575 ; CHECK-GI-NEXT:    mov d3, v2.d[1]
576 ; CHECK-GI-NEXT:    mov s4, v1.s[1]
577 ; CHECK-GI-NEXT:    fmul v2.2s, v2.2s, v3.2s
578 ; CHECK-GI-NEXT:    fmul s1, s1, s4
579 ; CHECK-GI-NEXT:    mov s3, v2.s[1]
580 ; CHECK-GI-NEXT:    fmul s0, s0, s1
581 ; CHECK-GI-NEXT:    fmul s1, s2, s3
582 ; CHECK-GI-NEXT:    fmul s0, s0, s1
583 ; CHECK-GI-NEXT:    ret
584   %r1 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float %i, <4 x float> %a)
585   %r2 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %b)
586   %r = fmul fast float %r1, %r2
587   ret float %r
590 define float @fmul_reduct_reassoc_v4v8f32(<4 x float> %a, <8 x float> %b) {
591 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v4v8f32:
592 ; CHECK-SD:       // %bb.0:
593 ; CHECK-SD-NEXT:    fmul v1.4s, v1.4s, v2.4s
594 ; CHECK-SD-NEXT:    fmul v0.4s, v0.4s, v1.4s
595 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
596 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v1.2s
597 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
598 ; CHECK-SD-NEXT:    ret
600 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v4v8f32:
601 ; CHECK-GI:       // %bb.0:
602 ; CHECK-GI-NEXT:    fmul v1.4s, v1.4s, v2.4s
603 ; CHECK-GI-NEXT:    mov d2, v0.d[1]
604 ; CHECK-GI-NEXT:    mov d3, v1.d[1]
605 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v2.2s
606 ; CHECK-GI-NEXT:    fmul v1.2s, v1.2s, v3.2s
607 ; CHECK-GI-NEXT:    mov s2, v0.s[1]
608 ; CHECK-GI-NEXT:    mov s3, v1.s[1]
609 ; CHECK-GI-NEXT:    fmul s0, s0, s2
610 ; CHECK-GI-NEXT:    fmul s1, s1, s3
611 ; CHECK-GI-NEXT:    fmul s0, s0, s1
612 ; CHECK-GI-NEXT:    ret
613   %r1 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %a)
614   %r2 = call fast float @llvm.vector.reduce.fmul.f32.v8f32(float 1.0, <8 x float> %b)
615   %r = fmul fast float %r1, %r2
616   ret float %r
619 define double @fmul_reduct_reassoc_v4f64(<4 x double> %a, <4 x double> %b) {
620 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v4f64:
621 ; CHECK-SD:       // %bb.0:
622 ; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v3.2d
623 ; CHECK-SD-NEXT:    fmul v0.2d, v0.2d, v1.2d
624 ; CHECK-SD-NEXT:    fmul v0.2d, v0.2d, v2.2d
625 ; CHECK-SD-NEXT:    fmul d0, d0, v0.d[1]
626 ; CHECK-SD-NEXT:    ret
628 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v4f64:
629 ; CHECK-GI:       // %bb.0:
630 ; CHECK-GI-NEXT:    fmul v0.2d, v0.2d, v1.2d
631 ; CHECK-GI-NEXT:    fmul v1.2d, v2.2d, v3.2d
632 ; CHECK-GI-NEXT:    fmul d0, d0, v0.d[1]
633 ; CHECK-GI-NEXT:    fmul d1, d1, v1.d[1]
634 ; CHECK-GI-NEXT:    fmul d0, d0, d1
635 ; CHECK-GI-NEXT:    ret
636   %r1 = call fast double @llvm.vector.reduce.fmul.f64.v4f64(double 1.0, <4 x double> %a)
637   %r2 = call fast double @llvm.vector.reduce.fmul.f64.v4f64(double 1.0, <4 x double> %b)
638   %r = fmul fast double %r1, %r2
639   ret double %r
642 define float @fmul_reduct_reassoc_v4f32_extrause(<4 x float> %a, <4 x float> %b) {
643 ; CHECK-SD-LABEL: fmul_reduct_reassoc_v4f32_extrause:
644 ; CHECK-SD:       // %bb.0:
645 ; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
646 ; CHECK-SD-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
647 ; CHECK-SD-NEXT:    fmul v0.2s, v0.2s, v2.2s
648 ; CHECK-SD-NEXT:    fmul v1.2s, v1.2s, v3.2s
649 ; CHECK-SD-NEXT:    fmul s0, s0, v0.s[1]
650 ; CHECK-SD-NEXT:    fmul s1, s1, v1.s[1]
651 ; CHECK-SD-NEXT:    fmul s1, s0, s1
652 ; CHECK-SD-NEXT:    fmul s0, s1, s0
653 ; CHECK-SD-NEXT:    ret
655 ; CHECK-GI-LABEL: fmul_reduct_reassoc_v4f32_extrause:
656 ; CHECK-GI:       // %bb.0:
657 ; CHECK-GI-NEXT:    mov d2, v0.d[1]
658 ; CHECK-GI-NEXT:    mov d3, v1.d[1]
659 ; CHECK-GI-NEXT:    fmul v0.2s, v0.2s, v2.2s
660 ; CHECK-GI-NEXT:    fmul v1.2s, v1.2s, v3.2s
661 ; CHECK-GI-NEXT:    mov s2, v0.s[1]
662 ; CHECK-GI-NEXT:    mov s3, v1.s[1]
663 ; CHECK-GI-NEXT:    fmul s0, s0, s2
664 ; CHECK-GI-NEXT:    fmul s1, s1, s3
665 ; CHECK-GI-NEXT:    fmul s1, s0, s1
666 ; CHECK-GI-NEXT:    fmul s0, s1, s0
667 ; CHECK-GI-NEXT:    ret
668   %r1 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %a)
669   %r2 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.0, <4 x float> %b)
670   %r = fmul fast float %r1, %r2
671   %p = fmul float %r, %r1
672   ret float %p
675 ; Function Attrs: nounwind readnone
676 declare half @llvm.vector.reduce.fmul.f16.v4f16(half, <4 x half>)
677 declare half @llvm.vector.reduce.fmul.f16.v8f16(half, <8 x half>)
678 declare half @llvm.vector.reduce.fmul.f16.v16f16(half, <16 x half>)
679 declare float @llvm.vector.reduce.fmul.f32.v2f32(float, <2 x float>)
680 declare float @llvm.vector.reduce.fmul.f32.v4f32(float, <4 x float>)
681 declare float @llvm.vector.reduce.fmul.f32.v8f32(float, <8 x float>)
682 declare double @llvm.vector.reduce.fmul.f64.v2f64(double, <2 x double>)
683 declare double @llvm.vector.reduce.fmul.f64.v4f64(double, <4 x double>)