From 148b923f71f3954ceaa37e7aff896d105bb7faa5 Mon Sep 17 00:00:00 2001 From: tevador Date: Wed, 6 May 2020 13:48:53 +0200 Subject: [PATCH] fix test 92 not failing properly on GCC/amd64 --- src/instructions_portable.cpp | 15 +++++++++++++++ src/intrin_portable.h | 6 ++++++ src/tests/tests.cpp | 6 +++--- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/instructions_portable.cpp b/src/instructions_portable.cpp index d1253d8..d746727 100644 --- a/src/instructions_portable.cpp +++ b/src/instructions_portable.cpp @@ -157,6 +157,21 @@ void rx_set_rounding_mode(uint32_t mode) { } } +uint32_t rx_get_rounding_mode() { + switch (fegetround()) { + case FE_DOWNWARD: + return RoundDown; + case FE_UPWARD: + return RoundUp; + case FE_TOWARDZERO: + return RoundToZero; + case FE_TONEAREST: + return RoundToNearest; + default: + UNREACHABLE; + } +} + #endif #ifdef RANDOMX_USE_X87 diff --git a/src/intrin_portable.h b/src/intrin_portable.h index c9d4475..05f6cd3 100644 --- a/src/intrin_portable.h +++ b/src/intrin_portable.h @@ -173,6 +173,10 @@ FORCE_INLINE void rx_set_rounding_mode(uint32_t mode) { _mm_setcsr(rx_mxcsr_default | (mode << 13)); } +FORCE_INLINE uint32_t rx_get_rounding_mode() { + return (_mm_getcsr() >> 13) & 3; +} + #elif defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__) //sadly only POWER7 and newer will be able to use SIMD acceleration. Earlier processors cant use doubles or 64 bit integers with SIMD #include #include @@ -736,6 +740,8 @@ void rx_reset_float_state(); void rx_set_rounding_mode(uint32_t mode); +uint32_t rx_get_rounding_mode(); + #endif double loadDoublePortable(const void* addr); diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index 82404d4..75daaba 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -4,7 +4,6 @@ #include #include -#include #include "utility.hpp" #include "../bytecode_machine.hpp" #include "../dataset.hpp" @@ -1076,10 +1075,11 @@ int main() { }); runTest("Preserve rounding mode", RANDOMX_FREQ_CFROUND > 0, []() { - fesetround(FE_TONEAREST); + rx_set_rounding_mode(RoundToNearest); char hash[RANDOMX_HASH_SIZE]; calcStringHash("test key 000", "Lorem ipsum dolor sit amet", &hash); - assert(fegetround() == FE_TONEAREST); + assert(equalsHex(hash, "300a0adb47603dedb42228ccb2b211104f4da45af709cd7547cd049e9489c969")); + assert(rx_get_rounding_mode() == RoundToNearest); }); randomx_destroy_vm(vm);