blob: 29172fa6d77f1b645e8e6cc5192dd079ee8b5ead [file] [log] [blame]
Chandler Carrutha216cad2014-10-11 00:57:18 +00001// RUN: %clang_cc1 %s -O1 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86
Chandler Carruth686de242014-10-11 09:24:41 +00002// 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
Joerg Sonnenbergeraa3e9f52014-10-17 11:51:19 +00004// RUN: %clang_cc1 %s -O1 -emit-llvm -triple powerpc-unknown-unknown -o - | FileCheck %s --check-prefix=PPC
Chandler Carrutha216cad2014-10-11 00:57:18 +00005
6float _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}
13float _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}
20float _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}
27float _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
36float _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}
43float _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}
50float _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}
58float _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
67float _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}
74float _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}
82float _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}
90float _Complex mul_float_cc(float _Complex a, float _Complex b) {
91 // X86-LABEL: @mul_float_cc(
Chandler Carruth0c4b2302014-10-19 19:13:49 +000092 // 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]]
Chandler Carruth686de242014-10-11 09:24:41 +0000103 // X86: call {{.*}} @__mulsc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000104 // X86: ret
105 return a * b;
106}
107
108float _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}
115float _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}
123float _Complex div_float_rc(float a, float _Complex b) {
124 // X86-LABEL: @div_float_rc(
125 // X86-NOT: fdiv
Chandler Carruth686de242014-10-11 09:24:41 +0000126 // X86: call {{.*}} @__divsc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000127 // X86: ret
128 return a / b;
129}
130float _Complex div_float_cc(float _Complex a, float _Complex b) {
131 // X86-LABEL: @div_float_cc(
132 // X86-NOT: fdiv
Chandler Carruth686de242014-10-11 09:24:41 +0000133 // X86: call {{.*}} @__divsc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000134 // X86: ret
135 return a / b;
136}
137
138double _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}
145double _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}
152double _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}
159double _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
168double _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}
175double _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}
182double _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}
190double _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
199double _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}
206double _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}
214double _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}
222double _Complex mul_double_cc(double _Complex a, double _Complex b) {
223 // X86-LABEL: @mul_double_cc(
Chandler Carruth0c4b2302014-10-19 19:13:49 +0000224 // 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]]
Chandler Carruth686de242014-10-11 09:24:41 +0000235 // X86: call {{.*}} @__muldc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000236 // X86: ret
237 return a * b;
238}
239
240double _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}
247double _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}
255double _Complex div_double_rc(double a, double _Complex b) {
256 // X86-LABEL: @div_double_rc(
257 // X86-NOT: fdiv
Chandler Carruth686de242014-10-11 09:24:41 +0000258 // X86: call {{.*}} @__divdc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000259 // X86: ret
260 return a / b;
261}
262double _Complex div_double_cc(double _Complex a, double _Complex b) {
263 // X86-LABEL: @div_double_cc(
264 // X86-NOT: fdiv
Chandler Carruth686de242014-10-11 09:24:41 +0000265 // X86: call {{.*}} @__divdc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000266 // X86: ret
267 return a / b;
268}
269
270long 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}
277long 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}
284long 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}
291long 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
300long 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}
307long 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}
314long 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}
322long 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
331long 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}
338long 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}
346long 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}
354long double _Complex mul_long_double_cc(long double _Complex a, long double _Complex b) {
355 // X86-LABEL: @mul_long_double_cc(
Chandler Carruth0c4b2302014-10-19 19:13:49 +0000356 // 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]]
Chandler Carruth686de242014-10-11 09:24:41 +0000367 // X86: call {{.*}} @__mulxc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000368 // X86: ret
Joerg Sonnenbergeraa3e9f52014-10-17 11:51:19 +0000369 // PPC-LABEL: @mul_long_double_cc(
Chandler Carruth0c4b2302014-10-19 19:13:49 +0000370 // 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]]
Joerg Sonnenbergeraa3e9f52014-10-17 11:51:19 +0000381 // PPC: call {{.*}} @__multc3(
382 // PPC: ret
Chandler Carrutha216cad2014-10-11 00:57:18 +0000383 return a * b;
384}
385
386long 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}
393long 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}
401long double _Complex div_long_double_rc(long double a, long double _Complex b) {
402 // X86-LABEL: @div_long_double_rc(
403 // X86-NOT: fdiv
Chandler Carruth686de242014-10-11 09:24:41 +0000404 // X86: call {{.*}} @__divxc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000405 // X86: ret
Joerg Sonnenbergeraa3e9f52014-10-17 11:51:19 +0000406 // PPC-LABEL: @div_long_double_rc(
407 // PPC-NOT: fdiv
408 // PPC: call {{.*}} @__divtc3(
409 // PPC: ret
Chandler Carrutha216cad2014-10-11 00:57:18 +0000410 return a / b;
411}
412long 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
Chandler Carruth686de242014-10-11 09:24:41 +0000415 // X86: call {{.*}} @__divxc3(
Chandler Carrutha216cad2014-10-11 00:57:18 +0000416 // X86: ret
Joerg Sonnenbergeraa3e9f52014-10-17 11:51:19 +0000417 // PPC-LABEL: @div_long_double_cc(
418 // PPC-NOT: fdiv
419 // PPC: call {{.*}} @__divtc3(
420 // PPC: ret
Chandler Carrutha216cad2014-10-11 00:57:18 +0000421 return a / b;
422}
Chandler Carruthb29a7432014-10-11 11:03:30 +0000423
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}