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