1 ; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx | FileCheck %s
2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s
4 define double @test_FMADD_ASSOC1(double %A, double %B, double %C,
5 double %D, double %E) {
6 %F = fmul double %A, %B ; <double> [#uses=1]
7 %G = fmul double %C, %D ; <double> [#uses=1]
8 %H = fadd double %F, %G ; <double> [#uses=1]
9 %I = fadd double %H, %E ; <double> [#uses=1]
11 ; CHECK-LABEL: test_FMADD_ASSOC1:
16 ; CHECK-VSX-LABEL: test_FMADD_ASSOC1:
17 ; CHECK-VSX: xsmaddmdp
18 ; CHECK-VSX-NEXT: xsmaddadp
23 define double @test_FMADD_ASSOC2(double %A, double %B, double %C,
24 double %D, double %E) {
25 %F = fmul double %A, %B ; <double> [#uses=1]
26 %G = fmul double %C, %D ; <double> [#uses=1]
27 %H = fadd double %F, %G ; <double> [#uses=1]
28 %I = fadd double %E, %H ; <double> [#uses=1]
30 ; CHECK-LABEL: test_FMADD_ASSOC2:
35 ; CHECK-VSX-LABEL: test_FMADD_ASSOC2:
36 ; CHECK-VSX: xsmaddmdp
37 ; CHECK-VSX-NEXT: xsmaddadp
42 define double @test_FMSUB_ASSOC1(double %A, double %B, double %C,
43 double %D, double %E) {
44 %F = fmul double %A, %B ; <double> [#uses=1]
45 %G = fmul double %C, %D ; <double> [#uses=1]
46 %H = fadd double %F, %G ; <double> [#uses=1]
47 %I = fsub double %H, %E ; <double> [#uses=1]
49 ; CHECK-LABEL: test_FMSUB_ASSOC1:
54 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC1:
55 ; CHECK-VSX: xsmsubmdp
56 ; CHECK-VSX-NEXT: xsmaddadp
61 define double @test_FMSUB_ASSOC2(double %A, double %B, double %C,
62 double %D, double %E) {
63 %F = fmul double %A, %B ; <double> [#uses=1]
64 %G = fmul double %C, %D ; <double> [#uses=1]
65 %H = fadd double %F, %G ; <double> [#uses=1]
66 %I = fsub double %E, %H ; <double> [#uses=1]
68 ; CHECK-LABEL: test_FMSUB_ASSOC2:
73 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC2:
74 ; CHECK-VSX: xsnmsubmdp
75 ; CHECK-VSX-NEXT: xsnmsubadp
80 define double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
81 double %D, double %E) {
82 %F = fmul float %A, %B ; <float> [#uses=1]
83 %G = fpext float %F to double ; <double> [#uses=1]
84 %H = fmul double %C, %D ; <double> [#uses=1]
85 %I = fadd double %H, %G ; <double> [#uses=1]
86 %J = fadd double %I, %E ; <double> [#uses=1]
88 ; CHECK-LABEL: test_FMADD_ASSOC_EXT1:
93 ; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT1:
94 ; CHECK-VSX: xsmaddmdp
95 ; CHECK-VSX-NEXT: xsmaddadp
99 define double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
100 float %D, double %E) {
101 %F = fmul float %A, %B ; <float> [#uses=1]
102 %G = fmul float %C, %D ; <float> [#uses=1]
103 %H = fadd float %F, %G ; <float> [#uses=1]
104 %I = fpext float %H to double ; <double> [#uses=1]
105 %J = fadd double %I, %E ; <double> [#uses=1]
107 ; CHECK-LABEL: test_FMADD_ASSOC_EXT2:
112 ; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT2:
113 ; CHECK-VSX: xsmaddmdp
114 ; CHECK-VSX-NEXT: xsmaddadp
115 ; CHECK-VSX-NEXT: fmr
116 ; CHECK-VSX-NEXT: blr
119 define double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
120 double %D, double %E) {
121 %F = fmul float %A, %B ; <float> [#uses=1]
122 %G = fpext float %F to double ; <double> [#uses=1]
123 %H = fmul double %C, %D ; <double> [#uses=1]
124 %I = fadd double %H, %G ; <double> [#uses=1]
125 %J = fadd double %E, %I ; <double> [#uses=1]
127 ; CHECK-LABEL: test_FMADD_ASSOC_EXT3:
132 ; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT3:
133 ; CHECK-VSX: xsmaddmdp
134 ; CHECK-VSX-NEXT: xsmaddadp
135 ; CHECK-VSX-NEXT: blr
138 define double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
139 float %D, double %E) {
140 %F = fmul float %A, %B ; <float> [#uses=1]
141 %G = fmul float %C, %D ; <float> [#uses=1]
142 %H = fadd float %F, %G ; <float> [#uses=1]
143 %I = fpext float %H to double ; <double> [#uses=1]
144 %J = fadd double %E, %I ; <double> [#uses=1]
146 ; CHECK-LABEL: test_FMADD_ASSOC_EXT4:
151 ; CHECK-VSX-LABEL: test_FMADD_ASSOC_EXT4:
152 ; CHECK-VSX: xsmaddmdp
153 ; CHECK-VSX-NEXT: xsmaddadp
154 ; CHECK-VSX-NEXT: fmr
155 ; CHECK-VSX-NEXT: blr
158 define double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
159 double %D, double %E) {
160 %F = fmul float %A, %B ; <float> [#uses=1]
161 %G = fpext float %F to double ; <double> [#uses=1]
162 %H = fmul double %C, %D ; <double> [#uses=1]
163 %I = fadd double %H, %G ; <double> [#uses=1]
164 %J = fsub double %I, %E ; <double> [#uses=1]
166 ; CHECK-LABEL: test_FMSUB_ASSOC_EXT1:
171 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT1:
172 ; CHECK-VSX: xsmsubmdp
173 ; CHECK-VSX-NEXT: xsmaddadp
174 ; CHECK-VSX-NEXT: blr
177 define double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
178 float %D, double %E) {
179 %F = fmul float %A, %B ; <float> [#uses=1]
180 %G = fmul float %C, %D ; <float> [#uses=1]
181 %H = fadd float %F, %G ; <float> [#uses=1]
182 %I = fpext float %H to double ; <double> [#uses=1]
183 %J = fsub double %I, %E ; <double> [#uses=1]
185 ; CHECK-LABEL: test_FMSUB_ASSOC_EXT2:
190 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT2:
191 ; CHECK-VSX: xsmsubmdp
192 ; CHECK-VSX-NEXT: xsmaddadp
193 ; CHECK-VSX-NEXT: fmr
194 ; CHECK-VSX-NEXT: blr
197 define double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
198 double %D, double %E) {
199 %F = fmul float %A, %B ; <float> [#uses=1]
200 %G = fpext float %F to double ; <double> [#uses=1]
201 %H = fmul double %C, %D ; <double> [#uses=1]
202 %I = fadd double %H, %G ; <double> [#uses=1]
203 %J = fsub double %E, %I ; <double> [#uses=1]
205 ; CHECK-LABEL: test_FMSUB_ASSOC_EXT3:
210 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT3:
211 ; CHECK-VSX: xsnmsubmdp
212 ; CHECK-VSX-NEXT: xsnmsubadp
213 ; CHECK-VSX-NEXT: fmr
214 ; CHECK-VSX-NEXT: blr
217 define double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
218 float %D, double %E) {
219 %F = fmul float %A, %B ; <float> [#uses=1]
220 %G = fmul float %C, %D ; <float> [#uses=1]
221 %H = fadd float %F, %G ; <float> [#uses=1]
222 %I = fpext float %H to double ; <double> [#uses=1]
223 %J = fsub double %E, %I ; <double> [#uses=1]
225 ; CHECK-LABEL: test_FMSUB_ASSOC_EXT4:
230 ; CHECK-VSX-LABEL: test_FMSUB_ASSOC_EXT4:
231 ; CHECK-VSX: xsnmsubmdp
232 ; CHECK-VSX-NEXT: xsnmsubadp
233 ; CHECK-VSX-NEXT: fmr
234 ; CHECK-VSX-NEXT: blr