blob: 36ef271b0ae02ba3ad66ba1b50eec45b05b72d94 [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: %clang_cc1 %s -O1 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86
2// RUN: %clang_cc1 %s -O1 -emit-llvm -triple x86_64-pc-win64 -o - | FileCheck %s --check-prefix=X86
3// RUN: %clang_cc1 %s -O1 -emit-llvm -triple i686-unknown-unknown -o - | FileCheck %s --check-prefix=X86
4// RUN: %clang_cc1 %s -O1 -emit-llvm -triple powerpc-unknown-unknown -o - | FileCheck %s --check-prefix=PPC
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005// RUN: %clang_cc1 %s -O1 -emit-llvm -triple armv7-none-linux-gnueabihf -o - | FileCheck %s --check-prefix=ARM
Stephen Hines176edba2014-12-01 14:53:08 -08006
7float _Complex add_float_rr(float a, float b) {
8 // X86-LABEL: @add_float_rr(
9 // X86: fadd
10 // X86-NOT: fadd
11 // X86: ret
12 return a + b;
13}
14float _Complex add_float_cr(float _Complex a, float b) {
15 // X86-LABEL: @add_float_cr(
16 // X86: fadd
17 // X86-NOT: fadd
18 // X86: ret
19 return a + b;
20}
21float _Complex add_float_rc(float a, float _Complex b) {
22 // X86-LABEL: @add_float_rc(
23 // X86: fadd
24 // X86-NOT: fadd
25 // X86: ret
26 return a + b;
27}
28float _Complex add_float_cc(float _Complex a, float _Complex b) {
29 // X86-LABEL: @add_float_cc(
30 // X86: fadd
31 // X86: fadd
32 // X86-NOT: fadd
33 // X86: ret
34 return a + b;
35}
36
37float _Complex sub_float_rr(float a, float b) {
38 // X86-LABEL: @sub_float_rr(
39 // X86: fsub
40 // X86-NOT: fsub
41 // X86: ret
42 return a - b;
43}
44float _Complex sub_float_cr(float _Complex a, float b) {
45 // X86-LABEL: @sub_float_cr(
46 // X86: fsub
47 // X86-NOT: fsub
48 // X86: ret
49 return a - b;
50}
51float _Complex sub_float_rc(float a, float _Complex b) {
52 // X86-LABEL: @sub_float_rc(
53 // X86: fsub
54 // X86: fsub float -0.{{0+}}e+00,
55 // X86-NOT: fsub
56 // X86: ret
57 return a - b;
58}
59float _Complex sub_float_cc(float _Complex a, float _Complex b) {
60 // X86-LABEL: @sub_float_cc(
61 // X86: fsub
62 // X86: fsub
63 // X86-NOT: fsub
64 // X86: ret
65 return a - b;
66}
67
68float _Complex mul_float_rr(float a, float b) {
69 // X86-LABEL: @mul_float_rr(
70 // X86: fmul
71 // X86-NOT: fmul
72 // X86: ret
73 return a * b;
74}
75float _Complex mul_float_cr(float _Complex a, float b) {
76 // X86-LABEL: @mul_float_cr(
77 // X86: fmul
78 // X86: fmul
79 // X86-NOT: fmul
80 // X86: ret
81 return a * b;
82}
83float _Complex mul_float_rc(float a, float _Complex b) {
84 // X86-LABEL: @mul_float_rc(
85 // X86: fmul
86 // X86: fmul
87 // X86-NOT: fmul
88 // X86: ret
89 return a * b;
90}
91float _Complex mul_float_cc(float _Complex a, float _Complex b) {
92 // X86-LABEL: @mul_float_cc(
93 // X86: %[[AC:[^ ]+]] = fmul
94 // X86: %[[BD:[^ ]+]] = fmul
95 // X86: %[[AD:[^ ]+]] = fmul
96 // X86: %[[BC:[^ ]+]] = fmul
97 // X86: %[[RR:[^ ]+]] = fsub float %[[AC]], %[[BD]]
98 // X86: %[[RI:[^ ]+]] = fadd float
99 // X86-DAG: %[[AD]]
100 // X86-DAG: ,
101 // X86-DAG: %[[BC]]
102 // X86: fcmp uno float %[[RR]]
103 // X86: fcmp uno float %[[RI]]
104 // X86: call {{.*}} @__mulsc3(
105 // X86: ret
106 return a * b;
107}
108
109float _Complex div_float_rr(float a, float b) {
110 // X86-LABEL: @div_float_rr(
111 // X86: fdiv
112 // X86-NOT: fdiv
113 // X86: ret
114 return a / b;
115}
116float _Complex div_float_cr(float _Complex a, float b) {
117 // X86-LABEL: @div_float_cr(
118 // X86: fdiv
119 // X86: fdiv
120 // X86-NOT: fdiv
121 // X86: ret
122 return a / b;
123}
124float _Complex div_float_rc(float a, float _Complex b) {
125 // X86-LABEL: @div_float_rc(
126 // X86-NOT: fdiv
127 // X86: call {{.*}} @__divsc3(
128 // X86: ret
129 return a / b;
130}
131float _Complex div_float_cc(float _Complex a, float _Complex b) {
132 // X86-LABEL: @div_float_cc(
133 // X86-NOT: fdiv
134 // X86: call {{.*}} @__divsc3(
135 // X86: ret
136 return a / b;
137}
138
139double _Complex add_double_rr(double a, double b) {
140 // X86-LABEL: @add_double_rr(
141 // X86: fadd
142 // X86-NOT: fadd
143 // X86: ret
144 return a + b;
145}
146double _Complex add_double_cr(double _Complex a, double b) {
147 // X86-LABEL: @add_double_cr(
148 // X86: fadd
149 // X86-NOT: fadd
150 // X86: ret
151 return a + b;
152}
153double _Complex add_double_rc(double a, double _Complex b) {
154 // X86-LABEL: @add_double_rc(
155 // X86: fadd
156 // X86-NOT: fadd
157 // X86: ret
158 return a + b;
159}
160double _Complex add_double_cc(double _Complex a, double _Complex b) {
161 // X86-LABEL: @add_double_cc(
162 // X86: fadd
163 // X86: fadd
164 // X86-NOT: fadd
165 // X86: ret
166 return a + b;
167}
168
169double _Complex sub_double_rr(double a, double b) {
170 // X86-LABEL: @sub_double_rr(
171 // X86: fsub
172 // X86-NOT: fsub
173 // X86: ret
174 return a - b;
175}
176double _Complex sub_double_cr(double _Complex a, double b) {
177 // X86-LABEL: @sub_double_cr(
178 // X86: fsub
179 // X86-NOT: fsub
180 // X86: ret
181 return a - b;
182}
183double _Complex sub_double_rc(double a, double _Complex b) {
184 // X86-LABEL: @sub_double_rc(
185 // X86: fsub
186 // X86: fsub double -0.{{0+}}e+00,
187 // X86-NOT: fsub
188 // X86: ret
189 return a - b;
190}
191double _Complex sub_double_cc(double _Complex a, double _Complex b) {
192 // X86-LABEL: @sub_double_cc(
193 // X86: fsub
194 // X86: fsub
195 // X86-NOT: fsub
196 // X86: ret
197 return a - b;
198}
199
200double _Complex mul_double_rr(double a, double b) {
201 // X86-LABEL: @mul_double_rr(
202 // X86: fmul
203 // X86-NOT: fmul
204 // X86: ret
205 return a * b;
206}
207double _Complex mul_double_cr(double _Complex a, double b) {
208 // X86-LABEL: @mul_double_cr(
209 // X86: fmul
210 // X86: fmul
211 // X86-NOT: fmul
212 // X86: ret
213 return a * b;
214}
215double _Complex mul_double_rc(double a, double _Complex b) {
216 // X86-LABEL: @mul_double_rc(
217 // X86: fmul
218 // X86: fmul
219 // X86-NOT: fmul
220 // X86: ret
221 return a * b;
222}
223double _Complex mul_double_cc(double _Complex a, double _Complex b) {
224 // X86-LABEL: @mul_double_cc(
225 // X86: %[[AC:[^ ]+]] = fmul
226 // X86: %[[BD:[^ ]+]] = fmul
227 // X86: %[[AD:[^ ]+]] = fmul
228 // X86: %[[BC:[^ ]+]] = fmul
229 // X86: %[[RR:[^ ]+]] = fsub double %[[AC]], %[[BD]]
230 // X86: %[[RI:[^ ]+]] = fadd double
231 // X86-DAG: %[[AD]]
232 // X86-DAG: ,
233 // X86-DAG: %[[BC]]
234 // X86: fcmp uno double %[[RR]]
235 // X86: fcmp uno double %[[RI]]
236 // X86: call {{.*}} @__muldc3(
237 // X86: ret
238 return a * b;
239}
240
241double _Complex div_double_rr(double a, double b) {
242 // X86-LABEL: @div_double_rr(
243 // X86: fdiv
244 // X86-NOT: fdiv
245 // X86: ret
246 return a / b;
247}
248double _Complex div_double_cr(double _Complex a, double b) {
249 // X86-LABEL: @div_double_cr(
250 // X86: fdiv
251 // X86: fdiv
252 // X86-NOT: fdiv
253 // X86: ret
254 return a / b;
255}
256double _Complex div_double_rc(double a, double _Complex b) {
257 // X86-LABEL: @div_double_rc(
258 // X86-NOT: fdiv
259 // X86: call {{.*}} @__divdc3(
260 // X86: ret
261 return a / b;
262}
263double _Complex div_double_cc(double _Complex a, double _Complex b) {
264 // X86-LABEL: @div_double_cc(
265 // X86-NOT: fdiv
266 // X86: call {{.*}} @__divdc3(
267 // X86: ret
268 return a / b;
269}
270
271long double _Complex add_long_double_rr(long double a, long double b) {
272 // X86-LABEL: @add_long_double_rr(
273 // X86: fadd
274 // X86-NOT: fadd
275 // X86: ret
276 return a + b;
277}
278long double _Complex add_long_double_cr(long double _Complex a, long double b) {
279 // X86-LABEL: @add_long_double_cr(
280 // X86: fadd
281 // X86-NOT: fadd
282 // X86: ret
283 return a + b;
284}
285long double _Complex add_long_double_rc(long double a, long double _Complex b) {
286 // X86-LABEL: @add_long_double_rc(
287 // X86: fadd
288 // X86-NOT: fadd
289 // X86: ret
290 return a + b;
291}
292long double _Complex add_long_double_cc(long double _Complex a, long double _Complex b) {
293 // X86-LABEL: @add_long_double_cc(
294 // X86: fadd
295 // X86: fadd
296 // X86-NOT: fadd
297 // X86: ret
298 return a + b;
299}
300
301long double _Complex sub_long_double_rr(long double a, long double b) {
302 // X86-LABEL: @sub_long_double_rr(
303 // X86: fsub
304 // X86-NOT: fsub
305 // X86: ret
306 return a - b;
307}
308long double _Complex sub_long_double_cr(long double _Complex a, long double b) {
309 // X86-LABEL: @sub_long_double_cr(
310 // X86: fsub
311 // X86-NOT: fsub
312 // X86: ret
313 return a - b;
314}
315long double _Complex sub_long_double_rc(long double a, long double _Complex b) {
316 // X86-LABEL: @sub_long_double_rc(
317 // X86: fsub
318 // X86: fsub x86_fp80 0xK8{{0+}},
319 // X86-NOT: fsub
320 // X86: ret
321 return a - b;
322}
323long double _Complex sub_long_double_cc(long double _Complex a, long double _Complex b) {
324 // X86-LABEL: @sub_long_double_cc(
325 // X86: fsub
326 // X86: fsub
327 // X86-NOT: fsub
328 // X86: ret
329 return a - b;
330}
331
332long double _Complex mul_long_double_rr(long double a, long double b) {
333 // X86-LABEL: @mul_long_double_rr(
334 // X86: fmul
335 // X86-NOT: fmul
336 // X86: ret
337 return a * b;
338}
339long double _Complex mul_long_double_cr(long double _Complex a, long double b) {
340 // X86-LABEL: @mul_long_double_cr(
341 // X86: fmul
342 // X86: fmul
343 // X86-NOT: fmul
344 // X86: ret
345 return a * b;
346}
347long double _Complex mul_long_double_rc(long double a, long double _Complex b) {
348 // X86-LABEL: @mul_long_double_rc(
349 // X86: fmul
350 // X86: fmul
351 // X86-NOT: fmul
352 // X86: ret
353 return a * b;
354}
355long double _Complex mul_long_double_cc(long double _Complex a, long double _Complex b) {
356 // X86-LABEL: @mul_long_double_cc(
357 // X86: %[[AC:[^ ]+]] = fmul
358 // X86: %[[BD:[^ ]+]] = fmul
359 // X86: %[[AD:[^ ]+]] = fmul
360 // X86: %[[BC:[^ ]+]] = fmul
361 // X86: %[[RR:[^ ]+]] = fsub x86_fp80 %[[AC]], %[[BD]]
362 // X86: %[[RI:[^ ]+]] = fadd x86_fp80
363 // X86-DAG: %[[AD]]
364 // X86-DAG: ,
365 // X86-DAG: %[[BC]]
366 // X86: fcmp uno x86_fp80 %[[RR]]
367 // X86: fcmp uno x86_fp80 %[[RI]]
368 // X86: call {{.*}} @__mulxc3(
369 // X86: ret
370 // PPC-LABEL: @mul_long_double_cc(
371 // PPC: %[[AC:[^ ]+]] = fmul
372 // PPC: %[[BD:[^ ]+]] = fmul
373 // PPC: %[[AD:[^ ]+]] = fmul
374 // PPC: %[[BC:[^ ]+]] = fmul
375 // PPC: %[[RR:[^ ]+]] = fsub ppc_fp128 %[[AC]], %[[BD]]
376 // PPC: %[[RI:[^ ]+]] = fadd ppc_fp128
377 // PPC-DAG: %[[AD]]
378 // PPC-DAG: ,
379 // PPC-DAG: %[[BC]]
380 // PPC: fcmp uno ppc_fp128 %[[RR]]
381 // PPC: fcmp uno ppc_fp128 %[[RI]]
382 // PPC: call {{.*}} @__multc3(
383 // PPC: ret
384 return a * b;
385}
386
387long double _Complex div_long_double_rr(long double a, long double b) {
388 // X86-LABEL: @div_long_double_rr(
389 // X86: fdiv
390 // X86-NOT: fdiv
391 // X86: ret
392 return a / b;
393}
394long double _Complex div_long_double_cr(long double _Complex a, long double b) {
395 // X86-LABEL: @div_long_double_cr(
396 // X86: fdiv
397 // X86: fdiv
398 // X86-NOT: fdiv
399 // X86: ret
400 return a / b;
401}
402long double _Complex div_long_double_rc(long double a, long double _Complex b) {
403 // X86-LABEL: @div_long_double_rc(
404 // X86-NOT: fdiv
405 // X86: call {{.*}} @__divxc3(
406 // X86: ret
407 // PPC-LABEL: @div_long_double_rc(
408 // PPC-NOT: fdiv
409 // PPC: call {{.*}} @__divtc3(
410 // PPC: ret
411 return a / b;
412}
413long double _Complex div_long_double_cc(long double _Complex a, long double _Complex b) {
414 // X86-LABEL: @div_long_double_cc(
415 // X86-NOT: fdiv
416 // X86: call {{.*}} @__divxc3(
417 // X86: ret
418 // PPC-LABEL: @div_long_double_cc(
419 // PPC-NOT: fdiv
420 // PPC: call {{.*}} @__divtc3(
421 // PPC: ret
422 return a / b;
423}
424
425// Comparison operators don't rely on library calls or have interseting math
426// properties, but test that mixed types work correctly here.
427_Bool eq_float_cr(float _Complex a, float b) {
428 // X86-LABEL: @eq_float_cr(
429 // X86: fcmp oeq
430 // X86: fcmp oeq
431 // X86: and i1
432 // X86: ret
433 return a == b;
434}
435_Bool eq_float_rc(float a, float _Complex b) {
436 // X86-LABEL: @eq_float_rc(
437 // X86: fcmp oeq
438 // X86: fcmp oeq
439 // X86: and i1
440 // X86: ret
441 return a == b;
442}
443_Bool eq_float_cc(float _Complex a, float _Complex b) {
444 // X86-LABEL: @eq_float_cc(
445 // X86: fcmp oeq
446 // X86: fcmp oeq
447 // X86: and i1
448 // X86: ret
449 return a == b;
450}
451_Bool ne_float_cr(float _Complex a, float b) {
452 // X86-LABEL: @ne_float_cr(
453 // X86: fcmp une
454 // X86: fcmp une
455 // X86: or i1
456 // X86: ret
457 return a != b;
458}
459_Bool ne_float_rc(float a, float _Complex b) {
460 // X86-LABEL: @ne_float_rc(
461 // X86: fcmp une
462 // X86: fcmp une
463 // X86: or i1
464 // X86: ret
465 return a != b;
466}
467_Bool ne_float_cc(float _Complex a, float _Complex b) {
468 // X86-LABEL: @ne_float_cc(
469 // X86: fcmp une
470 // X86: fcmp une
471 // X86: or i1
472 // X86: ret
473 return a != b;
474}
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700475
476// Check that the libcall will obtain proper calling convention on ARM
477_Complex double foo(_Complex double a, _Complex double b) {
478 // ARM-LABEL: @foo(
479 // ARM: call arm_aapcscc { double, double } @__muldc3
480 return a*b;
481}