summaryrefslogtreecommitdiff
path: root/gcc/config/arm/arm-isa.h
blob: 7d1e23be0a22ea3d04368a73538d606eef3ae092 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* ISA feature bits for ARM.
   Copyright (C) 2016-2017 Free Software Foundation, Inc.
   Contributed by ARM Ltd.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef ARM_ISA_FEATURE_H
#define ARM_ISA_FEATURE_H

enum isa_feature
  {
    isa_nobit,		/* Must be first.  */
    isa_bit_ARMv3m,	/* Extended multiply.  */
    isa_bit_mode26,	/* 26-bit mode support.  */
    isa_bit_mode32,	/* 32-bit mode support.  */
    isa_bit_ARMv4,	/* Architecture rel 4.  */
    isa_bit_ARMv5,	/* Architecture rel 5.	*/
    isa_bit_thumb,	/* Thumb aware.  */
    isa_bit_ARMv5e,	/* Architecture rel 5e.  */
    isa_bit_xscale,	/* XScale.  */
    isa_bit_ARMv6,	/* Architecture rel 6.  */
    isa_bit_ARMv6k,	/* Architecture rel 6k.  */
    isa_bit_thumb2,	/* Thumb-2.  */
    isa_bit_notm,	/* Instructions that are not present in 'M' profile.  */
    isa_bit_tdiv,	/* Thumb division instructions.  */
    isa_bit_ARMv7em,	/* Architecture rel 7e-m.  */
    isa_bit_ARMv7,	/* Architecture rel 7.  */
    isa_bit_adiv,	/* ARM division instructions.  */
    isa_bit_ARMv8,	/* Architecture rel 8.  */
    isa_bit_crc32,	/* ARMv8 CRC32 instructions.  */
    isa_bit_iwmmxt,	/* XScale v2 (Wireless MMX).  */
    isa_bit_iwmmxt2,	/* XScale Wireless MMX2.  */
    isa_bit_ARMv8_1,	/* Architecture rel 8.1.  */
    isa_bit_ARMv8_2,	/* Architecutre rel 8.2.  */
    isa_bit_cmse,	/* M-Profile security extensions.  */
    /* Floating point and Neon extensions.  */
    /* VFPv1 is not supported in GCC.  */
    isa_bit_VFPv2,	/* Vector floating point v2.  */
    isa_bit_VFPv3,	/* Vector floating point v3.  */
    isa_bit_VFPv4,	/* Vector floating point v4.  */
    isa_bit_FPv5,	/* Floating point v5.  */
    isa_bit_lpae,	/* ARMv7-A LPAE.  */
    isa_bit_FP_ARMv8,	/* ARMv8 floating-point extension.  */
    isa_bit_neon,	/* Advanced SIMD instructions.  */
    isa_bit_fp16conv,	/* Conversions to/from fp16 (VFPv3 extension).  */
    isa_bit_fp_dbl,	/* Double precision operations supported.  */
    isa_bit_fp_d32,	/* 32 Double precision registers.  */
    isa_bit_crypto,	/* Crypto extension to ARMv8.  */
    isa_bit_fp16,	/* FP16 data processing (half-precision float).  */

    /* ISA Quirks (errata?).  Don't forget to add this to the list of
       all quirks below.  */
    isa_quirk_no_volatile_ce,	/* No volatile memory in IT blocks.  */
    isa_quirk_ARMv6kz,		/* Previously mis-identified by GCC.  */
    isa_quirk_cm3_ldrd,		/* Cortex-M3 LDRD quirk.  */

    /* Aren't currently, but probably should be tuning bits.  */
    isa_bit_smallmul,	/* Slow multiply operations.  */

    /* Tuning bits.  Should be elsewhere.  */
    isa_tune_co_proc,	/* Has co-processor bus.  */
    isa_tune_ldsched,	/* Load scheduling necessary.  */
    isa_tune_strong,	/* StrongARM.  */
    isa_tune_wbuf,	/* Schedule for write buffer ops (ARM6 & 7 only).  */

    /* Must be last, used to dimension arrays.  */
    isa_num_bits
  };

/* Helper macros for use when defining CPUs and architectures.

   There must be no parenthesees in these lists, since they are used
   to initialize arrays.  */

