xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/vsx-fma-m.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx -fast-isel -O0 | FileCheck -check-prefix=CHECK-FISL %s
3*9880d681SAndroid Build Coastguard Worker; XFAIL: *
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Also run with -schedule-ppc-vsx-fma-mutation-early as a stress test for the
6*9880d681SAndroid Build Coastguard Worker; live-interval-updating logic.
7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=pwr7 -mattr=+vsx -schedule-ppc-vsx-fma-mutation-early
8*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64"
9*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu"
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine void @test1(double %a, double %b, double %c, double %e, double* nocapture %d) #0 {
12*9880d681SAndroid Build Coastguard Workerentry:
13*9880d681SAndroid Build Coastguard Worker  %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a)
14*9880d681SAndroid Build Coastguard Worker  store double %0, double* %d, align 8
15*9880d681SAndroid Build Coastguard Worker  %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a)
16*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds double, double* %d, i64 1
17*9880d681SAndroid Build Coastguard Worker  store double %1, double* %arrayidx1, align 8
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1
21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8
22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 3, 2, 1
23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 4
24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 3, 0, 7
25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 7, [[C1]]
26*9880d681SAndroid Build Coastguard Worker; CHECK: blr
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test1
29*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1
30*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3
31*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 7
32*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 4
33*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 8
34*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 7, [[C1]]
35*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine void @test2(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 {
39*9880d681SAndroid Build Coastguard Workerentry:
40*9880d681SAndroid Build Coastguard Worker  %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a)
41*9880d681SAndroid Build Coastguard Worker  store double %0, double* %d, align 8
42*9880d681SAndroid Build Coastguard Worker  %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a)
43*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds double, double* %d, i64 1
44*9880d681SAndroid Build Coastguard Worker  store double %1, double* %arrayidx1, align 8
45*9880d681SAndroid Build Coastguard Worker  %2 = tail call double @llvm.fma.f64(double %b, double %f, double %a)
46*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds double, double* %d, i64 2
47*9880d681SAndroid Build Coastguard Worker  store double %2, double* %arrayidx2, align 8
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2
51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8
52*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16
53*9880d681SAndroid Build Coastguard Worker; FIXME: We no longer get this because of copy ordering at the MI level.
54*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddmdp 3, 2, 1
55*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddmdp 4, 2, 1
56*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xsmaddadp 1, 2, 5
57*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 3, 0, 8
58*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 4, 8, [[C1]]
59*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxsdx 1, 8, [[C2]]
60*9880d681SAndroid Build Coastguard Worker; CHECK: blr
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test2
63*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1
64*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3
65*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 8
66*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 0, 1
67*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 4
68*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 8
69*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C1]]
70*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5
71*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16
72*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]]
73*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine void @test3(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a)
79*9880d681SAndroid Build Coastguard Worker  store double %0, double* %d, align 8
80*9880d681SAndroid Build Coastguard Worker  %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a)
81*9880d681SAndroid Build Coastguard Worker  %2 = tail call double @llvm.fma.f64(double %b, double %c, double %1)
82*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds double, double* %d, i64 3
83*9880d681SAndroid Build Coastguard Worker  store double %2, double* %arrayidx1, align 8
84*9880d681SAndroid Build Coastguard Worker  %3 = tail call double @llvm.fma.f64(double %b, double %f, double %a)
85*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds double, double* %d, i64 2
86*9880d681SAndroid Build Coastguard Worker  store double %3, double* %arrayidx2, align 8
87*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds double, double* %d, i64 1
88*9880d681SAndroid Build Coastguard Worker  store double %1, double* %arrayidx3, align 8
89*9880d681SAndroid Build Coastguard Worker  ret void
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3
92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr [[F1:[0-9]+]], 1
93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 24
94*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16
95*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 8
96*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 4, 2, 1
97*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 5
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require
100*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions.
101*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp [[F1]], 2, 3
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 3, 2, 4
104*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx [[F1]], 0, 8
105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 3, 8, [[C1]]
106*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 8, [[C2]]
107*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C3]]
108*9880d681SAndroid Build Coastguard Worker; CHECK: blr
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test3
111*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
112*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 4
113*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr 4, [[F1]]
114*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 4, 2, 3
115*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 24
116*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 4, 8, [[C1]]
117*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5
118*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16
119*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]]
120*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 8
121*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C3]]
122*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine void @test4(double %a, double %b, double %c, double %e, double %f, double* nocapture %d) #0 {
126*9880d681SAndroid Build Coastguard Workerentry:
127*9880d681SAndroid Build Coastguard Worker  %0 = tail call double @llvm.fma.f64(double %b, double %c, double %a)
128*9880d681SAndroid Build Coastguard Worker  store double %0, double* %d, align 8
129*9880d681SAndroid Build Coastguard Worker  %1 = tail call double @llvm.fma.f64(double %b, double %e, double %a)
130*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds double, double* %d, i64 1
131*9880d681SAndroid Build Coastguard Worker  store double %1, double* %arrayidx1, align 8
132*9880d681SAndroid Build Coastguard Worker  %2 = tail call double @llvm.fma.f64(double %b, double %c, double %1)
133*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds double, double* %d, i64 3
134*9880d681SAndroid Build Coastguard Worker  store double %2, double* %arrayidx3, align 8
135*9880d681SAndroid Build Coastguard Worker  %3 = tail call double @llvm.fma.f64(double %b, double %f, double %a)
136*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds double, double* %d, i64 2
137*9880d681SAndroid Build Coastguard Worker  store double %3, double* %arrayidx4, align 8
138*9880d681SAndroid Build Coastguard Worker  ret void
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4
141*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr [[F1:[0-9]+]], 1
142*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 8
143*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 16
144*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddmdp 4, 2, 1
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require
147*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions.
148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 1, 2, 5
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp [[F1]], 2, 3
151*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx [[F1]], 0, 8
152*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C1]]
153*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 24
154*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xsmaddadp 4, 2, 3
155*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 4, 8, [[C3]]
156*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxsdx 1, 8, [[C2]]
157*9880d681SAndroid Build Coastguard Worker; CHECK: blr
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @test4
160*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
161*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 3
162*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 0, 8
163*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: fmr [[F1]], 1
164*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp [[F1]], 2, 4
165*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 8
166*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C3]]
167*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 0, 2, 3
168*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 24
169*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 0, 8, [[C1]]
170*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xsmaddadp 1, 2, 5
171*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 16
172*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxsdx 1, 8, [[C2]]
173*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) #0
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine void @testv1(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double>* nocapture %d) #0 {
179*9880d681SAndroid Build Coastguard Workerentry:
180*9880d681SAndroid Build Coastguard Worker  %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a)
181*9880d681SAndroid Build Coastguard Worker  store <2 x double> %0, <2 x double>* %d, align 8
182*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a)
183*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1
184*9880d681SAndroid Build Coastguard Worker  store <2 x double> %1, <2 x double>* %arrayidx1, align 8
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv1
188*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 36, 35, 34
189*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 37
190*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 16
191*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 36, 0, 3
192*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C1:[0-9]+]]
193*9880d681SAndroid Build Coastguard Worker; CHECK: blr
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv1
196*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34
197*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36
198*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3
199*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 37
200*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16
201*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C1:[0-9]+]]
202*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine void @testv2(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 {
206*9880d681SAndroid Build Coastguard Workerentry:
207*9880d681SAndroid Build Coastguard Worker  %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a)
208*9880d681SAndroid Build Coastguard Worker  store <2 x double> %0, <2 x double>* %d, align 8
209*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a)
210*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1
211*9880d681SAndroid Build Coastguard Worker  store <2 x double> %1, <2 x double>* %arrayidx1, align 8
212*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a)
213*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2
214*9880d681SAndroid Build Coastguard Worker  store <2 x double> %2, <2 x double>* %arrayidx2, align 8
215*9880d681SAndroid Build Coastguard Worker  ret void
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv2
218*9880d681SAndroid Build Coastguard Worker; FIXME: We currently don't get this because of copy ordering on the MI level.
219*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddmdp 36, 35, 34
220*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddmdp 37, 35, 34
221*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: li [[C1:[0-9]+]], 16
222*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: li [[C2:[0-9]+]], 32
223*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: xvmaddadp 34, 35, 38
224*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 36, 0, 3
225*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 37, 3, [[C1:[0-9]+]]
226*9880d681SAndroid Build Coastguard Worker; CHECX-DAG: stxvd2x 34, 3, [[C2:[0-9]+]]
227*9880d681SAndroid Build Coastguard Worker; CHECK: blr
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv2
230*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34
231*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36
232*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3
233*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor 0, 34, 34
234*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 37
235*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16
236*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C1:[0-9]+]]
237*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 38
238*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32
239*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2:[0-9]+]]
240*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine void @testv3(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 {
244*9880d681SAndroid Build Coastguard Workerentry:
245*9880d681SAndroid Build Coastguard Worker  %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a)
246*9880d681SAndroid Build Coastguard Worker  store <2 x double> %0, <2 x double>* %d, align 8
247*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a)
248*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %1)
249*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 3
250*9880d681SAndroid Build Coastguard Worker  store <2 x double> %2, <2 x double>* %arrayidx1, align 8
251*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a)
252*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2
253*9880d681SAndroid Build Coastguard Worker  store <2 x double> %3, <2 x double>* %arrayidx2, align 8
254*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1
255*9880d681SAndroid Build Coastguard Worker  store <2 x double> %1, <2 x double>* %arrayidx3, align 8
256*9880d681SAndroid Build Coastguard Worker  ret void
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; Note: There is some unavoidable changeability in this variant.  If the
259*9880d681SAndroid Build Coastguard Worker; FMAs are reordered differently, the algorithm can pick a different
260*9880d681SAndroid Build Coastguard Worker; multiplicand to destroy, changing the register assignment.  There isn't
261*9880d681SAndroid Build Coastguard Worker; a good way to express this possibility, so hopefully this doesn't change
262*9880d681SAndroid Build Coastguard Worker; too often.
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv3
265*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxlor [[V1:[0-9]+]], 34, 34
266*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 48
267*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 32
268*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 37, 35, 34
269*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 16
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require
272*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions.
273*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp [[V1]], 35, 36
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 36, 35, 37
276*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 38
277*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 32, 0, 3
278*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 36, 3, [[C1]]
279*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C2]]
280*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C3]]
281*9880d681SAndroid Build Coastguard Worker; CHECK: blr
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv3
284*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V1:[0-9]+]], 34, 34
285*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V1]], 35, 36
286*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x [[V1]], 0, 3
287*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V2:[0-9]+]], 34, 34
288*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V2]], 35, 37
289*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V3:[0-9]+]], 0, 0
290*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V3]], 35, 36
291*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 48
292*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x [[V3]], 3, [[C1]]
293*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 34, 35, 38
294*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32
295*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2]]
296*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 16
297*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C3]]
298*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerdefine void @testv4(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %e, <2 x double> %f, <2 x double>* nocapture %d) #0 {
302*9880d681SAndroid Build Coastguard Workerentry:
303*9880d681SAndroid Build Coastguard Worker  %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %a)
304*9880d681SAndroid Build Coastguard Worker  store <2 x double> %0, <2 x double>* %d, align 8
305*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %e, <2 x double> %a)
306*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 1
307*9880d681SAndroid Build Coastguard Worker  store <2 x double> %1, <2 x double>* %arrayidx1, align 8
308*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %c, <2 x double> %1)
309*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 3
310*9880d681SAndroid Build Coastguard Worker  store <2 x double> %2, <2 x double>* %arrayidx3, align 8
311*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %b, <2 x double> %f, <2 x double> %a)
312*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds <2 x double>, <2 x double>* %d, i64 2
313*9880d681SAndroid Build Coastguard Worker  store <2 x double> %3, <2 x double>* %arrayidx4, align 8
314*9880d681SAndroid Build Coastguard Worker  ret void
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testv4
317*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxlor [[V1:[0-9]+]], 34, 34
318*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddmdp 37, 35, 34
319*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C1:[0-9]+]], 16
320*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C2:[0-9]+]], 32
321*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 34, 35, 38
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker; Note: We could convert this next FMA to M-type as well, but it would require
324*9880d681SAndroid Build Coastguard Worker; re-ordering the instructions.
325*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp [[V1]], 35, 36
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 32, 0, 3
328*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C1]]
329*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[C3:[0-9]+]], 48
330*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xvmaddadp 37, 35, 36
331*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 37, 3, [[C3]]
332*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stxvd2x 34, 3, [[C2]]
333*9880d681SAndroid Build Coastguard Worker; CHECK: blr
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-LABEL: @testv4
336*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V1:[0-9]+]], 34, 34
337*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V1]], 35, 36
338*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 0, 3
339*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xxlor [[V2:[0-9]+]], 34, 34
340*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp [[V2]], 35, 37
341*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C1:[0-9]+]], 16
342*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C1]]
343*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 37
344*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C3:[0-9]+]], 48
345*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 0, 3, [[C3]]
346*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: xvmaddadp 0, 35, 36
347*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: li [[C2:[0-9]+]], 32
348*9880d681SAndroid Build Coastguard Worker; CHECK-FISL-DAG: stxvd2x 34, 3, [[C2]]
349*9880d681SAndroid Build Coastguard Worker; CHECK-FISL: blr
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
355*9880d681SAndroid Build Coastguard Worker
356