|  | // RUN: %clang_cc1 -fexperimental-strict-floating-point -DEXCEPT=1 \ | 
|  | // RUN: -fcxx-exceptions -triple x86_64-linux-gnu -emit-llvm -o - %s \ | 
|  | // RUN: | FileCheck -check-prefix=CHECK-SRC %s | 
|  |  | 
|  | // RUN: %clang_cc1 -fexperimental-strict-floating-point \ | 
|  | // RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s -ffp-eval-method=source \ | 
|  | // RUN: | FileCheck -check-prefix=CHECK-SRC %s | 
|  |  | 
|  | // RUN: %clang_cc1 -fexperimental-strict-floating-point \ | 
|  | // RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s -ffp-eval-method=double \ | 
|  | // RUN: | FileCheck -check-prefixes=CHECK-DBL %s | 
|  |  | 
|  | // RUN: %clang_cc1 -fexperimental-strict-floating-point \ | 
|  | // RUN: -triple x86_64-linux-gnu -emit-llvm -o - %s -ffp-eval-method=extended \ | 
|  | // RUN: | FileCheck -check-prefixes=CHECK-EXT-FLT %s | 
|  |  | 
|  | // RUN: %clang_cc1 -triple powerpc-unknown-aix -emit-llvm -o - %s \ | 
|  | // RUN: | FileCheck %s -check-prefix=CHECK-DBL-PPC | 
|  |  | 
|  | // RUN: %clang_cc1 -fexperimental-strict-floating-point -triple i386-linux-gnu \ | 
|  | // RUN: -emit-llvm -o - %s -ffp-eval-method=extended -mlong-double-80 \ | 
|  | // RUN: | FileCheck %s -check-prefix=CHECK-EXT-FLT | 
|  |  | 
|  | int getFEM() { | 
|  | // LABEL: define {{.*}}getFEM{{.*}} | 
|  | return __FLT_EVAL_METHOD__; | 
|  | // CHECK-SRC: ret {{.*}} 0 | 
|  | // CHECK-DBL: ret {{.*}} 1 | 
|  | // CHECK-DBL-PPC: ret {{.*}} 1 | 
|  | // CHECK-EXT-FLT: ret {{.*}} 2 | 
|  | } | 
|  |  | 
|  | float func() { | 
|  | // LABEL: define {{.*}}@_Z4func{{.*}} | 
|  | float X = 100.0f; | 
|  | float Y = -45.3f; | 
|  | float Z = 393.78f; | 
|  | float temp; | 
|  | #if __FLT_EVAL_METHOD__ == 0 | 
|  | temp = X + Y + Z; | 
|  | #elif __FLT_EVAL_METHOD__ == 1 | 
|  | temp = X * Y * Z; | 
|  | #elif __FLT_EVAL_METHOD__ == 2 | 
|  | temp = X * Y - Z; | 
|  | #endif | 
|  | // CHECK-SRC: load float, ptr | 
|  | // CHECK-SRC: load float, ptr | 
|  | // CHECK-SRC: fadd float | 
|  | // CHECK-SRC: load float, ptr | 
|  | // CHECK-SRC: fadd float | 
|  |  | 
|  | // CHECK-DBL: load float, ptr | 
|  | // CHECK-DBL: fpext float | 
|  | // CHECK-DBL: load float, ptr | 
|  | // CHECK-DBL: fpext float | 
|  | // CHECK-DBL: fmul double | 
|  | // CHECK-DBL: load float, ptr | 
|  | // CHECK-DBL: fpext float | 
|  | // CHECK-DBL: fmul double | 
|  | // CHECK-DBL: fptrunc double | 
|  |  | 
|  | // CHECK-EXT-FLT: load float, ptr | 
|  | // CHECK-EXT-FLT: fpext float | 
|  | // CHECK-EXT-FLT: load float, ptr | 
|  | // CHECK-EXT-FLT: fpext float | 
|  | // CHECK-EXT-FLT: fmul x86_fp80 | 
|  | // CHECK-EXT-FLT: load float, ptr | 
|  | // CHECK-EXT-FLT: fpext float | 
|  | // CHECK-EXT-FLT: fsub x86_fp80 | 
|  | // CHECK-EXT-FLT: fptrunc x86_fp80 | 
|  |  | 
|  | // CHECK-DBL-PPC: load float, ptr | 
|  | // CHECK-DBL-PPC: load float, ptr | 
|  | // CHECK-DBL-PPC: fmul float | 
|  | // CHECK-DBL-PPC: load float, ptr | 
|  | // CHECK-DBL-PPC: fmul float | 
|  |  | 
|  | return temp; | 
|  | } |