#define ISA_ARMv2	isa_bit_notm
#define ISA_ARMv3	ISA_ARMv2, isa_bit_mode32
#define ISA_ARMv3m	ISA_ARMv3, isa_bit_ARMv3m
#define ISA_ARMv4	ISA_ARMv3m, isa_bit_ARMv4
#define ISA_ARMv4t	ISA_ARMv4, isa_bit_thumb
#define ISA_ARMv5	ISA_ARMv4, isa_bit_ARMv5
#define ISA_ARMv5t	ISA_ARMv5, isa_bit_thumb
#define ISA_ARMv5e	ISA_ARMv5, isa_bit_ARMv5e
#define ISA_ARMv5te	ISA_ARMv5e, isa_bit_thumb
#define ISA_ARMv5tej	ISA_ARMv5te
#define ISA_ARMv6	ISA_ARMv5te, isa_bit_ARMv6
#define ISA_ARMv6j	ISA_ARMv6
#define ISA_ARMv6k	ISA_ARMv6, isa_bit_ARMv6k
#define ISA_ARMv6z	ISA_ARMv6
#define ISA_ARMv6kz	ISA_ARMv6k, isa_quirk_ARMv6kz
#define ISA_ARMv6zk	ISA_ARMv6k
#define ISA_ARMv6t2	ISA_ARMv6, isa_bit_thumb2

/* This is suspect.  ARMv6-m doesn't really pull in any useful features
   from ARMv5* or ARMv6.  */
#define ISA_ARMv6m	isa_bit_mode32, isa_bit_ARMv3m, isa_bit_ARMv4, \
    isa_bit_thumb, isa_bit_ARMv5, isa_bit_ARMv5e, isa_bit_ARMv6
/* This is suspect, the 'common' ARMv7 subset excludes the thumb2 'DSP' and
   integer SIMD instructions that are in ARMv6T2.  */
#define ISA_ARMv7	ISA_ARMv6m, isa_bit_thumb2, isa_bit_ARMv7
#define ISA_ARMv7a	ISA_ARMv7, isa_bit_notm, isa_bit_ARMv6k
#define ISA_ARMv7ve	ISA_ARMv7a, isa_bit_adiv, isa_bit_tdiv, isa_bit_lpae
#define ISA_ARMv7r	ISA_ARMv7a, isa_bit_tdiv
#define ISA_ARMv7m	ISA_ARMv7, isa_bit_tdiv
#define ISA_ARMv7em	ISA_ARMv7m, isa_bit_ARMv7em
#define ISA_ARMv8a	ISA_ARMv7ve, isa_bit_ARMv8
#define ISA_ARMv8_1a	ISA_ARMv8a, isa_bit_crc32, isa_bit_ARMv8_1
#define ISA_ARMv8_2a	ISA_ARMv8_1a, isa_bit_ARMv8_2
#define ISA_ARMv8m_base ISA_ARMv6m, isa_bit_ARMv8, isa_bit_cmse, isa_bit_tdiv
#define ISA_ARMv8m_main ISA_ARMv7m, isa_bit_ARMv8, isa_bit_cmse

/* List of all FPU bits to strip out if -mfpu is used to override the
   default.  isa_bit_fp16 is deliberately missing from this list.  */
#define ISA_ALL_FPU	isa_bit_VFPv2, isa_bit_VFPv3, isa_bit_VFPv4, \
    isa_bit_FPv5, isa_bit_FP_ARMv8, isa_bit_neon, isa_bit_fp16conv, \
    isa_bit_fp_dbl, isa_bit_fp_d32, isa_bit_crypto

/* Useful combinations.  */
#define ISA_VFPv2	isa_bit_VFPv2
#define ISA_VFPv3	ISA_VFPv2, isa_bit_VFPv3
#define ISA_VFPv4	ISA_VFPv3, isa_bit_VFPv4, isa_bit_fp16conv
#define ISA_FPv5	ISA_VFPv4, isa_bit_FPv5
#define ISA_FP_ARMv8	ISA_FPv5, isa_bit_FP_ARMv8

#define ISA_FP_DBL	isa_bit_fp_dbl
#define ISA_FP_D32	ISA_FP_DBL, isa_bit_fp_d32
#define ISA_NEON	ISA_FP_D32, isa_bit_neon
#define ISA_CRYPTO	ISA_NEON, isa_bit_crypto

/* List of all quirk bits to strip out when comparing CPU features with
   architectures.  */
#define ISA_ALL_QUIRKS	isa_quirk_no_volatile_ce, isa_quirk_ARMv6kz,	\
    isa_quirk_cm3_ldrd

/* Helper macro so that we can concatenate multiple features together
   with arm-*.def files, since macro substitution can't have commas within an
   argument that lacks parenthesis.  */
#define ISA_FEAT(X)	X,
#endif