xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/complex-math.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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