Line data Source code
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/. */
4 :
5 : /* compile-time and runtime tests for whether to use SSE instructions */
6 :
7 : #ifndef mozilla_arm_h_
8 : #define mozilla_arm_h_
9 :
10 : // for definition of MFBT_DATA
11 : #include "mozilla/Types.h"
12 :
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.
20 :
21 : TODO: Add Thumb, Thumb2, VFP, iwMMX, etc. detection, if we need it. */
22 :
23 : #if defined(__GNUC__) && defined(__arm__)
24 :
25 : # define MOZILLA_ARM_ARCH 3
26 :
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
32 :
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
39 :
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
47 :
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
54 :
55 :
56 : # ifdef __GNUC__
57 : # define MOZILLA_MAY_SUPPORT_EDSP 1
58 :
59 : # if defined(HAVE_ARM_SIMD)
60 : # define MOZILLA_MAY_SUPPORT_ARMV6 1
61 : # endif
62 :
63 : # if defined(HAVE_ARM_NEON)
64 : # define MOZILLA_MAY_SUPPORT_NEON 1
65 : # endif
66 :
67 : # if defined(HAVE_ARM_SIMD)
68 : # define MOZILLA_MAY_SUPPORT_ARMV7 1
69 : # endif
70 : # endif
71 :
72 : // Currently we only have CPU detection for Linux via /proc/cpuinfo
73 : # if defined(__linux__) || defined(ANDROID)
74 : # define MOZILLA_ARM_HAVE_CPUID_DETECTION 1
75 : # endif
76 :
77 : #endif
78 :
79 : // When using -mfpu=neon on arm gcc, or using default on aarch64,
80 : // the compiler generates neon instructions.
81 : #if defined(__ARM_NEON)
82 : # define MOZILLA_PRESUME_NEON 1
83 : #endif
84 :
85 : namespace mozilla {
86 :
87 : namespace arm_private {
88 : #if defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
89 : #if !defined(MOZILLA_PRESUME_EDSP)
90 : extern bool MFBT_DATA edsp_enabled;
91 : #endif
92 : #if !defined(MOZILLA_PRESUME_ARMV6)
93 : extern bool MFBT_DATA armv6_enabled;
94 : #endif
95 : #if !defined(MOZILLA_PRESUME_ARMV7)
96 : extern bool MFBT_DATA armv7_enabled;
97 : #endif
98 : #if !defined(MOZILLA_PRESUME_NEON)
99 : extern bool MFBT_DATA neon_enabled;
100 : #endif
101 : #endif
102 : } // namespace arm_private
103 :
104 : #if defined(MOZILLA_PRESUME_EDSP)
105 : # define MOZILLA_MAY_SUPPORT_EDSP 1
106 : inline bool supports_edsp() { return true; }
107 : #elif defined(MOZILLA_MAY_SUPPORT_EDSP) \
108 : && defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
109 : inline bool supports_edsp() { return arm_private::edsp_enabled; }
110 : #else
111 1 : inline bool supports_edsp() { return false; }
112 : #endif
113 :
114 : #if defined(MOZILLA_PRESUME_ARMV6)
115 : # define MOZILLA_MAY_SUPPORT_ARMV6 1
116 : inline bool supports_armv6() { return true; }
117 : #elif defined(MOZILLA_MAY_SUPPORT_ARMV6) \
118 : && defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
119 : inline bool supports_armv6() { return arm_private::armv6_enabled; }
120 : #else
121 1 : inline bool supports_armv6() { return false; }
122 : #endif
123 :
124 : #if defined(MOZILLA_PRESUME_ARMV7)
125 : # define MOZILLA_MAY_SUPPORT_ARMV7 1
126 : inline bool supports_armv7() { return true; }
127 : #elif defined(MOZILLA_MAY_SUPPORT_ARMV7) \
128 : && defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
129 : inline bool supports_armv7() { return arm_private::armv7_enabled; }
130 : #else
131 1 : inline bool supports_armv7() { return false; }
132 : #endif
133 :
134 : #if defined(MOZILLA_PRESUME_NEON)
135 : # define MOZILLA_MAY_SUPPORT_NEON 1
136 : inline bool supports_neon() { return true; }
137 : #elif defined(MOZILLA_MAY_SUPPORT_NEON) \
138 : && defined(MOZILLA_ARM_HAVE_CPUID_DETECTION)
139 : inline bool supports_neon() { return arm_private::neon_enabled; }
140 : #else
141 1 : inline bool supports_neon() { return false; }
142 : #endif
143 :
144 : } // namespace mozilla
145 :
146 : #endif /* !defined(mozilla_arm_h_) */
|