|
|
|
/*
|
|
|
|
* Copyright 2009-2015 Samy Al Bahra.
|
|
|
|
* Copyright 2014 Paul Khuong.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef CK_GCC_CC_H
|
|
|
|
#define CK_GCC_CC_H
|
|
|
|
|
|
|
|
#include <ck_md.h>
|
|
|
|
|
|
|
|
#ifdef __SUNPRO_C
|
|
|
|
#define CK_CC_UNUSED
|
|
|
|
#define CK_CC_USED
|
|
|
|
#define CK_CC_IMM
|
|
|
|
#define CK_CC_IMM_U32
|
|
|
|
#else
|
|
|
|
#define CK_CC_UNUSED __attribute__((unused))
|
|
|
|
#define CK_CC_USED __attribute__((used))
|
|
|
|
#define CK_CC_IMM "i"
|
|
|
|
#if defined(__x86_64__) || defined(__x86__)
|
|
|
|
#define CK_CC_IMM_U32 "Z"
|
|
|
|
#define CK_CC_IMM_S32 "e"
|
|
|
|
#else
|
|
|
|
#define CK_CC_IMM_U32 CK_CC_IMM
|
|
|
|
#define CK_CC_IMM_S32 CK_CC_IMM
|
|
|
|
#endif /* __x86_64__ || __x86__ */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __OPTIMIZE__
|
|
|
|
#define CK_CC_INLINE CK_CC_UNUSED inline
|
|
|
|
#else
|
|
|
|
#define CK_CC_INLINE CK_CC_UNUSED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CK_CC_FORCE_INLINE CK_CC_UNUSED __attribute__((always_inline)) inline
|
|
|
|
#define CK_CC_RESTRICT __restrict__
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Packed attribute.
|
|
|
|
*/
|
|
|
|
#define CK_CC_PACKED __attribute__((packed))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Weak reference.
|
|
|
|
*/
|
|
|
|
#define CK_CC_WEAKREF __attribute__((weakref))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Alignment attribute.
|
|
|
|
*/
|
|
|
|
#define CK_CC_ALIGN(B) __attribute__((aligned(B)))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cache align.
|
|
|
|
*/
|
|
|
|
#define CK_CC_CACHELINE CK_CC_ALIGN(CK_MD_CACHELINE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* These are functions which should be avoided.
|
|
|
|
*/
|
|
|
|
#ifdef __freestanding__
|
|
|
|
#pragma GCC poison malloc free
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Branch execution hints.
|
|
|
|
*/
|
|
|
|
#define CK_CC_LIKELY(x) (__builtin_expect(!!(x), 1))
|
|
|
|
#define CK_CC_UNLIKELY(x) (__builtin_expect(!!(x), 0))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Some compilers are overly strict regarding aliasing semantics.
|
|
|
|
* Unfortunately, in many cases it makes more sense to pay aliasing
|
|
|
|
* cost rather than overly expensive register spillage.
|
|
|
|
*/
|
|
|
|
#define CK_CC_ALIASED __attribute__((__may_alias__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Compile-time typeof
|
|
|
|
*/
|
|
|
|
#define CK_CC_TYPEOF(X, DEFAULT) __typeof__(X)
|
|
|
|
|
|
|
|
/*
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
* Portability wrappers for bitwise operations.
|
|
|
|
*/
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
#ifndef CK_MD_CC_BUILTIN_DISABLE
|
|
|
|
#define CK_F_CC_FFS
|
|
|
|
CK_CC_INLINE static int
|
|
|
|
ck_cc_ffs(unsigned int x)
|
|
|
|
{
|
|
|
|
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
return __builtin_ffsl(x);
|
|
|
|
}
|
|
|
|
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
#define CK_F_CC_FFSL
|
|
|
|
CK_CC_INLINE static int
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
ck_cc_ffsl(unsigned long x)
|
|
|
|
{
|
|
|
|
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
return __builtin_ffsll(x);
|
|
|
|
}
|
|
|
|
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
#define CK_F_CC_CTZ
|
|
|
|
CK_CC_INLINE static int
|
|
|
|
ck_cc_ctz(unsigned int x)
|
|
|
|
{
|
|
|
|
|
|
|
|
return __builtin_ctz(x);
|
|
|
|
}
|
|
|
|
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
#define CK_F_CC_POPCOUNT
|
|
|
|
CK_CC_INLINE static int
|
|
|
|
ck_cc_popcount(unsigned int x)
|
|
|
|
{
|
|
|
|
|
|
|
|
return __builtin_popcount(x);
|
|
|
|
}
|
ck_cc: add a disable builtin flag for the FreeBSD kernel.
This primarily affects the FreeBSD kernel, where the popcount builtin
can be problematic (relies on compiler-provided libraries). See the
history of __POPCNT__ for details [1].
- A new flag, CK_MD_CC_BUILTIN_DISABLE, can be set to indicate that CK
should not rely on compiler builtins when possible.
- ck_cc_clz has been removed, it was unused.
- ck_internal_bsf has been removed, it was duplicate of ck_cc_ffs but broken,
replaced in favor of ck_cc_ffs. Previous consumers were using the bsf
instruction, eitherway.
- ck_{rhs,hs,ht} have been updated to use ck_cc_ffs*.
If FreeBSD requires the builtins for performance reasons, we will lift the
appropriate detection into ck_md (at least, bt* bs* family of functions don't
have the same problems on most targets unlike popcount).
1: https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069663.html
7 years ago
|
|
|
#endif /* CK_MD_CC_BUILTIN_DISABLE */
|
|
|
|
#endif /* CK_GCC_CC_H */
|