1 // 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
5 // RUN: %clang_cc1 %s -O1 -emit-llvm -triple armv7-none-linux-gnueabihf -o - | FileCheck %s --check-prefix=ARM
6
add_float_rr(float a,float b)7 float _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 }
add_float_cr(float _Complex a,float b)14 float _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 }
add_float_rc(float a,float _Complex b)21 float _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 }
add_float_cc(float _Complex a,float _Complex b)28 float _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
sub_float_rr(float a,float b)37 float _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 }
sub_float_cr(float _Complex a,float b)44 float _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 }
sub_float_rc(float a,float _Complex b)51 float _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 }
sub_float_cc(float _Complex a,float _Complex b)59 float _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
mul_float_rr(float a,float b)68 float _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 }
mul_float_cr(float _Complex a,float b)75 float _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 }
mul_float_rc(float a,float _Complex b)83 float _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 }
mul_float_cc(float _Complex a,float _Complex b)91 float _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
div_float_rr(float a,float b)109 float _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 }
div_float_cr(float _Complex a,float b)116 float _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 }
div_float_rc(float a,float _Complex b)124 float _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 }
div_float_cc(float _Complex a,float _Complex b)131 float _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
add_double_rr(double a,double b)139 double _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 }
add_double_cr(double _Complex a,double b)146 double _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 }
add_double_rc(double a,double _Complex b)153 double _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 }
add_double_cc(double _Complex a,double _Complex b)160 double _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
sub_double_rr(double a,double b)169 double _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 }
sub_double_cr(double _Complex a,double b)176 double _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 }
sub_double_rc(double a,double _Complex b)183 double _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 }
sub_double_cc(double _Complex a,double _Complex b)191 double _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
mul_double_rr(double a,double b)200 double _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 }
mul_double_cr(double _Complex a,double b)207 double _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 }
mul_double_rc(double a,double _Complex b)215 double _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 }
mul_double_cc(double _Complex a,double _Complex b)223 double _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
div_double_rr(double a,double b)241 double _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 }
div_double_cr(double _Complex a,double b)248 double _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 }
div_double_rc(double a,double _Complex b)256 double _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 }
div_double_cc(double _Complex a,double _Complex b)263 double _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
add_long_double_rr(long double a,long double b)271 long 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 }
add_long_double_cr(long double _Complex a,long double b)278 long 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 }
add_long_double_rc(long double a,long double _Complex b)285 long 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 }
add_long_double_cc(long double _Complex a,long double _Complex b)292 long 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
sub_long_double_rr(long double a,long double b)301 long 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 }
sub_long_double_cr(long double _Complex a,long double b)308 long 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 }
sub_long_double_rc(long double a,long double _Complex b)315 long 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 }
sub_long_double_cc(long double _Complex a,long double _Complex b)323 long 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
mul_long_double_rr(long double a,long double b)332 long 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 }
mul_long_double_cr(long double _Complex a,long double b)339 long 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 }
mul_long_double_rc(long double a,long double _Complex b)347 long 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 }
mul_long_double_cc(long double _Complex a,long double _Complex b)355 long 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
div_long_double_rr(long double a,long double b)387 long 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 }
div_long_double_cr(long double _Complex a,long double b)394 long 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 }
div_long_double_rc(long double a,long double _Complex b)402 long 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 }
div_long_double_cc(long double _Complex a,long double _Complex b)413 long 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.
eq_float_cr(float _Complex a,float b)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 }
eq_float_rc(float a,float _Complex b)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 }
eq_float_cc(float _Complex a,float _Complex b)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 }
ne_float_cr(float _Complex a,float b)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 }
ne_float_rc(float a,float _Complex b)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 }
ne_float_cc(float _Complex a,float _Complex b)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 }
475
476 // Check that the libcall will obtain proper calling convention on ARM
foo(_Complex double a,_Complex double b)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 }
482