template<int version> REALM_FORCEINLINE bool sseavx() { /* Return wether or not SSE 3.0 (if version = 30) or 4.2 (for version = 42) is supported. Return value is based on the CPUID instruction. sse_support = -1: No SSE support sse_support = 0: SSE3 sse_support = 1: SSE42 avx_support = -1: No AVX support avx_support = 0: AVX1 supported sse_support = 1: AVX2 supported (not yet implemented for detection in our cpuid_init(), todo) This lets us test very rapidly at runtime because we just need 1 compare instruction (with 0) to test both for SSE 3 and 4.2 by caller (compiler optimizes if calls are concecutive), and can decide branch with ja/jl/je because sse_support is signed type. Also, 0 requires no immediate operand. Same for AVX. We runtime-initialize sse_support in a constructor of a static variable which is not guaranteed to be called prior to cpu_sse(). So we compile-time initialize sse_support to -2 as fallback. */ REALM_STATIC_ASSERT(version == 1 || version == 2 || version == 30 || version == 42, "Only version == 1 (AVX), 2 (AVX2), 30 (SSE 3) and 42 (SSE 4.2) are supported for detection"); #ifdef REALM_COMPILER_SSE if (version == 30) return (sse_support >= 0); else if (version == 42) return (sse_support > 0); // faster than == 1 (0 requres no immediate operand) else if (version == 1) // avx return (avx_support >= 0); else if (version == 2) // avx2 return (avx_support > 0); #else return false; #endif }
// to_str() is used by the integer index. The existing StringIndex is re-used for this // by making Column convert its integers to strings by calling to_str(). template <class T> inline StringData to_str(const T& value) { REALM_STATIC_ASSERT((std::is_same<T, int64_t>::value), ""); const char* c = reinterpret_cast<const char*>(&value); return StringData(c, sizeof(T)); }