[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-scalar-by-elem-fma.ll
blobed88293fcf7e34cd8a0672b85452ffda7347120a
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
3 attributes #0 = { strictfp }
5 declare float @llvm.fma.f32(float, float, float)
6 declare double @llvm.fma.f64(double, double, double)
7 declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)
8 declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)
10 define float @test_fmla_ss4S_0(float %a, float %b, <4 x float> %v) {
11   ; CHECK-LABEL: test_fmla_ss4S_0
12   ; CHECK: fmadd s0, s1, s2, s0
13   %tmp1 = extractelement <4 x float> %v, i32 0
14   %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)
15   ret float %tmp2
18 define float @test_fmla_ss4S_0_swap(float %a, float %b, <4 x float> %v) {
19   ; CHECK-LABEL: test_fmla_ss4S_0_swap
20   ; CHECK: fmadd s0, s2, s1, s0
21   %tmp1 = extractelement <4 x float> %v, i32 0
22   %tmp2 = call float @llvm.fma.f32(float %tmp1, float %b, float %a)
23   ret float %tmp2
26 define float @test_fmla_ss4S_3(float %a, float %b, <4 x float> %v) {
27   ; CHECK-LABEL: test_fmla_ss4S_3
28   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
29   %tmp1 = extractelement <4 x float> %v, i32 3
30   %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)
31   ret float %tmp2
34 define float @test_fmla_ss4S_3_swap(float %a, float %b, <4 x float> %v) {
35   ; CHECK-LABEL: test_fmla_ss4S_3_swap
36   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
37   %tmp1 = extractelement <4 x float> %v, i32 3
38   %tmp2 = call float @llvm.fma.f32(float %tmp1, float %a, float %a)
39   ret float %tmp2
42 define float @test_fmla_ss2S_0(float %a, float %b, <2 x float> %v) {
43   ; CHECK-LABEL: test_fmla_ss2S_0
44   ; CHECK: fmadd s0, s1, s2, s0
45   %tmp1 = extractelement <2 x float> %v, i32 0
46   %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)
47   ret float %tmp2
50 define float @test_fmla_ss2S_0_swap(float %a, float %b, <2 x float> %v) {
51   ; CHECK-LABEL: test_fmla_ss2S_0_swap
52   ; CHECK: fmadd s0, s2, s1, s0
53   %tmp1 = extractelement <2 x float> %v, i32 0
54   %tmp2 = call float @llvm.fma.f32(float %tmp1, float %b, float %a)
55   ret float %tmp2
58 define float @test_fmla_ss2S_1(float %a, float %b, <2 x float> %v) {
59   ; CHECK-LABEL: test_fmla_ss2S_1
60   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
61   %tmp1 = extractelement <2 x float> %v, i32 1
62   %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)
63   ret float %tmp2
66 define double @test_fmla_ddD_0(double %a, double %b, <1 x double> %v) {
67   ; CHECK-LABEL: test_fmla_ddD_0
68   ; CHECK: fmadd d0, d1, d2, d0
69   %tmp1 = extractelement <1 x double> %v, i32 0
70   %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)
71   ret double %tmp2
74 define double @test_fmla_ddD_0_swap(double %a, double %b, <1 x double> %v) {
75   ; CHECK-LABEL: test_fmla_ddD_0_swap
76   ; CHECK: fmadd d0, d2, d1, d0
77   %tmp1 = extractelement <1 x double> %v, i32 0
78   %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)
79   ret double %tmp2
82 define double @test_fmla_dd2D_0(double %a, double %b, <2 x double> %v) {
83   ; CHECK-LABEL: test_fmla_dd2D_0
84   ; CHECK: fmadd d0, d1, d2, d0
85   %tmp1 = extractelement <2 x double> %v, i32 0
86   %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)
87   ret double %tmp2
90 define double @test_fmla_dd2D_0_swap(double %a, double %b, <2 x double> %v) {
91   ; CHECK-LABEL: test_fmla_dd2D_0_swap
92   ; CHECK: fmadd d0, d2, d1, d0
93   %tmp1 = extractelement <2 x double> %v, i32 0
94   %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)
95   ret double %tmp2
98 define double @test_fmla_dd2D_1(double %a, double %b, <2 x double> %v) {
99   ; CHECK-LABEL: test_fmla_dd2D_1
100   ; CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
101   %tmp1 = extractelement <2 x double> %v, i32 1
102   %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)
103   ret double %tmp2
106 define double @test_fmla_dd2D_1_swap(double %a, double %b, <2 x double> %v) {
107   ; CHECK-LABEL: test_fmla_dd2D_1_swap
108   ; CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
109   %tmp1 = extractelement <2 x double> %v, i32 1
110   %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)
111   ret double %tmp2
114 define float @test_fmls_ss4S_0(float %a, float %b, <4 x float> %v) {
115   ; CHECK-LABEL: test_fmls_ss4S_0
116   ; CHECK: fmsub s0, s2, s1, s0
117 entry:
118   %fneg = fneg float %b
119   %extract = extractelement <4 x float> %v, i64 0
120   %0 = tail call float @llvm.fma.f32(float %fneg, float %extract, float %a)
121   ret float %0
124 define float @test_fmls_ss4S_0_swap(float %a, float %b, <4 x float> %v) {
125   ; CHECK-LABEL: test_fmls_ss4S_0_swap
126   ; CHECK: fmsub s0, s2, s1, s0
127 entry:
128   %fneg = fneg float %b
129   %extract = extractelement <4 x float> %v, i64 0
130   %0 = tail call float @llvm.fma.f32(float %extract, float %fneg, float %a)
131   ret float %0
134 define float @test_fmls_ss4S_3(float %a, float %b, <4 x float> %v) {
135   ; CHECK-LABEL: test_fmls_ss4S_3
136   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
137   %tmp1 = extractelement <4 x float> %v, i32 3
138   %tmp2 = fsub float -0.0, %tmp1
139   %tmp3 = call float @llvm.fma.f32(float %tmp2, float %tmp1, float %a)
140   ret float %tmp3
143 define float @test_fmls_ss4S_3_swap(float %a, float %b, <4 x float> %v) {
144   ; CHECK-LABEL: test_fmls_ss4S_3_swap
145   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
146   %tmp1 = extractelement <4 x float> %v, i32 3
147   %tmp2 = fsub float -0.0, %tmp1
148   %tmp3 = call float @llvm.fma.f32(float %tmp1, float %tmp2, float %a)
149   ret float %tmp3
153 define float @test_fmls_ss2S_0(float %a, float %b, <2 x float> %v) {
154   ; CHECK-LABEL: test_fmls_ss2S_0
155   ; CHECK: fmsub s0, s2, s1, s0
156 entry:
157   %fneg = fneg float %b
158   %extract = extractelement <2 x float> %v, i64 0
159   %0 = tail call float @llvm.fma.f32(float %fneg, float %extract, float %a)
160   ret float %0
163 define float @test_fmls_ss2S_0_swap(float %a, float %b, <2 x float> %v) {
164   ; CHECK-LABEL: test_fmls_ss2S_0_swap
165   ; CHECK: fmsub s0, s2, s1, s0
166 entry:
167   %fneg = fneg float %b
168   %extract = extractelement <2 x float> %v, i64 0
169   %0 = tail call float @llvm.fma.f32(float %extract, float %fneg, float %a)
170   ret float %0
173 define float @test_fmls_ss2S_1(float %a, float %b, <2 x float> %v) {
174   ; CHECK-LABEL: test_fmls_ss2S_1
175   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
176   %tmp1 = extractelement <2 x float> %v, i32 1
177   %tmp2 = fsub float -0.0, %tmp1
178   %tmp3 = call float @llvm.fma.f32(float %tmp2, float %tmp1, float %a)
179   ret float %tmp3
182 define double @test_fmls_ddD_0(double %a, double %b, <1 x double> %v) {
183   ; CHECK-LABEL: test_fmls_ddD_0
184   ; CHECK: fmsub d0, d1, d2, d0
185 entry:
186   %fneg = fneg double %b
187   %extract = extractelement <1 x double> %v, i64 0
188   %0 = tail call double @llvm.fma.f64(double %fneg, double %extract, double %a)
189   ret double %0
192 define double @test_fmls_ddD_0_swap(double %a, double %b, <1 x double> %v) {
193   ; CHECK-LABEL: test_fmls_ddD_0_swap
194   ; CHECK: fmsub d0, d2, d1, d0
195 entry:
196   %fneg = fneg double %b
197   %extract = extractelement <1 x double> %v, i64 0
198   %0 = tail call double @llvm.fma.f64(double %extract, double %fneg, double %a)
199   ret double %0
202 define double @test_fmls_dd2D_0(double %a, double %b, <2 x double> %v) {
203   ; CHECK-LABEL: test_fmls_dd2D_0
204   ; CHECK: fmsub d0, d2, d1, d0
205 entry:
206   %fneg = fneg double %b
207   %extract = extractelement <2 x double> %v, i64 0
208   %0 = tail call double @llvm.fma.f64(double %fneg, double %extract, double %a)
209   ret double %0
212 define double @test_fmls_dd2D_0_swap(double %a, double %b, <2 x double> %v) {
213   ; CHECK-LABEL: test_fmls_dd2D_0_swap
214   ; CHECK: fmsub d0, d2, d1, d0
215 entry:
216   %fneg = fneg double %b
217   %extract = extractelement <2 x double> %v, i64 0
218   %0 = tail call double @llvm.fma.f64(double %extract, double %fneg, double %a)
219   ret double %0
222 define double @test_fmls_dd2D_1(double %a, double %b, <2 x double> %v) {
223   ; CHECK-LABEL: test_fmls_dd2D_1
224   ; CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
225   %tmp1 = extractelement <2 x double> %v, i32 1
226   %tmp2 = fsub double -0.0, %tmp1
227   %tmp3 = call double @llvm.fma.f64(double %tmp2, double %tmp1, double %a)
228   ret double %tmp3
231 define double @test_fmls_dd2D_1_swap(double %a, double %b, <2 x double> %v) {
232   ; CHECK-LABEL: test_fmls_dd2D_1_swap
233   ; CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
234   %tmp1 = extractelement <2 x double> %v, i32 1
235   %tmp2 = fsub double -0.0, %tmp1
236   %tmp3 = call double @llvm.fma.f64(double %tmp1, double %tmp2, double %a)
237   ret double %tmp3
240 define float @test_fmla_ss4S_0_strict(float %a, float %b, <4 x float> %v) #0 {
241   ; CHECK-LABEL: test_fmla_ss4S_0_strict
242   ; CHECK: fmadd s0, s1, s2, s0
243   %tmp1 = extractelement <4 x float> %v, i32 0
244   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
245   ret float %tmp2
248 define float @test_fmla_ss4S_0_swap_strict(float %a, float %b, <4 x float> %v) #0 {
249   ; CHECK-LABEL: test_fmla_ss4S_0_swap_strict
250   ; CHECK: fmadd s0, s2, s1, s0
251   %tmp1 = extractelement <4 x float> %v, i32 0
252   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %b, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
253   ret float %tmp2
256 define float @test_fmla_ss4S_3_strict(float %a, float %b, <4 x float> %v) #0 {
257   ; CHECK-LABEL: test_fmla_ss4S_3_strict
258   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
259   %tmp1 = extractelement <4 x float> %v, i32 3
260   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
261   ret float %tmp2
264 define float @test_fmla_ss4S_3_swap_strict(float %a, float %b, <4 x float> %v) #0 {
265   ; CHECK-LABEL: test_fmla_ss4S_3_swap_strict
266   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
267   %tmp1 = extractelement <4 x float> %v, i32 3
268   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %a, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
269   ret float %tmp2
272 define float @test_fmla_ss2S_0_strict(float %a, float %b, <2 x float> %v) #0 {
273   ; CHECK-LABEL: test_fmla_ss2S_0_strict
274   ; CHECK: fmadd s0, s1, s2, s0
275   %tmp1 = extractelement <2 x float> %v, i32 0
276   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
277   ret float %tmp2
280 define float @test_fmla_ss2S_0_swap_strict(float %a, float %b, <2 x float> %v) #0 {
281   ; CHECK-LABEL: test_fmla_ss2S_0_swap_strict
282   ; CHECK: fmadd s0, s2, s1, s0
283   %tmp1 = extractelement <2 x float> %v, i32 0
284   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %b, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
285   ret float %tmp2
288 define float @test_fmla_ss2S_1_strict(float %a, float %b, <2 x float> %v) #0 {
289   ; CHECK-LABEL: test_fmla_ss2S_1_strict
290   ; CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
291   %tmp1 = extractelement <2 x float> %v, i32 1
292   %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
293   ret float %tmp2
296 define double @test_fmla_ddD_0_strict(double %a, double %b, <1 x double> %v) #0 {
297   ; CHECK-LABEL: test_fmla_ddD_0_strict
298   ; CHECK: fmadd d0, d1, d2, d0
299   %tmp1 = extractelement <1 x double> %v, i32 0
300   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
301   ret double %tmp2
304 define double @test_fmla_ddD_0_swap_strict(double %a, double %b, <1 x double> %v) #0 {
305   ; CHECK-LABEL: test_fmla_ddD_0_swap_strict
306   ; CHECK: fmadd d0, d2, d1, d0
307   %tmp1 = extractelement <1 x double> %v, i32 0
308   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
309   ret double %tmp2
312 define double @test_fmla_dd2D_0_strict(double %a, double %b, <2 x double> %v) #0 {
313   ; CHECK-LABEL: test_fmla_dd2D_0_strict
314   ; CHECK: fmadd d0, d1, d2, d0
315   %tmp1 = extractelement <2 x double> %v, i32 0
316   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
317   ret double %tmp2
320 define double @test_fmla_dd2D_0_swap_strict(double %a, double %b, <2 x double> %v) #0 {
321   ; CHECK-LABEL: test_fmla_dd2D_0_swap_strict
322   ; CHECK: fmadd d0, d2, d1, d0
323   %tmp1 = extractelement <2 x double> %v, i32 0
324   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
325   ret double %tmp2
328 define double @test_fmla_dd2D_1_strict(double %a, double %b, <2 x double> %v) #0 {
329   ; CHECK-LABEL: test_fmla_dd2D_1_strict
330   ; CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
331   %tmp1 = extractelement <2 x double> %v, i32 1
332   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
333   ret double %tmp2
336 define double @test_fmla_dd2D_1_swap_strict(double %a, double %b, <2 x double> %v) #0 {
337   ; CHECK-LABEL: test_fmla_dd2D_1_swap_strict
338   ; CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
339   %tmp1 = extractelement <2 x double> %v, i32 1
340   %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
341   ret double %tmp2
344 define float @test_fmls_ss4S_0_strict(float %a, float %b, <4 x float> %v) #0 {
345   ; CHECK-LABEL: test_fmls_ss4S_0_strict
346   ; CHECK: fmsub s0, s2, s1, s0
347 entry:
348   %fneg = fneg float %b
349   %extract = extractelement <4 x float> %v, i64 0
350   %0 = tail call float @llvm.experimental.constrained.fma.f32(float %fneg, float %extract, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
351   ret float %0
354 define float @test_fmls_ss4S_0_swap_strict(float %a, float %b, <4 x float> %v) #0 {
355   ; CHECK-LABEL: test_fmls_ss4S_0_swap_strict
356   ; CHECK: fmsub s0, s2, s1, s0
357 entry:
358   %fneg = fneg float %b
359   %extract = extractelement <4 x float> %v, i64 0
360   %0 = tail call float @llvm.experimental.constrained.fma.f32(float %extract, float %fneg, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
361   ret float %0
364 define float @test_fmls_ss4S_3_strict(float %a, float %b, <4 x float> %v) #0 {
365   ; CHECK-LABEL: test_fmls_ss4S_3_strict
366   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
367   %tmp1 = extractelement <4 x float> %v, i32 3
368   %tmp2 = fneg float %tmp1
369   %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp2, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
370   ret float %tmp3
373 define float @test_fmls_ss4S_3_swap_strict(float %a, float %b, <4 x float> %v) #0 {
374   ; CHECK-LABEL: test_fmls_ss4S_3_swap_strict
375   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
376   %tmp1 = extractelement <4 x float> %v, i32 3
377   %tmp2 = fneg float %tmp1
378   %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %tmp2, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
379   ret float %tmp3
382 define float @test_fmls_ss2S_0_strict(float %a, float %b, <2 x float> %v) #0 {
383   ; CHECK-LABEL: test_fmls_ss2S_0_strict
384   ; CHECK: fmsub s0, s2, s1, s0
385 entry:
386   %fneg = fneg float %b
387   %extract = extractelement <2 x float> %v, i64 0
388   %0 = tail call float @llvm.experimental.constrained.fma.f32(float %fneg, float %extract, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
389   ret float %0
392 define float @test_fmls_ss2S_0_swap_strict(float %a, float %b, <2 x float> %v) #0 {
393   ; CHECK-LABEL: test_fmls_ss2S_0_swap_strict
394   ; CHECK: fmsub s0, s2, s1, s0
395 entry:
396   %fneg = fneg float %b
397   %extract = extractelement <2 x float> %v, i64 0
398   %0 = tail call float @llvm.experimental.constrained.fma.f32(float %extract, float %fneg, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
399   ret float %0
402 define float @test_fmls_ss2S_1_strict(float %a, float %b, <2 x float> %v) #0 {
403   ; CHECK-LABEL: test_fmls_ss2S_1_strict
404   ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
405   %tmp1 = extractelement <2 x float> %v, i32 1
406   %tmp2 = fneg float %tmp1
407   %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp2, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
408   ret float %tmp3
411 define double @test_fmls_ddD_0_strict(double %a, double %b, <1 x double> %v) #0 {
412   ; CHECK-LABEL: test_fmls_ddD_0_strict
413   ; CHECK: fmsub d0, d2, d1, d0
414 entry:
415   %fneg = fneg double %b
416   %extract = extractelement <1 x double> %v, i64 0
417   %0 = tail call double @llvm.experimental.constrained.fma.f64(double %fneg, double %extract, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
418   ret double %0
421 define double @test_fmls_ddD_0_swap_strict(double %a, double %b, <1 x double> %v) #0 {
422   ; CHECK-LABEL: test_fmls_ddD_0_swap_strict
423   ; CHECK: fmsub d0, d2, d1, d0
424 entry:
425   %fneg = fneg double %b
426   %extract = extractelement <1 x double> %v, i64 0
427   %0 = tail call double @llvm.experimental.constrained.fma.f64(double %extract, double %fneg, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
428   ret double %0
431 define double @test_fmls_dd2D_0_strict(double %a, double %b, <2 x double> %v) #0 {
432   ; CHECK-LABEL: test_fmls_dd2D_0_strict
433   ; CHECK: fmsub d0, d2, d1, d0
434 entry:
435   %fneg = fneg double %b
436   %extract = extractelement <2 x double> %v, i64 0
437   %0 = tail call double @llvm.experimental.constrained.fma.f64(double %fneg, double %extract, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
438   ret double %0
441 define double @test_fmls_dd2D_0_swap_strict(double %a, double %b, <2 x double> %v) #0 {
442   ; CHECK-LABEL: test_fmls_dd2D_0_swap_strict
443   ; CHECK: fmsub d0, d2, d1, d0
444 entry:
445   %fneg = fneg double %b
446   %extract = extractelement <2 x double> %v, i64 0
447   %0 = tail call double @llvm.experimental.constrained.fma.f64(double %extract, double %fneg, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
448   ret double %0
451 define double @test_fmls_dd2D_1_strict(double %a, double %b, <2 x double> %v) #0 {
452   ; CHECK-LABEL: test_fmls_dd2D_1_strict
453   ; CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
454   %tmp1 = extractelement <2 x double> %v, i32 1
455   %tmp2 = fneg double %tmp1
456   %tmp3 = call double @llvm.experimental.constrained.fma.f64(double %tmp2, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
457   ret double %tmp3
460 define double @test_fmls_dd2D_1_swap_strict(double %a, double %b, <2 x double> %v) #0 {
461   ; CHECK-LABEL: test_fmls_dd2D_1_swap_strict
462   ; CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
463   %tmp1 = extractelement <2 x double> %v, i32 1
464   %tmp2 = fneg double %tmp1
465   %tmp3 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %tmp2, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")
466   ret double %tmp3