comparison clang/test/CodeGen/complex-math.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 0572611fdcc8
children c4bab56944e8
comparison
equal deleted inserted replaced
173:0572611fdcc8 207:2e18cbf3894f
3 // RUN: %clang_cc1 %s -O0 -fno-experimental-new-pass-manager -emit-llvm -triple i686-unknown-unknown -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 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 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 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 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 -o - | FileCheck %s --check-prefix=AARCH64-FASTMATH 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
9 10
10 float _Complex add_float_rr(float a, float b) { 11 float _Complex add_float_rr(float a, float b) {
11 // X86-LABEL: @add_float_rr( 12 // X86-LABEL: @add_float_rr(
12 // X86: fadd 13 // X86: fadd
13 // X86-NOT: fadd 14 // X86-NOT: fadd
105 // X86-DAG: %[[BC]] 106 // X86-DAG: %[[BC]]
106 // X86: fcmp uno float %[[RR]] 107 // X86: fcmp uno float %[[RR]]
107 // X86: fcmp uno float %[[RI]] 108 // X86: fcmp uno float %[[RI]]
108 // X86: call {{.*}} @__mulsc3( 109 // X86: call {{.*}} @__mulsc3(
109 // X86: ret 110 // X86: ret
111 // SPIR: call spir_func {{.*}} @__mulsc3(
110 return a * b; 112 return a * b;
111 } 113 }
112 114
113 float _Complex div_float_rr(float a, float b) { 115 float _Complex div_float_rr(float a, float b) {
114 // X86-LABEL: @div_float_rr( 116 // X86-LABEL: @div_float_rr(
128 float _Complex div_float_rc(float a, float _Complex b) { 130 float _Complex div_float_rc(float a, float _Complex b) {
129 // X86-LABEL: @div_float_rc( 131 // X86-LABEL: @div_float_rc(
130 // X86-NOT: fdiv 132 // X86-NOT: fdiv
131 // X86: call {{.*}} @__divsc3( 133 // X86: call {{.*}} @__divsc3(
132 // X86: ret 134 // X86: ret
135
136 // SPIR: call spir_func {{.*}} @__divsc3(
133 137
134 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 138 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
135 // AARCH64-FASTMATH-LABEL: @div_float_rc(float %a, [2 x float] %b.coerce) 139 // AARCH64-FASTMATH-LABEL: @div_float_rc(float %a, [2 x float] %b.coerce)
136 // A = a 140 // A = a
137 // B = 0 141 // B = 0
155 float _Complex div_float_cc(float _Complex a, float _Complex b) { 159 float _Complex div_float_cc(float _Complex a, float _Complex b) {
156 // X86-LABEL: @div_float_cc( 160 // X86-LABEL: @div_float_cc(
157 // X86-NOT: fdiv 161 // X86-NOT: fdiv
158 // X86: call {{.*}} @__divsc3( 162 // X86: call {{.*}} @__divsc3(
159 // X86: ret 163 // X86: ret
164
165 // SPIR: call spir_func {{.*}} @__divsc3(
160 166
161 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 167 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
162 // AARCH64-FASTMATH-LABEL: @div_float_cc([2 x float] %a.coerce, [2 x float] %b.coerce) 168 // AARCH64-FASTMATH-LABEL: @div_float_cc([2 x float] %a.coerce, [2 x float] %b.coerce)
163 // 169 //
164 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast float 170 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast float
276 // X86-DAG: %[[BC]] 282 // X86-DAG: %[[BC]]
277 // X86: fcmp uno double %[[RR]] 283 // X86: fcmp uno double %[[RR]]
278 // X86: fcmp uno double %[[RI]] 284 // X86: fcmp uno double %[[RI]]
279 // X86: call {{.*}} @__muldc3( 285 // X86: call {{.*}} @__muldc3(
280 // X86: ret 286 // X86: ret
287
288 // SPIR: call spir_func {{.*}} @__muldc3(
281 return a * b; 289 return a * b;
282 } 290 }
283 291
284 double _Complex div_double_rr(double a, double b) { 292 double _Complex div_double_rr(double a, double b) {
285 // X86-LABEL: @div_double_rr( 293 // X86-LABEL: @div_double_rr(
299 double _Complex div_double_rc(double a, double _Complex b) { 307 double _Complex div_double_rc(double a, double _Complex b) {
300 // X86-LABEL: @div_double_rc( 308 // X86-LABEL: @div_double_rc(
301 // X86-NOT: fdiv 309 // X86-NOT: fdiv
302 // X86: call {{.*}} @__divdc3( 310 // X86: call {{.*}} @__divdc3(
303 // X86: ret 311 // X86: ret
312
313 // SPIR: call spir_func {{.*}} @__divdc3(
304 314
305 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 315 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
306 // AARCH64-FASTMATH-LABEL: @div_double_rc(double %a, [2 x double] %b.coerce) 316 // AARCH64-FASTMATH-LABEL: @div_double_rc(double %a, [2 x double] %b.coerce)
307 // A = a 317 // A = a
308 // B = 0 318 // B = 0
326 double _Complex div_double_cc(double _Complex a, double _Complex b) { 336 double _Complex div_double_cc(double _Complex a, double _Complex b) {
327 // X86-LABEL: @div_double_cc( 337 // X86-LABEL: @div_double_cc(
328 // X86-NOT: fdiv 338 // X86-NOT: fdiv
329 // X86: call {{.*}} @__divdc3( 339 // X86: call {{.*}} @__divdc3(
330 // X86: ret 340 // X86: ret
341
342 // SPIR: call spir_func {{.*}} @__divdc3(
331 343
332 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 344 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
333 // AARCH64-FASTMATH-LABEL: @div_double_cc([2 x double] %a.coerce, [2 x double] %b.coerce) 345 // AARCH64-FASTMATH-LABEL: @div_double_cc([2 x double] %a.coerce, [2 x double] %b.coerce)
334 // 346 //
335 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast double 347 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast double
461 // PPC-DAG: %[[BC]] 473 // PPC-DAG: %[[BC]]
462 // PPC: fcmp uno ppc_fp128 %[[RR]] 474 // PPC: fcmp uno ppc_fp128 %[[RR]]
463 // PPC: fcmp uno ppc_fp128 %[[RI]] 475 // PPC: fcmp uno ppc_fp128 %[[RI]]
464 // PPC: call {{.*}} @__multc3( 476 // PPC: call {{.*}} @__multc3(
465 // PPC: ret 477 // PPC: ret
478 // SPIR: call spir_func {{.*}} @__muldc3(
466 return a * b; 479 return a * b;
467 } 480 }
468 481
469 long double _Complex div_long_double_rr(long double a, long double b) { 482 long double _Complex div_long_double_rr(long double a, long double b) {
470 // X86-LABEL: @div_long_double_rr( 483 // X86-LABEL: @div_long_double_rr(
488 // X86: ret 501 // X86: ret
489 // PPC-LABEL: @div_long_double_rc( 502 // PPC-LABEL: @div_long_double_rc(
490 // PPC-NOT: fdiv 503 // PPC-NOT: fdiv
491 // PPC: call {{.*}} @__divtc3( 504 // PPC: call {{.*}} @__divtc3(
492 // PPC: ret 505 // PPC: ret
506 // SPIR: call spir_func {{.*}} @__divdc3(
493 507
494 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 508 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
495 // AARCH64-FASTMATH-LABEL: @div_long_double_rc(fp128 %a, [2 x fp128] %b.coerce) 509 // AARCH64-FASTMATH-LABEL: @div_long_double_rc(fp128 %a, [2 x fp128] %b.coerce)
496 // A = a 510 // A = a
497 // B = 0 511 // B = 0
519 // X86: ret 533 // X86: ret
520 // PPC-LABEL: @div_long_double_cc( 534 // PPC-LABEL: @div_long_double_cc(
521 // PPC-NOT: fdiv 535 // PPC-NOT: fdiv
522 // PPC: call {{.*}} @__divtc3( 536 // PPC: call {{.*}} @__divtc3(
523 // PPC: ret 537 // PPC: ret
538 // SPIR: call spir_func {{.*}} @__divdc3(
524 539
525 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD)) 540 // a / b = (A+iB) / (C+iD) = ((AC+BD)/(CC+DD)) + i((BC-AD)/(CC+DD))
526 // AARCH64-FASTMATH-LABEL: @div_long_double_cc([2 x fp128] %a.coerce, [2 x fp128] %b.coerce) 541 // AARCH64-FASTMATH-LABEL: @div_long_double_cc([2 x fp128] %a.coerce, [2 x fp128] %b.coerce)
527 // 542 //
528 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast fp128 543 // AARCH64-FASTMATH: [[AC:%.*]] = fmul fast fp128
601 // use the base AAPCS. 616 // use the base AAPCS.
602 617
603 // ARM-LABEL: @foo( 618 // ARM-LABEL: @foo(
604 // ARM: call void @__muldc3 619 // ARM: call void @__muldc3
605 620
621 // SPIR: call spir_func void @__muldc3
622
606 // ARMHF-LABEL: @foo( 623 // ARMHF-LABEL: @foo(
607 // ARMHF: call { double, double } @__muldc3 624 // ARMHF: call { double, double } @__muldc3
608 625
609 // ARM7K-LABEL: @foo( 626 // ARM7K-LABEL: @foo(
610 // ARM7K: call { double, double } @__muldc3 627 // ARM7K: call { double, double } @__muldc3