2#include "gaia/config/config_core.h"
12#ifndef TCB_SPAN_NO_CONTRACT_CHECKING
20#if !defined(NDEBUG) || defined(_DEBUG)
21 #define GAIA_DEBUG_BUILD 1
23 #define GAIA_DEBUG_BUILD 0
30#if !defined(GAIA_DEBUG)
31 #if GAIA_DEBUG_BUILD || GAIA_FORCE_DEBUG
38#if GAIA_DISABLE_ASSERTS
39 #ifdef GAIA_ASSERT_ENABLED
40 #undef GAIA_ASSERT_ENABLED
42 #define GAIA_ASSERT_ENABLED 0
47 #define GAIA_ASSERT(cond)
52 #define GAIA_ASSERT2(cond, msg)
53#elif !defined(GAIA_ASSERT)
57 #define GAIA_ASSERT_ENABLED 1
58 #define GAIA_ASSERT(cond) \
60 GAIA_MSVC_WARNING_PUSH() \
61 GAIA_MSVC_WARNING_DISABLE(4127) \
63 GAIA_MSVC_WARNING_POP() \
65 #define GAIA_ASSERT2(cond, msg) \
67 GAIA_MSVC_WARNING_PUSH() \
68 GAIA_MSVC_WARNING_DISABLE(4127) \
69 assert((cond) && (msg)); \
70 GAIA_MSVC_WARNING_POP() \
75 #define GAIA_ASSERT_ENABLED 1
76 #define GAIA_ASSERT(cond) \
78 GAIA_MSVC_WARNING_PUSH() \
79 GAIA_MSVC_WARNING_DISABLE(4127) \
80 if GAIA_UNLIKELY (!(cond)) \
82 GAIA_LOG_E("%s:%d: Assertion failed: '%s'.", __FILE__, __LINE__, #cond); \
84 GAIA_MSVC_WARNING_POP() \
86 #define GAIA_ASSERT2(cond, msg) \
88 GAIA_MSVC_WARNING_PUSH() \
89 GAIA_MSVC_WARNING_DISABLE(4127) \
90 if GAIA_UNLIKELY (!(cond)) \
92 GAIA_LOG_E("%s:%d: Assertion failed: '%s'.", __FILE__, __LINE__, (msg)); \
94 GAIA_MSVC_WARNING_POP() \
97 #define GAIA_ASSERT_ENABLED 0
98 #define GAIA_ASSERT(cond)
99 #define GAIA_ASSERT2(cond, msg)
104#if !defined(GAIA_ECS_VALIDATE_CHUNKS)
105 #define GAIA_ECS_VALIDATE_CHUNKS (GAIA_DEBUG && GAIA_DEVMODE)
107#if !defined(GAIA_ECS_VALIDATE_ENTITY_LIST)
108 #define GAIA_ECS_VALIDATE_ENTITY_LIST (GAIA_DEBUG && GAIA_DEVMODE)
110#if !defined(GAIA_ECS_VALIDATE_ARCHETYPE_GRAPH)
111 #define GAIA_ECS_VALIDATE_ARCHETYPE_GRAPH (GAIA_DEBUG && GAIA_DEVMODE)
121 enum PrefetchHint :
int {
123 PREFETCH_HINT_T0 = 3,
125 PREFETCH_HINT_T1 = 2,
128 PREFETCH_HINT_T2 = 1,
131 PREFETCH_HINT_NTA = 0
137 GAIA_FORCEINLINE
void prefetch(
const void* x,
int hint) {
139 #if GAIA_COMPILER_CLANG
157 case PREFETCH_HINT_T1:
158 __builtin_prefetch(x, 0, PREFETCH_HINT_T1);
160 case PREFETCH_HINT_T2:
161 __builtin_prefetch(x, 0, PREFETCH_HINT_T2);
163 case PREFETCH_HINT_NTA:
164 __builtin_prefetch(x, 0, PREFETCH_HINT_NTA);
167 __builtin_prefetch(x, 0, PREFETCH_HINT_T0);
170 #elif GAIA_COMPILER_GCC
171 #if !defined(__i386) || defined(__SSE__)
172 if (__builtin_constant_p(hint)) {
173 __builtin_prefetch(x, 0, hint);
176 __builtin_prefetch(x);
178 #elif !GAIA_HAS_NO_INLINE_ASSEMBLY
183 if (hint == PREFETCH_HINT_NTA)
184 asm volatile(
"prefetchnta (%0)" : :
"r"(x));
186 #elif GAIA_COMPILER_MSVC && GAIA_ARCH == GAIA_ARCH_X86
188 case PREFETCH_HINT_T1:
189 _mm_prefetch(
static_cast<const char*
>(x), _MM_HINT_T1);
191 case PREFETCH_HINT_T2:
192 _mm_prefetch(
static_cast<const char*
>(x), _MM_HINT_T2);
194 case PREFETCH_HINT_NTA:
195 _mm_prefetch(
static_cast<const char*
>(x), _MM_HINT_NTA);
198 _mm_prefetch(
static_cast<const char*
>(x), _MM_HINT_T0);