xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/fma-assoc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC1(double %A, double %B, double %C,
5*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
6*9880d681SAndroid Build Coastguard Worker  %F = fmul double %A, %B         ; <double> [#uses=1]
7*9880d681SAndroid Build Coastguard Worker  %G = fmul double %C, %D         ; <double> [#uses=1]
8*9880d681SAndroid Build Coastguard Worker  %H = fadd double %F, %G         ; <double> [#uses=1]
9*9880d681SAndroid Build Coastguard Worker  %I = fadd double %H, %E         ; <double> [#uses=1]
10*9880d681SAndroid Build Coastguard Worker  ret double %I
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC1:
12*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC1:
17*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
18*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
19*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
20*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC2(double %A, double %B, double %C,
24*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
25*9880d681SAndroid Build Coastguard Worker  %F = fmul double %A, %B         ; <double> [#uses=1]
26*9880d681SAndroid Build Coastguard Worker  %G = fmul double %C, %D         ; <double> [#uses=1]
27*9880d681SAndroid Build Coastguard Worker  %H = fadd double %F, %G         ; <double> [#uses=1]
28*9880d681SAndroid Build Coastguard Worker  %I = fadd double %E, %H         ; <double> [#uses=1]
29*9880d681SAndroid Build Coastguard Worker  ret double %I
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC2:
31*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC2:
36*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
37*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
38*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
39*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC1(double %A, double %B, double %C,
43*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
44*9880d681SAndroid Build Coastguard Worker  %F = fmul double %A, %B         ; <double> [#uses=1]
45*9880d681SAndroid Build Coastguard Worker  %G = fmul double %C, %D         ; <double> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker  %H = fadd double %F, %G         ; <double> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker  %I = fsub double %H, %E         ; <double> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker  ret double %I
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC1:
50*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC1:
55*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp
56*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
57*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
58*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC2(double %A, double %B, double %C,
62*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
63*9880d681SAndroid Build Coastguard Worker  %F = fmul double %A, %B         ; <double> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker  %G = fmul double %C, %D         ; <double> [#uses=1]
65*9880d681SAndroid Build Coastguard Worker  %H = fadd double %F, %G         ; <double> [#uses=1]
66*9880d681SAndroid Build Coastguard Worker  %I = fsub double %E, %H         ; <double> [#uses=1]
67*9880d681SAndroid Build Coastguard Worker  ret double %I
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC2:
69*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC2:
74*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp
75*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp
76*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
77*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
81*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
82*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B         ; <float> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker  %G = fpext float %F to double   ; <double> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker  %H = fmul double %C, %D         ; <double> [#uses=1]
85*9880d681SAndroid Build Coastguard Worker  %I = fadd double %H, %G         ; <double> [#uses=1]
86*9880d681SAndroid Build Coastguard Worker  %J = fadd double %I, %E         ; <double> [#uses=1]
87*9880d681SAndroid Build Coastguard Worker  ret double %J
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT1:
89*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT1:
94*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
95*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
96*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
100*9880d681SAndroid Build Coastguard Worker                                 float %D, double %E) {
101*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B         ; <float> [#uses=1]
102*9880d681SAndroid Build Coastguard Worker  %G = fmul float %C, %D         ; <float> [#uses=1]
103*9880d681SAndroid Build Coastguard Worker  %H = fadd float %F, %G         ; <float> [#uses=1]
104*9880d681SAndroid Build Coastguard Worker  %I = fpext float %H to double   ; <double> [#uses=1]
105*9880d681SAndroid Build Coastguard Worker  %J = fadd double %I, %E         ; <double> [#uses=1]
106*9880d681SAndroid Build Coastguard Worker  ret double %J
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT2:
108*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT2:
113*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
114*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
115*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
116*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
120*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
121*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
122*9880d681SAndroid Build Coastguard Worker  %G = fpext float %F to double   ; <double> [#uses=1]
123*9880d681SAndroid Build Coastguard Worker  %H = fmul double %C, %D         ; <double> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker  %I = fadd double %H, %G         ; <double> [#uses=1]
125*9880d681SAndroid Build Coastguard Worker  %J = fadd double %E, %I         ; <double> [#uses=1]
126*9880d681SAndroid Build Coastguard Worker  ret double %J
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT3:
128*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT3:
133*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
134*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
135*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
139*9880d681SAndroid Build Coastguard Worker                                 float %D, double %E) {
140*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
141*9880d681SAndroid Build Coastguard Worker  %G = fmul float %C, %D          ; <float> [#uses=1]
142*9880d681SAndroid Build Coastguard Worker  %H = fadd float %F, %G          ; <float> [#uses=1]
143*9880d681SAndroid Build Coastguard Worker  %I = fpext float %H to double   ; <double> [#uses=1]
144*9880d681SAndroid Build Coastguard Worker  %J = fadd double %E, %I         ; <double> [#uses=1]
145*9880d681SAndroid Build Coastguard Worker  ret double %J
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMADD_ASSOC_EXT4:
147*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT4:
152*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmaddmdp
153*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
154*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
155*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
159*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
160*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
161*9880d681SAndroid Build Coastguard Worker  %G = fpext float %F to double   ; <double> [#uses=1]
162*9880d681SAndroid Build Coastguard Worker  %H = fmul double %C, %D         ; <double> [#uses=1]
163*9880d681SAndroid Build Coastguard Worker  %I = fadd double %H, %G         ; <double> [#uses=1]
164*9880d681SAndroid Build Coastguard Worker  %J = fsub double %I, %E         ; <double> [#uses=1]
165*9880d681SAndroid Build Coastguard Worker  ret double %J
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT1:
167*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT1:
172*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp
173*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
174*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
178*9880d681SAndroid Build Coastguard Worker                                 float %D, double %E) {
179*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
180*9880d681SAndroid Build Coastguard Worker  %G = fmul float %C, %D          ; <float> [#uses=1]
181*9880d681SAndroid Build Coastguard Worker  %H = fadd float %F, %G          ; <float> [#uses=1]
182*9880d681SAndroid Build Coastguard Worker  %I = fpext float %H to double   ; <double> [#uses=1]
183*9880d681SAndroid Build Coastguard Worker  %J = fsub double %I, %E         ; <double> [#uses=1]
184*9880d681SAndroid Build Coastguard Worker  ret double %J
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT2:
186*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT2:
191*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsmsubmdp
192*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsmaddadp
193*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
194*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
198*9880d681SAndroid Build Coastguard Worker                                 double %D, double %E) {
199*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
200*9880d681SAndroid Build Coastguard Worker  %G = fpext float %F to double   ; <double> [#uses=1]
201*9880d681SAndroid Build Coastguard Worker  %H = fmul double %C, %D         ; <double> [#uses=1]
202*9880d681SAndroid Build Coastguard Worker  %I = fadd double %H, %G         ; <double> [#uses=1]
203*9880d681SAndroid Build Coastguard Worker  %J = fsub double %E, %I         ; <double> [#uses=1]
204*9880d681SAndroid Build Coastguard Worker  ret double %J
205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT3:
206*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub
207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub
208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT3:
211*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp
212*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp
213*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
214*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdefine double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
218*9880d681SAndroid Build Coastguard Worker                                 float %D, double %E) {
219*9880d681SAndroid Build Coastguard Worker  %F = fmul float %A, %B          ; <float> [#uses=1]
220*9880d681SAndroid Build Coastguard Worker  %G = fmul float %C, %D          ; <float> [#uses=1]
221*9880d681SAndroid Build Coastguard Worker  %H = fadd float %F, %G          ; <float> [#uses=1]
222*9880d681SAndroid Build Coastguard Worker  %I = fpext float %H to double   ; <double> [#uses=1]
223*9880d681SAndroid Build Coastguard Worker  %J = fsub double %E, %I         ; <double> [#uses=1]
224*9880d681SAndroid Build Coastguard Worker  ret double %J
225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_FMSUB_ASSOC_EXT4:
226*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fnmsub
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT4:
231*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: xsnmsubmdp
232*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: xsnmsubadp
233*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: fmr
234*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-NEXT: blr
235*9880d681SAndroid Build Coastguard Worker}
236