summaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2018-11-29 23:33:40 +0000
committerRich Felker <dalias@aerifal.cx>2019-04-17 13:12:08 -0400
commit3c3763fc529114e209aea08336a420c5d5be4dc2 (patch)
tree6ab36f16fb49fa0b92c433b5a9fe080237326f1a /src/internal
parent4f8acf953ccf1a978a3378db7fb1e8d5a7afbca1 (diff)
downloadmusl-3c3763fc529114e209aea08336a420c5d5be4dc2.tar.gz
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%.
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/libm.h9
1 files changed, 9 insertions, 0 deletions
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