cpu-features.h revision 4fdbadde921ec17b4ff9e97fbd41096903b21772
1e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/*
2e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * Copyright (C) 2008 The Android Open Source Project
3e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * All rights reserved.
4e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
5e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * Redistribution and use in source and binary forms, with or without
6e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * modification, are permitted provided that the following conditions
7e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * are met:
8e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *  * Redistributions of source code must retain the above copyright
9e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *    notice, this list of conditions and the following disclaimer.
10e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *  * Redistributions in binary form must reproduce the above copyright
11e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *    notice, this list of conditions and the following disclaimer in
12e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *    the documentation and/or other materials provided with the
13e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *    distribution.
14e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
15e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * SUCH DAMAGE.
27e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
28e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#ifndef _ARM_MACHINE_CPU_FEATURES_H
29e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#define _ARM_MACHINE_CPU_FEATURES_H
30e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
31e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* The purpose of this file is to define several macros corresponding
32e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * to CPU features that may or may not be available at build time on
33e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * on the target CPU.
34e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
35e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * This is done to abstract us from the various ARM Architecture
36e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * quirks and alphabet soup.
37e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
38e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * IMPORTANT: We have no intention to support anything below an ARMv4T !
39e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
40e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
414fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden/* __ARM_ARCH__ is a number corresponding to the ARM revision
42e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * we're going to support
43e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
44e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * it looks like our toolchain doesn't define __ARM_ARCH__
45e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * so try to guess it.
46e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
47e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
48e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
49e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
50e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#ifndef __ARM_ARCH__
51e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
52e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  if defined __ARM_ARCH_7__   || defined __ARM_ARCH_7A__ || \
53e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru      defined __ARM_ARCH_7R__  || defined __ARM_ARCH_7M__
54e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
55e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    define __ARM_ARCH__ 7
56e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
57e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  elif defined __ARM_ARCH_6__   || defined __ARM_ARCH_6J__ || \
58e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru      defined __ARM_ARCH_6K__  || defined __ARM_ARCH_6Z__ || \
59e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru      defined __ARM_ARCH_6KZ__ || defined __ARM_ARCH_6T2__
60e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
61e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    define __ARM_ARCH__ 6
62e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
63e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  elif defined __ARM_ARCH_5__ || defined __ARM_ARCH_5T__ || \
64e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru        defined __ARM_ARCH_5TE__ || defined __ARM_ARCH_5TEJ__
65e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
66e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    define __ARM_ARCH__ 5
67e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
68e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  elif defined __ARM_ARCH_4T__
69e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
70e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    define __ARM_ARCH__ 4
71e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#
72e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  elif defined __ARM_ARCH_4__
73e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    error ARMv4 is not supported, please use ARMv4T at a minimum
74e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  else
75e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    error Unknown or unsupported ARM architecture
76e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  endif
77e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
78e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
79e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* experimental feature used to check that our ARMv4 workarounds
80e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * work correctly without a real ARMv4 machine */
81e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#ifdef BIONIC_EXPERIMENTAL_FORCE_ARMV4
82e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  undef  __ARM_ARCH__
83e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define __ARM_ARCH__  4
84e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
85e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
86e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define __ARM_HAVE_5TE if we have the ARMv5TE instructions */
87e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_ARCH__ > 5
88e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_5TE  1
89e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#elif __ARM_ARCH__ == 5
90e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  if defined __ARM_ARCH_5TE__ || defined __ARM_ARCH_5TEJ__
91e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#    define __ARM_HAVE_5TE  1
92e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  endif
93e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
94e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
95e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* instructions introduced in ARMv5 */
96e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_ARCH__ >= 5
97e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_BLX  1
98e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_CLZ  1
99e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_LDC2 1
100e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_MCR2 1
101e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_MRC2 1
102e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_STC2 1
103e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
104e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
105e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* ARMv5TE introduces a few instructions */
106e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_HAVE_5TE
107e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_PLD   1
108e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_MCRR  1
109e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_MRRC  1
110e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
111e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
112e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define __ARM_HAVE_HALFWORD_MULTIPLY when half-word multiply instructions
113e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * this means variants of: smul, smulw, smla, smlaw, smlal
114e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
115e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_HAVE_5TE
116e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_HALFWORD_MULTIPLY  1
117e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
118e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
119e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define __ARM_HAVE_PAIR_LOAD_STORE when 64-bit memory loads and stored
120e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * into/from a pair of 32-bit registers is supported throuhg 'ldrd' and 'strd'
121e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
122e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_HAVE_5TE
123e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_PAIR_LOAD_STORE 1
124e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
125e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
126e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define __ARM_HAVE_SATURATED_ARITHMETIC is you have the saturated integer
127e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * arithmetic instructions: qdd, qdadd, qsub, qdsub
128e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
129e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_HAVE_5TE
130e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  __ARM_HAVE_SATURATED_ARITHMETIC 1
131e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
132e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
133e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define __ARM_HAVE_PC_INTERWORK when a direct assignment to the
134e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * pc register will switch into thumb/ARM mode depending on bit 0
135e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * of the new instruction address. Before ARMv5, this was not the
136e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * case, and you have to write:
137e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
138e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *     mov  r0, [<some address>]
139e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *     bx   r0
140e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
141e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * instead of:
142e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
143e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *     ldr  pc, [<some address>]
144e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru *
1454fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden * note that this affects any instruction that explicitly changes the
146e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * value of the pc register, including ldm { ...,pc } or 'add pc, #offset'
147e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
148e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_ARCH__ >= 5
149e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define __ARM_HAVE_PC_INTERWORK
150e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
151e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
1524fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden/* define __ARM_HAVE_LDREX_STREX for ARMv6 and ARMv7 architecture to be
1534fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden * used in replacement of deprecated swp instruction
15476ec6891e2bc18c9e12cd2f567358bb817b24cffvinay harugop */
15576ec6891e2bc18c9e12cd2f567358bb817b24cffvinay harugop#if __ARM_ARCH__ >= 6
1564fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#  define __ARM_HAVE_LDREX_STREX
1574fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#endif
1584fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden
1594fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden/* define __ARM_HAVE_DMB for ARMv7 architecture
1604fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden */
1614fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#if __ARM_ARCH__ >= 7
1624fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#  define __ARM_HAVE_DMB
1634fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#endif
1644fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden
1654fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden/* define __ARM_HAVE_LDREXD for ARMv7 architecture
1664fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden * (also present in ARMv6K, but not implemented in ARMv7-M, neither of which
1674fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden * we care about)
1684fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden */
1694fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#if __ARM_ARCH__ >= 7
1704fdbadde921ec17b4ff9e97fbd41096903b21772Andy McFadden#  define __ARM_HAVE_LDREXD
17176ec6891e2bc18c9e12cd2f567358bb817b24cffvinay harugop#endif
17276ec6891e2bc18c9e12cd2f567358bb817b24cffvinay harugop
173e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
174e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* Assembly-only macros */
175e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
176e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru/* define a handy PLD(address) macro since the cache preload
177e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru * is an optional opcode
178e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru */
179e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#if __ARM_HAVE_PLD
180e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  PLD(reg,offset)    pld    [reg, offset]
181e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#else
182e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#  define  PLD(reg,offset)    /* nothing */
183e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif
184e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru
185e0055e0f99732dbaea81fd1c7055efb7b506c221Jean-Baptiste Queru#endif /* _ARM_MACHINE_CPU_FEATURES_H */
186