Co-authored-by: Zhuohan Li <zhuohan@openai.com> Co-authored-by: Maratyszcza <marat@openai.com> Co-authored-by: Volodymyr Kyrylov <vol@wilab.org.ua>
108 lines
3.2 KiB
C
108 lines
3.2 KiB
C
#pragma once
|
|
|
|
/***** Architecture detection macros *****/
|
|
|
|
#ifdef GPTOSS_ARCH_X86_64
|
|
#if GPTOSS_ARCH_X86_64 != 0 && GPTOSS_ARCH_X86_64 != 1
|
|
#error "Invalid GPTOSS_ARCH_X86_64 value: must be either 0 or 1"
|
|
#endif
|
|
#else
|
|
#if defined(__x86_64__) || defined(_M_X64) && !defined(_M_ARM64EC)
|
|
#define GPTOSS_ARCH_X86_64 1
|
|
#else
|
|
#define GPTOSS_ARCH_X86_64 0
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef GPTOSS_ARCH_ARM64
|
|
#if GPTOSS_ARCH_ARM64 != 0 && GPTOSS_ARCH_ARM64 != 1
|
|
#error "Invalid GPTOSS_ARCH_ARM64 value: must be either 0 or 1"
|
|
#endif
|
|
#else
|
|
#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
|
|
#define GPTOSS_ARCH_ARM64 1
|
|
#else
|
|
#define GPTOSS_ARCH_ARM64 0
|
|
#endif
|
|
#endif
|
|
|
|
#if GPTOSS_ARCH_X86_64 + GPTOSS_ARCH_ARM64 == 0
|
|
#error "Unsupported architecture: neither x86-64 nor ARM64 detected"
|
|
#elif GPTOSS_ARCH_X86_64 + GPTOSS_ARCH_ARM64 != 1
|
|
#error "Inconsistent architecture detection: both x86-64 and ARM64 detection macros are specified"
|
|
#endif
|
|
|
|
/***** Compiler portability macros *****/
|
|
|
|
#ifndef GPTOSS_LIKELY
|
|
#if defined(__GNUC__)
|
|
#define GPTOSS_LIKELY(condition) (__builtin_expect(!!(condition), 1))
|
|
#else
|
|
#define GPTOSS_LIKELY(condition) (!!(condition))
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef GPTOSS_UNLIKELY
|
|
#if defined(__GNUC__)
|
|
#define GPTOSS_UNLIKELY(condition) (__builtin_expect(!!(condition), 0))
|
|
#else
|
|
#define GPTOSS_UNLIKELY(condition) (!!(condition))
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef GPTOSS_UNPREDICTABLE
|
|
#if defined(__has_builtin)
|
|
#if __has_builtin(__builtin_unpredictable)
|
|
#define GPTOSS_UNPREDICTABLE(condition) (__builtin_unpredictable(!!(condition)))
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#ifndef GPTOSS_UNPREDICTABLE
|
|
#if defined(__GNUC__) && (__GNUC__ >= 9) && !defined(__INTEL_COMPILER)
|
|
#define GPTOSS_UNPREDICTABLE(condition) (__builtin_expect_with_probability(!!(condition), 0, 0.5))
|
|
#else
|
|
#define GPTOSS_UNPREDICTABLE(condition) (!!(condition))
|
|
#endif
|
|
#endif
|
|
|
|
// Disable padding for structure members.
|
|
#ifndef GPTOSS_DENSELY_PACKED_STRUCTURE
|
|
#if defined(__GNUC__)
|
|
#define GPTOSS_DENSELY_PACKED_STRUCTURE __attribute__((__packed__))
|
|
#else
|
|
#error "Compiler-specific implementation of GPTOSS_DENSELY_PACKED_STRUCTURE required"
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef GPTOSS_ALIGN
|
|
#if defined(__GNUC__)
|
|
#define GPTOSS_ALIGN(alignment) __attribute__((__aligned__(alignment)))
|
|
#elif defined(_MSC_VER)
|
|
#define GPTOSS_ALIGN(alignment) __declspec(align(alignment))
|
|
#else
|
|
#error "Compiler-specific implementation of GPTOSS_ALIGN required"
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef GPTOSS_FORCE_INLINE
|
|
#if defined(__GNUC__)
|
|
#define GPTOSS_FORCE_INLINE inline __attribute__((__always_inline__))
|
|
#elif defined(_MSC_VER)
|
|
#define GPTOSS_FORCE_INLINE __forceinline
|
|
#else
|
|
#define GPTOSS_FORCE_INLINE inline
|
|
#endif
|
|
#endif
|
|
|
|
/***** Symbol visibility macros *****/
|
|
|
|
#ifndef GPTOSS_INTERNAL_SYMBOL
|
|
#if defined(__ELF__)
|
|
#define GPTOSS_INTERNAL_SYMBOL __attribute__((__visibility__("internal")))
|
|
#elif defined(__MACH__)
|
|
#define GPTOSS_INTERNAL_SYMBOL __attribute__((__visibility__("hidden")))
|
|
#else
|
|
#define GPTOSS_INTERNAL_SYMBOL
|
|
#endif
|
|
#endif
|