xref: /netbsd-src/external/gpl3/binutils.old/dist/include/opcode/arm.h (revision e992f068c547fd6e84b3f104dc2340adcc955732)
175fd0b74Schristos /* ARM assembler/disassembler support.
2*e992f068Schristos    Copyright (C) 2004-2022 Free Software Foundation, Inc.
375fd0b74Schristos 
475fd0b74Schristos    This file is part of GDB and GAS.
575fd0b74Schristos 
675fd0b74Schristos    GDB and GAS are free software; you can redistribute it and/or
775fd0b74Schristos    modify it under the terms of the GNU General Public License as
875fd0b74Schristos    published by the Free Software Foundation; either version 3, or (at
975fd0b74Schristos    your option) any later version.
1075fd0b74Schristos 
1175fd0b74Schristos    GDB and GAS are distributed in the hope that it will be useful, but
1275fd0b74Schristos    WITHOUT ANY WARRANTY; without even the implied warranty of
1375fd0b74Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1475fd0b74Schristos    General Public License for more details.
1575fd0b74Schristos 
1675fd0b74Schristos    You should have received a copy of the GNU General Public License
1775fd0b74Schristos    along with GDB or GAS; see the file COPYING3.  If not, write to the
1875fd0b74Schristos    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
1975fd0b74Schristos    MA 02110-1301, USA.  */
2075fd0b74Schristos 
2175fd0b74Schristos /* The following bitmasks control CPU extensions:  */
2275fd0b74Schristos #define ARM_EXT_V1	     0x00000001	/* All processors (core set).	     */
2375fd0b74Schristos #define ARM_EXT_V2	     0x00000002	/* Multiply instructions.	     */
2475fd0b74Schristos #define ARM_EXT_V2S	     0x00000004	/* SWP instructions.		     */
2575fd0b74Schristos #define ARM_EXT_V3	     0x00000008	/* MSR MRS.			     */
2675fd0b74Schristos #define ARM_EXT_V3M	     0x00000010	/* Allow long multiplies.	     */
2775fd0b74Schristos #define ARM_EXT_V4	     0x00000020	/* Allow half word loads.	     */
2875fd0b74Schristos #define ARM_EXT_V4T	     0x00000040	/* Thumb.			     */
2975fd0b74Schristos #define ARM_EXT_V5	     0x00000080	/* Allow CLZ, etc.		     */
3075fd0b74Schristos #define ARM_EXT_V5T	     0x00000100	/* Improved interworking.	     */
3175fd0b74Schristos #define ARM_EXT_V5ExP	     0x00000200	/* DSP core set.		     */
3275fd0b74Schristos #define ARM_EXT_V5E	     0x00000400	/* DSP Double transfers.	     */
3375fd0b74Schristos #define ARM_EXT_V5J	     0x00000800	/* Jazelle extension.		     */
3475fd0b74Schristos #define ARM_EXT_V6	     0x00001000 /* ARM V6.			     */
3575fd0b74Schristos #define ARM_EXT_V6K	     0x00002000 /* ARM V6K.			     */
3675fd0b74Schristos #define ARM_EXT_V8	     0x00004000 /* ARMv8 w/o atomics.		     */
3775fd0b74Schristos #define ARM_EXT_V6T2	     0x00008000	/* Thumb-2.			     */
3875fd0b74Schristos #define ARM_EXT_DIV	     0x00010000	/* Integer division.		     */
3975fd0b74Schristos /* The 'M' in Arm V7M stands for Microcontroller.
4075fd0b74Schristos    On earlier architecture variants it stands for Multiply.  */
4175fd0b74Schristos #define ARM_EXT_V5E_NOTM     0x00020000	/* Arm V5E but not Arm V7M.	     */
4275fd0b74Schristos #define ARM_EXT_V6_NOTM	     0x00040000	/* Arm V6 but not Arm V7M.	     */
4375fd0b74Schristos #define ARM_EXT_V7	     0x00080000	/* Arm V7.			     */
4475fd0b74Schristos #define ARM_EXT_V7A	     0x00100000	/* Arm V7A.			     */
4575fd0b74Schristos #define ARM_EXT_V7R	     0x00200000	/* Arm V7R.			     */
4675fd0b74Schristos #define ARM_EXT_V7M	     0x00400000	/* Arm V7M.			     */
4775fd0b74Schristos #define ARM_EXT_V6M	     0x00800000	/* ARM V6M.			     */
4875fd0b74Schristos #define ARM_EXT_BARRIER	     0x01000000	/* DSB/DMB/ISB.			     */
4975fd0b74Schristos #define ARM_EXT_THUMB_MSR    0x02000000	/* Thumb MSR/MRS.		     */
5075fd0b74Schristos #define ARM_EXT_V6_DSP	     0x04000000	/* ARM v6 (DSP-related),
5175fd0b74Schristos 					   not in v7-M.			     */
5275fd0b74Schristos #define ARM_EXT_MP	     0x08000000 /* Multiprocessing Extensions.	     */
5375fd0b74Schristos #define ARM_EXT_SEC	     0x10000000	/* Security extensions.		     */
5475fd0b74Schristos #define ARM_EXT_OS	     0x20000000	/* OS Extensions.		     */
5575fd0b74Schristos #define ARM_EXT_ADIV	     0x40000000	/* Integer divide extensions in ARM
5675fd0b74Schristos 					   state.			     */
5775fd0b74Schristos #define ARM_EXT_VIRT	     0x80000000	/* Virtualization extensions.	     */
5875fd0b74Schristos 
5975fd0b74Schristos #define ARM_EXT2_PAN	     0x00000001 /* PAN extension.		     */
6075fd0b74Schristos #define ARM_EXT2_V8_2A	     0x00000002 /* ARM V8.2A.			     */
6175fd0b74Schristos #define ARM_EXT2_V8M	     0x00000004	/* ARM V8M.			     */
6275fd0b74Schristos #define ARM_EXT2_ATOMICS     0x00000008	/* ARMv8 atomics.		     */
6375fd0b74Schristos #define ARM_EXT2_V6T2_V8M    0x00000010	/* V8M Baseline from V6T2.	     */
6475fd0b74Schristos #define ARM_EXT2_FP16_INST   0x00000020	/* ARM V8.2A FP16 instructions.	     */
6575fd0b74Schristos #define ARM_EXT2_V8M_MAIN    0x00000040	/* ARMv8-M Mainline.		     */
6675fd0b74Schristos #define ARM_EXT2_RAS	     0x00000080	/* RAS extension.		     */
67ede78133Schristos #define ARM_EXT2_V8_3A	     0x00000100	/* ARM V8.3A.			     */
68ede78133Schristos #define ARM_EXT2_V8A	     0x00000200	/* ARMv8-A.			     */
69ede78133Schristos #define ARM_EXT2_V8_4A	     0x00000400	/* ARM V8.4A.			     */
70012573ebSchristos #define ARM_EXT2_FP16_FML    0x00000800	/* ARM V8.2A FP16-FML
71012573ebSchristos 					   instructions.		     */
72012573ebSchristos #define ARM_EXT2_V8_5A	     0x00001000	/* ARM V8.5A.			     */
73012573ebSchristos #define ARM_EXT2_SB	     0x00002000	/* Speculation Barrier instruction.  */
74012573ebSchristos #define ARM_EXT2_PREDRES     0x00004000	/* Prediction Restriction insns.     */
75012573ebSchristos #define ARM_EXT2_V8_1M_MAIN  0x00008000 /* ARMv8.1-M Mainline.		     */
76012573ebSchristos #define ARM_EXT2_V8_6A	     0x00010000	/* ARM V8.6A.			     */
77012573ebSchristos #define ARM_EXT2_BF16	     0x00020000 /* ARMv8 bfloat16.		     */
78012573ebSchristos #define ARM_EXT2_I8MM	     0x00040000 /* ARMv8.6A i8mm.		     */
79012573ebSchristos #define ARM_EXT2_CRC	     0x00080000	/* ARMv8 CRC32 */
80012573ebSchristos #define ARM_EXT2_MVE	     0x00100000	/* MVE Integer extension.	   */
81012573ebSchristos #define ARM_EXT2_MVE_FP	     0x00200000	/* MVE Floating Point extension.   */
82*e992f068Schristos #define ARM_EXT2_CDE	     0x00400000 /* Custom Datapath Extension.	   */
83*e992f068Schristos #define ARM_EXT2_CDE0	     0x00800000 /* Using CDE coproc 0.	   */
84*e992f068Schristos #define ARM_EXT2_CDE1	     0x01000000 /* Using CDE coproc 1.	   */
85*e992f068Schristos #define ARM_EXT2_CDE2	     0x02000000 /* Using CDE coproc 2.	   */
86*e992f068Schristos #define ARM_EXT2_CDE3	     0x04000000 /* Using CDE coproc 3.	   */
87*e992f068Schristos #define ARM_EXT2_CDE4	     0x08000000 /* Using CDE coproc 4.	   */
88*e992f068Schristos #define ARM_EXT2_CDE5	     0x10000000 /* Using CDE coproc 5.	   */
89*e992f068Schristos #define ARM_EXT2_CDE6	     0x20000000 /* Using CDE coproc 6.	   */
90*e992f068Schristos #define ARM_EXT2_CDE7	     0x40000000 /* Using CDE coproc 7.	   */
91*e992f068Schristos #define ARM_EXT2_V8R	     0x80000000	/* Arm V8R.	               */
92*e992f068Schristos 
93*e992f068Schristos #define ARM_EXT3_PACBTI	     0x00000001 /* Arm v8-M Mainline Pointer
94*e992f068Schristos 					   Authentication and Branch
95*e992f068Schristos 					   Target Identification
96*e992f068Schristos 					   Extension.  */
97*e992f068Schristos #define ARM_EXT3_V9A	        0x00000002 /* Armv9-A.	               */
9875fd0b74Schristos 
9975fd0b74Schristos /* Co-processor space extensions.  */
10075fd0b74Schristos #define ARM_CEXT_XSCALE	     0x00000001	/* Allow MIA etc.	 	   */
10175fd0b74Schristos #define ARM_CEXT_MAVERICK    0x00000002	/* Use Cirrus/DSP coprocessor.	   */
102012573ebSchristos #define ARM_CEXT_IWMMXT	     0x00000004 /* Intel Wireless MMX technology
103012573ebSchristos 					   coprocessor.			   */
104012573ebSchristos #define ARM_CEXT_IWMMXT2     0x00000008 /* Intel Wireless MMX technology
105012573ebSchristos 					   coprocessor version 2.	   */
10675fd0b74Schristos 
10775fd0b74Schristos #define FPU_ENDIAN_PURE	     0x80000000	/* Pure-endian doubles.		   */
10875fd0b74Schristos #define FPU_FPA_EXT_V1	     0x40000000	/* Base FPA instruction set.	   */
10975fd0b74Schristos #define FPU_FPA_EXT_V2	     0x20000000	/* LFM/SFM.			   */
11075fd0b74Schristos #define FPU_MAVERICK	     0x10000000	/* Cirrus Maverick.		   */
11175fd0b74Schristos #define FPU_VFP_EXT_V1xD     0x08000000	/* Base VFP instruction set.	   */
11275fd0b74Schristos #define FPU_VFP_EXT_V1	     0x04000000	/* Double-precision insns.	   */
11375fd0b74Schristos #define FPU_VFP_EXT_V2	     0x02000000	/* ARM10E VFPr1.		   */
11475fd0b74Schristos #define FPU_VFP_EXT_V3xD     0x01000000	/* VFPv3 single-precision.	   */
11575fd0b74Schristos #define FPU_VFP_EXT_V3	     0x00800000	/* VFPv3 double-precision.	   */
11675fd0b74Schristos #define FPU_NEON_EXT_V1	     0x00400000	/* Neon (SIMD) insns.		   */
11775fd0b74Schristos #define FPU_VFP_EXT_D32	     0x00200000	/* Registers D16-D31.		   */
11875fd0b74Schristos #define FPU_VFP_EXT_FP16     0x00100000	/* Half-precision extensions.	   */
119012573ebSchristos #define FPU_NEON_EXT_FMA     0x00080000	/* Neon fused multiply-add.	   */
120012573ebSchristos #define FPU_VFP_EXT_FMA	     0x00040000	/* VFP fused multiply-add.	   */
12175fd0b74Schristos #define FPU_VFP_EXT_ARMV8    0x00020000	/* Double-precision FP for ARMv8.  */
12275fd0b74Schristos #define FPU_NEON_EXT_ARMV8   0x00010000	/* Neon for ARMv8.		   */
12375fd0b74Schristos #define FPU_CRYPTO_EXT_ARMV8 0x00008000	/* Crypto for ARMv8.		   */
124012573ebSchristos /* Unused                    0x00004000	*/
12575fd0b74Schristos #define FPU_VFP_EXT_ARMV8xD  0x00002000	/* Single-precision FP for ARMv8.  */
12675fd0b74Schristos #define FPU_NEON_EXT_RDMA    0x00001000	/* v8.1 Adv.SIMD extensions.	   */
127ede78133Schristos #define FPU_NEON_EXT_DOTPROD 0x00000800	/* Dot Product extension.	   */
12875fd0b74Schristos 
12975fd0b74Schristos /* Architectures are the sum of the base and extensions.  The ARM ARM (rev E)
13075fd0b74Schristos    defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T,
13175fd0b74Schristos    ARMv5xM, ARMv5, ARMv5TxM, ARMv5T, ARMv5TExP, ARMv5TE.  To these we add
13275fd0b74Schristos    three more to cover cores prior to ARM6.  Finally, there are cores which
13375fd0b74Schristos    implement further extensions in the co-processor space.  */
13475fd0b74Schristos #define ARM_AEXT_V1			     ARM_EXT_V1
13575fd0b74Schristos #define ARM_AEXT_V2	(ARM_AEXT_V1	   | ARM_EXT_V2)
13675fd0b74Schristos #define ARM_AEXT_V2S	(ARM_AEXT_V2	   | ARM_EXT_V2S)
13775fd0b74Schristos #define ARM_AEXT_V3	(ARM_AEXT_V2S	   | ARM_EXT_V3)
13875fd0b74Schristos #define ARM_AEXT_V3M	(ARM_AEXT_V3	   | ARM_EXT_V3M)
13975fd0b74Schristos #define ARM_AEXT_V4xM	(ARM_AEXT_V3	   | ARM_EXT_V4)
14075fd0b74Schristos #define ARM_AEXT_V4	(ARM_AEXT_V3M	   | ARM_EXT_V4)
141ede78133Schristos #define ARM_AEXT_V4TxM	(ARM_AEXT_V4xM	   | ARM_EXT_V4T    | ARM_EXT_OS)
142ede78133Schristos #define ARM_AEXT_V4T	(ARM_AEXT_V4	   | ARM_EXT_V4T    | ARM_EXT_OS)
14375fd0b74Schristos #define ARM_AEXT_V5xM	(ARM_AEXT_V4xM	   | ARM_EXT_V5)
14475fd0b74Schristos #define ARM_AEXT_V5	(ARM_AEXT_V4	   | ARM_EXT_V5)
145ede78133Schristos #define ARM_AEXT_V5TxM	(ARM_AEXT_V5xM	   | ARM_EXT_V4T    | ARM_EXT_V5T     \
146ede78133Schristos 					   | ARM_EXT_OS)
147ede78133Schristos #define ARM_AEXT_V5T	(ARM_AEXT_V5	   | ARM_EXT_V4T    | ARM_EXT_V5T     \
148ede78133Schristos 					   | ARM_EXT_OS)
14975fd0b74Schristos #define ARM_AEXT_V5TExP	(ARM_AEXT_V5T	   | ARM_EXT_V5ExP)
15075fd0b74Schristos #define ARM_AEXT_V5TE	(ARM_AEXT_V5TExP   | ARM_EXT_V5E)
15175fd0b74Schristos #define ARM_AEXT_V5TEJ	(ARM_AEXT_V5TE	   | ARM_EXT_V5J)
15275fd0b74Schristos #define ARM_AEXT_V6	(ARM_AEXT_V5TEJ	   | ARM_EXT_V6)
15375fd0b74Schristos #define ARM_AEXT_V6K	(ARM_AEXT_V6	   | ARM_EXT_V6K)
15475fd0b74Schristos #define ARM_AEXT_V6Z	(ARM_AEXT_V6K	   | ARM_EXT_SEC)
15575fd0b74Schristos #define ARM_AEXT_V6KZ	(ARM_AEXT_V6K	   | ARM_EXT_SEC)
156012573ebSchristos #define ARM_AEXT_V6T2	(ARM_AEXT_V6	   | ARM_EXT_V6T2   | ARM_EXT_V6_NOTM \
157012573ebSchristos 					   | ARM_EXT_THUMB_MSR \
15875fd0b74Schristos 					   | ARM_EXT_V6_DSP )
15975fd0b74Schristos #define ARM_AEXT_V6KT2	(ARM_AEXT_V6T2	   | ARM_EXT_V6K)
16075fd0b74Schristos #define ARM_AEXT_V6ZT2	(ARM_AEXT_V6T2	   | ARM_EXT_SEC)
16175fd0b74Schristos #define ARM_AEXT_V6KZT2	(ARM_AEXT_V6T2	   | ARM_EXT_V6K    | ARM_EXT_SEC)
16275fd0b74Schristos #define ARM_AEXT_V7_ARM	(ARM_AEXT_V6KT2	   | ARM_EXT_V7     | ARM_EXT_BARRIER)
16375fd0b74Schristos #define ARM_AEXT_V7A	(ARM_AEXT_V7_ARM   | ARM_EXT_V7A)
16475fd0b74Schristos #define ARM_AEXT_V7VE	(ARM_AEXT_V7A	   | ARM_EXT_DIV    | ARM_EXT_ADIV    \
165012573ebSchristos 					   | ARM_EXT_VIRT   | ARM_EXT_SEC     \
166012573ebSchristos 					   | ARM_EXT_MP)
16775fd0b74Schristos #define ARM_AEXT_V7R	(ARM_AEXT_V7_ARM   | ARM_EXT_V7R    | ARM_EXT_DIV)
168012573ebSchristos #define ARM_AEXT_NOTM	(ARM_AEXT_V4	   | ARM_EXT_V5ExP  | ARM_EXT_V5J     \
169012573ebSchristos 					   | ARM_EXT_V6_DSP		      \
170012573ebSchristos 					   | ARM_EXT_V6_NOTM)
171012573ebSchristos #define ARM_AEXT_V6M   ((ARM_AEXT_V6K	   | ARM_EXT_V6M    | ARM_EXT_BARRIER \
172012573ebSchristos 					   | ARM_EXT_THUMB_MSR)		      \
173012573ebSchristos 			& ~(ARM_AEXT_NOTM | ARM_EXT_OS))
17475fd0b74Schristos #define ARM_AEXT_V6SM	(ARM_AEXT_V6M	   | ARM_EXT_OS)
175012573ebSchristos #define ARM_AEXT_V7M   ((ARM_AEXT_V7_ARM   | ARM_EXT_V6M    | ARM_EXT_V7M     \
176012573ebSchristos 					   | ARM_EXT_DIV)		      \
177012573ebSchristos 			& ~ARM_AEXT_NOTM)
17875fd0b74Schristos #define ARM_AEXT_V7	(ARM_AEXT_V7A	   & ARM_AEXT_V7R   & ARM_AEXT_V7M)
179012573ebSchristos #define ARM_AEXT_V7EM	(ARM_AEXT_V7M	   | ARM_EXT_V5ExP  | ARM_EXT_V6_DSP)
180012573ebSchristos #define ARM_AEXT_V8A	(ARM_AEXT_V7A	   | ARM_EXT_MP	    | ARM_EXT_SEC     \
181012573ebSchristos 					   | ARM_EXT_DIV    | ARM_EXT_ADIV    \
18275fd0b74Schristos 					   | ARM_EXT_VIRT   | ARM_EXT_V8)
183ede78133Schristos #define ARM_AEXT2_V8AR	(ARM_EXT2_V6T2_V8M | ARM_EXT2_ATOMICS)
184ede78133Schristos #define ARM_AEXT2_V8A	(ARM_AEXT2_V8AR	   | ARM_EXT2_V8A)
18575fd0b74Schristos #define ARM_AEXT2_V8_1A	(ARM_AEXT2_V8A	   | ARM_EXT2_PAN)
18675fd0b74Schristos #define ARM_AEXT2_V8_2A	(ARM_AEXT2_V8_1A   | ARM_EXT2_V8_2A | ARM_EXT2_RAS)
187ede78133Schristos #define ARM_AEXT2_V8_3A	(ARM_AEXT2_V8_2A   | ARM_EXT2_V8_3A)
188012573ebSchristos #define ARM_AEXT2_V8_4A	(ARM_AEXT2_V8_3A   | ARM_EXT2_FP16_FML		      \
189012573ebSchristos 					   | ARM_EXT2_V8_4A)
190012573ebSchristos #define ARM_AEXT2_V8_5A	(ARM_AEXT2_V8_4A   | ARM_EXT2_V8_5A | ARM_EXT2_SB     \
191012573ebSchristos 					   | ARM_EXT2_PREDRES)
192012573ebSchristos #define ARM_AEXT2_V8_6A	(ARM_AEXT2_V8_5A   | ARM_EXT2_V8_6A | ARM_EXT2_BF16)
19375fd0b74Schristos #define ARM_AEXT_V8M_BASE	(ARM_AEXT_V6SM	    | ARM_EXT_DIV)
19475fd0b74Schristos #define ARM_AEXT_V8M_MAIN	 ARM_AEXT_V7M
195ede78133Schristos #define ARM_AEXT_V8M_MAIN_DSP	 ARM_AEXT_V7EM
196012573ebSchristos #define ARM_AEXT2_V8M_BASE	(ARM_EXT2_V8M	    | ARM_EXT2_ATOMICS	      \
197012573ebSchristos 						    | ARM_EXT2_V6T2_V8M)
198012573ebSchristos #define ARM_AEXT2_V8M_MAIN	(ARM_AEXT2_V8M_BASE | ARM_EXT2_V8M_MAIN)
199ede78133Schristos #define ARM_AEXT2_V8M_MAIN_DSP	 ARM_AEXT2_V8M_MAIN
200ede78133Schristos #define ARM_AEXT_V8R		 ARM_AEXT_V8A
201*e992f068Schristos #define ARM_AEXT2_V8R		 (ARM_EXT2_V8R | ARM_AEXT2_V8AR)
202012573ebSchristos #define ARM_AEXT_V8_1M_MAIN	 ARM_AEXT_V8M_MAIN
203012573ebSchristos #define ARM_AEXT2_V8_1M_MAIN	(ARM_AEXT2_V8M_MAIN | ARM_EXT2_V8_1M_MAIN     \
204012573ebSchristos 						    | ARM_EXT2_FP16_INST)
20575fd0b74Schristos 
206*e992f068Schristos #define ARM_AEXT3_V8_1M_MAIN_PACBTI	(ARM_AEXT2_V8M_MAIN | ARM_EXT3_PACBTI)
207*e992f068Schristos 
20875fd0b74Schristos /* Processors with specific extensions in the co-processor space.  */
20975fd0b74Schristos #define ARM_ARCH_XSCALE	ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE)
21075fd0b74Schristos #define ARM_ARCH_IWMMXT	\
21175fd0b74Schristos  ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT)
21275fd0b74Schristos #define ARM_ARCH_IWMMXT2	\
21375fd0b74Schristos  ARM_FEATURE_LOW (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT \
21475fd0b74Schristos 		  | ARM_CEXT_IWMMXT2)
21575fd0b74Schristos 
21675fd0b74Schristos #define FPU_VFP_V1xD	  (FPU_VFP_EXT_V1xD  | FPU_ENDIAN_PURE)
21775fd0b74Schristos #define FPU_VFP_V1	  (FPU_VFP_V1xD	     | FPU_VFP_EXT_V1)
21875fd0b74Schristos #define FPU_VFP_V2	  (FPU_VFP_V1	     | FPU_VFP_EXT_V2)
219012573ebSchristos #define FPU_VFP_V3D16	  (FPU_VFP_V2	     | FPU_VFP_EXT_V3xD	   \
220012573ebSchristos 					     | FPU_VFP_EXT_V3)
22175fd0b74Schristos #define FPU_VFP_V3	  (FPU_VFP_V3D16     | FPU_VFP_EXT_D32)
222012573ebSchristos #define FPU_VFP_V3xD	  (FPU_VFP_V1xD	     | FPU_VFP_EXT_V2	   \
223012573ebSchristos 					     | FPU_VFP_EXT_V3xD)
224012573ebSchristos #define FPU_VFP_V4D16	  (FPU_VFP_V3D16     | FPU_VFP_EXT_FP16	   \
225012573ebSchristos 					     | FPU_VFP_EXT_FMA)
226012573ebSchristos #define FPU_VFP_V4	  (FPU_VFP_V3	     | FPU_VFP_EXT_FP16	   \
227012573ebSchristos 					     | FPU_VFP_EXT_FMA)
228012573ebSchristos #define FPU_VFP_V4_SP_D16 (FPU_VFP_V3xD	     | FPU_VFP_EXT_FP16	   \
229012573ebSchristos 					     | FPU_VFP_EXT_FMA)
230012573ebSchristos #define FPU_VFP_V5D16	  (FPU_VFP_V4D16     | FPU_VFP_EXT_ARMV8xD \
231012573ebSchristos 					     | FPU_VFP_EXT_ARMV8)
23275fd0b74Schristos #define FPU_VFP_V5_SP_D16 (FPU_VFP_V4_SP_D16 | FPU_VFP_EXT_ARMV8xD)
233012573ebSchristos #define FPU_VFP_ARMV8	  (FPU_VFP_V4	     | FPU_VFP_EXT_ARMV8   \
234012573ebSchristos 					     | FPU_VFP_EXT_ARMV8xD)
235012573ebSchristos #define FPU_NEON_ARMV8	  (FPU_NEON_EXT_V1   | FPU_NEON_EXT_FMA	   \
236012573ebSchristos 					     | FPU_NEON_EXT_ARMV8)
237012573ebSchristos #define FPU_NEON_ARMV8_1  (FPU_NEON_ARMV8    | FPU_NEON_EXT_RDMA)
23875fd0b74Schristos #define FPU_CRYPTO_ARMV8  (FPU_CRYPTO_EXT_ARMV8)
239012573ebSchristos #define FPU_VFP_HARD	  (FPU_VFP_EXT_V1xD  | FPU_VFP_EXT_V1	   \
240012573ebSchristos 					     | FPU_VFP_EXT_V2	   \
241012573ebSchristos 					     | FPU_VFP_EXT_V3xD	   \
242012573ebSchristos 					     | FPU_VFP_EXT_FMA	   \
243012573ebSchristos 					     | FPU_NEON_EXT_FMA	   \
244012573ebSchristos 					     | FPU_VFP_EXT_V3	   \
245012573ebSchristos 					     | FPU_NEON_EXT_V1	   \
246012573ebSchristos 					     | FPU_VFP_EXT_D32)
24775fd0b74Schristos #define FPU_FPA		  (FPU_FPA_EXT_V1    | FPU_FPA_EXT_V2)
24875fd0b74Schristos 
24975fd0b74Schristos /* Deprecated.  */
25075fd0b74Schristos #define FPU_ARCH_VFP		ARM_FEATURE_COPROC (FPU_ENDIAN_PURE)
25175fd0b74Schristos 
25275fd0b74Schristos #define FPU_ARCH_FPE		ARM_FEATURE_COPROC (FPU_FPA_EXT_V1)
25375fd0b74Schristos #define FPU_ARCH_FPA		ARM_FEATURE_COPROC (FPU_FPA)
25475fd0b74Schristos 
25575fd0b74Schristos #define FPU_ARCH_VFP_V1xD	ARM_FEATURE_COPROC (FPU_VFP_V1xD)
25675fd0b74Schristos #define FPU_ARCH_VFP_V1		ARM_FEATURE_COPROC (FPU_VFP_V1)
25775fd0b74Schristos #define FPU_ARCH_VFP_V2		ARM_FEATURE_COPROC (FPU_VFP_V2)
25875fd0b74Schristos #define FPU_ARCH_VFP_V3D16	ARM_FEATURE_COPROC (FPU_VFP_V3D16)
259012573ebSchristos #define FPU_ARCH_VFP_V3D16_FP16 ARM_FEATURE_COPROC (FPU_VFP_V3D16	 \
260012573ebSchristos 						    | FPU_VFP_EXT_FP16)
26175fd0b74Schristos #define FPU_ARCH_VFP_V3		ARM_FEATURE_COPROC (FPU_VFP_V3)
262012573ebSchristos #define FPU_ARCH_VFP_V3_FP16	ARM_FEATURE_COPROC (FPU_VFP_V3		 \
263012573ebSchristos 						    | FPU_VFP_EXT_FP16)
26475fd0b74Schristos #define FPU_ARCH_VFP_V3xD	ARM_FEATURE_COPROC (FPU_VFP_V3xD)
26575fd0b74Schristos #define FPU_ARCH_VFP_V3xD_FP16	ARM_FEATURE_COPROC (FPU_VFP_V3xD	 \
26675fd0b74Schristos 						    | FPU_VFP_EXT_FP16)
26775fd0b74Schristos #define FPU_ARCH_NEON_V1	ARM_FEATURE_COPROC (FPU_NEON_EXT_V1)
26875fd0b74Schristos #define FPU_ARCH_VFP_V3_PLUS_NEON_V1					 \
269012573ebSchristos 				ARM_FEATURE_COPROC (FPU_VFP_V3		 \
270012573ebSchristos 						    | FPU_NEON_EXT_V1)
271012573ebSchristos #define FPU_ARCH_NEON_FP16	ARM_FEATURE_COPROC (FPU_VFP_V3		 \
272012573ebSchristos 						    | FPU_NEON_EXT_V1	 \
273012573ebSchristos 						    | FPU_VFP_EXT_FP16)
27475fd0b74Schristos #define FPU_ARCH_VFP_HARD	ARM_FEATURE_COPROC (FPU_VFP_HARD)
27575fd0b74Schristos #define FPU_ARCH_VFP_V4		ARM_FEATURE_COPROC (FPU_VFP_V4)
27675fd0b74Schristos #define FPU_ARCH_VFP_V4D16	ARM_FEATURE_COPROC (FPU_VFP_V4D16)
27775fd0b74Schristos #define FPU_ARCH_VFP_V4_SP_D16	ARM_FEATURE_COPROC (FPU_VFP_V4_SP_D16)
27875fd0b74Schristos #define FPU_ARCH_VFP_V5D16	ARM_FEATURE_COPROC (FPU_VFP_V5D16)
27975fd0b74Schristos #define FPU_ARCH_VFP_V5_SP_D16	ARM_FEATURE_COPROC (FPU_VFP_V5_SP_D16)
280012573ebSchristos #define FPU_ARCH_NEON_VFP_V4	ARM_FEATURE_COPROC (FPU_VFP_V4		 \
281012573ebSchristos 						    | FPU_NEON_EXT_V1	 \
282012573ebSchristos 						    | FPU_NEON_EXT_FMA)
28375fd0b74Schristos #define FPU_ARCH_VFP_ARMV8	ARM_FEATURE_COPROC (FPU_VFP_ARMV8)
28475fd0b74Schristos #define FPU_ARCH_NEON_VFP_ARMV8	ARM_FEATURE_COPROC (FPU_NEON_ARMV8	 \
28575fd0b74Schristos 						    | FPU_VFP_ARMV8)
28675fd0b74Schristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8					 \
287012573ebSchristos 				ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8	 \
288012573ebSchristos 						    | FPU_NEON_ARMV8	 \
289012573ebSchristos 						    | FPU_VFP_ARMV8)
290ede78133Schristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD				 \
291012573ebSchristos 				ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8	 \
292012573ebSchristos 						    | FPU_NEON_ARMV8	 \
29375fd0b74Schristos 						    | FPU_VFP_ARMV8	 \
294012573ebSchristos 						    | FPU_NEON_EXT_DOTPROD)
295012573ebSchristos #define FPU_ARCH_NEON_VFP_ARMV8_1					 \
296012573ebSchristos 				ARM_FEATURE_COPROC (FPU_NEON_ARMV8_1	 \
297012573ebSchristos 						    | FPU_VFP_ARMV8)
29875fd0b74Schristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1				 \
299012573ebSchristos 				ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8	 \
300012573ebSchristos 						    | FPU_NEON_ARMV8_1	 \
301012573ebSchristos 						    | FPU_VFP_ARMV8)
30275fd0b74Schristos 
303012573ebSchristos #define FPU_ARCH_DOTPROD_NEON_VFP_ARMV8					 \
304012573ebSchristos 				ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD \
305012573ebSchristos 						    | FPU_NEON_ARMV8_1	 \
306012573ebSchristos 						    | FPU_VFP_ARMV8)
307012573ebSchristos 
308012573ebSchristos #define FPU_ARCH_NEON_VFP_ARMV8_2_FP16					 \
309012573ebSchristos       ARM_FEATURE (0, ARM_EXT2_FP16_INST,				 \
310012573ebSchristos 		   FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8)
311012573ebSchristos 
312012573ebSchristos #define FPU_ARCH_NEON_VFP_ARMV8_2_FP16FML				 \
313012573ebSchristos       ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML,		 \
314012573ebSchristos 		   FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8)
315012573ebSchristos 
316012573ebSchristos #define FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML				 \
317012573ebSchristos       ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML,		 \
318012573ebSchristos 		   FPU_NEON_ARMV8_1 | FPU_VFP_ARMV8 | FPU_NEON_EXT_DOTPROD)
319012573ebSchristos 
320012573ebSchristos #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4				 \
321012573ebSchristos 			      ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8	 \
322012573ebSchristos 						  | FPU_NEON_ARMV8_1	 \
323012573ebSchristos 						  | FPU_VFP_ARMV8	 \
324012573ebSchristos 						  | FPU_NEON_EXT_DOTPROD)
32575fd0b74Schristos 
32675fd0b74Schristos #define FPU_ARCH_ENDIAN_PURE ARM_FEATURE_COPROC (FPU_ENDIAN_PURE)
32775fd0b74Schristos 
32875fd0b74Schristos #define FPU_ARCH_MAVERICK ARM_FEATURE_COPROC (FPU_MAVERICK)
32975fd0b74Schristos 
33075fd0b74Schristos #define ARM_ARCH_V1	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V1)
33175fd0b74Schristos #define ARM_ARCH_V2	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V2)
33275fd0b74Schristos #define ARM_ARCH_V2S	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V2S)
33375fd0b74Schristos #define ARM_ARCH_V3	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V3)
33475fd0b74Schristos #define ARM_ARCH_V3M	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V3M)
33575fd0b74Schristos #define ARM_ARCH_V4xM	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V4xM)
33675fd0b74Schristos #define ARM_ARCH_V4	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V4)
33775fd0b74Schristos #define ARM_ARCH_V4TxM	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V4TxM)
33875fd0b74Schristos #define ARM_ARCH_V4T	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V4T)
33975fd0b74Schristos #define ARM_ARCH_V5xM	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5xM)
34075fd0b74Schristos #define ARM_ARCH_V5	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5)
34175fd0b74Schristos #define ARM_ARCH_V5TxM	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TxM)
34275fd0b74Schristos #define ARM_ARCH_V5T	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5T)
34375fd0b74Schristos #define ARM_ARCH_V5TExP	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TExP)
34475fd0b74Schristos #define ARM_ARCH_V5TE	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TE)
34575fd0b74Schristos #define ARM_ARCH_V5TEJ	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V5TEJ)
34675fd0b74Schristos #define ARM_ARCH_V6	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6)
34775fd0b74Schristos #define ARM_ARCH_V6K	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6K)
34875fd0b74Schristos #define ARM_ARCH_V6Z	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6Z)
34975fd0b74Schristos #define ARM_ARCH_V6KZ	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6KZ)
35075fd0b74Schristos #define ARM_ARCH_V6T2	 ARM_FEATURE_CORE (ARM_AEXT_V6T2, ARM_EXT2_V6T2_V8M)
35175fd0b74Schristos #define ARM_ARCH_V6KT2	 ARM_FEATURE_CORE (ARM_AEXT_V6KT2, ARM_EXT2_V6T2_V8M)
35275fd0b74Schristos #define ARM_ARCH_V6ZT2	 ARM_FEATURE_CORE (ARM_AEXT_V6ZT2, ARM_EXT2_V6T2_V8M)
35375fd0b74Schristos #define ARM_ARCH_V6KZT2	 ARM_FEATURE_CORE (ARM_AEXT_V6KZT2, ARM_EXT2_V6T2_V8M)
35475fd0b74Schristos #define ARM_ARCH_V6M	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6M)
35575fd0b74Schristos #define ARM_ARCH_V6SM	 ARM_FEATURE_CORE_LOW (ARM_AEXT_V6SM)
35675fd0b74Schristos #define ARM_ARCH_V7	 ARM_FEATURE_CORE (ARM_AEXT_V7, ARM_EXT2_V6T2_V8M)
35775fd0b74Schristos #define ARM_ARCH_V7A	 ARM_FEATURE_CORE (ARM_AEXT_V7A, ARM_EXT2_V6T2_V8M)
35875fd0b74Schristos #define ARM_ARCH_V7VE	 ARM_FEATURE_CORE (ARM_AEXT_V7VE, ARM_EXT2_V6T2_V8M)
35975fd0b74Schristos #define ARM_ARCH_V7R	 ARM_FEATURE_CORE (ARM_AEXT_V7R, ARM_EXT2_V6T2_V8M)
36075fd0b74Schristos #define ARM_ARCH_V7M	 ARM_FEATURE_CORE (ARM_AEXT_V7M, ARM_EXT2_V6T2_V8M)
36175fd0b74Schristos #define ARM_ARCH_V7EM	 ARM_FEATURE_CORE (ARM_AEXT_V7EM, ARM_EXT2_V6T2_V8M)
36275fd0b74Schristos #define ARM_ARCH_V8A	 ARM_FEATURE_CORE (ARM_AEXT_V8A, ARM_AEXT2_V8A)
363012573ebSchristos #define ARM_ARCH_V8A_CRC ARM_FEATURE (ARM_AEXT_V8A,	   \
364012573ebSchristos 				      ARM_AEXT2_V8A | ARM_EXT2_CRC)
365012573ebSchristos #define ARM_ARCH_V8_1A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A	   \
366012573ebSchristos 				      | ARM_EXT2_CRC,  FPU_NEON_EXT_RDMA)
367012573ebSchristos #define ARM_ARCH_V8_2A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_2A	   \
368012573ebSchristos 				      | ARM_EXT2_CRC,  FPU_NEON_EXT_RDMA)
369012573ebSchristos #define ARM_ARCH_V8_3A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_3A	   \
370012573ebSchristos 				      | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA)
371012573ebSchristos #define ARM_ARCH_V8_4A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_4A	   \
372012573ebSchristos 				      | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA	   \
373ede78133Schristos 						    | FPU_NEON_EXT_DOTPROD)
374012573ebSchristos #define ARM_ARCH_V8_5A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_5A	   \
375012573ebSchristos 				      | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA	   \
376012573ebSchristos 						    | FPU_NEON_EXT_DOTPROD)
377012573ebSchristos #define ARM_ARCH_V8_6A	 ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_6A	   \
378012573ebSchristos 				      | ARM_EXT2_CRC, FPU_NEON_EXT_RDMA	   \
379012573ebSchristos 						    | FPU_NEON_EXT_DOTPROD)
380*e992f068Schristos #define ARM_ARCH_V8_7A	 ARM_ARCH_V8_6A
381*e992f068Schristos #define ARM_ARCH_V8_8A	 ARM_ARCH_V8_7A
382012573ebSchristos #define ARM_ARCH_V8M_BASE      ARM_FEATURE_CORE (ARM_AEXT_V8M_BASE,	   \
383012573ebSchristos 						 ARM_AEXT2_V8M_BASE)
38475fd0b74Schristos #define ARM_ARCH_V8M_MAIN      ARM_FEATURE_CORE (ARM_AEXT_V8M_MAIN,	   \
38575fd0b74Schristos 						 ARM_AEXT2_V8M_MAIN)
386ede78133Schristos #define ARM_ARCH_V8M_MAIN_DSP  ARM_FEATURE_CORE (ARM_AEXT_V8M_MAIN_DSP,	   \
387ede78133Schristos 						 ARM_AEXT2_V8M_MAIN_DSP)
388ede78133Schristos #define ARM_ARCH_V8R	       ARM_FEATURE_CORE (ARM_AEXT_V8R, ARM_AEXT2_V8R)
389012573ebSchristos #define ARM_ARCH_V8_1M_MAIN    ARM_FEATURE_CORE (ARM_AEXT_V8_1M_MAIN,	   \
390012573ebSchristos 						 ARM_AEXT2_V8_1M_MAIN)
391*e992f068Schristos #define ARM_ARCH_V9A	       ARM_FEATURE_ALL(ARM_AEXT_V8A,	   \
392*e992f068Schristos 				      ARM_AEXT2_V8_5A | ARM_EXT2_CRC,	   \
393*e992f068Schristos 				      ARM_EXT3_V9A,	   \
394*e992f068Schristos                       FPU_NEON_EXT_RDMA	| FPU_NEON_EXT_DOTPROD)
395*e992f068Schristos #define ARM_ARCH_V9_1A	 ARM_FEATURE_ALL (ARM_AEXT_V8A,			   \
396*e992f068Schristos 				          ARM_AEXT2_V8_6A | ARM_EXT2_CRC,  \
397*e992f068Schristos 					  ARM_EXT3_V9A,	   		   \
398*e992f068Schristos 					  FPU_NEON_EXT_RDMA		   \
399*e992f068Schristos 					  | FPU_NEON_EXT_DOTPROD)
400*e992f068Schristos #define ARM_ARCH_V9_2A   ARM_ARCH_V9_1A
401*e992f068Schristos #define ARM_ARCH_V9_3A   ARM_ARCH_V9_2A
40275fd0b74Schristos 
40375fd0b74Schristos /* Some useful combinations:  */
404*e992f068Schristos #define ARM_ARCH_NONE	ARM_FEATURE_ALL (0, 0, 0, 0)
405*e992f068Schristos #define FPU_NONE	ARM_FEATURE_ALL (0, 0, 0, 0)
406*e992f068Schristos #define ARM_ARCH_UNKNOWN	ARM_FEATURE_ALL (-1, -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP), -1, -1)	/* Machine type is unknown.  */
407*e992f068Schristos #define ARM_ANY		ARM_FEATURE_ALL (-1, -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP), -1, 0)	/* Any basic core.  */
408*e992f068Schristos #define FPU_ANY		ARM_FEATURE_COPROC (-1 & ~(ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT | ARM_CEXT_IWMMXT2)) /* Any FPU.  */
40975fd0b74Schristos #define FPU_ANY_HARD	ARM_FEATURE_COPROC (FPU_FPA | FPU_VFP_HARD | FPU_MAVERICK)
41075fd0b74Schristos /* Extensions containing some Thumb-2 instructions.  If any is present, Thumb
41175fd0b74Schristos    ISA is Thumb-2.  */
41275fd0b74Schristos #define ARM_ARCH_THUMB2 ARM_FEATURE_CORE (ARM_EXT_V6T2 | ARM_EXT_V7	\
41375fd0b74Schristos 					  | ARM_EXT_DIV | ARM_EXT_V8,	\
41475fd0b74Schristos 					  ARM_EXT2_ATOMICS | ARM_EXT2_V6T2_V8M)
41575fd0b74Schristos /* v7-a+sec.  */
41675fd0b74Schristos #define ARM_ARCH_V7A_SEC \
41775fd0b74Schristos   ARM_FEATURE_CORE (ARM_AEXT_V7A | ARM_EXT_SEC, ARM_EXT2_V6T2_V8M)
41875fd0b74Schristos /* v7-a+mp+sec.  */
41975fd0b74Schristos #define ARM_ARCH_V7A_MP_SEC \
42075fd0b74Schristos   ARM_FEATURE_CORE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, ARM_EXT2_V6T2_V8M)
42175fd0b74Schristos /* v7-r+idiv.  */
42275fd0b74Schristos #define ARM_ARCH_V7R_IDIV \
42375fd0b74Schristos   ARM_FEATURE_CORE (ARM_AEXT_V7R | ARM_EXT_ADIV, ARM_EXT2_V6T2_V8M)
42475fd0b74Schristos /* v8-a+fp.  */
42575fd0b74Schristos #define ARM_ARCH_V8A_FP	\
42675fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_VFP_ARMV8)
42775fd0b74Schristos /* v8-a+simd (implies fp).  */
42875fd0b74Schristos #define ARM_ARCH_V8A_SIMD \
42975fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_NEON_VFP_ARMV8)
43075fd0b74Schristos /* v8-a+crypto (implies simd+fp).  */
43175fd0b74Schristos #define ARM_ARCH_V8A_CRYPTOV1 \
43275fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8)
43375fd0b74Schristos 
43475fd0b74Schristos /* v8.1-a+fp.  */
43575fd0b74Schristos #define ARM_ARCH_V8_1A_FP \
43675fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_VFP_ARMV8)
43775fd0b74Schristos /* v8.1-a+simd (implies fp).  */
43875fd0b74Schristos #define ARM_ARCH_V8_1A_SIMD \
43975fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_NEON_VFP_ARMV8_1)
44075fd0b74Schristos /* v8.1-a+crypto (implies simd+fp).  */
44175fd0b74Schristos #define ARM_ARCH_V8_1A_CRYPTOV1 \
44275fd0b74Schristos   ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_1A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1)
44375fd0b74Schristos 
44475fd0b74Schristos 
44575fd0b74Schristos /* There are too many feature bits to fit in a single word, so use a
44675fd0b74Schristos    structure.  For simplicity we put all core features in array CORE
447*e992f068Schristos    and everything else in the other.  All the bits in element core[0:1]
448*e992f068Schristos    have been occupied, so new feature should use bit in element core[2]
44975fd0b74Schristos    and use macro ARM_FEATURE to initialize the feature set variable.  */
45075fd0b74Schristos typedef struct
45175fd0b74Schristos {
452*e992f068Schristos   unsigned long core[3];
45375fd0b74Schristos   unsigned long coproc;
45475fd0b74Schristos } arm_feature_set;
45575fd0b74Schristos 
45675fd0b74Schristos /* Test whether CPU and FEAT have any features in common.  */
45775fd0b74Schristos #define ARM_CPU_HAS_FEATURE(CPU,FEAT) \
45875fd0b74Schristos   (((CPU).core[0] & (FEAT).core[0]) != 0 \
45975fd0b74Schristos    || ((CPU).core[1] & (FEAT).core[1]) != 0 \
460*e992f068Schristos    || ((CPU).core[2] & (FEAT).core[2]) != 0 \
46175fd0b74Schristos    || ((CPU).coproc & (FEAT).coproc) != 0)
46275fd0b74Schristos 
46375fd0b74Schristos /* Tests whether the features of A are a subset of B.  */
46475fd0b74Schristos #define ARM_FSET_CPU_SUBSET(A,B) \
46575fd0b74Schristos   (((A).core[0] & (B).core[0]) == (A).core[0] \
46675fd0b74Schristos    && ((A).core[1] & (B).core[1]) == (A).core[1] \
467*e992f068Schristos    && ((A).core[2] & (B).core[2]) == (A).core[2] \
46875fd0b74Schristos    && ((A).coproc & (B).coproc) == (A).coproc)
46975fd0b74Schristos 
47075fd0b74Schristos #define ARM_CPU_IS_ANY(CPU) \
47175fd0b74Schristos   ((CPU).core[0] == ((arm_feature_set)ARM_ANY).core[0] \
472*e992f068Schristos    && (CPU).core[1] == ((arm_feature_set)ARM_ANY).core[1] \
473*e992f068Schristos    && (CPU).core[2] == ((arm_feature_set)ARM_ANY).core[2])
47475fd0b74Schristos 
47575fd0b74Schristos #define ARM_MERGE_FEATURE_SETS(TARG,F1,F2)		\
476ede78133Schristos   do							\
477ede78133Schristos     {							\
47875fd0b74Schristos       (TARG).core[0] = (F1).core[0] | (F2).core[0];	\
47975fd0b74Schristos       (TARG).core[1] = (F1).core[1] | (F2).core[1];	\
480*e992f068Schristos       (TARG).core[2] = (F1).core[2] | (F2).core[2];	\
48175fd0b74Schristos       (TARG).coproc = (F1).coproc | (F2).coproc;	\
482ede78133Schristos     }							\
483ede78133Schristos   while (0)
48475fd0b74Schristos 
48575fd0b74Schristos #define ARM_CLEAR_FEATURE(TARG,F1,F2)			\
486ede78133Schristos   do							\
487ede78133Schristos     {							\
48875fd0b74Schristos       (TARG).core[0] = (F1).core[0] &~ (F2).core[0];	\
48975fd0b74Schristos       (TARG).core[1] = (F1).core[1] &~ (F2).core[1];	\
490*e992f068Schristos       (TARG).core[2] = (F1).core[2] &~ (F2).core[2];	\
49175fd0b74Schristos       (TARG).coproc = (F1).coproc &~ (F2).coproc;	\
492ede78133Schristos     }							\
493ede78133Schristos   while (0)
49475fd0b74Schristos 
49575fd0b74Schristos #define ARM_FEATURE_EQUAL(T1,T2)		\
49675fd0b74Schristos   (   (T1).core[0] == (T2).core[0]		\
49775fd0b74Schristos    && (T1).core[1] == (T2).core[1]		\
498*e992f068Schristos    && (T1).core[2] == (T2).core[2]		\
49975fd0b74Schristos    && (T1).coproc  == (T2).coproc)
50075fd0b74Schristos 
50175fd0b74Schristos #define ARM_FEATURE_ZERO(T)			\
502*e992f068Schristos   ((T).core[0] == 0				\
503*e992f068Schristos    && (T).core[1] == 0				\
504*e992f068Schristos    && (T).core[2] == 0				\
505*e992f068Schristos    && (T).coproc == 0)
50675fd0b74Schristos 
50775fd0b74Schristos #define ARM_FEATURE_CORE_EQUAL(T1, T2)		\
508*e992f068Schristos   ((T1).core[0] == (T2).core[0]			\
509*e992f068Schristos    && (T1).core[1] == (T2).core[1]		\
510*e992f068Schristos    && (T1).core[2] == (T2).core[2])
51175fd0b74Schristos 
512*e992f068Schristos #define ARM_FEATURE_LOW(core, coproc) {{(core), 0, 0}, (coproc)}
513*e992f068Schristos #define ARM_FEATURE_CORE(core1, core2) {{(core1), (core2), 0}, 0}
514*e992f068Schristos #define ARM_FEATURE_CORE_LOW(core) {{(core), 0, 0}, 0}
515*e992f068Schristos #define ARM_FEATURE_CORE_HIGH(core) {{0, (core), 0}, 0}
516*e992f068Schristos #define ARM_FEATURE_CORE_HIGH_HIGH(core) {{0, 0, (core)}, 0}
517*e992f068Schristos #define ARM_FEATURE_COPROC(coproc) {{0, 0, 0}, (coproc)}
518*e992f068Schristos #define ARM_FEATURE(core1, core2, coproc) {{(core1), (core2), 0}, (coproc)}
519*e992f068Schristos /* Below macro is used to set all fields in arm_feature_set struct.
520*e992f068Schristos */
521*e992f068Schristos #define ARM_FEATURE_ALL(core1, core2, core3, coproc) {{(core1), (core2), (core3)}, (coproc)}
522