| // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ |
| // RUN: -verify -complex-range=promoted -o - | FileCheck %s |
| |
| // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ |
| // RUN: -verify=nopromotion -complex-range=promoted -target-feature -x87 \ |
| // RUN: -o - | FileCheck %s --check-prefix=NOX87 |
| |
| // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-windows \ |
| // RUN: -verify=nopromotion -complex-range=promoted -o - \ |
| // RUN: | FileCheck %s --check-prefix=NOX87 |
| |
| // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-windows \ |
| // RUN: -verify=nopromotion -complex-range=promoted -target-feature -x87 \ |
| // RUN: -o - | FileCheck %s --check-prefix=NOX87 |
| |
| |
| |
| // expected-no-diagnostics |
| |
| // CHECK-LABEL: define dso_local <2 x float> @divd |
| _Complex float divd(_Complex float a, _Complex float b) { |
| // CHECK: fpext float {{.*}} to double |
| // CHECK: fpext float {{.*}} to double |
| // CHECK: fdiv double |
| // CHECK: fdiv double |
| // CHECK: fptrunc double {{.*}} to float |
| // CHECK: fptrunc double {{.*}} to float |
| |
| // NOX87: fpext float {{.*}} to double |
| // NOX87: fpext float {{.*}} to double |
| // NOX87: fdiv double |
| // NOX87: fdiv double |
| // NOX87: fptrunc double {{.*}} to float |
| // NOX87: fptrunc double {{.*}} to float |
| |
| return a / b; |
| } |
| |
| // CHECK-LABEL: define dso_local { double, double } @divf |
| _Complex double divf(_Complex double a, _Complex double b) { |
| // CHECK: fpext double {{.*}} to x86_fp80 |
| // CHECK: fpext double {{.*}} to x86_fp80 |
| // CHECK: fdiv x86_fp80 |
| // CHECK: fdiv x86_fp80 |
| // CHECK: fptrunc x86_fp80 |
| // CHECK: fptrunc x86_fp80 |
| |
| // NOX87: call double @llvm.fabs.f64(double {{.*}}) |
| // NOX87-NEXT: call double @llvm.fabs.f64(double {{.*}}) |
| // NOX87-NEXT: fcmp ugt double %{{.*}}, {{.*}} |
| // NOX87-NEXT: br i1 {{.*}}, label |
| // NOX87: abs_rhsr_greater_or_equal_abs_rhsi: |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fadd double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fadd double |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fsub double |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: br label {{.*}} |
| // NOX87: abs_rhsr_less_than_abs_rhsi: |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fadd double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fadd double |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: fmul double |
| // NOX87-NEXT: fsub double |
| // NOX87-NEXT: fdiv double |
| // NOX87-NEXT: br label |
| // NOX87: complex_div: |
| // NOX87-NEXT: phi double |
| // NOX87-NEXT: phi double |
| // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 0 |
| // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 1 |
| // NOX87-NEXT: store double |
| // NOX87-NEXT: store double |
| |
| return a / b; // nopromotion-warning{{excess precision is requested but the target does not support excess precision which may result in observable differences in complex division behavior}} |
| } |