xref: /netbsd-src/external/gpl3/gcc/dist/gcc/config/loongarch/loongarch-def.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* LoongArch definitions.
2    Copyright (C) 2021-2022 Free Software Foundation, Inc.
3    Contributed by Loongson Ltd.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 /* Definition of standard codes for:
22     - base architecture types	(isa_base),
23     - ISA extensions		(isa_ext),
24     - base ABI types		(abi_base),
25     - ABI extension types	(abi_ext).
26 
27     - code models		      (cmodel)
28     - other command-line switches     (switch)
29 
30    These values are primarily used for implementing option handling
31    logic in "loongarch.opt", "loongarch-driver.c" and "loongarch-opt.c".
32 
33    As for the result of this option handling process, the following
34    scheme is adopted to represent the final configuration:
35 
36     - The target ABI is encoded with a tuple (abi_base, abi_ext)
37       using the code defined below.
38 
39     - The target ISA is encoded with a "struct loongarch_isa" defined
40       in loongarch-cpu.h.
41 
42     - The target microarchitecture is represented with a cpu model
43       index defined in loongarch-cpu.h.
44 */
45 
46 #ifndef LOONGARCH_DEF_H
47 #define LOONGARCH_DEF_H
48 
49 #include "loongarch-tune.h"
50 
51 #ifdef __cplusplus
52 extern "C" {
53 #endif
54 
55 /* enum isa_base */
56 extern const char* loongarch_isa_base_strings[];
57 #define ISA_BASE_LA64V100     0
58 #define N_ISA_BASE_TYPES      1
59 
60 /* enum isa_ext_* */
61 extern const char* loongarch_isa_ext_strings[];
62 #define ISA_EXT_NOFPU	      0
63 #define ISA_EXT_FPU32	      1
64 #define ISA_EXT_FPU64	      2
65 #define N_ISA_EXT_FPU_TYPES   3
66 #define N_ISA_EXT_TYPES	      3
67 
68 /* enum abi_base */
69 extern const char* loongarch_abi_base_strings[];
70 #define ABI_BASE_LP64D	      0
71 #define ABI_BASE_LP64F	      1
72 #define ABI_BASE_LP64S	      2
73 #define N_ABI_BASE_TYPES      3
74 
75 /* enum abi_ext */
76 extern const char* loongarch_abi_ext_strings[];
77 #define ABI_EXT_BASE	      0
78 #define N_ABI_EXT_TYPES	      1
79 
80 /* enum cmodel */
81 extern const char* loongarch_cmodel_strings[];
82 #define CMODEL_NORMAL	      0
83 #define CMODEL_TINY	      1
84 #define CMODEL_TINY_STATIC    2
85 #define CMODEL_LARGE	      3
86 #define CMODEL_EXTREME	      4
87 #define N_CMODEL_TYPES	      5
88 
89 /* enum switches */
90 /* The "SW_" codes represent command-line switches (options that
91    accept no parameters). Definition for other switches that affects
92    the target ISA / ABI configuration will also be appended here
93    in the future.  */
94 
95 extern const char* loongarch_switch_strings[];
96 #define SW_SOFT_FLOAT	      0
97 #define SW_SINGLE_FLOAT	      1
98 #define SW_DOUBLE_FLOAT	      2
99 #define N_SWITCH_TYPES	      3
100 
101 /* The common default value for variables whose assignments
102    are triggered by command-line options.  */
103 
104 #define M_OPTION_NOT_SEEN -1
105 #define M_OPT_ABSENT(opt_enum)  ((opt_enum) == M_OPTION_NOT_SEEN)
106 
107 
108 /* Internal representation of the target.  */
109 struct loongarch_isa
110 {
111   unsigned char base;	    /* ISA_BASE_ */
112   unsigned char fpu;	    /* ISA_EXT_FPU_ */
113 };
114 
115 struct loongarch_abi
116 {
117   unsigned char base;	    /* ABI_BASE_ */
118   unsigned char ext;	    /* ABI_EXT_ */
119 };
120 
121 struct loongarch_target
122 {
123   struct loongarch_isa isa;
124   struct loongarch_abi abi;
125   unsigned char cpu_arch;   /* CPU_ */
126   unsigned char cpu_tune;   /* same */
127   unsigned char cpu_native; /* same */
128   unsigned char cmodel;	    /* CMODEL_ */
129 };
130 
131 /* CPU properties.  */
132 /* index */
133 #define CPU_NATIVE	  0
134 #define CPU_LOONGARCH64	  1
135 #define CPU_LA464	  2
136 #define N_ARCH_TYPES	  3
137 #define N_TUNE_TYPES	  3
138 
139 /* parallel tables.  */
140 extern const char* loongarch_cpu_strings[];
141 extern struct loongarch_isa loongarch_cpu_default_isa[];
142 extern int loongarch_cpu_issue_rate[];
143 extern int loongarch_cpu_multipass_dfa_lookahead[];
144 
145 extern struct loongarch_cache loongarch_cpu_cache[];
146 extern struct loongarch_rtx_cost_data loongarch_cpu_rtx_cost_data[];
147 
148 #ifdef __cplusplus
149 }
150 #endif
151 #endif /* LOONGARCH_DEF_H */
152