1269956Simp/*
2269956Simp * Copyright (c) 2014 ARM Ltd
3269956Simp * All rights reserved.
4269956Simp *
5269956Simp * Redistribution and use in source and binary forms, with or without
6269956Simp * modification, are permitted provided that the following conditions
7269956Simp * are met:
8269956Simp * 1. Redistributions of source code must retain the above copyright
9269956Simp *    notice, this list of conditions and the following disclaimer.
10269956Simp * 2. Redistributions in binary form must reproduce the above copyright
11269956Simp *    notice, this list of conditions and the following disclaimer in the
12269956Simp *    documentation and/or other materials provided with the distribution.
13269956Simp * 3. The name of the company may not be used to endorse or promote
14269956Simp *    products derived from this software without specific prior written
15269956Simp *    permission.
16269956Simp *
17269956Simp * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
18269956Simp * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19269956Simp * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20269956Simp * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21269956Simp * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22269956Simp * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23269956Simp * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24269956Simp * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25269956Simp * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26269956Simp * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27269956Simp *
28269956Simp * $FreeBSD$
29269956Simp */
30269956Simp
31269956Simp#ifndef __ARM_ARCH
32269956Simp
33269956Simp/* ACLE standardises a set of pre-defines that describe the ARM architecture.
34269956Simp   These were mostly implemented in GCC around GCC-4.8; older versions
35269956Simp   have no, or only partial support.  To provide a level of backwards
36269956Simp   compatibility we try to work out what the definitions should be, given
37269956Simp   the older pre-defines that GCC did produce.  This isn't complete, but
38269956Simp   it should be enough for use by routines that depend on this header.  */
39269956Simp
40269956Simp/* No need to handle ARMv8, GCC had ACLE support before that.  */
41269956Simp
42269956Simp#define __ARM_ACLE 101
43269956Simp
44269956Simp# ifdef __ARM_ARCH_7__
45269956Simp/* The common subset of ARMv7 in all profiles.  */
46269956Simp#  define __ARM_ARCH 7
47269956Simp#  define __ARM_ARCH_ISA_THUMB 2
48269956Simp#  define __ARM_FEATURE_CLZ
49269956Simp#  define __ARM_FEATURE_LDREX 7
50269956Simp#  define __ARM_FEATURE_UNALIGNED
51269956Simp# endif
52269956Simp
53269956Simp# if defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7R__)
54269956Simp#  define __ARM_ARCH 7
55269956Simp#  define __ARM_ARCH_ISA_THUMB 2
56269956Simp#  define __ARM_ARCH_ISA_ARM
57269956Simp#  define __ARM_FEATURE_CLZ
58269956Simp#  define __ARM_FEATURE_SIMD32
59269956Simp#  define __ARM_FEATURE_DSP
60269956Simp#  define __ARM_FEATURE_QBIT
61269956Simp#  define __ARM_FEATURE_SAT
62269956Simp#  define __ARM_FEATURE_LDREX 15
63269956Simp#  define __ARM_FEATURE_UNALIGNED
64269956Simp#  ifdef __ARM_ARCH_7A__
65269956Simp#   define __ARM_ARCH_PROFILE 'A'
66269956Simp#  else
67269956Simp#   define __ARM_ARCH_PROFILE 'R'
68269956Simp#  endif
69269956Simp# endif
70269956Simp
71269956Simp# ifdef __ARM_ARCH_7EM__
72269956Simp#  define __ARM_ARCH 7
73269956Simp#  define __ARM_ARCH_ISA_THUMB 2
74269956Simp#  define __ARM_FEATURE_CLZ
75269956Simp#  define __ARM_FEATURE_SIMD32
76269956Simp#  define __ARM_FEATURE_DSP
77269956Simp#  define __ARM_FEATURE_QBIT
78269956Simp#  define __ARM_FEATURE_SAT
79269956Simp#  define __ARM_FEATURE_LDREX 7
80269956Simp#  define __ARM_FEATURE_UNALIGNED
81269956Simp#  define __ARM_ARCH_PROFILE 'M'
82269956Simp# endif
83269956Simp
84269956Simp# ifdef __ARM_ARCH_7M__
85269956Simp#  define __ARM_ARCH 7
86269956Simp#  define __ARM_ARCH_ISA_THUMB 2
87269956Simp#  define __ARM_FEATURE_CLZ
88269956Simp#  define __ARM_FEATURE_QBIT
89269956Simp#  define __ARM_FEATURE_SAT
90269956Simp#  define __ARM_FEATURE_LDREX 7
91269956Simp#  define __ARM_FEATURE_UNALIGNED
92269956Simp#  define __ARM_ARCH_PROFILE 'M'
93269956Simp# endif
94269956Simp
95269956Simp# ifdef __ARM_ARCH_6T2__
96269956Simp#  define __ARM_ARCH 6
97269956Simp#  define __ARM_ARCH_ISA_THUMB 2
98269956Simp#  define __ARM_ARCH_ISA_ARM
99269956Simp#  define __ARM_FEATURE_CLZ
100269956Simp#  define __ARM_FEATURE_SIMD32
101269956Simp#  define __ARM_FEATURE_DSP
102269956Simp#  define __ARM_FEATURE_QBIT
103269956Simp#  define __ARM_FEATURE_SAT
104269956Simp#  define __ARM_FEATURE_LDREX 4
105269956Simp#  define __ARM_FEATURE_UNALIGNED
106269956Simp# endif
107269956Simp
108269956Simp# ifdef __ARM_ARCH_6M__
109269956Simp#  define __ARM_ARCH 6
110269956Simp#  define __ARM_ARCH_ISA_THUMB 1
111269956Simp#  define __ARM_ARCH_PROFILE 'M'
112269956Simp# endif
113269956Simp
114269956Simp# if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) \
115269956Simp  || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6Z__) \
116269956Simp  || defined (__ARM_ARCH_6ZK__)
117269956Simp#  define __ARM_ARCH 6
118269956Simp#  define __ARM_ARCH_ISA_THUMB 1
119269956Simp#  define __ARM_ARCH_ISA_ARM
120269956Simp#  define __ARM_FEATURE_CLZ
121269956Simp#  define __ARM_FEATURE_SIMD32
122269956Simp#  define __ARM_FEATURE_DSP
123269956Simp#  define __ARM_FEATURE_QBIT
124269956Simp#  define __ARM_FEATURE_SAT
125269956Simp#  define __ARM_FEATURE_UNALIGNED
126269956Simp#  ifndef __thumb__
127269956Simp#   if defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__)
128269956Simp#    define __ARM_FEATURE_LDREX 15
129269956Simp#   else
130269956Simp#    define __ARM_FEATURE_LDREX 4
131269956Simp#   endif
132269956Simp#  endif
133269956Simp# endif
134269956Simp
135269956Simp# if defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5E__)
136269956Simp#  define __ARM_ARCH 5
137269956Simp#  define __ARM_ARCH_ISA_ARM
138269956Simp#  ifdef __ARM_ARCH_5TE__
139269956Simp#   define __ARM_ARCH_ISA_THUMB 1
140269956Simp#  endif
141269956Simp#  define __ARM_FEATURE_CLZ
142269956Simp#  define __ARM_FEATURE_DSP
143269956Simp# endif
144269956Simp
145269956Simp# if defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5__)
146269956Simp#  define __ARM_ARCH 5
147269956Simp#  define __ARM_ARCH_ISA_ARM
148269956Simp#  ifdef __ARM_ARCH_5TE__
149269956Simp#   define __ARM_ARCH_ISA_THUMB 1
150269956Simp#  endif
151269956Simp#  define __ARM_FEATURE_CLZ
152269956Simp# endif
153269956Simp
154269956Simp# ifdef __ARM_ARCH_4T__
155269956Simp#  define __ARM_ARCH 4
156269956Simp#  define __ARM_ARCH_ISA_ARM
157269956Simp#  define __ARM_ARCH_ISA_THUMB 1
158269956Simp# endif
159269956Simp
160269956Simp# ifdef __ARM_ARCH_4__
161269956Simp#  define __ARM_ARCH 4
162269956Simp#  define __ARM_ARCH_ISA_ARM
163269956Simp# endif
164269956Simp
165269956Simp# if defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__)
166269956Simp#  define __ARM_ARCH 3
167269956Simp#  define __ARM_ARCH_ISA_ARM
168269956Simp# endif
169269956Simp
170269956Simp# ifdef __ARM_ARCH_2__
171269956Simp#  define __ARM_ARCH 2
172269956Simp#  define __ARM_ARCH_ISA_ARM
173269956Simp# endif
174269956Simp
175269956Simp# ifdef __ARMEB__
176269956Simp#  define __ARM_BIG_ENDIAN
177269956Simp# endif
178269956Simp
179269956Simp/* If we still don't know what the target architecture is, then we're
180269956Simp   probably not using GCC.  */
181269956Simp# ifndef __ARM_ARCH
182269956Simp#  error Unable to determine architecture version.
183269956Simp# endif
184269956Simp
185269956Simp#endif /* __ARM_ARCH  */
186