libzahl

big integer library
git clone git://git.suckless.org/libzahl
Log | Files | Refs | README | LICENSE

commit f345412eb653cf7079996ad2c371def814f410b6
parent 4bba6e7176632b4d760ba9362a1515552471d741
Author: Mattias Andrée <maandree@kth.se>
Date:   Fri, 29 Apr 2016 22:08:39 +0200

Specify optimisation level on functions in zahl-inlines.h

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Msrc/internals.h | 32+++++++-------------------------
Mzahl-inlines.h | 26+++++++++++++-------------
Mzahl-internals.h | 31+++++++++++++++++++++++++++++--
3 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/src/internals.h b/src/internals.h @@ -18,31 +18,13 @@ #define BITS_IN_LAST_CHAR(bits) ZAHL_BITS_IN_LAST_CHAR(bits) #define TRUNCATE_TO_CHAR(bits) ZAHL_TRUNCATE_TO_CHAR(bits) -#if defined(__GNUC__) -# define O0 __attribute__((optimize("O0"))) -# define O1 __attribute__((optimize("O1"))) -# define O2 __attribute__((optimize("O2"))) -# define O3 __attribute__((optimize("O3"))) -# define Ofast __attribute__((optimize("Ofast"))) -# define Os __attribute__((optimize("Os"))) -# define Oz __attribute__((optimize("Os"))) -#elif defined(__clang__) -# define O0 __attribute__((optnone)) -# define O1 /* Don't know how. */ -# define O2 /* Don't know how. */ -# define O3 /* Don't know how. */ -# define Ofast /* Don't know how. */ -# define Os /* Don't know how. */ -# define Oz /* Don't know how. */ -#else -# define O0 /* Don't know how. */ -# define O1 /* Don't know how. */ -# define O2 /* Don't know how. */ -# define O3 /* Don't know how. */ -# define Ofast /* Don't know how. */ -# define Os /* Don't know how. */ -# define Oz /* Don't know how. */ -#endif +#define O0 ZAHL_O0 +#define O1 ZAHL_O1 +#define O2 ZAHL_O2 +#define O3 ZAHL_O3 +#define Ofast ZAHL_Ofast +#define Os ZAHL_Os +#define Oz ZAHL_Oz #define LIST_TEMPS\ X(libzahl_tmp_cmp, 1)\ diff --git a/zahl-inlines.h b/zahl-inlines.h @@ -11,7 +11,7 @@ ZAHL_INLINE void zabs(z_t a, z_t b) { ZAHL_SET(a, b); a->sign = !!a->sign; } ZAHL_INLINE void zneg(z_t a, z_t b) { ZAHL_SET(a, b); a->sign = -a->sign; } -ZAHL_INLINE void +ZAHL_INLINE ZAHL_O3 void zswap(z_t a, z_t b) { /* Almost three times faster than the naïve method. */ @@ -23,7 +23,7 @@ zswap(z_t a, z_t b) } -ZAHL_INLINE void +ZAHL_INLINE ZAHL_O3 void zseti(z_t a, int64_t b) { if (ZAHL_UNLIKELY(b >= 0)) { @@ -35,7 +35,7 @@ zseti(z_t a, int64_t b) } -ZAHL_INLINE void +ZAHL_INLINE ZAHL_O3 void zsetu(z_t a, uint64_t b) { if (!b) { @@ -49,7 +49,7 @@ zsetu(z_t a, uint64_t b) } -ZAHL_INLINE size_t +ZAHL_INLINE ZAHL_O3 size_t zlsb(z_t a) { size_t i = 0; @@ -62,7 +62,7 @@ zlsb(z_t a) } -ZAHL_INLINE size_t +ZAHL_INLINE ZAHL_O3 size_t zbits(z_t a) { size_t rc; @@ -75,7 +75,7 @@ zbits(z_t a) } -ZAHL_INLINE int +ZAHL_INLINE ZAHL_O3 int zcmpmag(z_t a, z_t b) { size_t i, j; @@ -103,7 +103,7 @@ zcmpmag(z_t a, z_t b) } -ZAHL_INLINE int +ZAHL_INLINE ZAHL_O3 int zcmp(z_t a, z_t b) { if (zsignum(a) != zsignum(b)) @@ -112,7 +112,7 @@ zcmp(z_t a, z_t b) } -ZAHL_INLINE int +ZAHL_INLINE ZAHL_O3 int zcmpu(z_t a, uint64_t b) { extern z_t libzahl_tmp_cmp; @@ -125,7 +125,7 @@ zcmpu(z_t a, uint64_t b) } -ZAHL_INLINE int +ZAHL_INLINE ZAHL_O3 int zcmpi(z_t a, int64_t b) { extern z_t libzahl_tmp_cmp; @@ -147,7 +147,7 @@ zcmpi(z_t a, int64_t b) } -ZAHL_INLINE void +ZAHL_INLINE ZAHL_O3 void zbset(z_t a, z_t b, size_t bit, int action) { if (ZAHL_UNLIKELY(a != b)) @@ -185,7 +185,7 @@ fallback: } -ZAHL_INLINE int +ZAHL_INLINE ZAHL_O3 int zbtest(z_t a, size_t bit) { size_t chars; @@ -201,7 +201,7 @@ zbtest(z_t a, size_t bit) } -ZAHL_INLINE void +ZAHL_INLINE ZAHL_O3 void zsplit(z_t high, z_t low, z_t a, size_t delim) { if (ZAHL_UNLIKELY(high == a)) { @@ -214,7 +214,7 @@ zsplit(z_t high, z_t low, z_t a, size_t delim) } -ZAHL_INLINE size_t +ZAHL_INLINE ZAHL_O3 size_t zsave(z_t a, void *buffer) { if (ZAHL_LIKELY(buffer)) { diff --git a/zahl-internals.h b/zahl-internals.h @@ -19,6 +19,33 @@ #endif +#if defined(__GNUC__) && !defined(__clang__) +# define ZAHL_O0 __attribute__((optimize("O0"))) +# define ZAHL_O1 __attribute__((optimize("O1"))) +# define ZAHL_O2 __attribute__((optimize("O2"))) +# define ZAHL_O3 __attribute__((optimize("O3"))) +# define ZAHL_Ofast __attribute__((optimize("Ofast"))) +# define ZAHL_Os __attribute__((optimize("Os"))) +# define ZAHL_Oz __attribute__((optimize("Os"))) +#elif defined(__clang__) +# define ZAHL_O0 __attribute__((optnone)) +# define ZAHL_O1 /* Don't know how. */ +# define ZAHL_O2 /* Don't know how. */ +# define ZAHL_O3 /* Don't know how. */ +# define ZAHL_Ofast /* Don't know how. */ +# define ZAHL_Os /* Don't know how. */ +# define ZAHL_Oz /* Don't know how. */ +#else +# define ZAHL_O0 /* Don't know how. */ +# define ZAHL_O1 /* Don't know how. */ +# define ZAHL_O2 /* Don't know how. */ +# define ZAHL_O3 /* Don't know how. */ +# define ZAHL_Ofast /* Don't know how. */ +# define ZAHL_Os /* Don't know how. */ +# define ZAHL_Oz /* Don't know how. */ +#endif + + #define ZAHL_BITS_PER_CHAR 64 #define ZAHL_LB_BITS_PER_CHAR 6 #define ZAHL_CHAR_MAX UINT64_MAX @@ -78,14 +105,14 @@ struct zahl { void libzahl_realloc(struct zahl *, size_t); -static inline void +ZAHL_O3 static inline void libzahl_memcpy(zahl_char_t *restrict d, const zahl_char_t *restrict s, register size_t n) { while (n--) d[n] = s[n]; } -static inline void +ZAHL_O3 static inline void libzahl_memset(zahl_char_t *a, register zahl_char_t v, register size_t n) { while (n--)