1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkFeatures_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkFeatures_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && \ 12*c8dee2aaSAndroid Build Coastguard Worker !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC) 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #ifdef __APPLE__ 15*c8dee2aaSAndroid Build Coastguard Worker #include <TargetConditionals.h> 16*c8dee2aaSAndroid Build Coastguard Worker #endif 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #if defined(_WIN32) || defined(__SYMBIAN32__) 19*c8dee2aaSAndroid Build Coastguard Worker #define SK_BUILD_FOR_WIN 20*c8dee2aaSAndroid Build Coastguard Worker #elif defined(ANDROID) || defined(__ANDROID__) 21*c8dee2aaSAndroid Build Coastguard Worker #define SK_BUILD_FOR_ANDROID 22*c8dee2aaSAndroid Build Coastguard Worker #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \ 23*c8dee2aaSAndroid Build Coastguard Worker defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \ 24*c8dee2aaSAndroid Build Coastguard Worker defined(__DragonFly__) || defined(__Fuchsia__) || \ 25*c8dee2aaSAndroid Build Coastguard Worker defined(__GLIBC__) || defined(__GNU__) || defined(__unix__) 26*c8dee2aaSAndroid Build Coastguard Worker #define SK_BUILD_FOR_UNIX 27*c8dee2aaSAndroid Build Coastguard Worker #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 28*c8dee2aaSAndroid Build Coastguard Worker #define SK_BUILD_FOR_IOS 29*c8dee2aaSAndroid Build Coastguard Worker #else 30*c8dee2aaSAndroid Build Coastguard Worker #define SK_BUILD_FOR_MAC 31*c8dee2aaSAndroid Build Coastguard Worker #endif 32*c8dee2aaSAndroid Build Coastguard Worker #endif // end SK_BUILD_FOR_* 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_WIN) && !defined(__clang__) 36*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_RESTRICT) 37*c8dee2aaSAndroid Build Coastguard Worker #define SK_RESTRICT __restrict 38*c8dee2aaSAndroid Build Coastguard Worker #endif 39*c8dee2aaSAndroid Build Coastguard Worker #endif 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_RESTRICT) 42*c8dee2aaSAndroid Build Coastguard Worker #define SK_RESTRICT __restrict__ 43*c8dee2aaSAndroid Build Coastguard Worker #endif 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN) 46*c8dee2aaSAndroid Build Coastguard Worker #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) 47*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_BENDIAN 48*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 49*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LENDIAN 50*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__sparc) || defined(__sparc__) || \ 51*c8dee2aaSAndroid Build Coastguard Worker defined(_POWER) || defined(__powerpc__) || \ 52*c8dee2aaSAndroid Build Coastguard Worker defined(__ppc__) || defined(__hppa) || \ 53*c8dee2aaSAndroid Build Coastguard Worker defined(__PPC__) || defined(__PPC64__) || \ 54*c8dee2aaSAndroid Build Coastguard Worker defined(_MIPSEB) || defined(__ARMEB__) || \ 55*c8dee2aaSAndroid Build Coastguard Worker defined(__s390__) || \ 56*c8dee2aaSAndroid Build Coastguard Worker (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ 57*c8dee2aaSAndroid Build Coastguard Worker (defined(__ia64) && defined(__BIG_ENDIAN__)) 58*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_BENDIAN 59*c8dee2aaSAndroid Build Coastguard Worker #else 60*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LENDIAN 61*c8dee2aaSAndroid Build Coastguard Worker #endif 62*c8dee2aaSAndroid Build Coastguard Worker #endif 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker #if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) 65*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_X86 1 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker #if defined(__loongarch__) || defined (__loongarch64) 69*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LOONGARCH 1 70*c8dee2aaSAndroid Build Coastguard Worker #endif 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker #if defined(__powerpc__) || defined (__powerpc64__) 73*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_PPC 1 74*c8dee2aaSAndroid Build Coastguard Worker #endif 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker /** 77*c8dee2aaSAndroid Build Coastguard Worker * SK_CPU_SSE_LEVEL 78*c8dee2aaSAndroid Build Coastguard Worker * 79*c8dee2aaSAndroid Build Coastguard Worker * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level. 80*c8dee2aaSAndroid Build Coastguard Worker * On non-intel CPU this should be undefined. 81*c8dee2aaSAndroid Build Coastguard Worker */ 82*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSE1 10 83*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSE2 20 84*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSE3 30 85*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSSE3 31 86*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSE41 41 87*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SSE42 42 88*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_AVX 51 89*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_AVX2 52 90*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL_SKX 60 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker /** 93*c8dee2aaSAndroid Build Coastguard Worker * SK_CPU_LSX_LEVEL 94*c8dee2aaSAndroid Build Coastguard Worker * 95*c8dee2aaSAndroid Build Coastguard Worker * If defined, SK_CPU_LSX_LEVEL should be set to the highest supported level. 96*c8dee2aaSAndroid Build Coastguard Worker * On non-loongarch CPU this should be undefined. 97*c8dee2aaSAndroid Build Coastguard Worker */ 98*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LSX_LEVEL_LSX 70 99*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LSX_LEVEL_LASX 80 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker // TODO(kjlubick) clean up these checks 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker // Are we in GCC/Clang? 104*c8dee2aaSAndroid Build Coastguard Worker #ifndef SK_CPU_SSE_LEVEL 105*c8dee2aaSAndroid Build Coastguard Worker // These checks must be done in descending order to ensure we set the highest 106*c8dee2aaSAndroid Build Coastguard Worker // available SSE level. 107*c8dee2aaSAndroid Build Coastguard Worker #if defined(__AVX512F__) && defined(__AVX512DQ__) && defined(__AVX512CD__) && \ 108*c8dee2aaSAndroid Build Coastguard Worker defined(__AVX512BW__) && defined(__AVX512VL__) 109*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SKX 110*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__AVX2__) 111*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2 112*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__AVX__) 113*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX 114*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__SSE4_2__) 115*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE42 116*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__SSE4_1__) 117*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE41 118*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__SSSE3__) 119*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 120*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__SSE3__) 121*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 122*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__SSE2__) 123*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 124*c8dee2aaSAndroid Build Coastguard Worker #endif 125*c8dee2aaSAndroid Build Coastguard Worker #endif 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker #ifndef SK_CPU_LSX_LEVEL 128*c8dee2aaSAndroid Build Coastguard Worker #if defined(__loongarch_asx) 129*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LSX_LEVEL SK_CPU_LSX_LEVEL_LASX 130*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__loongarch_sx) 131*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_LSX_LEVEL SK_CPU_LSX_LEVEL_LSX 132*c8dee2aaSAndroid Build Coastguard Worker #endif 133*c8dee2aaSAndroid Build Coastguard Worker #endif 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker // Are we in VisualStudio? 136*c8dee2aaSAndroid Build Coastguard Worker #ifndef SK_CPU_SSE_LEVEL 137*c8dee2aaSAndroid Build Coastguard Worker // These checks must be done in descending order to ensure we set the highest 138*c8dee2aaSAndroid Build Coastguard Worker // available SSE level. 64-bit intel guarantees at least SSE2 support. 139*c8dee2aaSAndroid Build Coastguard Worker #if defined(__AVX512F__) && defined(__AVX512DQ__) && defined(__AVX512CD__) && \ 140*c8dee2aaSAndroid Build Coastguard Worker defined(__AVX512BW__) && defined(__AVX512VL__) 141*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SKX 142*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__AVX2__) 143*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2 144*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__AVX__) 145*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX 146*c8dee2aaSAndroid Build Coastguard Worker #elif defined(_M_X64) || defined(_M_AMD64) 147*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 148*c8dee2aaSAndroid Build Coastguard Worker #elif defined(_M_IX86_FP) 149*c8dee2aaSAndroid Build Coastguard Worker #if _M_IX86_FP >= 2 150*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 151*c8dee2aaSAndroid Build Coastguard Worker #elif _M_IX86_FP == 1 152*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 153*c8dee2aaSAndroid Build Coastguard Worker #endif 154*c8dee2aaSAndroid Build Coastguard Worker #endif 155*c8dee2aaSAndroid Build Coastguard Worker #endif 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker // ARM defines 158*c8dee2aaSAndroid Build Coastguard Worker #if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR) 159*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_ARM32 160*c8dee2aaSAndroid Build Coastguard Worker #elif defined(__aarch64__) 161*c8dee2aaSAndroid Build Coastguard Worker #define SK_CPU_ARM64 162*c8dee2aaSAndroid Build Coastguard Worker #endif 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker // All 64-bit ARM chips have NEON. Many 32-bit ARM chips do too. 165*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ARM_HAS_NEON) && defined(__ARM_NEON) 166*c8dee2aaSAndroid Build Coastguard Worker #define SK_ARM_HAS_NEON 167*c8dee2aaSAndroid Build Coastguard Worker #endif 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker #endif // SkFeatures_DEFINED 170