[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / fp-fold.ll
blobe796e3561b0d8e801d6052d5d5df5759823c2728
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown                        | FileCheck %s --check-prefixes=ANY,STRICT
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s --check-prefixes=ANY,UNSAFE
5 define float @fadd_zero(float %x) {
6 ; STRICT-LABEL: fadd_zero:
7 ; STRICT:       # %bb.0:
8 ; STRICT-NEXT:    xorps %xmm1, %xmm1
9 ; STRICT-NEXT:    addss %xmm1, %xmm0
10 ; STRICT-NEXT:    retq
12 ; UNSAFE-LABEL: fadd_zero:
13 ; UNSAFE:       # %bb.0:
14 ; UNSAFE-NEXT:    retq
15   %r = fadd float %x, 0.0
16   ret float %r
19 define float @fadd_negzero(float %x) {
20 ; ANY-LABEL: fadd_negzero:
21 ; ANY:       # %bb.0:
22 ; ANY-NEXT:    retq
23   %r = fadd float %x, -0.0
24   ret float %r
27 define float @fadd_produce_zero(float %x) {
28 ; ANY-LABEL: fadd_produce_zero:
29 ; ANY:       # %bb.0:
30 ; ANY-NEXT:    xorps %xmm0, %xmm0
31 ; ANY-NEXT:    retq
32   %neg = fsub nsz float 0.0, %x
33   %r = fadd nnan float %neg, %x
34   ret float %r
37 define float @fadd_reassociate(float %x) {
38 ; ANY-LABEL: fadd_reassociate:
39 ; ANY:       # %bb.0:
40 ; ANY-NEXT:    addss {{.*}}(%rip), %xmm0
41 ; ANY-NEXT:    retq
42   %sum = fadd float %x, 8.0
43   %r = fadd reassoc nsz float %sum, 12.0
44   ret float %r
47 define float @fadd_negzero_nsz(float %x) {
48 ; ANY-LABEL: fadd_negzero_nsz:
49 ; ANY:       # %bb.0:
50 ; ANY-NEXT:    retq
51   %r = fadd nsz float %x, -0.0
52   ret float %r
55 define float @fadd_zero_nsz(float %x) {
56 ; ANY-LABEL: fadd_zero_nsz:
57 ; ANY:       # %bb.0:
58 ; ANY-NEXT:    retq
59   %r = fadd nsz float %x, 0.0
60   ret float %r
63 define float @fsub_zero(float %x) {
64 ; ANY-LABEL: fsub_zero:
65 ; ANY:       # %bb.0:
66 ; ANY-NEXT:    retq
67   %r = fsub float %x, 0.0
68   ret float %r
71 define float @fsub_self(float %x) {
72 ; ANY-LABEL: fsub_self:
73 ; ANY:       # %bb.0:
74 ; ANY-NEXT:    xorps %xmm0, %xmm0
75 ; ANY-NEXT:    retq
76   %r = fsub nnan float %x, %x
77   ret float %r
80 define float @fsub_neg_x_y(float %x, float %y) {
81 ; ANY-LABEL: fsub_neg_x_y:
82 ; ANY:       # %bb.0:
83 ; ANY-NEXT:    subss %xmm0, %xmm1
84 ; ANY-NEXT:    movaps %xmm1, %xmm0
85 ; ANY-NEXT:    retq
86   %neg = fsub nsz float 0.0, %x
87   %r = fadd nsz float %neg, %y
88   ret float %r
91 define float @fsub_neg_y(float %x, float %y) {
92 ; ANY-LABEL: fsub_neg_y:
93 ; ANY:       # %bb.0:
94 ; ANY-NEXT:    mulss {{.*}}(%rip), %xmm0
95 ; ANY-NEXT:    retq
96   %mul = fmul float %x, 5.0
97   %add = fadd float %mul, %y
98   %r = fsub nsz reassoc float %y, %add
99   ret float %r
102 define <4 x float> @fsub_neg_y_vector(<4 x float> %x, <4 x float> %y) {
103 ; ANY-LABEL: fsub_neg_y_vector:
104 ; ANY:       # %bb.0:
105 ; ANY-NEXT:    mulps {{.*}}(%rip), %xmm0
106 ; ANY-NEXT:    retq
107   %mul = fmul <4 x float> %x, <float 5.0, float 5.0, float 5.0, float 5.0>
108   %add = fadd <4 x float> %mul, %y
109   %r = fsub nsz reassoc <4 x float> %y, %add
110   ret <4 x float> %r
113 define <4 x float> @fsub_neg_y_vector_nonuniform(<4 x float> %x, <4 x float> %y) {
114 ; ANY-LABEL: fsub_neg_y_vector_nonuniform:
115 ; ANY:       # %bb.0:
116 ; ANY-NEXT:    mulps {{.*}}(%rip), %xmm0
117 ; ANY-NEXT:    retq
118   %mul = fmul <4 x float> %x, <float 5.0, float 6.0, float 7.0, float 8.0>
119   %add = fadd <4 x float> %mul, %y
120   %r = fsub nsz reassoc <4 x float> %y, %add
121   ret <4 x float> %r
124 define float @fsub_neg_y_commute(float %x, float %y) {
125 ; ANY-LABEL: fsub_neg_y_commute:
126 ; ANY:       # %bb.0:
127 ; ANY-NEXT:    mulss {{.*}}(%rip), %xmm0
128 ; ANY-NEXT:    retq
129   %mul = fmul float %x, 5.0
130   %add = fadd float %y, %mul
131   %r = fsub nsz reassoc float %y, %add
132   ret float %r
135 define <4 x float> @fsub_neg_y_commute_vector(<4 x float> %x, <4 x float> %y) {
136 ; ANY-LABEL: fsub_neg_y_commute_vector:
137 ; ANY:       # %bb.0:
138 ; ANY-NEXT:    mulps {{.*}}(%rip), %xmm0
139 ; ANY-NEXT:    retq
140   %mul = fmul <4 x float> %x, <float 5.0, float 5.0, float 5.0, float 5.0>
141   %add = fadd <4 x float> %y, %mul
142   %r = fsub nsz reassoc <4 x float> %y, %add
143   ret <4 x float> %r
146 ; Y - (X + Y) --> -X
148 define float @fsub_fadd_common_op_fneg(float %x, float %y) {
149 ; ANY-LABEL: fsub_fadd_common_op_fneg:
150 ; ANY:       # %bb.0:
151 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
152 ; ANY-NEXT:    retq
153   %a = fadd float %x, %y
154   %r = fsub reassoc nsz float %y, %a
155   ret float %r
158 ; Y - (X + Y) --> -X
160 define <4 x float> @fsub_fadd_common_op_fneg_vec(<4 x float> %x, <4 x float> %y) {
161 ; ANY-LABEL: fsub_fadd_common_op_fneg_vec:
162 ; ANY:       # %bb.0:
163 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
164 ; ANY-NEXT:    retq
165   %a = fadd <4 x float> %x, %y
166   %r = fsub nsz reassoc <4 x float> %y, %a
167   ret <4 x float> %r
170 ; Y - (Y + X) --> -X
171 ; Commute operands of the 'add'.
173 define float @fsub_fadd_common_op_fneg_commute(float %x, float %y) {
174 ; ANY-LABEL: fsub_fadd_common_op_fneg_commute:
175 ; ANY:       # %bb.0:
176 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
177 ; ANY-NEXT:    retq
178   %a = fadd float %y, %x
179   %r = fsub reassoc nsz float %y, %a
180   ret float %r
183 ; Y - (Y + X) --> -X
185 define <4 x float> @fsub_fadd_common_op_fneg_commute_vec(<4 x float> %x, <4 x float> %y) {
186 ; ANY-LABEL: fsub_fadd_common_op_fneg_commute_vec:
187 ; ANY:       # %bb.0:
188 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
189 ; ANY-NEXT:    retq
190   %a = fadd <4 x float> %y, %x
191   %r = fsub reassoc nsz <4 x float> %y, %a
192   ret <4 x float> %r
195 define float @fsub_negzero(float %x) {
196 ; STRICT-LABEL: fsub_negzero:
197 ; STRICT:       # %bb.0:
198 ; STRICT-NEXT:    xorps %xmm1, %xmm1
199 ; STRICT-NEXT:    addss %xmm1, %xmm0
200 ; STRICT-NEXT:    retq
202 ; UNSAFE-LABEL: fsub_negzero:
203 ; UNSAFE:       # %bb.0:
204 ; UNSAFE-NEXT:    retq
205   %r = fsub float %x, -0.0
206   ret float %r
209 define <4 x float> @fsub_negzero_vector(<4 x float> %x) {
210 ; STRICT-LABEL: fsub_negzero_vector:
211 ; STRICT:       # %bb.0:
212 ; STRICT-NEXT:    xorps %xmm1, %xmm1
213 ; STRICT-NEXT:    addps %xmm1, %xmm0
214 ; STRICT-NEXT:    retq
216 ; UNSAFE-LABEL: fsub_negzero_vector:
217 ; UNSAFE:       # %bb.0:
218 ; UNSAFE-NEXT:    retq
219   %r = fsub <4 x float> %x, <float -0.0, float -0.0, float -0.0, float -0.0>
220   ret <4 x float> %r
223 define float @fsub_zero_nsz_1(float %x) {
224 ; ANY-LABEL: fsub_zero_nsz_1:
225 ; ANY:       # %bb.0:
226 ; ANY-NEXT:    retq
227   %r = fsub nsz float %x, 0.0
228   ret float %r
231 define float @fsub_zero_nsz_2(float %x) {
232 ; ANY-LABEL: fsub_zero_nsz_2:
233 ; ANY:       # %bb.0:
234 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
235 ; ANY-NEXT:    retq
236   %r = fsub nsz float 0.0, %x
237   ret float %r
240 define float @fsub_negzero_nsz(float %x) {
241 ; ANY-LABEL: fsub_negzero_nsz:
242 ; ANY:       # %bb.0:
243 ; ANY-NEXT:    retq
244   %r = fsub nsz float %x, -0.0
245   ret float %r
248 define float @fmul_zero(float %x) {
249 ; ANY-LABEL: fmul_zero:
250 ; ANY:       # %bb.0:
251 ; ANY-NEXT:    xorps %xmm0, %xmm0
252 ; ANY-NEXT:    retq
253   %r = fmul nnan nsz float %x, 0.0
254   ret float %r
257 define float @fmul_one(float %x) {
258 ; ANY-LABEL: fmul_one:
259 ; ANY:       # %bb.0:
260 ; ANY-NEXT:    retq
261   %r = fmul float %x, 1.0
262   ret float %r
265 define float @fmul_x_const_const(float %x) {
266 ; ANY-LABEL: fmul_x_const_const:
267 ; ANY:       # %bb.0:
268 ; ANY-NEXT:    mulss {{.*}}(%rip), %xmm0
269 ; ANY-NEXT:    retq
270   %mul = fmul reassoc float %x, 9.0
271   %r = fmul reassoc float %mul, 4.0
272   ret float %r