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