Bug 1562686 - revert remaining unnecessary bit of bug 1187245; r=glandium
[gecko.git] / mozglue / build / arm.h
blob8600329931e50300119ef0aaf3efa4084238f96b
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 /* compile-time and runtime tests for whether to use SSE instructions */
7 #ifndef mozilla_arm_h_
8 #define mozilla_arm_h_
10 // for definition of MFBT_DATA
11 #include "mozilla/Types.h"
13 /* This is patterned after SSE.h, but provides ARMv5E, ARMv6, and NEON
14 detection. For reasons similar to the SSE code, code using NEON (even just
15 in inline asm) needs to be in a separate compilation unit from the regular
16 code, because it requires an ".fpu neon" directive which can't be undone.
17 ARMv5E and ARMv6 code may also require an .arch directive, since by default
18 the assembler refuses to generate code for opcodes outside of its current
19 .arch setting.
21 TODO: Add Thumb, Thumb2, VFP, iwMMX, etc. detection, if we need it. */
23 #if defined(__GNUC__) && defined(__arm__)
25 # define MOZILLA_ARM_ARCH 3
27 # if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \
28 defined(_ARM_ARCH_4)
29 # undef MOZILLA_ARM_ARCH
30 # define MOZILLA_ARM_ARCH 4
31 # endif
33 # if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
34 defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
35 defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5)
36 # undef MOZILLA_ARM_ARCH
37 # define MOZILLA_ARM_ARCH 5
38 # endif
40 # if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
41 defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
42 defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) || \
43 defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6)
44 # undef MOZILLA_ARM_ARCH
45 # define MOZILLA_ARM_ARCH 6
46 # endif
48 # if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
49 defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
50 defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7)
51 # undef MOZILLA_ARM_ARCH
52 # define MOZILLA_ARM_ARCH 7
53 # endif
55 # ifdef __GNUC__
56 # define MOZILLA_MAY_SUPPORT_EDSP 1
58 # if defined(HAVE_ARM_SIMD)
59 # define MOZILLA_MAY_SUPPORT_ARMV6 1
60 # endif
62 # if defined(HAVE_ARM_NEON)
63 # define MOZILLA_MAY_SUPPORT_NEON 1
64 # endif
66 # if defined(HAVE_ARM_SIMD)
67 # define MOZILLA_MAY_SUPPORT_ARMV7 1
68 # endif
69 # endif
71 // Currently we only have CPU detection for Linux via /proc/cpuinfo
72 # if defined(__linux__) || defined(ANDROID)
73 # define MOZILLA_ARM_HAVE_CPUID_DETECTION 1
74 # endif
76 #endif
78 // When using -mfpu=neon on arm gcc, or using default on aarch64,
79 // the compiler generates neon instructions.
80 #if defined(__ARM_NEON)
81 # define MOZILLA_PRESUME_NEON 1
82 #endif
84 namespace mozilla {
86 namespace arm_private {
87 #if defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
88 # if !defined(MOZILLA_PRESUME_EDSP)
89 extern bool MFBT_DATA edsp_enabled;
90 # endif
91 # if !defined(MOZILLA_PRESUME_ARMV6)
92 extern bool MFBT_DATA armv6_enabled;
93 # endif
94 # if !defined(MOZILLA_PRESUME_ARMV7)
95 extern bool MFBT_DATA armv7_enabled;
96 # endif
97 # if !defined(MOZILLA_PRESUME_NEON)
98 extern bool MFBT_DATA neon_enabled;
99 # endif
100 #endif
101 } // namespace arm_private
103 #if defined(MOZILLA_PRESUME_EDSP)
104 # define MOZILLA_MAY_SUPPORT_EDSP 1
105 inline bool supports_edsp() { return true; }
106 #elif defined(MOZILLA_MAY_SUPPORT_EDSP) && \
107 defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
108 inline bool supports_edsp() { return arm_private::edsp_enabled; }
109 #else
110 inline bool supports_edsp() { return false; }
111 #endif
113 #if defined(MOZILLA_PRESUME_ARMV6)
114 # define MOZILLA_MAY_SUPPORT_ARMV6 1
115 inline bool supports_armv6() { return true; }
116 #elif defined(MOZILLA_MAY_SUPPORT_ARMV6) && \
117 defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
118 inline bool supports_armv6() { return arm_private::armv6_enabled; }
119 #else
120 inline bool supports_armv6() { return false; }
121 #endif
123 #if defined(MOZILLA_PRESUME_ARMV7)
124 # define MOZILLA_MAY_SUPPORT_ARMV7 1
125 inline bool supports_armv7() { return true; }
126 #elif defined(MOZILLA_MAY_SUPPORT_ARMV7) && \
127 defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
128 inline bool supports_armv7() { return arm_private::armv7_enabled; }
129 #else
130 inline bool supports_armv7() { return false; }
131 #endif
133 #if defined(MOZILLA_PRESUME_NEON)
134 # define MOZILLA_MAY_SUPPORT_NEON 1
135 inline bool supports_neon() { return true; }
136 #elif defined(MOZILLA_MAY_SUPPORT_NEON) && \
137 defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
138 inline bool supports_neon() { return arm_private::neon_enabled; }
139 #else
140 inline bool supports_neon() { return false; }
141 #endif
143 } // namespace mozilla
145 #endif /* !defined(mozilla_arm_h_) */