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