1 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86
2 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple x86_64-pc-win64 -o - | FileCheck %s --check-prefix=X86
3 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple i686-unknown-unknown -o - | FileCheck %s --check-prefix=X86
4 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple powerpc-unknown-unknown -o - | FileCheck %s --check-prefix=PPC
5 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple armv7-none-linux-gnueabi -o - | FileCheck %s --check-prefix=ARM
6 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple armv7-none-linux-gnueabihf -o - | FileCheck %s --check-prefix=ARMHF
7 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple thumbv7k-apple-watchos2.0 -o - -target-abi aapcs16 | FileCheck %s --check-prefix=ARM7K
8 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple aarch64-unknown-unknown -ffast-math -ffp-contract=fast -o - | FileCheck %s --check-prefix=AARCH64-FASTMATH
9 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple spir -o - | FileCheck %s --check-prefix=SPIR
10 
add_float_rr(float a,float b)11 float _Complex add_float_rr(float a, float b) {
12   // X86-LABEL: @add_float_rr(
13   // X86: fadd
14   // X86-NOT: fadd
15   // X86: ret
16   return a + b;
17 }
add_float_cr(float _Complex a,float b)18 float _Complex add_float_cr(float _Complex a, float b) {
19   // X86-LABEL: @add_float_cr(
20   // X86: fadd
21   // X86-NOT: fadd
22   // X86: ret
23   return a + b;
24 }
add_float_rc(float a,float _Complex b)25 float _Complex add_float_rc(float a, float _Complex b) {
26   // X86-LABEL: @add_float_rc(
27   // X86: fadd
28   // X86-NOT: fadd
29   // X86: ret
30   return a + b;
31 }
add_float_cc(float _Complex a,float _Complex b)32 float _Complex add_float_cc(float _Complex a, float _Complex b) {
33   // X86-LABEL: @add_float_cc(
34   // X86: fadd
35   // X86: fadd
36   // X86-NOT: fadd
37   // X86: ret
38   return a + b;
39 }
40 
sub_float_rr(float a,float b)41 float _Complex sub_float_rr(float a, float b) {
42   // X86-LABEL: @sub_float_rr(
43   // X86: fsub
44   // X86-NOT: fsub
45   // X86: ret
46   return a - b;
47 }
sub_float_cr(float _Complex a,float b)48 float _Complex sub_float_cr(float _Complex a, float b) {
49   // X86-LABEL: @sub_float_cr(
50   // X86: fsub
51   // X86-NOT: fsub
52   // X86: ret
53   return a - b;
54 }
sub_float_rc(float a,float _Complex b)55 float _Complex sub_float_rc(float a, float _Complex b) {
56   // X86-LABEL: @sub_float_rc(
57   // X86: fsub
58   // X86: fneg
59   // X86-NOT: fsub
60   // X86: ret
61   return a - b;
62 }
sub_float_cc(float _Complex a,float _Complex b)63 float _Complex sub_float_cc(float _Complex a, float _Complex b) {
64   // X86-LABEL: @sub_float_cc(
65   // X86: fsub
66   // X86: fsub
67   // X86-NOT: fsub
68   // X86: ret
69   return a - b;
70 }
71 
mul_float_rr(float a,float b)72 float _Complex mul_float_rr(float a, float b) {
73   // X86-LABEL: @mul_float_rr(
74   // X86: fmul
75   // X86-NOT: fmul
76   // X86: ret
77   return a * b;
78 }
mul_float_cr(float _Complex a,float b)79 float _Complex mul_float_cr(float _Complex a, float b) {
80   // X86-LABEL: @mul_float_cr(
81   // X86: fmul
82   // X86: fmul
83   // X86-NOT: fmul
84   // X86: ret
85   return a * b;
86 }
mul_float_rc(float a,float _Complex b)87 float _Complex mul_float_rc(float a, float _Complex b) {
88   // X86-LABEL: @mul_float_rc(
89   // X86: fmul
90   // X86: fmul
91   // X86-NOT: fmul
92   // X86: ret
93   return a * b;
94 }
95 
mul_float_cc(float _Complex a,float _Complex b)96 float _Complex mul_float_cc(float _Complex a, float _Complex b) {
97   // X86-LABEL: @mul_float_cc(
98   // X86: %[[AC:[^ ]+]] = fmul
99   // X86: %[[BD:[^ ]+]] = fmul
100   // X86: %[[AD:[^ ]+]] = fmul
101   // X86: %[[BC:[^ ]+]] = fmul
102   // X86: %[[RR:[^ ]+]] = fsub
103   // X86: %[[RI:[^ ]+]] = fadd
104   // X86-DAG: %[[AD]]
105   // X86-DAG: ,
106   // X86-DAG: %[[BC]]
107   // X86: fcmp uno float %[[RR]]
108   // X86: fcmp uno float %[[RI]]
109   // X86: call {{.*}} @__mulsc3(
110   // X86: ret
111   // SPIR: call spir_func {{.*}} @__mulsc3(
112   return a * b;
113 }
114 
div_float_rr(float a,float b)115 float _Complex div_float_rr(float a, float b) {
116   // X86-LABEL: @div_float_rr(
117   // X86: fdiv
118   // X86-NOT: fdiv
119   // X86: ret
120   return a / b;
121 }
div_float_cr(float _Complex a,float b)122 float _Complex div_float_cr(float _Complex a, float b) {
123   // X86-LABEL: @div_float_cr(
124   // X86: fdiv
125   // X86: fdiv
126   // X86-NOT: fdiv
127   // X86: ret
128   return a / b;
129 }
div_float_rc(float a,float _Complex b)130 float _Complex div_float_rc(float a, float _Complex b) {
131   // X86-LABEL: @div_float_rc(
132   // X86-NOT: fdiv
133   // X86: call {{.*}} @__divsc3(
134   // X86: ret
135 
136   // SPIR: call spir_func {{.*}} @__divsc3(
137 
138   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
139   // AARCH64-FASTMATH-LABEL: @div_float_rc(float %a, [2 x float] %b.coerce)
140   // A = a
141   // B = 0
142   //
143   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast float
144   // BD = 0
145   // ACpBD = AC
146   //
147   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast float
148   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast float
149   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast float
150   //
151   // BC = 0
152   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast float
153   //
154   // AARCH64-FASTMATH: fdiv fast float
155   // AARCH64-FASTMATH: fdiv fast float
156   // AARCH64-FASTMATH: ret
157   return a / b;
158 }
div_float_cc(float _Complex a,float _Complex b)159 float _Complex div_float_cc(float _Complex a, float _Complex b) {
160   // X86-LABEL: @div_float_cc(
161   // X86-NOT: fdiv
162   // X86: call {{.*}} @__divsc3(
163   // X86: ret
164 
165   // SPIR: call spir_func {{.*}} @__divsc3(
166 
167   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
168   // AARCH64-FASTMATH-LABEL: @div_float_cc([2 x float] %a.coerce, [2 x float] %b.coerce)
169   //
170   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast float
171   // AARCH64-FASTMATH: [[BD:%.*]] = fmul fast float
172   // AARCH64-FASTMATH: [[ACpBD:%.*]] = fadd fast float
173   //
174   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast float
175   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast float
176   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast float
177   //
178   // AARCH64-FASTMATH: [[BC:%.*]] = fmul fast float
179   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast float
180   // AARCH64-FASTMATH: [[BCmAD:%.*]] = fsub fast float
181   //
182   // AARCH64-FASTMATH: fdiv fast float
183   // AARCH64-FASTMATH: fdiv fast float
184   // AARCH64-FASTMATH: ret
185   return a / b;
186 }
187 
add_double_rr(double a,double b)188 double _Complex add_double_rr(double a, double b) {
189   // X86-LABEL: @add_double_rr(
190   // X86: fadd
191   // X86-NOT: fadd
192   // X86: ret
193   return a + b;
194 }
add_double_cr(double _Complex a,double b)195 double _Complex add_double_cr(double _Complex a, double b) {
196   // X86-LABEL: @add_double_cr(
197   // X86: fadd
198   // X86-NOT: fadd
199   // X86: ret
200   return a + b;
201 }
add_double_rc(double a,double _Complex b)202 double _Complex add_double_rc(double a, double _Complex b) {
203   // X86-LABEL: @add_double_rc(
204   // X86: fadd
205   // X86-NOT: fadd
206   // X86: ret
207   return a + b;
208 }
add_double_cc(double _Complex a,double _Complex b)209 double _Complex add_double_cc(double _Complex a, double _Complex b) {
210   // X86-LABEL: @add_double_cc(
211   // X86: fadd
212   // X86: fadd
213   // X86-NOT: fadd
214   // X86: ret
215   return a + b;
216 }
217 
sub_double_rr(double a,double b)218 double _Complex sub_double_rr(double a, double b) {
219   // X86-LABEL: @sub_double_rr(
220   // X86: fsub
221   // X86-NOT: fsub
222   // X86: ret
223   return a - b;
224 }
sub_double_cr(double _Complex a,double b)225 double _Complex sub_double_cr(double _Complex a, double b) {
226   // X86-LABEL: @sub_double_cr(
227   // X86: fsub
228   // X86-NOT: fsub
229   // X86: ret
230   return a - b;
231 }
sub_double_rc(double a,double _Complex b)232 double _Complex sub_double_rc(double a, double _Complex b) {
233   // X86-LABEL: @sub_double_rc(
234   // X86: fsub
235   // X86: fneg
236   // X86-NOT: fsub
237   // X86: ret
238   return a - b;
239 }
sub_double_cc(double _Complex a,double _Complex b)240 double _Complex sub_double_cc(double _Complex a, double _Complex b) {
241   // X86-LABEL: @sub_double_cc(
242   // X86: fsub
243   // X86: fsub
244   // X86-NOT: fsub
245   // X86: ret
246   return a - b;
247 }
248 
mul_double_rr(double a,double b)249 double _Complex mul_double_rr(double a, double b) {
250   // X86-LABEL: @mul_double_rr(
251   // X86: fmul
252   // X86-NOT: fmul
253   // X86: ret
254   return a * b;
255 }
mul_double_cr(double _Complex a,double b)256 double _Complex mul_double_cr(double _Complex a, double b) {
257   // X86-LABEL: @mul_double_cr(
258   // X86: fmul
259   // X86: fmul
260   // X86-NOT: fmul
261   // X86: ret
262   return a * b;
263 }
mul_double_rc(double a,double _Complex b)264 double _Complex mul_double_rc(double a, double _Complex b) {
265   // X86-LABEL: @mul_double_rc(
266   // X86: fmul
267   // X86: fmul
268   // X86-NOT: fmul
269   // X86: ret
270   return a * b;
271 }
mul_double_cc(double _Complex a,double _Complex b)272 double _Complex mul_double_cc(double _Complex a, double _Complex b) {
273   // X86-LABEL: @mul_double_cc(
274   // X86: %[[AC:[^ ]+]] = fmul
275   // X86: %[[BD:[^ ]+]] = fmul
276   // X86: %[[AD:[^ ]+]] = fmul
277   // X86: %[[BC:[^ ]+]] = fmul
278   // X86: %[[RR:[^ ]+]] = fsub double %[[AC]], %[[BD]]
279   // X86: %[[RI:[^ ]+]] = fadd double
280   // X86-DAG: %[[AD]]
281   // X86-DAG: ,
282   // X86-DAG: %[[BC]]
283   // X86: fcmp uno double %[[RR]]
284   // X86: fcmp uno double %[[RI]]
285   // X86: call {{.*}} @__muldc3(
286   // X86: ret
287 
288   // SPIR: call spir_func {{.*}} @__muldc3(
289   return a * b;
290 }
291 
div_double_rr(double a,double b)292 double _Complex div_double_rr(double a, double b) {
293   // X86-LABEL: @div_double_rr(
294   // X86: fdiv
295   // X86-NOT: fdiv
296   // X86: ret
297   return a / b;
298 }
div_double_cr(double _Complex a,double b)299 double _Complex div_double_cr(double _Complex a, double b) {
300   // X86-LABEL: @div_double_cr(
301   // X86: fdiv
302   // X86: fdiv
303   // X86-NOT: fdiv
304   // X86: ret
305   return a / b;
306 }
div_double_rc(double a,double _Complex b)307 double _Complex div_double_rc(double a, double _Complex b) {
308   // X86-LABEL: @div_double_rc(
309   // X86-NOT: fdiv
310   // X86: call {{.*}} @__divdc3(
311   // X86: ret
312 
313   // SPIR: call spir_func {{.*}} @__divdc3(
314 
315   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
316   // AARCH64-FASTMATH-LABEL: @div_double_rc(double %a, [2 x double] %b.coerce)
317   // A = a
318   // B = 0
319   //
320   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast double
321   // BD = 0
322   // ACpBD = AC
323   //
324   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast double
325   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast double
326   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast double
327   //
328   // BC = 0
329   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast double
330   //
331   // AARCH64-FASTMATH: fdiv fast double
332   // AARCH64-FASTMATH: fdiv fast double
333   // AARCH64-FASTMATH: ret
334   return a / b;
335 }
div_double_cc(double _Complex a,double _Complex b)336 double _Complex div_double_cc(double _Complex a, double _Complex b) {
337   // X86-LABEL: @div_double_cc(
338   // X86-NOT: fdiv
339   // X86: call {{.*}} @__divdc3(
340   // X86: ret
341 
342   // SPIR: call spir_func {{.*}} @__divdc3(
343 
344   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
345   // AARCH64-FASTMATH-LABEL: @div_double_cc([2 x double] %a.coerce, [2 x double] %b.coerce)
346   //
347   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast double
348   // AARCH64-FASTMATH: [[BD:%.*]] = fmul fast double
349   // AARCH64-FASTMATH: [[ACpBD:%.*]] = fadd fast double
350   //
351   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast double
352   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast double
353   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast double
354   //
355   // AARCH64-FASTMATH: [[BC:%.*]] = fmul fast double
356   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast double
357   // AARCH64-FASTMATH: [[BCmAD:%.*]] = fsub fast double
358   //
359   // AARCH64-FASTMATH: fdiv fast double
360   // AARCH64-FASTMATH: fdiv fast double
361   // AARCH64-FASTMATH: ret
362   return a / b;
363 }
364 
add_long_double_rr(long double a,long double b)365 long double _Complex add_long_double_rr(long double a, long double b) {
366   // X86-LABEL: @add_long_double_rr(
367   // X86: fadd
368   // X86-NOT: fadd
369   // X86: ret
370   return a + b;
371 }
add_long_double_cr(long double _Complex a,long double b)372 long double _Complex add_long_double_cr(long double _Complex a, long double b) {
373   // X86-LABEL: @add_long_double_cr(
374   // X86: fadd
375   // X86-NOT: fadd
376   // X86: ret
377   return a + b;
378 }
add_long_double_rc(long double a,long double _Complex b)379 long double _Complex add_long_double_rc(long double a, long double _Complex b) {
380   // X86-LABEL: @add_long_double_rc(
381   // X86: fadd
382   // X86-NOT: fadd
383   // X86: ret
384   return a + b;
385 }
add_long_double_cc(long double _Complex a,long double _Complex b)386 long double _Complex add_long_double_cc(long double _Complex a, long double _Complex b) {
387   // X86-LABEL: @add_long_double_cc(
388   // X86: fadd
389   // X86: fadd
390   // X86-NOT: fadd
391   // X86: ret
392   return a + b;
393 }
394 
sub_long_double_rr(long double a,long double b)395 long double _Complex sub_long_double_rr(long double a, long double b) {
396   // X86-LABEL: @sub_long_double_rr(
397   // X86: fsub
398   // X86-NOT: fsub
399   // X86: ret
400   return a - b;
401 }
sub_long_double_cr(long double _Complex a,long double b)402 long double _Complex sub_long_double_cr(long double _Complex a, long double b) {
403   // X86-LABEL: @sub_long_double_cr(
404   // X86: fsub
405   // X86-NOT: fsub
406   // X86: ret
407   return a - b;
408 }
sub_long_double_rc(long double a,long double _Complex b)409 long double _Complex sub_long_double_rc(long double a, long double _Complex b) {
410   // X86-LABEL: @sub_long_double_rc(
411   // X86: fsub
412   // X86: fneg
413   // X86-NOT: fsub
414   // X86: ret
415   return a - b;
416 }
sub_long_double_cc(long double _Complex a,long double _Complex b)417 long double _Complex sub_long_double_cc(long double _Complex a, long double _Complex b) {
418   // X86-LABEL: @sub_long_double_cc(
419   // X86: fsub
420   // X86: fsub
421   // X86-NOT: fsub
422   // X86: ret
423   return a - b;
424 }
425 
mul_long_double_rr(long double a,long double b)426 long double _Complex mul_long_double_rr(long double a, long double b) {
427   // X86-LABEL: @mul_long_double_rr(
428   // X86: fmul
429   // X86-NOT: fmul
430   // X86: ret
431   return a * b;
432 }
mul_long_double_cr(long double _Complex a,long double b)433 long double _Complex mul_long_double_cr(long double _Complex a, long double b) {
434   // X86-LABEL: @mul_long_double_cr(
435   // X86: fmul
436   // X86: fmul
437   // X86-NOT: fmul
438   // X86: ret
439   return a * b;
440 }
mul_long_double_rc(long double a,long double _Complex b)441 long double _Complex mul_long_double_rc(long double a, long double _Complex b) {
442   // X86-LABEL: @mul_long_double_rc(
443   // X86: fmul
444   // X86: fmul
445   // X86-NOT: fmul
446   // X86: ret
447   return a * b;
448 }
mul_long_double_cc(long double _Complex a,long double _Complex b)449 long double _Complex mul_long_double_cc(long double _Complex a, long double _Complex b) {
450   // X86-LABEL: @mul_long_double_cc(
451   // X86: %[[AC:[^ ]+]] = fmul
452   // X86: %[[BD:[^ ]+]] = fmul
453   // X86: %[[AD:[^ ]+]] = fmul
454   // X86: %[[BC:[^ ]+]] = fmul
455   // X86: %[[RR:[^ ]+]] = fsub x86_fp80 %[[AC]], %[[BD]]
456   // X86: %[[RI:[^ ]+]] = fadd x86_fp80
457   // X86-DAG: %[[AD]]
458   // X86-DAG: ,
459   // X86-DAG: %[[BC]]
460   // X86: fcmp uno x86_fp80 %[[RR]]
461   // X86: fcmp uno x86_fp80 %[[RI]]
462   // X86: call {{.*}} @__mulxc3(
463   // X86: ret
464   // PPC-LABEL: @mul_long_double_cc(
465   // PPC: %[[AC:[^ ]+]] = fmul
466   // PPC: %[[BD:[^ ]+]] = fmul
467   // PPC: %[[AD:[^ ]+]] = fmul
468   // PPC: %[[BC:[^ ]+]] = fmul
469   // PPC: %[[RR:[^ ]+]] = fsub ppc_fp128 %[[AC]], %[[BD]]
470   // PPC: %[[RI:[^ ]+]] = fadd ppc_fp128
471   // PPC-DAG: %[[AD]]
472   // PPC-DAG: ,
473   // PPC-DAG: %[[BC]]
474   // PPC: fcmp uno ppc_fp128 %[[RR]]
475   // PPC: fcmp uno ppc_fp128 %[[RI]]
476   // PPC: call {{.*}} @__multc3(
477   // PPC: ret
478   // SPIR: call spir_func {{.*}} @__muldc3(
479   return a * b;
480 }
481 
div_long_double_rr(long double a,long double b)482 long double _Complex div_long_double_rr(long double a, long double b) {
483   // X86-LABEL: @div_long_double_rr(
484   // X86: fdiv
485   // X86-NOT: fdiv
486   // X86: ret
487   return a / b;
488 }
div_long_double_cr(long double _Complex a,long double b)489 long double _Complex div_long_double_cr(long double _Complex a, long double b) {
490   // X86-LABEL: @div_long_double_cr(
491   // X86: fdiv
492   // X86: fdiv
493   // X86-NOT: fdiv
494   // X86: ret
495   return a / b;
496 }
div_long_double_rc(long double a,long double _Complex b)497 long double _Complex div_long_double_rc(long double a, long double _Complex b) {
498   // X86-LABEL: @div_long_double_rc(
499   // X86-NOT: fdiv
500   // X86: call {{.*}} @__divxc3(
501   // X86: ret
502   // PPC-LABEL: @div_long_double_rc(
503   // PPC-NOT: fdiv
504   // PPC: call {{.*}} @__divtc3(
505   // PPC: ret
506   // SPIR: call spir_func {{.*}} @__divdc3(
507 
508   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
509   // AARCH64-FASTMATH-LABEL: @div_long_double_rc(fp128 %a, [2 x fp128] %b.coerce)
510   // A = a
511   // B = 0
512   //
513   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast fp128
514   // BD = 0
515   // ACpBD = AC
516   //
517   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast fp128
518   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast fp128
519   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast fp128
520   //
521   // BC = 0
522   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast fp128
523   //
524   // AARCH64-FASTMATH: fdiv fast fp128
525   // AARCH64-FASTMATH: fdiv fast fp128
526   // AARCH64-FASTMATH: ret
527   return a / b;
528 }
div_long_double_cc(long double _Complex a,long double _Complex b)529 long double _Complex div_long_double_cc(long double _Complex a, long double _Complex b) {
530   // X86-LABEL: @div_long_double_cc(
531   // X86-NOT: fdiv
532   // X86: call {{.*}} @__divxc3(
533   // X86: ret
534   // PPC-LABEL: @div_long_double_cc(
535   // PPC-NOT: fdiv
536   // PPC: call {{.*}} @__divtc3(
537   // PPC: ret
538   // SPIR: call spir_func {{.*}} @__divdc3(
539 
540   // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
541   // AARCH64-FASTMATH-LABEL: @div_long_double_cc([2 x fp128] %a.coerce, [2 x fp128] %b.coerce)
542   //
543   // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast fp128
544   // AARCH64-FASTMATH: [[BD:%.*]] = fmul fast fp128
545   // AARCH64-FASTMATH: [[ACpBD:%.*]] = fadd fast fp128
546   //
547   // AARCH64-FASTMATH: [[CC:%.*]] = fmul fast fp128
548   // AARCH64-FASTMATH: [[DD:%.*]] = fmul fast fp128
549   // AARCH64-FASTMATH: [[CCpDD:%.*]] = fadd fast fp128
550   //
551   // AARCH64-FASTMATH: [[BC:%.*]] = fmul fast fp128
552   // AARCH64-FASTMATH: [[AD:%.*]] = fmul fast fp128
553   // AARCH64-FASTMATH: [[BCmAD:%.*]] = fsub fast fp128
554   //
555   // AARCH64-FASTMATH: fdiv fast fp128
556   // AARCH64-FASTMATH: fdiv fast fp128
557   // AARCH64-FASTMATH: ret
558   return a / b;
559 }
560 
561 // Comparison operators don't rely on library calls or have interseting math
562 // properties, but test that mixed types work correctly here.
eq_float_cr(float _Complex a,float b)563 _Bool eq_float_cr(float _Complex a, float b) {
564   // X86-LABEL: @eq_float_cr(
565   // X86: fcmp oeq
566   // X86: fcmp oeq
567   // X86: and i1
568   // X86: ret
569   return a == b;
570 }
eq_float_rc(float a,float _Complex b)571 _Bool eq_float_rc(float a, float _Complex b) {
572   // X86-LABEL: @eq_float_rc(
573   // X86: fcmp oeq
574   // X86: fcmp oeq
575   // X86: and i1
576   // X86: ret
577   return a == b;
578 }
eq_float_cc(float _Complex a,float _Complex b)579 _Bool eq_float_cc(float _Complex a, float _Complex b) {
580   // X86-LABEL: @eq_float_cc(
581   // X86: fcmp oeq
582   // X86: fcmp oeq
583   // X86: and i1
584   // X86: ret
585   return a == b;
586 }
ne_float_cr(float _Complex a,float b)587 _Bool ne_float_cr(float _Complex a, float b) {
588   // X86-LABEL: @ne_float_cr(
589   // X86: fcmp une
590   // X86: fcmp une
591   // X86: or i1
592   // X86: ret
593   return a != b;
594 }
ne_float_rc(float a,float _Complex b)595 _Bool ne_float_rc(float a, float _Complex b) {
596   // X86-LABEL: @ne_float_rc(
597   // X86: fcmp une
598   // X86: fcmp une
599   // X86: or i1
600   // X86: ret
601   return a != b;
602 }
ne_float_cc(float _Complex a,float _Complex b)603 _Bool ne_float_cc(float _Complex a, float _Complex b) {
604   // X86-LABEL: @ne_float_cc(
605   // X86: fcmp une
606   // X86: fcmp une
607   // X86: or i1
608   // X86: ret
609   return a != b;
610 }
611 
612 // Check that the libcall will obtain proper calling convention on ARM
foo(_Complex double a,_Complex double b)613 _Complex double foo(_Complex double a, _Complex double b) {
614   // These functions are not defined as floating point helper functions in
615   // Run-time ABI for the ARM architecture document so they must not always
616   // use the base AAPCS.
617 
618   // ARM-LABEL: @foo(
619   // ARM: call void @__muldc3
620 
621   // SPIR: call spir_func void @__muldc3
622 
623   // ARMHF-LABEL: @foo(
624   // ARMHF: call { double, double } @__muldc3
625 
626   // ARM7K-LABEL: @foo(
627   // ARM7K: call { double, double } @__muldc3
628   return a*b;
629 }
630