From 1ee34556a63217ecb49f4986ff6b759377535dc4 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 25 Mar 2022 00:13:06 -0700 Subject: Try to improve assume_aligned for other compilers --- common/almalloc.h | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/common/almalloc.h b/common/almalloc.h index 1e43acca..5efa4f63 100644 --- a/common/almalloc.h +++ b/common/almalloc.h @@ -101,8 +101,41 @@ constexpr bool operator==(const allocator&, const allocator&) noexcept template constexpr bool operator!=(const allocator&, const allocator&) noexcept { return false; } -template -[[gnu::assume_aligned(alignment)]] constexpr T* assume_aligned(T *ptr) noexcept { return ptr; } +#ifdef __cpp_lib_assume_aligned +template +using assume_aligned = std::assume_aligned; + +#elif defined(__clang__) || (defined(__GNUC__) && !defined(__ICC)) + +template +[[gnu::always_inline/*,nodiscard*/]] constexpr T* assume_aligned(T *ptr) noexcept +{ return static_cast(__builtin_assume_aligned(ptr, alignment)); } + +#elif defined(_MSC_VER) + +template +__forceinline /*[[nodiscard]]*/ constexpr T* assume_aligned(T *ptr) noexcept +{ + static constexpr std::size_t alignment_mask{(1<(ptr)&alignment_mask) == 0) + return ptr; + __assume(0); +} + +#elif defined(__ICC) + +template +/*[[nodiscard]]*/ constexpr T* assume_aligned(T *ptr) noexcept +{ + __assume_aligned(ptr, alignment); + return ptr; +} + +#else + +template +/*[[nodiscard]]*/ constexpr T* assume_aligned(T *ptr) noexcept { return ptr; } +#endif template -- cgit v1.2.3