/* Compiler definitions helpers, for portability. */ #ifndef COM_DEF_H #define COM_DEF_H #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ defined(__GNUC__) || defined(__clang__) #define COM_DEF_COMPILE_MODERN 1 #endif /* TODO: uppercase? */ #ifdef COM_DEF_COMPILE_MODERN #define com_def_alignedas(v_as) _Alignas(v_as) #define com_def_vector(v_t, v_v, v_n) \ v_t v_v __attribute__((vector_size(sizeof(v_t) * v_n))) #else #define com_def_alignedas(v_as) #define com_def_vector(v_t, v_v, v_n) v_t v_v[v_n] #endif #define COM_DEF_VECTOR_NONE 0 #define COM_DEF_VECTOR_SSE2 1 #ifdef COM_DEF_COMPILE_MODERN #define COM_DEF_VECTOR_IMPL COM_DEF_VECTOR_SSE2 #endif // #define COM_DEF_PROFILE_VAR volatile /* Sadly, doesn't work in some cases */ #define COM_DEF_PROFILE_SINK(m_v) __asm__ volatile("" ::"r"(m_v) : "memory") #endif