1*a07aba5dSTimm Baeder // RUN: %clang_cc1 -emit-llvm -triple i386-linux -std=c++2a -Wno-unknown-pragmas %s -o - | FileCheck %s 2*a07aba5dSTimm Baeder // RUN: %clang_cc1 -emit-llvm -triple i386-linux -fexperimental-new-constant-interpreter -std=c++2a -Wno-unknown-pragmas %s -o - | FileCheck %s 3*a07aba5dSTimm Baeder 4*a07aba5dSTimm Baeder 5*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_UPWARD 6*a07aba5dSTimm Baeder 7*a07aba5dSTimm Baeder float F1u = 1.0F + 0x0.000002p0F; 8*a07aba5dSTimm Baeder float F2u = 1.0F + 0x0.000001p0F; 9*a07aba5dSTimm Baeder float F3u = 0x1.000001p0; 10*a07aba5dSTimm Baeder // CHECK: @F1u = {{.*}} float 0x3FF0000020000000 11*a07aba5dSTimm Baeder // CHECK: @F2u = {{.*}} float 0x3FF0000020000000 12*a07aba5dSTimm Baeder // CHECK: @F3u = {{.*}} float 0x3FF0000020000000 13*a07aba5dSTimm Baeder 14*a07aba5dSTimm Baeder float FI1u = 0xFFFFFFFFU; 15*a07aba5dSTimm Baeder // CHECK: @FI1u = {{.*}} float 0x41F0000000000000 16*a07aba5dSTimm Baeder 17*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_DOWNWARD 18*a07aba5dSTimm Baeder 19*a07aba5dSTimm Baeder float F1d = 1.0F + 0x0.000002p0F; 20*a07aba5dSTimm Baeder float F2d = 1.0F + 0x0.000001p0F; 21*a07aba5dSTimm Baeder float F3d = 0x1.000001p0; 22*a07aba5dSTimm Baeder 23*a07aba5dSTimm Baeder // CHECK: @F1d = {{.*}} float 0x3FF0000020000000 24*a07aba5dSTimm Baeder // CHECK: @F2d = {{.*}} float 1.000000e+00 25*a07aba5dSTimm Baeder // CHECK: @F3d = {{.*}} float 1.000000e+00 26*a07aba5dSTimm Baeder 27*a07aba5dSTimm Baeder 28*a07aba5dSTimm Baeder float FI1d = 0xFFFFFFFFU; 29*a07aba5dSTimm Baeder // CHECK: @FI1d = {{.*}} float 0x41EFFFFFE0000000 30*a07aba5dSTimm Baeder 31*a07aba5dSTimm Baeder // nextUp(1.F) == 0x1.000002p0F 32*a07aba5dSTimm Baeder 33*a07aba5dSTimm Baeder constexpr float add_round_down(float x, float y) { 34*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_DOWNWARD 35*a07aba5dSTimm Baeder float res = x; 36*a07aba5dSTimm Baeder res = res + y; 37*a07aba5dSTimm Baeder return res; 38*a07aba5dSTimm Baeder } 39*a07aba5dSTimm Baeder 40*a07aba5dSTimm Baeder constexpr float add_round_up(float x, float y) { 41*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_UPWARD 42*a07aba5dSTimm Baeder float res = x; 43*a07aba5dSTimm Baeder res = res + y; 44*a07aba5dSTimm Baeder return res; 45*a07aba5dSTimm Baeder } 46*a07aba5dSTimm Baeder 47*a07aba5dSTimm Baeder float V1 = add_round_down(1.0F, 0x0.000001p0F); 48*a07aba5dSTimm Baeder float V2 = add_round_up(1.0F, 0x0.000001p0F); 49*a07aba5dSTimm Baeder // CHECK: @V1 = {{.*}} float 1.000000e+00 50*a07aba5dSTimm Baeder // CHECK: @V2 = {{.*}} float 0x3FF0000020000000 51*a07aba5dSTimm Baeder 52*a07aba5dSTimm Baeder 53*a07aba5dSTimm Baeder constexpr float add_cast_round_down(float x, double y) { 54*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_DOWNWARD 55*a07aba5dSTimm Baeder float res = x; 56*a07aba5dSTimm Baeder res += y; 57*a07aba5dSTimm Baeder return res; 58*a07aba5dSTimm Baeder } 59*a07aba5dSTimm Baeder 60*a07aba5dSTimm Baeder constexpr float add_cast_round_up(float x, double y) { 61*a07aba5dSTimm Baeder #pragma STDC FENV_ROUND FE_UPWARD 62*a07aba5dSTimm Baeder float res = x; 63*a07aba5dSTimm Baeder res += y; 64*a07aba5dSTimm Baeder return res; 65*a07aba5dSTimm Baeder } 66*a07aba5dSTimm Baeder 67*a07aba5dSTimm Baeder float V3 = add_cast_round_down(1.0F, 0x0.000001p0F); 68*a07aba5dSTimm Baeder float V4 = add_cast_round_up(1.0F, 0x0.000001p0F); 69*a07aba5dSTimm Baeder 70*a07aba5dSTimm Baeder // CHECK: @V3 = {{.*}} float 1.000000e+00 71*a07aba5dSTimm Baeder // CHECK: @V4 = {{.*}} float 0x3FF0000020000000 72