tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
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