>From ae939d0b35714a3934f27a6be9897e07af8c22e6 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Thu, 29 Nov 2018 23:33:40 +0000 Subject: [PATCH 09/18] math: add macros for static branch prediction hints These don't have an effectw with -Os so not useful with default settings other than documenting the expectation. With --enable-optimize=internal,malloc,string,math the libc.so code size increases by 18K on x86_64 and performance varies in -2% .. +10%. --- src/internal/libm.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/internal/libm.h b/src/internal/libm.h index 62da4bdb..28537603 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -59,6 +59,15 @@ union ldshape { #error Unsupported long double representation #endif +/* Helps static branch prediction so hot path can be better optimized. */ +#ifdef __GNUC__ +#define predict_true(x) __builtin_expect(!!(x), 1) +#define predict_false(x) __builtin_expect(x, 0) +#else +#define predict_true(x) (x) +#define predict_false(x) (x) +#endif + /* Evaluate an expression as the specified type. With standard excess precision handling a type cast or assignment is enough (with -ffloat-store an assignment is required, in old compilers argument -- 2.19.1