ATF_TC_BODY(fpsetround_basic, tc) { #ifndef _FLOAT_IEEE754 atf_tc_skip("Test not applicable on this architecture."); #else int r; ATF_CHECK_EQ(r = fpgetround(), FP_RN); if (FP_RN != r) fprintf(stderr, "default expected=%s got=%s\n", getname(FP_RN), getname(r)); ATF_CHECK_EQ(FLT_ROUNDS, 1); for (size_t i = 0; i < __arraycount(rnd); i++) { const size_t j = (i + 1) & 3; const int o = rnd[i].rm; const int n = rnd[j].rm; ATF_CHECK_EQ(r = fpsetround(n), o); if (o != r) fprintf(stderr, "set %s expected=%s got=%s\n", getname(n), getname(o), getname(r)); ATF_CHECK_EQ(r = fpgetround(), n); if (n != r) fprintf(stderr, "get expected=%s got=%s\n", getname(n), getname(r)); ATF_CHECK_EQ(r = FLT_ROUNDS, rnd[j].rf); if (r != rnd[j].rf) fprintf(stderr, "rounds expected=%x got=%x\n", rnd[j].rf, r); test(r); } #endif /* _FLOAT_IEEE754 */ }
int test_settings(void) { int failures = 0; fp_except mask_orig; printf("Testing settings on the chip... "); fflush(stdout); fpsetround(FP_RM); if(fpgetround() != FP_RM) FAIL_TEST; fpsetround(FP_RP); if(fpgetround() != FP_RP) FAIL_TEST; fpsetround(FP_RZ); if(fpgetround() != FP_RZ) FAIL_TEST; fpsetround(FP_RN); if(fpgetround() != FP_RN) FAIL_TEST; fpsetsticky(FP_X_INV | FP_X_DZ | FP_X_IMP); if(fpgetsticky() != (FP_X_INV | FP_X_DZ | FP_X_IMP)) FAIL_TEST; fpsetsticky(FP_X_OFL | FP_X_IMP); if(fpgetsticky() != (FP_X_OFL | FP_X_IMP)) FAIL_TEST; fpsetsticky(FP_X_UFL | FP_X_DZ); if(fpgetsticky() != (FP_X_UFL | FP_X_DZ)) FAIL_TEST; fpsetsticky(0); if(fpgetsticky() != 0) FAIL_TEST; mask_orig = fpsetmask(FP_X_INV | FP_X_DZ); if(fpgetmask() != (FP_X_INV | FP_X_DZ)) FAIL_TEST; fpsetmask(FP_X_OFL | FP_X_IMP); if(fpgetmask() != (FP_X_OFL | FP_X_IMP)) FAIL_TEST; fpsetmask(FP_X_UFL | FP_X_DZ | FP_X_INV); if(fpgetmask() != (FP_X_UFL | FP_X_DZ | FP_X_INV)) FAIL_TEST; fpsetmask(mask_orig); if(fpgetmask() != mask_orig) FAIL_TEST; #ifdef __CYGWIN__ fpsetprecision(FP_PC_SGL); if(fpgetprecision() != FP_PC_SGL) FAIL_TEST; fpsetprecision(FP_PC_DBL); if(fpgetprecision() != FP_PC_DBL) FAIL_TEST; fpsetprecision(FP_PC_EXT); if(fpgetprecision() != FP_PC_EXT) FAIL_TEST; #endif if(failures == 0) { printf(" PASSED\n"); return 0; } else { printf(" %d failures\n", failures); return 1; } }
int os_get_rounding_mode(void) { assert(FP_RN == 0); assert(FP_RZ == 1); assert(FP_RP == 2); assert(FP_RM == 3); return fpgetround(); }
/* * The fegetround() function shall get the current rounding direction. */ int fegetround(void) { #ifdef __SOFTFP__ return fpgetround(); #else return __SHIFTOUT(armreg_fpscr_read(), VFP_FPSCR_RMODE); #endif }
// Older FreeBSD. Cygwin has the ieeefp.h header but not the functions! static int getrounding(TaskData *) { switch (fpgetround()) { case FP_RN: return POLY_ROUND_TONEAREST; case FP_RM: return POLY_ROUND_DOWNWARD; case FP_RP: return POLY_ROUND_UPWARD; case FP_RZ: return POLY_ROUND_TOZERO; default: return 0; /* Shouldn't happen. */ } }
/* * The fegetenv() function shall attempt to store the current floating-point * environment in the object pointed to by envp. */ int fegetenv(fenv_t *envp) { #ifdef __SOFTFP__ *envp = __SHIFTIN(fpgetround(), VFP_FPSCR_RMODE) | __SHIFTIN(fpgetmask(), VFP_FPSCR_ESUM) | __SHIFTIN(fpgetsticky(), VFP_FPSCR_CSUM); #else *envp = armreg_fpscr_read(); #endif return 0; }
ptr_t getfc(cerr er) { fp_rnd mode = fpgetround(); int r; switch(mode){ case FP_RZ: r = TO_ZERO; break; case FP_RN: r = TO_NEAREST; break; case FP_RP: r = TO_POSINF; break; case FP_RM: r = TO_NEGINF; break; default: send_errmsg(er,Eround); } return alloc_intint((val_t)r, (val_t)DOUBLE); }
/* * The feholdexcept() function shall save the current floating-point * environment in the object pointed to by envp, clear the floating-point * status flags, and then install a non-stop (continue on floating-point * exceptions) mode, if available, for all floating-point exceptions. */ int feholdexcept(fenv_t *envp) { #ifdef __SOFTFP__ *envp = __SHIFTIN(fpgetround(), VFP_FPSCR_RMODE) | __SHIFTIN(fpgetmask(), VFP_FPSCR_ESUM) | __SHIFTIN(fpgetsticky(), VFP_FPSCR_CSUM); fpsetmask(0); fpsetsticky(0); #else *envp = armreg_fpscr_read(); armreg_fpscr_write((*envp) & ~(VFP_FPSCR_ESUM|VFP_FPSCR_CSUM)); #endif return 0; }
FPEnvironmentImpl::FPEnvironmentImpl() { _rnd = fpgetround(); _exc = fpgetmask(); }
FPEnvironmentImpl::RoundingModeImpl FPEnvironmentImpl::getRoundingModeImpl() { return (FPEnvironmentImpl::RoundingModeImpl) fpgetround(); }