18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
8d3ebb48320cf1b7e969974673e4bd7743816985ebungeman// IWYU pragma: private, include "SkTypes.h"
9d3ebb48320cf1b7e969974673e4bd7743816985ebungeman
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPreConfig_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPreConfig_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
134469938e92d779dff05e745559e67907bbf21e78reed@google.com// Allows embedders that want to disable macros that take arguments to just
144469938e92d779dff05e745559e67907bbf21e78reed@google.com// define that symbol to be one of these
154469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG1(arg1)
164469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG2(arg1, arg2)
174469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG3(arg1, arg2, arg3)
184469938e92d779dff05e745559e67907bbf21e78reed@google.com
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
213ac6b7551dc7aa182018f96b32f6e516305333eebungeman#if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN32) && !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC)
22f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
23f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #ifdef __APPLE__
24f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #include "TargetConditionals.h"
25f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #endif
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2762e1a1a4ba9926c9b515eb603173ea4202ac28aemtklein    #if defined(_WIN32) || defined(__SYMBIAN32__)
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_WIN32
29f419781d378fd78a332fdf9dd5dda0ff65d3c07dmtklein    #elif defined(ANDROID) || defined(__ANDROID__)
3060abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com        #define SK_BUILD_FOR_ANDROID
310cbe7ee765cf72f15e6ca10b308676aa077fb3e2halcanary    #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \
320cbe7ee765cf72f15e6ca10b308676aa077fb3e2halcanary          defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \
336fc8ff024bd823f350400a86e7b9daa1c25f618eabarth          defined(__DragonFly__) || defined(__Fuchsia__) || \
346fc8ff024bd823f350400a86e7b9daa1c25f618eabarth          defined(__GLIBC__) || defined(__GNU__) || defined(__unix__)
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_UNIX
36f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
37f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_BUILD_FOR_IOS
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #else
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_MAC
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
44059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org/* Even if the user only defined the framework variant we still need to build
45059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * the default (NDK-compliant) Android code. Therefore, when attempting to
46059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * include/exclude something from the framework variant check first that we are
47059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * building for Android then check the status of the framework define.
4858629291bc145edca8fb303e465c8537bed65314djsollen@google.com */
49530efc808544e9ff79814f61678bd919b168cb21bsalomon@google.com#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID)
5058629291bc145edca8fb303e465c8537bed65314djsollen@google.com    #define SK_BUILD_FOR_ANDROID
5158629291bc145edca8fb303e465c8537bed65314djsollen@google.com#endif
5258629291bc145edca8fb303e465c8537bed65314djsollen@google.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5563debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#ifdef SK_BUILD_FOR_WIN32
56333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com    #if !defined(SK_RESTRICT)
57333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com        #define SK_RESTRICT __restrict
58333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com    #endif
59363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #if !defined(SK_WARN_UNUSED_RESULT)
60363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com        #define SK_WARN_UNUSED_RESULT
61363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #endif
6263debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#endif
6363debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com
645c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if !defined(SK_RESTRICT)
655c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #define SK_RESTRICT __restrict__
665c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#endif
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
68363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#if !defined(SK_WARN_UNUSED_RESULT)
69363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
70363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#endif
71363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
753c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman    #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
763c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman        #define SK_CPU_BENDIAN
773c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman    #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
783c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman        #define SK_CPU_LENDIAN
793c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman    #elif defined(__sparc) || defined(__sparc__) || \
808ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      defined(_POWER) || defined(__powerpc__) || \
818ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      defined(__ppc__) || defined(__hppa) || \
828ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      defined(__PPC__) || defined(__PPC64__) || \
838ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      defined(_MIPSEB) || defined(__ARMEB__) || \
848ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      defined(__s390__) || \
858ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
868ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org      (defined(__ia64) && defined(__BIG_ENDIAN__))
878ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org         #define SK_CPU_BENDIAN
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #else
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_CPU_LENDIAN
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
954460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org#if defined(__i386) || defined(_M_IX86) ||  defined(__x86_64__) || defined(_M_X64)
964460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org  #define SK_CPU_X86 1
974460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org#endif
984460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org
994a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com/**
100126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com *  SK_CPU_SSE_LEVEL
101126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com *
102ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
103ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com *  On non-intel CPU this should be undefined.
1044a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com */
105126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com
10600aad94f01a9078d26363db3116f8005d84440f2reed@google.com#define SK_CPU_SSE_LEVEL_SSE1     10
1078dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE2     20
1088dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE3     30
1098dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSSE3    31
110ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org#define SK_CPU_SSE_LEVEL_SSE41    41
111ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org#define SK_CPU_SSE_LEVEL_SSE42    42
1125141d90796034a932a48738cf76091957314c9a1mtklein#define SK_CPU_SSE_LEVEL_AVX      51
1135141d90796034a932a48738cf76091957314c9a1mtklein#define SK_CPU_SSE_LEVEL_AVX2     52
114ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com
115e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// When targetting iOS and using gyp to generate the build files, it is not
116e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// possible to select files to build depending on the architecture (i.e. it
117e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// is not possible to use hand optimized assembly implementation). In that
118e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// configuration SK_BUILD_NO_OPTS is defined. Remove optimisation then.
119e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#ifdef SK_BUILD_NO_OPTS
120e3fa811657ecf4ab694d026752a81080c6b10611sdefresne    #define SK_CPU_SSE_LEVEL 0
121c60bfbb1b58ceea872f12bc8b62f2654bb47fbaamtklein#endif
122c60bfbb1b58ceea872f12bc8b62f2654bb47fbaamtklein
123126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in GCC?
1244a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#ifndef SK_CPU_SSE_LEVEL
12588a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org    // These checks must be done in descending order to ensure we set the highest
12688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org    // available SSE level.
1275141d90796034a932a48738cf76091957314c9a1mtklein    #if defined(__AVX2__)
1285141d90796034a932a48738cf76091957314c9a1mtklein        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX2
1295141d90796034a932a48738cf76091957314c9a1mtklein    #elif defined(__AVX__)
1305141d90796034a932a48738cf76091957314c9a1mtklein        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX
1315141d90796034a932a48738cf76091957314c9a1mtklein    #elif defined(__SSE4_2__)
132ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE42
133ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org    #elif defined(__SSE4_1__)
134ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE41
135ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org    #elif defined(__SSSE3__)
13688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
137ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com    #elif defined(__SSE3__)
1388dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
13988a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org    #elif defined(__SSE2__)
14088a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
1414a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com    #endif
1424a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#endif
1434a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com
144126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in VisualStudio?
145126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#ifndef SK_CPU_SSE_LEVEL
14688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org    // These checks must be done in descending order to ensure we set the highest
147ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org    // available SSE level. 64-bit intel guarantees at least SSE2 support.
1485141d90796034a932a48738cf76091957314c9a1mtklein    #if defined(__AVX2__)
1495141d90796034a932a48738cf76091957314c9a1mtklein        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX2
1505141d90796034a932a48738cf76091957314c9a1mtklein    #elif defined(__AVX__)
1515141d90796034a932a48738cf76091957314c9a1mtklein        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX
1525141d90796034a932a48738cf76091957314c9a1mtklein    #elif defined(_M_X64) || defined(_M_AMD64)
1535141d90796034a932a48738cf76091957314c9a1mtklein        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_SSE2
1545141d90796034a932a48738cf76091957314c9a1mtklein    #elif defined(_M_IX86_FP)
15588a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org        #if _M_IX86_FP >= 2
1564736ed1a0a7e252e169685e3c7572f08dfca0a2ccommit-bot@chromium.org            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
15788a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org        #elif _M_IX86_FP == 1
15888a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
1594736ed1a0a7e252e169685e3c7572f08dfca0a2ccommit-bot@chromium.org        #endif
16000aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #endif
16100aad94f01a9078d26363db3116f8005d84440f2reed@google.com#endif
16200aad94f01a9078d26363db3116f8005d84440f2reed@google.com
163867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com//////////////////////////////////////////////////////////////////////
164867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com// ARM defines
165867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
166d01ec71f9c350ab73e24808a5d4da22a3c8fc515commit-bot@chromium.org#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
1673a2682a77f996f649de7699c9f7bee046c6d4f17mtklein    #define SK_CPU_ARM32
168867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
169867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #if defined(__GNUC__)
170867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
171867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
172867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7)
173867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 7
174867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
175867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
176867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
177867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6)
178867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 6
179867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
180867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
181867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5)
182867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 5
183867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4)
184867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 4
185867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #else
186867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 3
187867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #endif
188867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #endif
189126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#endif
190126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com
191e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#if defined(__aarch64__) && !defined(SK_BUILD_NO_OPTS)
1926f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    #define SK_CPU_ARM64
1936f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
1946f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org
195b79ff56de23fef680ae7187040f2d6a9516b553dmtklein// All 64-bit ARM chips have NEON.  Many 32-bit ARM chips do too.
196e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_NO_OPTS) && (defined(__ARM_NEON__) || defined(__ARM_NEON))
197b79ff56de23fef680ae7187040f2d6a9516b553dmtklein    #define SK_ARM_HAS_NEON
198b79ff56de23fef680ae7187040f2d6a9516b553dmtklein#endif
199b79ff56de23fef680ae7187040f2d6a9516b553dmtklein
2009441af52aafd59553ab1a2ea52c390400f93e0bbmtklein// Really this __APPLE__ check shouldn't be necessary, but it seems that Apple's Clang defines
2019441af52aafd59553ab1a2ea52c390400f93e0bbmtklein// __ARM_FEATURE_CRC32 for -arch arm64, even though their chips don't support those instructions!
2029441af52aafd59553ab1a2ea52c390400f93e0bbmtklein#if defined(__ARM_FEATURE_CRC32) && !defined(__APPLE__)
2039441af52aafd59553ab1a2ea52c390400f93e0bbmtklein    #define SK_ARM_HAS_CRC32
2049441af52aafd59553ab1a2ea52c390400f93e0bbmtklein#endif
2059441af52aafd59553ab1a2ea52c390400f93e0bbmtklein
2064a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com//////////////////////////////////////////////////////////////////////
2074a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com
2087ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#if !defined(SKIA_IMPLEMENTATION)
2097ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #define SKIA_IMPLEMENTATION 0
2107ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif
211c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com
212fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein#if !defined(SK_API)
213fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein    #if defined(SKIA_DLL)
2147a1f45f9e584fef625e764bd5d180a9c4943dcd5mtklein        #if defined(_MSC_VER)
215fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein            #if SKIA_IMPLEMENTATION
216fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein                #define SK_API __declspec(dllexport)
217fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein            #else
218fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein                #define SK_API __declspec(dllimport)
219fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein            #endif
220c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #else
221fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein            #define SK_API __attribute__((visibility("default")))
222c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #endif
2237ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #else
224fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein        #define SK_API
2257ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #endif
2267ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif
2277ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org
228157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com//////////////////////////////////////////////////////////////////////
229157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com
230157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com/**
231157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Use SK_PURE_FUNC as an attribute to indicate that a function's
232157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * return value only depends on the value of its parameters. This
233157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * can help the compiler optimize out successive calls.
234157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com *
235157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Usage:
236157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com *      void  function(int params)  SK_PURE_FUNC;
237157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com */
238157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#if defined(__GNUC__)
239157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#  define  SK_PURE_FUNC  __attribute__((pure))
240157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#else
241157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#  define  SK_PURE_FUNC  /* nothing */
242157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#endif
243157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com
244536079b2099e986853c82c874059a6bcd7602742digit@google.com//////////////////////////////////////////////////////////////////////
245536079b2099e986853c82c874059a6bcd7602742digit@google.com
246536079b2099e986853c82c874059a6bcd7602742digit@google.com/**
247536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler
248536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports __attribute__((<name>)). Mostly important because
249536079b2099e986853c82c874059a6bcd7602742digit@google.com * Clang doesn't support all of GCC attributes.
250536079b2099e986853c82c874059a6bcd7602742digit@google.com */
251536079b2099e986853c82c874059a6bcd7602742digit@google.com#if defined(__has_attribute)
252536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) __has_attribute(x)
253536079b2099e986853c82c874059a6bcd7602742digit@google.com#elif defined(__GNUC__)
254536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) 1
255536079b2099e986853c82c874059a6bcd7602742digit@google.com#else
256536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) 0
257536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif
258536079b2099e986853c82c874059a6bcd7602742digit@google.com
259536079b2099e986853c82c874059a6bcd7602742digit@google.com/**
260536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute
261536079b2099e986853c82c874059a6bcd7602742digit@google.com * to specify individual optimization level of -O1, if the compiler
262536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports it.
263536079b2099e986853c82c874059a6bcd7602742digit@google.com *
264536079b2099e986853c82c874059a6bcd7602742digit@google.com * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute.
265536079b2099e986853c82c874059a6bcd7602742digit@google.com */
266536079b2099e986853c82c874059a6bcd7602742digit@google.com#if SK_HAS_ATTRIBUTE(optimize)
267536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1")))
268536079b2099e986853c82c874059a6bcd7602742digit@google.com#else
269536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
272536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif
273