198b9484cSchristos /* ARM assembler/disassembler support. 2*02f41505Schristos Copyright (C) 2004-2024 Free Software Foundation, Inc. 398b9484cSchristos 498b9484cSchristos This file is part of GDB and GAS. 598b9484cSchristos 698b9484cSchristos GDB and GAS are free software; you can redistribute it and/or 798b9484cSchristos modify it under the terms of the GNU General Public License as 898b9484cSchristos published by the Free Software Foundation; either version 3, or (at 998b9484cSchristos your option) any later version. 1098b9484cSchristos 1198b9484cSchristos GDB and GAS are distributed in the hope that it will be useful, but 1298b9484cSchristos WITHOUT ANY WARRANTY; without even the implied warranty of 1398b9484cSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1498b9484cSchristos General Public License for more details. 1598b9484cSchristos 1698b9484cSchristos You should have received a copy of the GNU General Public License 1798b9484cSchristos along with GDB or GAS; see the file COPYING3. If not, write to the 1898b9484cSchristos Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, 1998b9484cSchristos MA 02110-1301, USA. */ 2098b9484cSchristos 2198b9484cSchristos /* The following bitmasks control CPU extensions: */ 2298b9484cSchristos #define ARM_EXT_V1 0x00000001 /* All processors (core set). */ 2398b9484cSchristos #define ARM_EXT_V2 0x00000002 /* Multiply instructions. */ 2498b9484cSchristos #define ARM_EXT_V2S 0x00000004 /* SWP instructions. */ 2598b9484cSchristos #define ARM_EXT_V3 0x00000008 /* MSR MRS. */ 2698b9484cSchristos #define ARM_EXT_V3M 0x00000010 /* Allow long multiplies. */ 2798b9484cSchristos #define ARM_EXT_V4 0x00000020 /* Allow half word loads. */ 2898b9484cSchristos #define ARM_EXT_V4T 0x00000040 /* Thumb. */ 2998b9484cSchristos #define ARM_EXT_V5 0x00000080 /* Allow CLZ, etc. */ 3098b9484cSchristos #define ARM_EXT_V5T 0x00000100 /* Improved interworking. */ 3198b9484cSchristos #define ARM_EXT_V5ExP 0x00000200 /* DSP core set. */ 3298b9484cSchristos #define ARM_EXT_V5E 0x00000400 /* DSP Double transfers. */ 3398b9484cSchristos #define ARM_EXT_V5J 0x00000800 /* Jazelle extension. */ 3498b9484cSchristos #define ARM_EXT_V6 0x00001000 /* ARM V6. */ 3598b9484cSchristos #define ARM_EXT_V6K 0x00002000 /* ARM V6K. */ 36ba340e45Schristos #define ARM_EXT_V8 0x00004000 /* ARMv8 w/o atomics. */ 3798b9484cSchristos #define ARM_EXT_V6T2 0x00008000 /* Thumb-2. */ 3898b9484cSchristos #define ARM_EXT_DIV 0x00010000 /* Integer division. */ 3998b9484cSchristos /* The 'M' in Arm V7M stands for Microcontroller. 4098b9484cSchristos On earlier architecture variants it stands for Multiply. */ 4198b9484cSchristos #define ARM_EXT_V5E_NOTM 0x00020000 /* Arm V5E but not Arm V7M. */ 4298b9484cSchristos #define ARM_EXT_V6_NOTM 0x00040000 /* Arm V6 but not Arm V7M. */ 4398b9484cSchristos #define ARM_EXT_V7 0x00080000 /* Arm V7. */ 4498b9484cSchristos #define ARM_EXT_V7A 0x00100000 /* Arm V7A. */ 4598b9484cSchristos #define ARM_EXT_V7R 0x00200000 /* Arm V7R. */ 4698b9484cSchristos #define ARM_EXT_V7M 0x00400000 /* Arm V7M. */ 4798b9484cSchristos #define ARM_EXT_V6M 0x00800000 /* ARM V6M. */ 4898b9484cSchristos #define ARM_EXT_BARRIER 0x01000000 /* DSB/DMB/ISB. */ 4998b9484cSchristos #define ARM_EXT_THUMB_MSR 0x02000000 /* Thumb MSR/MRS. */ 5098b9484cSchristos #define ARM_EXT_V6_DSP 0x04000000 /* ARM v6 (DSP-related), 5198b9484cSchristos not in v7-M. */ 5298b9484cSchristos #define ARM_EXT_MP 0x08000000 /* Multiprocessing Extensions. */ 5398b9484cSchristos #define ARM_EXT_SEC 0x10000000 /* Security extensions. */ 5498b9484cSchristos #define ARM_EXT_OS 0x20000000 /* OS Extensions. */ 5598b9484cSchristos #define ARM_EXT_ADIV 0x40000000 /* Integer divide extensions in ARM 5698b9484cSchristos state. */ 5798b9484cSchristos #define ARM_EXT_VIRT 0x80000000 /* Virtualization extensions. */ 5898b9484cSchristos 59212397c6Schristos #define ARM_EXT2_PAN 0x00000001 /* PAN extension. */ 60ba340e45Schristos #define ARM_EXT2_V8_2A 0x00000002 /* ARM V8.2A. */ 61ba340e45Schristos #define ARM_EXT2_V8M 0x00000004 /* ARM V8M. */ 62ba340e45Schristos #define ARM_EXT2_ATOMICS 0x00000008 /* ARMv8 atomics. */ 63ba340e45Schristos #define ARM_EXT2_V6T2_V8M 0x00000010 /* V8M Baseline from V6T2. */ 64ba340e45Schristos #define ARM_EXT2_FP16_INST 0x00000020 /* ARM V8.2A FP16 instructions. */ 65ba340e45Schristos #define ARM_EXT2_V8M_MAIN 0x00000040 /* ARMv8-M Mainline. */ 66ba340e45Schristos #define ARM_EXT2_RAS 0x00000080 /* RAS extension. */ 67796c32c9Schristos #define ARM_EXT2_V8_3A 0x00000100 /* ARM V8.3A. */ 684559860eSchristos #define ARM_EXT2_V8A 0x00000200 /* ARMv8-A. */ 694559860eSchristos #define ARM_EXT2_V8_4A 0x00000400 /* ARM V8.4A. */ 704559860eSchristos #define ARM_EXT2_FP16_FML 0x00000800 /* ARM V8.2A FP16-FML 714559860eSchristos instructions. */ 724559860eSchristos #define ARM_EXT2_V8_5A 0x00001000 /* ARM V8.5A. */ 734559860eSchristos #define ARM_EXT2_SB 0x00002000 /* Speculation Barrier instruction. */ 744559860eSchristos #define ARM_EXT2_PREDRES 0x00004000 /* Prediction Restriction insns. */ 758dffb485Schristos #define ARM_EXT2_V8_1M_MAIN 0x00008000 /* ARMv8.1-M Mainline. */ 768dffb485Schristos #define ARM_EXT2_V8_6A 0x00010000 /* ARM V8.6A. */ 778dffb485Schristos #define ARM_EXT2_BF16 0x00020000 /* ARMv8 bfloat16. */ 788dffb485Schristos #define ARM_EXT2_I8MM 0x00040000 /* ARMv8.6A i8mm. */ 798dffb485Schristos #define ARM_EXT2_CRC 0x00080000 /* ARMv8 CRC32 */ 808dffb485Schristos #define ARM_EXT2_MVE 0x00100000 /* MVE Integer extension. */ 818dffb485Schristos #define ARM_EXT2_MVE_FP 0x00200000 /* MVE Floating Point extension. */ 828dffb485Schristos #define ARM_EXT2_CDE 0x00400000 /* Custom Datapath Extension. */ 838dffb485Schristos #define ARM_EXT2_CDE0 0x00800000 /* Using CDE coproc 0. */ 848dffb485Schristos #define ARM_EXT2_CDE1 0x01000000 /* Using CDE coproc 1. */ 858dffb485Schristos #define ARM_EXT2_CDE2 0x02000000 /* Using CDE coproc 2. */ 868dffb485Schristos #define ARM_EXT2_CDE3 0x04000000 /* Using CDE coproc 3. */ 878dffb485Schristos #define ARM_EXT2_CDE4 0x08000000 /* Using CDE coproc 4. */ 888dffb485Schristos #define ARM_EXT2_CDE5 0x10000000 /* Using CDE coproc 5. */ 898dffb485Schristos #define ARM_EXT2_CDE6 0x20000000 /* Using CDE coproc 6. */ 908dffb485Schristos #define ARM_EXT2_CDE7 0x40000000 /* Using CDE coproc 7. */ 918dffb485Schristos #define ARM_EXT2_V8R 0x80000000 /* Arm V8R. */ 92212397c6Schristos 934b169a6bSchristos #define ARM_EXT3_PACBTI 0x00000001 /* Arm v8-M Mainline Pointer 944b169a6bSchristos Authentication and Branch 954b169a6bSchristos Target Identification 964b169a6bSchristos Extension. */ 974b169a6bSchristos #define ARM_EXT3_V9A 0x00000002 /* Armv9-A. */ 984b169a6bSchristos 9998b9484cSchristos /* Co-processor space extensions. */ 10098b9484cSchristos #define ARM_CEXT_XSCALE 0x00000001 /* Allow MIA etc. */ 101*02f41505Schristos /* unused 0x00000002 */ 1024559860eSchristos #define ARM_CEXT_IWMMXT 0x00000004 /* Intel Wireless MMX technology 1034559860eSchristos coprocessor. */ 1044559860eSchristos #define ARM_CEXT_IWMMXT2 0x00000008 /* Intel Wireless MMX technology 1054559860eSchristos coprocessor version 2. */ 10698b9484cSchristos 10798b9484cSchristos #define FPU_ENDIAN_PURE 0x80000000 /* Pure-endian doubles. */ 10898b9484cSchristos #define FPU_FPA_EXT_V1 0x40000000 /* Base FPA instruction set. */ 10998b9484cSchristos #define FPU_FPA_EXT_V2 0x20000000 /* LFM/SFM. */ 110*02f41505Schristos /* unused 0x10000000 */ 11198b9484cSchristos #define FPU_VFP_EXT_V1xD 0x08000000 /* Base VFP instruction set. */ 11298b9484cSchristos #define FPU_VFP_EXT_V1 0x04000000 /* Double-precision insns. */ 11398b9484cSchristos #define FPU_VFP_EXT_V2 0x02000000 /* ARM10E VFPr1. */ 11498b9484cSchristos #define FPU_VFP_EXT_V3xD 0x01000000 /* VFPv3 single-precision. */ 11598b9484cSchristos #define FPU_VFP_EXT_V3 0x00800000 /* VFPv3 double-precision. */ 11698b9484cSchristos #define FPU_NEON_EXT_V1 0x00400000 /* Neon (SIMD) insns. */ 11798b9484cSchristos #define FPU_VFP_EXT_D32 0x00200000 /* Registers D16-D31. */ 11898b9484cSchristos #define FPU_VFP_EXT_FP16 0x00100000 /* Half-precision extensions. */ 1194559860eSchristos #define FPU_NEON_EXT_FMA 0x00080000 /* Neon fused multiply-add. */ 1204559860eSchristos #define FPU_VFP_EXT_FMA 0x00040000 /* VFP fused multiply-add. */ 121968cf8f2Schristos #define FPU_VFP_EXT_ARMV8 0x00020000 /* Double-precision FP for ARMv8. */ 122a2e2270fSchristos #define FPU_NEON_EXT_ARMV8 0x00010000 /* Neon for ARMv8. */ 123a2e2270fSchristos #define FPU_CRYPTO_EXT_ARMV8 0x00008000 /* Crypto for ARMv8. */ 1248dffb485Schristos /* Unused 0x00004000 */ 125968cf8f2Schristos #define FPU_VFP_EXT_ARMV8xD 0x00002000 /* Single-precision FP for ARMv8. */ 126212397c6Schristos #define FPU_NEON_EXT_RDMA 0x00001000 /* v8.1 Adv.SIMD extensions. */ 1274559860eSchristos #define FPU_NEON_EXT_DOTPROD 0x00000800 /* Dot Product extension. */ 12898b9484cSchristos 12998b9484cSchristos /* Architectures are the sum of the base and extensions. The ARM ARM (rev E) 13098b9484cSchristos defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T, 13198b9484cSchristos ARMv5xM, ARMv5, ARMv5TxM, ARMv5T, ARMv5TExP, ARMv5TE. To these we add 13298b9484cSchristos three more to cover cores prior to ARM6. Finally, there are cores which 13398b9484cSchristos implement further extensions in the co-processor space. */ 13498b9484cSchristos #define ARM_AEXT_V1 ARM_EXT_V1 13598b9484cSchristos #define ARM_AEXT_V2 (ARM_AEXT_V1 | ARM_EXT_V2) 13698b9484cSchristos #define ARM_AEXT_V2S (ARM_AEXT_V2 | ARM_EXT_V2S) 13798b9484cSchristos #define ARM_AEXT_V3 (ARM_AEXT_V2S | ARM_EXT_V3) 13898b9484cSchristos #define ARM_AEXT_V3M (ARM_AEXT_V3 | ARM_EXT_V3M) 13998b9484cSchristos #define ARM_AEXT_V4xM (ARM_AEXT_V3 | ARM_EXT_V4) 14098b9484cSchristos #define ARM_AEXT_V4 (ARM_AEXT_V3M | ARM_EXT_V4) 1414559860eSchristos #define ARM_AEXT_V4TxM (ARM_AEXT_V4xM | ARM_EXT_V4T | ARM_EXT_OS) 1424559860eSchristos #define ARM_AEXT_V4T (ARM_AEXT_V4 | ARM_EXT_V4T | ARM_EXT_OS) 14398b9484cSchristos #define ARM_AEXT_V5xM (ARM_AEXT_V4xM | ARM_EXT_V5) 14498b9484cSchristos #define ARM_AEXT_V5 (ARM_AEXT_V4 | ARM_EXT_V5) 1454559860eSchristos #define ARM_AEXT_V5TxM (ARM_AEXT_V5xM | ARM_EXT_V4T | ARM_EXT_V5T \ 1464559860eSchristos | ARM_EXT_OS) 1474559860eSchristos #define ARM_AEXT_V5T (ARM_AEXT_V5 | ARM_EXT_V4T | ARM_EXT_V5T \ 1484559860eSchristos | ARM_EXT_OS) 14998b9484cSchristos #define ARM_AEXT_V5TExP (ARM_AEXT_V5T | ARM_EXT_V5ExP) 15098b9484cSchristos #define ARM_AEXT_V5TE (ARM_AEXT_V5TExP | ARM_EXT_V5E) 15198b9484cSchristos #define ARM_AEXT_V5TEJ (ARM_AEXT_V5TE | ARM_EXT_V5J) 15298b9484cSchristos #define ARM_AEXT_V6 (ARM_AEXT_V5TEJ | ARM_EXT_V6) 15398b9484cSchristos #define ARM_AEXT_V6K (ARM_AEXT_V6 | ARM_EXT_V6K) 15498b9484cSchristos #define ARM_AEXT_V6Z (ARM_AEXT_V6K | ARM_EXT_SEC) 155ba340e45Schristos #define ARM_AEXT_V6KZ (ARM_AEXT_V6K | ARM_EXT_SEC) 1564559860eSchristos #define ARM_AEXT_V6T2 (ARM_AEXT_V6 | ARM_EXT_V6T2 | ARM_EXT_V6_NOTM \ 1574559860eSchristos | ARM_EXT_THUMB_MSR \ 15898b9484cSchristos | ARM_EXT_V6_DSP ) 15998b9484cSchristos #define ARM_AEXT_V6KT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K) 16098b9484cSchristos #define ARM_AEXT_V6ZT2 (ARM_AEXT_V6T2 | ARM_EXT_SEC) 161ba340e45Schristos #define ARM_AEXT_V6KZT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K | ARM_EXT_SEC) 16298b9484cSchristos #define ARM_AEXT_V7_ARM (ARM_AEXT_V6KT2 | ARM_EXT_V7 | ARM_EXT_BARRIER) 16398b9484cSchristos #define ARM_AEXT_V7A (ARM_AEXT_V7_ARM | ARM_EXT_V7A) 16403467a24Schristos #define ARM_AEXT_V7VE (ARM_AEXT_V7A | ARM_EXT_DIV | ARM_EXT_ADIV \ 1654559860eSchristos | ARM_EXT_VIRT | ARM_EXT_SEC \ 1664559860eSchristos | ARM_EXT_MP) 16798b9484cSchristos #define ARM_AEXT_V7R (ARM_AEXT_V7_ARM | ARM_EXT_V7R | ARM_EXT_DIV) 1684559860eSchristos #define ARM_AEXT_NOTM (ARM_AEXT_V4 | ARM_EXT_V5ExP | ARM_EXT_V5J \ 1694559860eSchristos | ARM_EXT_V6_DSP \ 1704559860eSchristos | ARM_EXT_V6_NOTM) 1714559860eSchristos #define ARM_AEXT_V6M ((ARM_AEXT_V6K | ARM_EXT_V6M | ARM_EXT_BARRIER \ 1724559860eSchristos | ARM_EXT_THUMB_MSR) \ 1734559860eSchristos & ~(ARM_AEXT_NOTM | ARM_EXT_OS)) 17498b9484cSchristos #define ARM_AEXT_V6SM (ARM_AEXT_V6M | ARM_EXT_OS) 1754559860eSchristos #define ARM_AEXT_V7M ((ARM_AEXT_V7_ARM | ARM_EXT_V6M | ARM_EXT_V7M \ 1764559860eSchristos | ARM_EXT_DIV) \ 1774559860eSchristos & ~ARM_AEXT_NOTM) 17898b9484cSchristos #define ARM_AEXT_V7 (ARM_AEXT_V7A & ARM_AEXT_V7R & ARM_AEXT_V7M) 1794559860eSchristos #define ARM_AEXT_V7EM (ARM_AEXT_V7M | ARM_EXT_V5ExP | ARM_EXT_V6_DSP) 1804559860eSchristos #define ARM_AEXT_V8A (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC \ 1814559860eSchristos | ARM_EXT_DIV | ARM_EXT_ADIV \ 182a2e2270fSchristos | ARM_EXT_VIRT | ARM_EXT_V8) 1834559860eSchristos #define ARM_AEXT2_V8AR (ARM_EXT2_V6T2_V8M | ARM_EXT2_ATOMICS) 1844559860eSchristos #define ARM_AEXT2_V8A (ARM_AEXT2_V8AR | ARM_EXT2_V8A) 185ba340e45Schristos #define ARM_AEXT2_V8_1A (ARM_AEXT2_V8A | ARM_EXT2_PAN) 186ba340e45Schristos #define ARM_AEXT2_V8_2A (ARM_AEXT2_V8_1A | ARM_EXT2_V8_2A | ARM_EXT2_RAS) 187796c32c9Schristos #define ARM_AEXT2_V8_3A (ARM_AEXT2_V8_2A | ARM_EXT2_V8_3A) 1884559860eSchristos #define ARM_AEXT2_V8_4A (ARM_AEXT2_V8_3A | ARM_EXT2_FP16_FML \ 1894559860eSchristos | ARM_EXT2_V8_4A) 1904559860eSchristos #define ARM_AEXT2_V8_5A (ARM_AEXT2_V8_4A | ARM_EXT2_V8_5A | ARM_EXT2_SB \ 1914559860eSchristos | ARM_EXT2_PREDRES) 1928dffb485Schristos #define ARM_AEXT2_V8_6A (ARM_AEXT2_V8_5A | ARM_EXT2_V8_6A | ARM_EXT2_BF16) 193ba340e45Schristos #define ARM_AEXT_V8M_BASE (ARM_AEXT_V6SM | ARM_EXT_DIV) 194ba340e45Schristos #define ARM_AEXT_V8M_MAIN ARM_AEXT_V7M 195796c32c9Schristos #define ARM_AEXT_V8M_MAIN_DSP ARM_AEXT_V7EM 1964559860eSchristos #define ARM_AEXT2_V8M_BASE (ARM_EXT2_V8M | ARM_EXT2_ATOMICS \ 1974559860eSchristos | ARM_EXT2_V6T2_V8M) 1984559860eSchristos #define ARM_AEXT2_V8M_MAIN (ARM_AEXT2_V8M_BASE | ARM_EXT2_V8M_MAIN) 199796c32c9Schristos #define ARM_AEXT2_V8M_MAIN_DSP ARM_AEXT2_V8M_MAIN 2004559860eSchristos #define ARM_AEXT_V8R ARM_AEXT_V8A 2018dffb485Schristos #define ARM_AEXT2_V8R (ARM_EXT2_V8R | ARM_AEXT2_V8AR) 2028dffb485Schristos #define ARM_AEXT_V8_1M_MAIN ARM_AEXT_V8M_MAIN 2038dffb485Schristos #define ARM_AEXT2_V8_1M_MAIN (ARM_AEXT2_V8M_MAIN | ARM_EXT2_V8_1M_MAIN \ 2048dffb485Schristos | ARM_EXT2_FP16_INST) 20598b9484cSchristos 2064b169a6bSchristos #define ARM_AEXT3_V8_1M_MAIN_PACBTI (ARM_AEXT2_V8M_MAIN | ARM_EXT3_PACBTI) 2074b169a6bSchristos 20898b9484cSchristos /* Processors with specific extensions in the co-processor space. */ 209212397c6Schristos #define ARM_ARCH_XSCALE ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE) 21098b9484cSchristos #define ARM_ARCH_IWMMXT \ 211212397c6Schristos ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT) 21298b9484cSchristos #define ARM_ARCH_IWMMXT2 \ 213212397c6Schristos ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT \ 214212397c6Schristos | ARM_CEXT_IWMMXT2) 21598b9484cSchristos 21698b9484cSchristos #define FPU_VFP_V1xD (FPU_VFP_EXT_V1xD | FPU_ENDIAN_PURE) 21798b9484cSchristos #define FPU_VFP_V1 (FPU_VFP_V1xD | FPU_VFP_EXT_V1) 21898b9484cSchristos #define FPU_VFP_V2 (FPU_VFP_V1 | FPU_VFP_EXT_V2) 2194559860eSchristos #define FPU_VFP_V3D16 (FPU_VFP_V2 | FPU_VFP_EXT_V3xD \ 2204559860eSchristos | FPU_VFP_EXT_V3) 22198b9484cSchristos #define FPU_VFP_V3 (FPU_VFP_V3D16 | FPU_VFP_EXT_D32) 2224559860eSchristos #define FPU_VFP_V3xD (FPU_VFP_V1xD | FPU_VFP_EXT_V2 \ 2234559860eSchristos | FPU_VFP_EXT_V3xD) 2244559860eSchristos #define FPU_VFP_V4D16 (FPU_VFP_V3D16 | FPU_VFP_EXT_FP16 \ 2254559860eSchristos | FPU_VFP_EXT_FMA) 2264559860eSchristos #define FPU_VFP_V4 (FPU_VFP_V3 | FPU_VFP_EXT_FP16 \ 2274559860eSchristos | FPU_VFP_EXT_FMA) 2284559860eSchristos #define FPU_VFP_V4_SP_D16 (FPU_VFP_V3xD | FPU_VFP_EXT_FP16 \ 2294559860eSchristos | FPU_VFP_EXT_FMA) 2304559860eSchristos #define FPU_VFP_V5D16 (FPU_VFP_V4D16 | FPU_VFP_EXT_ARMV8xD \ 2314559860eSchristos | FPU_VFP_EXT_ARMV8) 232968cf8f2Schristos #define FPU_VFP_V5_SP_D16 (FPU_VFP_V4_SP_D16 | FPU_VFP_EXT_ARMV8xD) 2334559860eSchristos #define FPU_VFP_ARMV8 (FPU_VFP_V4 | FPU_VFP_EXT_ARMV8 \ 2344559860eSchristos | FPU_VFP_EXT_ARMV8xD) 2354559860eSchristos #define FPU_NEON_ARMV8 (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA \ 2364559860eSchristos | FPU_NEON_EXT_ARMV8) 2378dffb485Schristos #define FPU_NEON_ARMV8_1 (FPU_NEON_ARMV8 | FPU_NEON_EXT_RDMA) 238a2e2270fSchristos #define FPU_CRYPTO_ARMV8 (FPU_CRYPTO_EXT_ARMV8) 2394559860eSchristos #define FPU_VFP_HARD (FPU_VFP_EXT_V1xD | FPU_VFP_EXT_V1 \ 2404559860eSchristos | FPU_VFP_EXT_V2 \ 2414559860eSchristos | FPU_VFP_EXT_V3xD \ 2424559860eSchristos | FPU_VFP_EXT_FMA \ 2434559860eSchristos | FPU_NEON_EXT_FMA \ 2444559860eSchristos | FPU_VFP_EXT_V3 \ 2454559860eSchristos | FPU_NEON_EXT_V1 \ 2464559860eSchristos | FPU_VFP_EXT_D32) 24798b9484cSchristos #define FPU_FPA (FPU_FPA_EXT_V1 | FPU_FPA_EXT_V2) 24898b9484cSchristos 249a2e2270fSchristos /* Deprecated. */ 250212397c6Schristos #define FPU_ARCH_VFP ARM_FEATURE_COPROC (FPU_ENDIAN_PURE) 25198b9484cSchristos 252212397c6Schristos #define FPU_ARCH_FPE ARM_FEATURE_COPROC (FPU_FPA_EXT_V1) 253212397c6Schristos #define FPU_ARCH_FPA ARM_FEATURE_COPROC (FPU_FPA) 25498b9484cSchristos 255212397c6Schristos #define FPU_ARCH_VFP_V1xD ARM_FEATURE_COPROC (FPU_VFP_V1xD) 256212397c6Schristos #define FPU_ARCH_VFP_V1 ARM_FEATURE_COPROC (FPU_VFP_V1) 257212397c6Schristos #define FPU_ARCH_VFP_V2 ARM_FEATURE_COPROC (FPU_VFP_V2) 258212397c6Schristos #define FPU_ARCH_VFP_V3D16 ARM_FEATURE_COPROC (FPU_VFP_V3D16) 2594559860eSchristos #define FPU_ARCH_VFP_V3D16_FP16 ARM_FEATURE_COPROC (FPU_VFP_V3D16 \ 2604559860eSchristos | FPU_VFP_EXT_FP16) 261212397c6Schristos #define FPU_ARCH_VFP_V3 ARM_FEATURE_COPROC (FPU_VFP_V3) 2624559860eSchristos #define FPU_ARCH_VFP_V3_FP16 ARM_FEATURE_COPROC (FPU_VFP_V3 \ 2634559860eSchristos | FPU_VFP_EXT_FP16) 264212397c6Schristos #define FPU_ARCH_VFP_V3xD ARM_FEATURE_COPROC (FPU_VFP_V3xD) 265212397c6Schristos #define FPU_ARCH_VFP_V3xD_FP16 ARM_FEATURE_COPROC (FPU_VFP_V3xD \ 266212397c6Schristos | FPU_VFP_EXT_FP16) 267212397c6Schristos #define FPU_ARCH_NEON_V1 ARM_FEATURE_COPROC (FPU_NEON_EXT_V1) 26898b9484cSchristos #define FPU_ARCH_VFP_V3_PLUS_NEON_V1 \ 2694559860eSchristos ARM_FEATURE_COPROC (FPU_VFP_V3 \ 2704559860eSchristos | FPU_NEON_EXT_V1) 2714559860eSchristos #define FPU_ARCH_NEON_FP16 ARM_FEATURE_COPROC (FPU_VFP_V3 \ 2724559860eSchristos | FPU_NEON_EXT_V1 \ 2734559860eSchristos | FPU_VFP_EXT_FP16) 274212397c6Schristos #define FPU_ARCH_VFP_HARD ARM_FEATURE_COPROC (FPU_VFP_HARD) 275212397c6Schristos #define FPU_ARCH_VFP_V4 ARM_FEATURE_COPROC (FPU_VFP_V4) 276212397c6Schristos #define FPU_ARCH_VFP_V4D16 ARM_FEATURE_COPROC (FPU_VFP_V4D16) 277212397c6Schristos #define FPU_ARCH_VFP_V4_SP_D16 ARM_FEATURE_COPROC (FPU_VFP_V4_SP_D16) 278212397c6Schristos #define FPU_ARCH_VFP_V5D16 ARM_FEATURE_COPROC (FPU_VFP_V5D16) 279212397c6Schristos #define FPU_ARCH_VFP_V5_SP_D16 ARM_FEATURE_COPROC (FPU_VFP_V5_SP_D16) 2804559860eSchristos #define FPU_ARCH_NEON_VFP_V4 ARM_FEATURE_COPROC (FPU_VFP_V4 \ 2814559860eSchristos | FPU_NEON_EXT_V1 \ 2824559860eSchristos | FPU_NEON_EXT_FMA) 283212397c6Schristos #define FPU_ARCH_VFP_ARMV8 ARM_FEATURE_COPROC (FPU_VFP_ARMV8) 284212397c6Schristos #define FPU_ARCH_NEON_VFP_ARMV8 ARM_FEATURE_COPROC (FPU_NEON_ARMV8 \ 285212397c6Schristos | FPU_VFP_ARMV8) 286a2e2270fSchristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8 \ 2874559860eSchristos ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 \ 2884559860eSchristos | FPU_NEON_ARMV8 \ 2894559860eSchristos | FPU_VFP_ARMV8) 2904559860eSchristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD \ 2914559860eSchristos ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 \ 2924559860eSchristos | FPU_NEON_ARMV8 \ 2934559860eSchristos | FPU_VFP_ARMV8 \ 2944559860eSchristos | FPU_NEON_EXT_DOTPROD) 295212397c6Schristos #define FPU_ARCH_NEON_VFP_ARMV8_1 \ 2968dffb485Schristos ARM_FEATURE_COPROC (FPU_NEON_ARMV8_1 \ 2978dffb485Schristos | FPU_VFP_ARMV8) 298212397c6Schristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1 \ 2994559860eSchristos ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 \ 3008dffb485Schristos | FPU_NEON_ARMV8_1 \ 3014559860eSchristos | FPU_VFP_ARMV8) 30298b9484cSchristos 3038dffb485Schristos #define FPU_ARCH_DOTPROD_NEON_VFP_ARMV8 \ 3048dffb485Schristos ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD \ 3058dffb485Schristos | FPU_NEON_ARMV8_1 \ 3068dffb485Schristos | FPU_VFP_ARMV8) 3078dffb485Schristos 3088dffb485Schristos #define FPU_ARCH_NEON_VFP_ARMV8_2_FP16 \ 3098dffb485Schristos ARM_FEATURE (0, ARM_EXT2_FP16_INST, \ 3108dffb485Schristos FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8) 3118dffb485Schristos 3128dffb485Schristos #define FPU_ARCH_NEON_VFP_ARMV8_2_FP16FML \ 3138dffb485Schristos ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML, \ 3148dffb485Schristos FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8) 3158dffb485Schristos 3168dffb485Schristos #define FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML \ 3178dffb485Schristos ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML, \ 3188dffb485Schristos FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8 | FPU_NEON_EXT_DOTPROD) 3198dffb485Schristos 3208dffb485Schristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4 \ 3218dffb485Schristos ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 \ 3228dffb485Schristos | FPU_NEON_ARMV8_1 \ 3238dffb485Schristos | FPU_VFP_ARMV8 \ 3248dffb485Schristos | FPU_NEON_EXT_DOTPROD) 32598b9484cSchristos 326212397c6Schristos #define FPU_ARCH_ENDIAN_PURE ARM_FEATURE_COPROC (FPU_ENDIAN_PURE) 32798b9484cSchristos 328212397c6Schristos #define ARM_ARCH_V1 ARM_FEATURE_CORE_LOW (ARM_AEXT_V1) 329212397c6Schristos #define ARM_ARCH_V2 ARM_FEATURE_CORE_LOW (ARM_AEXT_V2) 330212397c6Schristos #define ARM_ARCH_V2S ARM_FEATURE_CORE_LOW (ARM_AEXT_V2S) 331212397c6Schristos #define ARM_ARCH_V3 ARM_FEATURE_CORE_LOW (ARM_AEXT_V3) 332212397c6Schristos #define ARM_ARCH_V3M ARM_FEATURE_CORE_LOW (ARM_AEXT_V3M) 333212397c6Schristos #define ARM_ARCH_V4xM ARM_FEATURE_CORE_LOW (ARM_AEXT_V4xM) 334212397c6Schristos #define ARM_ARCH_V4 ARM_FEATURE_CORE_LOW (ARM_AEXT_V4) 335212397c6Schristos #define ARM_ARCH_V4TxM ARM_FEATURE_CORE_LOW (ARM_AEXT_V4TxM) 336212397c6Schristos #define ARM_ARCH_V4T ARM_FEATURE_CORE_LOW (ARM_AEXT_V4T) 337212397c6Schristos #define ARM_ARCH_V5xM ARM_FEATURE_CORE_LOW (ARM_AEXT_V5xM) 338212397c6Schristos #define ARM_ARCH_V5 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5) 339212397c6Schristos #define ARM_ARCH_V5TxM ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TxM) 340212397c6Schristos #define ARM_ARCH_V5T ARM_FEATURE_CORE_LOW (ARM_AEXT_V5T) 341212397c6Schristos #define ARM_ARCH_V5TExP ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TExP) 342212397c6Schristos #define ARM_ARCH_V5TE ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TE) 343212397c6Schristos #define ARM_ARCH_V5TEJ ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TEJ) 344212397c6Schristos #define ARM_ARCH_V6 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6) 345212397c6Schristos #define ARM_ARCH_V6K ARM_FEATURE_CORE_LOW (ARM_AEXT_V6K) 346212397c6Schristos #define ARM_ARCH_V6Z ARM_FEATURE_CORE_LOW (ARM_AEXT_V6Z) 347ba340e45Schristos #define ARM_ARCH_V6KZ ARM_FEATURE_CORE_LOW (ARM_AEXT_V6KZ) 348ba340e45Schristos #define ARM_ARCH_V6T2 ARM_FEATURE_CORE (ARM_AEXT_V6T2, ARM_EXT2_V6T2_V8M) 349ba340e45Schristos #define ARM_ARCH_V6KT2 ARM_FEATURE_CORE (ARM_AEXT_V6KT2, ARM_EXT2_V6T2_V8M) 350ba340e45Schristos #define ARM_ARCH_V6ZT2 ARM_FEATURE_CORE (ARM_AEXT_V6ZT2, ARM_EXT2_V6T2_V8M) 351ba340e45Schristos #define ARM_ARCH_V6KZT2 ARM_FEATURE_CORE (ARM_AEXT_V6KZT2, ARM_EXT2_V6T2_V8M) 352212397c6Schristos #define ARM_ARCH_V6M ARM_FEATURE_CORE_LOW (ARM_AEXT_V6M) 353212397c6Schristos #define ARM_ARCH_V6SM ARM_FEATURE_CORE_LOW (ARM_AEXT_V6SM) 354ba340e45Schristos #define ARM_ARCH_V7 ARM_FEATURE_CORE (ARM_AEXT_V7, ARM_EXT2_V6T2_V8M) 355ba340e45Schristos #define ARM_ARCH_V7A ARM_FEATURE_CORE (ARM_AEXT_V7A, ARM_EXT2_V6T2_V8M) 356ba340e45Schristos #define ARM_ARCH_V7VE ARM_FEATURE_CORE (ARM_AEXT_V7VE, ARM_EXT2_V6T2_V8M) 357ba340e45Schristos #define ARM_ARCH_V7R ARM_FEATURE_CORE (ARM_AEXT_V7R, ARM_EXT2_V6T2_V8M) 358ba340e45Schristos #define ARM_ARCH_V7M ARM_FEATURE_CORE (ARM_AEXT_V7M, ARM_EXT2_V6T2_V8M) 359ba340e45Schristos #define ARM_ARCH_V7EM ARM_FEATURE_CORE (ARM_AEXT_V7EM, ARM_EXT2_V6T2_V8M) 360ba340e45Schristos #define ARM_ARCH_V8A ARM_FEATURE_CORE (ARM_AEXT_V8A, ARM_AEXT2_V8A) 3618dffb485Schristos #define ARM_ARCH_V8A_CRC ARM_FEATURE (ARM_AEXT_V8A, \ 3628dffb485Schristos ARM_AEXT2_V8A | ARM_EXT2_CRC) 3638dffb485Schristos #define ARM_ARCH_V8_1A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A \ 3648dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA) 3658dffb485Schristos #define ARM_ARCH_V8_2A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_2A \ 3668dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA) 3678dffb485Schristos #define ARM_ARCH_V8_3A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_3A \ 3688dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA) 3698dffb485Schristos #define ARM_ARCH_V8_4A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_4A \ 3708dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA \ 3714559860eSchristos | FPU_NEON_EXT_DOTPROD) 3728dffb485Schristos #define ARM_ARCH_V8_5A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_5A \ 3738dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA \ 3748dffb485Schristos | FPU_NEON_EXT_DOTPROD) 3758dffb485Schristos #define ARM_ARCH_V8_6A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_6A \ 3768dffb485Schristos | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA \ 3774559860eSchristos | FPU_NEON_EXT_DOTPROD) 3784b169a6bSchristos #define ARM_ARCH_V8_7A ARM_ARCH_V8_6A 3794b169a6bSchristos #define ARM_ARCH_V8_8A ARM_ARCH_V8_7A 380*02f41505Schristos #define ARM_ARCH_V8_9A ARM_ARCH_V8_8A 3814559860eSchristos #define ARM_ARCH_V8M_BASE ARM_FEATURE_CORE (ARM_AEXT_V8M_BASE, \ 3824559860eSchristos ARM_AEXT2_V8M_BASE) 383ba340e45Schristos #define ARM_ARCH_V8M_MAIN ARM_FEATURE_CORE (ARM_AEXT_V8M_MAIN, \ 384ba340e45Schristos ARM_AEXT2_V8M_MAIN) 385796c32c9Schristos #define ARM_ARCH_V8M_MAIN_DSP ARM_FEATURE_CORE (ARM_AEXT_V8M_MAIN_DSP, \ 386796c32c9Schristos ARM_AEXT2_V8M_MAIN_DSP) 3874559860eSchristos #define ARM_ARCH_V8R ARM_FEATURE_CORE (ARM_AEXT_V8R, ARM_AEXT2_V8R) 3888dffb485Schristos #define ARM_ARCH_V8_1M_MAIN ARM_FEATURE_CORE (ARM_AEXT_V8_1M_MAIN, \ 3898dffb485Schristos ARM_AEXT2_V8_1M_MAIN) 3904b169a6bSchristos #define ARM_ARCH_V9A ARM_FEATURE_ALL(ARM_AEXT_V8A, \ 3914b169a6bSchristos ARM_AEXT2_V8_5A | ARM_EXT2_CRC, \ 3924b169a6bSchristos ARM_EXT3_V9A, \ 3934b169a6bSchristos FPU_NEON_EXT_RDMA | FPU_NEON_EXT_DOTPROD) 3944b169a6bSchristos #define ARM_ARCH_V9_1A ARM_FEATURE_ALL (ARM_AEXT_V8A, \ 3954b169a6bSchristos ARM_AEXT2_V8_6A | ARM_EXT2_CRC, \ 3964b169a6bSchristos ARM_EXT3_V9A, \ 3974b169a6bSchristos FPU_NEON_EXT_RDMA \ 3984b169a6bSchristos | FPU_NEON_EXT_DOTPROD) 3994b169a6bSchristos #define ARM_ARCH_V9_2A ARM_ARCH_V9_1A 4004b169a6bSchristos #define ARM_ARCH_V9_3A ARM_ARCH_V9_2A 401*02f41505Schristos #define ARM_ARCH_V9_4A ARM_ARCH_V9_3A 402*02f41505Schristos #define ARM_ARCH_V9_5A ARM_ARCH_V9_4A 40398b9484cSchristos 40498b9484cSchristos /* Some useful combinations: */ 4054b169a6bSchristos #define ARM_ARCH_NONE ARM_FEATURE_ALL (0, 0, 0, 0) 4064b169a6bSchristos #define FPU_NONE ARM_FEATURE_ALL (0, 0, 0, 0) 4074b169a6bSchristos #define ARM_ARCH_UNKNOWN ARM_FEATURE_ALL (-1, -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP), -1, -1) /* Machine type is unknown. */ 4084b169a6bSchristos #define ARM_ANY ARM_FEATURE_ALL (-1, -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP), -1, 0) /* Any basic core. */ 4094b169a6bSchristos #define FPU_ANY ARM_FEATURE_COPROC (-1 & ~(ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT | ARM_CEXT_IWMMXT2)) /* Any FPU. */ 410*02f41505Schristos #define FPU_ANY_HARD ARM_FEATURE_COPROC (FPU_FPA | FPU_VFP_HARD) 411ba340e45Schristos /* Extensions containing some Thumb-2 instructions. If any is present, Thumb 412ba340e45Schristos ISA is Thumb-2. */ 413ba340e45Schristos #define ARM_ARCH_THUMB2 ARM_FEATURE_CORE (ARM_EXT_V6T2 | ARM_EXT_V7 \ 414ba340e45Schristos | ARM_EXT_DIV | ARM_EXT_V8, \ 415ba340e45Schristos ARM_EXT2_ATOMICS | ARM_EXT2_V6T2_V8M) 41698b9484cSchristos /* v7-a+sec. */ 417ba340e45Schristos #define ARM_ARCH_V7A_SEC \ 418ba340e45Schristos ARM_FEATURE_CORE (ARM_AEXT_V7A | ARM_EXT_SEC, ARM_EXT2_V6T2_V8M) 41998b9484cSchristos /* v7-a+mp+sec. */ 42098b9484cSchristos #define ARM_ARCH_V7A_MP_SEC \ 421ba340e45Schristos ARM_FEATURE_CORE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, ARM_EXT2_V6T2_V8M) 422a2e2270fSchristos /* v7-r+idiv. */ 423ba340e45Schristos #define ARM_ARCH_V7R_IDIV \ 424ba340e45Schristos ARM_FEATURE_CORE (ARM_AEXT_V7R | ARM_EXT_ADIV, ARM_EXT2_V6T2_V8M) 425a2e2270fSchristos /* v8-a+fp. */ 426ba340e45Schristos #define ARM_ARCH_V8A_FP \ 427ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_VFP_ARMV8) 428a2e2270fSchristos /* v8-a+simd (implies fp). */ 429ba340e45Schristos #define ARM_ARCH_V8A_SIMD \ 430ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_NEON_VFP_ARMV8) 431a2e2270fSchristos /* v8-a+crypto (implies simd+fp). */ 432ba340e45Schristos #define ARM_ARCH_V8A_CRYPTOV1 \ 433ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8) 43498b9484cSchristos 435212397c6Schristos /* v8.1-a+fp. */ 436ba340e45Schristos #define ARM_ARCH_V8_1A_FP \ 437ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_VFP_ARMV8) 438212397c6Schristos /* v8.1-a+simd (implies fp). */ 439ba340e45Schristos #define ARM_ARCH_V8_1A_SIMD \ 440ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_NEON_VFP_ARMV8_1) 441212397c6Schristos /* v8.1-a+crypto (implies simd+fp). */ 442ba340e45Schristos #define ARM_ARCH_V8_1A_CRYPTOV1 \ 443ba340e45Schristos ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1) 444212397c6Schristos 445212397c6Schristos 44698b9484cSchristos /* There are too many feature bits to fit in a single word, so use a 447212397c6Schristos structure. For simplicity we put all core features in array CORE 4484b169a6bSchristos and everything else in the other. All the bits in element core[0:1] 4494b169a6bSchristos have been occupied, so new feature should use bit in element core[2] 450212397c6Schristos and use macro ARM_FEATURE to initialize the feature set variable. */ 45198b9484cSchristos typedef struct 45298b9484cSchristos { 4534b169a6bSchristos unsigned long core[3]; 45498b9484cSchristos unsigned long coproc; 45598b9484cSchristos } arm_feature_set; 45698b9484cSchristos 457ba340e45Schristos /* Test whether CPU and FEAT have any features in common. */ 45898b9484cSchristos #define ARM_CPU_HAS_FEATURE(CPU,FEAT) \ 459212397c6Schristos (((CPU).core[0] & (FEAT).core[0]) != 0 \ 460212397c6Schristos || ((CPU).core[1] & (FEAT).core[1]) != 0 \ 4614b169a6bSchristos || ((CPU).core[2] & (FEAT).core[2]) != 0 \ 462212397c6Schristos || ((CPU).coproc & (FEAT).coproc) != 0) 46398b9484cSchristos 464ba340e45Schristos /* Tests whether the features of A are a subset of B. */ 465ba340e45Schristos #define ARM_FSET_CPU_SUBSET(A,B) \ 466ba340e45Schristos (((A).core[0] & (B).core[0]) == (A).core[0] \ 467ba340e45Schristos && ((A).core[1] & (B).core[1]) == (A).core[1] \ 4684b169a6bSchristos && ((A).core[2] & (B).core[2]) == (A).core[2] \ 469ba340e45Schristos && ((A).coproc & (B).coproc) == (A).coproc) 470ba340e45Schristos 471a2e2270fSchristos #define ARM_CPU_IS_ANY(CPU) \ 472212397c6Schristos ((CPU).core[0] == ((arm_feature_set)ARM_ANY).core[0] \ 4734b169a6bSchristos && (CPU).core[1] == ((arm_feature_set)ARM_ANY).core[1] \ 4744b169a6bSchristos && (CPU).core[2] == ((arm_feature_set)ARM_ANY).core[2]) 475a2e2270fSchristos 47698b9484cSchristos #define ARM_MERGE_FEATURE_SETS(TARG,F1,F2) \ 4774559860eSchristos do \ 4784559860eSchristos { \ 479212397c6Schristos (TARG).core[0] = (F1).core[0] | (F2).core[0]; \ 480212397c6Schristos (TARG).core[1] = (F1).core[1] | (F2).core[1]; \ 4814b169a6bSchristos (TARG).core[2] = (F1).core[2] | (F2).core[2]; \ 48298b9484cSchristos (TARG).coproc = (F1).coproc | (F2).coproc; \ 4834559860eSchristos } \ 4844559860eSchristos while (0) 48598b9484cSchristos 48698b9484cSchristos #define ARM_CLEAR_FEATURE(TARG,F1,F2) \ 4874559860eSchristos do \ 4884559860eSchristos { \ 489212397c6Schristos (TARG).core[0] = (F1).core[0] &~ (F2).core[0]; \ 490212397c6Schristos (TARG).core[1] = (F1).core[1] &~ (F2).core[1]; \ 4914b169a6bSchristos (TARG).core[2] = (F1).core[2] &~ (F2).core[2]; \ 49298b9484cSchristos (TARG).coproc = (F1).coproc &~ (F2).coproc; \ 4934559860eSchristos } \ 4944559860eSchristos while (0) 495212397c6Schristos 496212397c6Schristos #define ARM_FEATURE_EQUAL(T1,T2) \ 497212397c6Schristos ( (T1).core[0] == (T2).core[0] \ 498212397c6Schristos && (T1).core[1] == (T2).core[1] \ 4994b169a6bSchristos && (T1).core[2] == (T2).core[2] \ 500212397c6Schristos && (T1).coproc == (T2).coproc) 501212397c6Schristos 502212397c6Schristos #define ARM_FEATURE_ZERO(T) \ 5034b169a6bSchristos ((T).core[0] == 0 \ 5044b169a6bSchristos && (T).core[1] == 0 \ 5054b169a6bSchristos && (T).core[2] == 0 \ 5064b169a6bSchristos && (T).coproc == 0) 507212397c6Schristos 508212397c6Schristos #define ARM_FEATURE_CORE_EQUAL(T1, T2) \ 5094b169a6bSchristos ((T1).core[0] == (T2).core[0] \ 5104b169a6bSchristos && (T1).core[1] == (T2).core[1] \ 5114b169a6bSchristos && (T1).core[2] == (T2).core[2]) 512212397c6Schristos 5134b169a6bSchristos #define ARM_FEATURE_LOW(core, coproc) {{(core), 0, 0}, (coproc)} 5144b169a6bSchristos #define ARM_FEATURE_CORE(core1, core2) {{(core1), (core2), 0}, 0} 5154b169a6bSchristos #define ARM_FEATURE_CORE_LOW(core) {{(core), 0, 0}, 0} 5164b169a6bSchristos #define ARM_FEATURE_CORE_HIGH(core) {{0, (core), 0}, 0} 5174b169a6bSchristos #define ARM_FEATURE_CORE_HIGH_HIGH(core) {{0, 0, (core)}, 0} 5184b169a6bSchristos #define ARM_FEATURE_COPROC(coproc) {{0, 0, 0}, (coproc)} 5194b169a6bSchristos #define ARM_FEATURE(core1, core2, coproc) {{(core1), (core2), 0}, (coproc)} 5204b169a6bSchristos /* Below macro is used to set all fields in arm_feature_set struct. 5214b169a6bSchristos */ 5224b169a6bSchristos #define ARM_FEATURE_ALL(core1, core2, core3, coproc) {{(core1), (core2), (core3)}, (coproc)} 523