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