Module Name: src Committed By: riastradh Date: Sun Nov 5 15:28:17 UTC 2023
Modified Files: src/tests/lib/libm: t_fenv.c Log Message: t_fenv: Check FLT_ROUNDS whenever we touch the rounding mode. PR port-mips/57680 XXX pullup-10 To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/tests/lib/libm/t_fenv.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libm/t_fenv.c diff -u src/tests/lib/libm/t_fenv.c:1.7 src/tests/lib/libm/t_fenv.c:1.8 --- src/tests/lib/libm/t_fenv.c:1.7 Sun Nov 5 15:27:40 2023 +++ src/tests/lib/libm/t_fenv.c Sun Nov 5 15:28:17 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: t_fenv.c,v 1.7 2023/11/05 15:27:40 riastradh Exp $ */ +/* $NetBSD: t_fenv.c,v 1.8 2023/11/05 15:28:17 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -29,13 +29,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_fenv.c,v 1.7 2023/11/05 15:27:40 riastradh Exp $"); +__RCSID("$NetBSD: t_fenv.c,v 1.8 2023/11/05 15:28:17 riastradh Exp $"); #include <atf-c.h> #include <fenv.h> #ifdef __HAVE_FENV +#include <float.h> #include <ieeefp.h> #include <stdlib.h> @@ -67,6 +68,39 @@ __RCSID("$NetBSD: t_fenv.c,v 1.7 2023/11 #endif +static int +feround_to_fltrounds(int feround) +{ + + /* + * C99, Sec. 5.2.4.2.2 Characteristics of floating types + * <float.h>, p. 24, clause 7 + */ + switch (feround) { + case FE_TOWARDZERO: + return 0; + case FE_TONEAREST: + return 1; + case FE_UPWARD: + return 2; + case FE_DOWNWARD: + return 3; + default: + return -1; + } +} + +static void +checkfltrounds(void) +{ + int feround = fegetround(); + int expected = feround_to_fltrounds(feround); + + ATF_CHECK_EQ_MSG(FLT_ROUNDS, expected, + "FLT_ROUNDS=%d expected=%d fegetround()=%d", + FLT_ROUNDS, expected, feround); +} + ATF_TC(fegetround); ATF_TC_HEAD(fegetround, tc) @@ -84,18 +118,25 @@ ATF_TC_BODY(fegetround, tc) ATF_CHECK_EQ_MSG(fegetround(), FE_TOWARDZERO, "fegetround()=%d FE_TOWARDZERO=%d", fegetround(), FE_TOWARDZERO); + checkfltrounds(); + fpsetround(FP_RM); ATF_CHECK_EQ_MSG(fegetround(), FE_DOWNWARD, "fegetround()=%d FE_DOWNWARD=%d", fegetround(), FE_DOWNWARD); + checkfltrounds(); + fpsetround(FP_RN); ATF_CHECK_EQ_MSG(fegetround(), FE_TONEAREST, "fegetround()=%d FE_TONEAREST=%d", fegetround(), FE_TONEAREST); + checkfltrounds(); + fpsetround(FP_RP); ATF_CHECK_EQ_MSG(fegetround(), FE_UPWARD, "fegetround()=%d FE_UPWARD=%d", fegetround(), FE_UPWARD); + checkfltrounds(); } ATF_TC(fesetround); @@ -115,18 +156,25 @@ ATF_TC_BODY(fesetround, tc) ATF_CHECK_EQ_MSG(fpgetround(), FP_RZ, "fpgetround()=%d FP_RZ=%d", (int)fpgetround(), (int)FP_RZ); + checkfltrounds(); + fesetround(FE_DOWNWARD); ATF_CHECK_EQ_MSG(fpgetround(), FP_RM, "fpgetround()=%d FP_RM=%d", (int)fpgetround(), (int)FP_RM); + checkfltrounds(); + fesetround(FE_TONEAREST); ATF_CHECK_EQ_MSG(fpgetround(), FP_RN, "fpgetround()=%d FP_RN=%d", (int)fpgetround(), (int)FP_RN); + checkfltrounds(); + fesetround(FE_UPWARD); ATF_CHECK_EQ_MSG(fpgetround(), FP_RP, "fpgetround()=%d FP_RP=%d", (int)fpgetround(), (int)FP_RP); + checkfltrounds(); } ATF_TC(fegetexcept);