blob: 9cfef398edfd29a7e92bba63b86c5d8747d81999 [file] [log] [blame]
Bill Schmidta087d742014-10-17 21:02:44 +00001; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx | FileCheck %s
Bill Schmidtfff86092014-10-19 20:27:56 +00002; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00003; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s
4; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s
Chris Lattnerb9a11b82005-04-09 04:01:32 +00005
Hal Finkel62ac7362014-09-19 11:42:56 +00006declare double @dummy1(double) #0
7declare double @dummy2(double, double) #0
8declare double @dummy3(double, double, double) #0
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00009declare float @dummy4(float, float) #0
Hal Finkel62ac7362014-09-19 11:42:56 +000010
Tanya Lattnera99d8b52008-02-19 08:07:33 +000011define double @test_FMADD1(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000012 %D = fmul double %A, %B ; <double> [#uses=1]
Hal Finkel62ac7362014-09-19 11:42:56 +000013 %E = fadd double %C, %D ; <double> [#uses=1]
Nate Begeman968e44a2005-04-09 08:29:59 +000014 ret double %E
Stephen Linf799e3f2013-07-13 20:38:47 +000015; CHECK-LABEL: test_FMADD1:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000016; CHECK: fmadd
17; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +000018
19; CHECK-VSX-LABEL: test_FMADD1:
20; CHECK-VSX: xsmaddmdp
21; CHECK-VSX-NEXT: blr
Nate Begeman968e44a2005-04-09 08:29:59 +000022}
Tanya Lattnera99d8b52008-02-19 08:07:33 +000023
24define double @test_FMADD2(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000025 %D = fmul double %A, %B ; <double> [#uses=1]
26 %E = fadd double %D, %C ; <double> [#uses=1]
Chris Lattnerb9a11b82005-04-09 04:01:32 +000027 ret double %E
Stephen Linf799e3f2013-07-13 20:38:47 +000028; CHECK-LABEL: test_FMADD2:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000029; CHECK: fmadd
30; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +000031
32; CHECK-VSX-LABEL: test_FMADD2:
33; CHECK-VSX: xsmaddmdp
34; CHECK-VSX-NEXT: blr
Chris Lattnerb9a11b82005-04-09 04:01:32 +000035}
Tanya Lattnera99d8b52008-02-19 08:07:33 +000036
Hal Finkel62ac7362014-09-19 11:42:56 +000037define double @test_FMSUB1(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000038 %D = fmul double %A, %B ; <double> [#uses=1]
39 %E = fsub double %D, %C ; <double> [#uses=1]
Chris Lattnerb9a11b82005-04-09 04:01:32 +000040 ret double %E
Hal Finkel62ac7362014-09-19 11:42:56 +000041; CHECK-LABEL: test_FMSUB1:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000042; CHECK: fmsub
43; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +000044
45; CHECK-VSX-LABEL: test_FMSUB1:
46; CHECK-VSX: xsmsubmdp
47; CHECK-VSX-NEXT: blr
Chris Lattnerb9a11b82005-04-09 04:01:32 +000048}
Tanya Lattnera99d8b52008-02-19 08:07:33 +000049
Hal Finkel62ac7362014-09-19 11:42:56 +000050define double @test_FMSUB2(double %A, double %B, double %C, double %D) {
51 %E = fmul double %A, %B ; <double> [#uses=2]
52 %F = fadd double %E, %C ; <double> [#uses=1]
53 %G = fsub double %E, %D ; <double> [#uses=1]
54 %H = call double @dummy2(double %F, double %G) ; <double> [#uses=1]
55 ret double %H
56; CHECK-LABEL: test_FMSUB2:
57; CHECK: fmadd
58; CHECK-NEXT: fmsub
Bill Schmidta087d742014-10-17 21:02:44 +000059
60; CHECK-VSX-LABEL: test_FMSUB2:
61; CHECK-VSX: xsmaddadp
62; CHECK-VSX-NEXT: xsmsubmdp
Hal Finkel62ac7362014-09-19 11:42:56 +000063}
64
Tanya Lattnera99d8b52008-02-19 08:07:33 +000065define double @test_FNMADD1(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000066 %D = fmul double %A, %B ; <double> [#uses=1]
67 %E = fadd double %D, %C ; <double> [#uses=1]
68 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
Chris Lattnerb9a11b82005-04-09 04:01:32 +000069 ret double %F
Stephen Linf799e3f2013-07-13 20:38:47 +000070; CHECK-LABEL: test_FNMADD1:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000071; CHECK: fnmadd
72; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +000073
74; CHECK-VSX-LABEL: test_FNMADD1:
75; CHECK-VSX: xsnmaddmdp
76; CHECK-VSX-NEXT: blr
Chris Lattnerb9a11b82005-04-09 04:01:32 +000077}
Tanya Lattnera99d8b52008-02-19 08:07:33 +000078
79define double @test_FNMADD2(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000080 %D = fmul double %A, %B ; <double> [#uses=1]
81 %E = fadd double %C, %D ; <double> [#uses=1]
82 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
Chris Lattnerb9a11b82005-04-09 04:01:32 +000083 ret double %F
Stephen Linf799e3f2013-07-13 20:38:47 +000084; CHECK-LABEL: test_FNMADD2:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000085; CHECK: fnmadd
86; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +000087
88; CHECK-VSX-LABEL: test_FNMADD2:
89; CHECK-VSX: xsnmaddmdp
90; CHECK-VSX-NEXT: blr
Chris Lattnerb9a11b82005-04-09 04:01:32 +000091}
Tanya Lattnera99d8b52008-02-19 08:07:33 +000092
93define double @test_FNMSUB1(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +000094 %D = fmul double %A, %B ; <double> [#uses=1]
95 %E = fsub double %C, %D ; <double> [#uses=1]
Nate Begeman968e44a2005-04-09 08:29:59 +000096 ret double %E
Stephen Linf799e3f2013-07-13 20:38:47 +000097; CHECK-LABEL: test_FNMSUB1:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +000098; CHECK: fnmsub
99; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +0000100
101; CHECK-VSX-LABEL: test_FNMSUB1:
102; CHECK-VSX: xsnmsubmdp
Nate Begeman968e44a2005-04-09 08:29:59 +0000103}
Tanya Lattnera99d8b52008-02-19 08:07:33 +0000104
105define double @test_FNMSUB2(double %A, double %B, double %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +0000106 %D = fmul double %A, %B ; <double> [#uses=1]
107 %E = fsub double %D, %C ; <double> [#uses=1]
108 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
Chris Lattnerb9a11b82005-04-09 04:01:32 +0000109 ret double %F
Stephen Linf799e3f2013-07-13 20:38:47 +0000110; CHECK-LABEL: test_FNMSUB2:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +0000111; CHECK: fnmsub
112; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +0000113
114; CHECK-VSX-LABEL: test_FNMSUB2:
115; CHECK-VSX: xsnmsubmdp
116; CHECK-VSX-NEXT: blr
Chris Lattnerb9a11b82005-04-09 04:01:32 +0000117}
Tanya Lattnera99d8b52008-02-19 08:07:33 +0000118
119define float @test_FNMSUBS(float %A, float %B, float %C) {
Dan Gohmana5b96452009-06-04 22:49:04 +0000120 %D = fmul float %A, %B ; <float> [#uses=1]
121 %E = fsub float %D, %C ; <float> [#uses=1]
122 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
Nate Begeman78539832005-12-14 22:51:13 +0000123 ret float %F
Stephen Linf799e3f2013-07-13 20:38:47 +0000124; CHECK-LABEL: test_FNMSUBS:
Benjamin Kramer3960c1c2013-04-11 12:32:23 +0000125; CHECK: fnmsubs
126; CHECK-NEXT: blr
Bill Schmidta087d742014-10-17 21:02:44 +0000127
128; CHECK-VSX-LABEL: test_FNMSUBS:
129; CHECK-VSX: fnmsubs
130; CHECK-VSX-NEXT: blr
Nate Begeman78539832005-12-14 22:51:13 +0000131}
Nemanja Ivanovic376e1732015-05-29 17:13:25 +0000132
133define float @test_XSMADDMSP(float %A, float %B, float %C) {
134 %D = fmul float %A, %B ; <float> [#uses=1]
135 %E = fadd float %C, %D ; <float> [#uses=1]
136 ret float %E
137; CHECK-P8-LABEL: test_XSMADDMSP:
138; CHECK-P8: xsmaddmsp
139; CHECK-P8-NEXT: blr
140}
141
142define float @test_XSMSUBMSP(float %A, float %B, float %C) {
143 %D = fmul float %A, %B ; <float> [#uses=1]
144 %E = fsub float %D, %C ; <float> [#uses=1]
145 ret float %E
146; CHECK-P8-LABEL: test_XSMSUBMSP:
147; CHECK-P8: xsmsubmsp
148; CHECK-P8-NEXT: blr
149}
150
151define float @test_XSMADDASP(float %A, float %B, float %C, float %D) {
152 %E = fmul float %A, %B ; <float> [#uses=2]
153 %F = fadd float %E, %C ; <float> [#uses=1]
154 %G = fsub float %E, %D ; <float> [#uses=1]
155 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]
156 ret float %H
157; CHECK-P8-LABEL: test_XSMADDASP:
158; CHECK-P8: xsmaddasp
159; CHECK-P8-NEXT: xsmsubmsp
160}
161
162define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) {
163 %E = fmul float %A, %B ; <float> [#uses=2]
164 %F = fsub float %E, %C ; <float> [#uses=1]
165 %G = fsub float %E, %D ; <float> [#uses=1]
166 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]
167 ret float %H
168; CHECK-P8-LABEL: test_XSMSUBASP:
169; CHECK-P8: xsmsubasp
170; CHECK-P8-NEXT: xsmsubmsp
171}
172
173define float @test_XSNMADDMSP(float %A, float %B, float %C) {
174 %D = fmul float %A, %B ; <float> [#uses=1]
175 %E = fadd float %D, %C ; <float> [#uses=1]
176 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
177 ret float %F
178; CHECK-P8-LABEL: test_XSNMADDMSP:
179; CHECK-P8: xsnmaddmsp
180; CHECK-P8-NEXT: blr
181}
182
183define float @test_XSNMSUBMSP(float %A, float %B, float %C) {
184 %D = fmul float %A, %B ; <float> [#uses=1]
185 %E = fsub float %D, %C ; <float> [#uses=1]
186 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
187 ret float %F
188; CHECK-P8-LABEL: test_XSNMSUBMSP:
189; CHECK-P8: xsnmsubmsp
190; CHECK-P8-NEXT: blr
191}
192
193define float @test_XSNMADDASP(float %A, float %B, float %C) {
194 %D = fmul float %A, %B ; <float> [#uses=1]
195 %E = fadd float %D, %C ; <float> [#uses=1]
196 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
197 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]
198 ret float %F
199; CHECK-P8-LABEL: test_XSNMADDASP:
200; CHECK-P8: xsnmaddasp
201}
202
203define float @test_XSNMSUBASP(float %A, float %B, float %C) {
204 %D = fmul float %A, %B ; <float> [#uses=1]
205 %E = fsub float %D, %C ; <float> [#uses=1]
206 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
207 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]
208 ret float %F
209; CHECK-P8-LABEL: test_XSNMSUBASP:
210; CHECK-P8: xsnmsubasp
211}