72 lines · cpp
1// RUN: %clang_cc1 -emit-llvm -triple i386-linux -std=c++2a -Wno-unknown-pragmas %s -o - | FileCheck %s2// RUN: %clang_cc1 -emit-llvm -triple i386-linux -fexperimental-new-constant-interpreter -std=c++2a -Wno-unknown-pragmas %s -o - | FileCheck %s3 4 5#pragma STDC FENV_ROUND FE_UPWARD6 7float F1u = 1.0F + 0x0.000002p0F;8float F2u = 1.0F + 0x0.000001p0F;9float F3u = 0x1.000001p0;10// CHECK: @F1u = {{.*}} float 0x3FF000002000000011// CHECK: @F2u = {{.*}} float 0x3FF000002000000012// CHECK: @F3u = {{.*}} float 0x3FF000002000000013 14float FI1u = 0xFFFFFFFFU;15// CHECK: @FI1u = {{.*}} float 0x41F000000000000016 17#pragma STDC FENV_ROUND FE_DOWNWARD18 19float F1d = 1.0F + 0x0.000002p0F;20float F2d = 1.0F + 0x0.000001p0F;21float F3d = 0x1.000001p0;22 23// CHECK: @F1d = {{.*}} float 0x3FF000002000000024// CHECK: @F2d = {{.*}} float 1.000000e+0025// CHECK: @F3d = {{.*}} float 1.000000e+0026 27 28float FI1d = 0xFFFFFFFFU;29// CHECK: @FI1d = {{.*}} float 0x41EFFFFFE000000030 31// nextUp(1.F) == 0x1.000002p0F32 33constexpr float add_round_down(float x, float y) {34 #pragma STDC FENV_ROUND FE_DOWNWARD35 float res = x;36 res = res + y;37 return res;38}39 40constexpr float add_round_up(float x, float y) {41 #pragma STDC FENV_ROUND FE_UPWARD42 float res = x;43 res = res + y;44 return res;45}46 47float V1 = add_round_down(1.0F, 0x0.000001p0F);48float V2 = add_round_up(1.0F, 0x0.000001p0F);49// CHECK: @V1 = {{.*}} float 1.000000e+0050// CHECK: @V2 = {{.*}} float 0x3FF000002000000051 52 53constexpr float add_cast_round_down(float x, double y) {54 #pragma STDC FENV_ROUND FE_DOWNWARD55 float res = x;56 res += y;57 return res;58}59 60constexpr float add_cast_round_up(float x, double y) {61 #pragma STDC FENV_ROUND FE_UPWARD62 float res = x;63 res += y;64 return res;65}66 67float V3 = add_cast_round_down(1.0F, 0x0.000001p0F);68float V4 = add_cast_round_up(1.0F, 0x0.000001p0F);69 70// CHECK: @V3 = {{.*}} float 1.000000e+0071// CHECK: @V4 = {{.*}} float 0x3FF000002000000072