>From d5d1d9670df51c237280f7fdb32f92df0aba47ed Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sat, 27 Apr 2019 16:21:31 +0000 Subject: [PATCH 1/3] math: keep excess precision in fp_barrier --- arch/aarch64/fp_arch.h | 6 ++++-- src/internal/libm.h | 14 +++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/arch/aarch64/fp_arch.h b/arch/aarch64/fp_arch.h index f3d445b9..e4c4c868 100644 --- a/arch/aarch64/fp_arch.h +++ b/arch/aarch64/fp_arch.h @@ -1,12 +1,14 @@ +#include + #define fp_barrierf fp_barrierf -static inline float fp_barrierf(float x) +static inline float_t fp_barrierf(float_t x) { __asm__ __volatile__ ("" : "+w"(x)); return x; } #define fp_barrier fp_barrier -static inline double fp_barrier(double x) +static inline double_t fp_barrier(double_t x) { __asm__ __volatile__ ("" : "+w"(x)); return x; diff --git a/src/internal/libm.h b/src/internal/libm.h index b5bd26b8..f77dfa4d 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -113,24 +113,24 @@ static inline double eval_as_double(double x) return y; } -/* fp_barrier returns its input, but limits code transformations - as if it had a side-effect (e.g. observable io) and returned - an arbitrary value. */ +/* fp_barrier returns its input (without dropping excess precision), + but limits code transformations as if it had a side-effect + (e.g. observable io) and returned an arbitrary value. */ #ifndef fp_barrierf #define fp_barrierf fp_barrierf -static inline float fp_barrierf(float x) +static inline float fp_barrierf(float_t x) { - volatile float y = x; + volatile float_t y = x; return y; } #endif #ifndef fp_barrier #define fp_barrier fp_barrier -static inline double fp_barrier(double x) +static inline double_t fp_barrier(double_t x) { - volatile double y = x; + volatile double_t y = x; return y; } #endif -- 2.21.0