xref: /aosp_15_r20/external/skia/include/private/base/SkFeatures.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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