ip2k-desc.c revision 1.1.1.11 1 1.1.1.5 christos /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
2 1.1 skrll /* CPU data for ip2k.
3 1.1 skrll
4 1.1 skrll THIS FILE IS MACHINE GENERATED WITH CGEN.
5 1.1 skrll
6 1.1.1.11 christos Copyright (C) 1996-2026 Free Software Foundation, Inc.
7 1.1 skrll
8 1.1 skrll This file is part of the GNU Binutils and/or GDB, the GNU debugger.
9 1.1 skrll
10 1.1 skrll This file is free software; you can redistribute it and/or modify
11 1.1 skrll it under the terms of the GNU General Public License as published by
12 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
13 1.1 skrll any later version.
14 1.1 skrll
15 1.1 skrll It is distributed in the hope that it will be useful, but WITHOUT
16 1.1 skrll ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 1.1 skrll or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 1.1 skrll License for more details.
19 1.1 skrll
20 1.1 skrll You should have received a copy of the GNU General Public License along
21 1.1 skrll with this program; if not, write to the Free Software Foundation, Inc.,
22 1.1 skrll 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
23 1.1 skrll
24 1.1 skrll */
25 1.1 skrll
26 1.1 skrll #include "sysdep.h"
27 1.1 skrll #include <stdio.h>
28 1.1 skrll #include <stdarg.h>
29 1.1.1.8 christos #include <stdlib.h>
30 1.1 skrll #include "ansidecl.h"
31 1.1 skrll #include "bfd.h"
32 1.1 skrll #include "symcat.h"
33 1.1 skrll #include "ip2k-desc.h"
34 1.1 skrll #include "ip2k-opc.h"
35 1.1 skrll #include "opintl.h"
36 1.1 skrll #include "libiberty.h"
37 1.1 skrll #include "xregex.h"
38 1.1 skrll
39 1.1 skrll /* Attributes. */
40 1.1 skrll
41 1.1 skrll static const CGEN_ATTR_ENTRY bool_attr[] =
42 1.1 skrll {
43 1.1 skrll { "#f", 0 },
44 1.1 skrll { "#t", 1 },
45 1.1 skrll { 0, 0 }
46 1.1 skrll };
47 1.1 skrll
48 1.1 skrll static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
49 1.1 skrll {
50 1.1 skrll { "base", MACH_BASE },
51 1.1 skrll { "ip2022", MACH_IP2022 },
52 1.1 skrll { "ip2022ext", MACH_IP2022EXT },
53 1.1 skrll { "max", MACH_MAX },
54 1.1 skrll { 0, 0 }
55 1.1 skrll };
56 1.1 skrll
57 1.1 skrll static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
58 1.1 skrll {
59 1.1 skrll { "ip2k", ISA_IP2K },
60 1.1 skrll { "max", ISA_MAX },
61 1.1 skrll { 0, 0 }
62 1.1 skrll };
63 1.1 skrll
64 1.1 skrll const CGEN_ATTR_TABLE ip2k_cgen_ifield_attr_table[] =
65 1.1 skrll {
66 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
67 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
68 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
69 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
70 1.1 skrll { "RESERVED", &bool_attr[0], &bool_attr[0] },
71 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
72 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] },
73 1.1 skrll { 0, 0, 0 }
74 1.1 skrll };
75 1.1 skrll
76 1.1 skrll const CGEN_ATTR_TABLE ip2k_cgen_hardware_attr_table[] =
77 1.1 skrll {
78 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
79 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
80 1.1 skrll { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
81 1.1 skrll { "PC", &bool_attr[0], &bool_attr[0] },
82 1.1 skrll { "PROFILE", &bool_attr[0], &bool_attr[0] },
83 1.1 skrll { 0, 0, 0 }
84 1.1 skrll };
85 1.1 skrll
86 1.1 skrll const CGEN_ATTR_TABLE ip2k_cgen_operand_attr_table[] =
87 1.1 skrll {
88 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
89 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
90 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
91 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
92 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
93 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] },
94 1.1 skrll { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
95 1.1 skrll { "RELAX", &bool_attr[0], &bool_attr[0] },
96 1.1 skrll { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
97 1.1 skrll { 0, 0, 0 }
98 1.1 skrll };
99 1.1 skrll
100 1.1 skrll const CGEN_ATTR_TABLE ip2k_cgen_insn_attr_table[] =
101 1.1 skrll {
102 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
103 1.1 skrll { "ALIAS", &bool_attr[0], &bool_attr[0] },
104 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
105 1.1 skrll { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
106 1.1 skrll { "COND-CTI", &bool_attr[0], &bool_attr[0] },
107 1.1 skrll { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
108 1.1 skrll { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
109 1.1 skrll { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
110 1.1 skrll { "RELAXED", &bool_attr[0], &bool_attr[0] },
111 1.1 skrll { "NO-DIS", &bool_attr[0], &bool_attr[0] },
112 1.1 skrll { "PBB", &bool_attr[0], &bool_attr[0] },
113 1.1 skrll { "EXT-SKIP-INSN", &bool_attr[0], &bool_attr[0] },
114 1.1 skrll { "SKIPA", &bool_attr[0], &bool_attr[0] },
115 1.1 skrll { 0, 0, 0 }
116 1.1 skrll };
117 1.1 skrll
118 1.1 skrll /* Instruction set variants. */
119 1.1 skrll
120 1.1 skrll static const CGEN_ISA ip2k_cgen_isa_table[] = {
121 1.1 skrll { "ip2k", 16, 16, 16, 16 },
122 1.1 skrll { 0, 0, 0, 0, 0 }
123 1.1 skrll };
124 1.1 skrll
125 1.1 skrll /* Machine variants. */
126 1.1 skrll
127 1.1 skrll static const CGEN_MACH ip2k_cgen_mach_table[] = {
128 1.1 skrll { "ip2022", "ip2022", MACH_IP2022, 0 },
129 1.1 skrll { "ip2022ext", "ip2022ext", MACH_IP2022EXT, 0 },
130 1.1 skrll { 0, 0, 0, 0 }
131 1.1 skrll };
132 1.1 skrll
133 1.1 skrll static CGEN_KEYWORD_ENTRY ip2k_cgen_opval_register_names_entries[] =
134 1.1 skrll {
135 1.1 skrll { "ADDRSEL", 2, {0, {{{0, 0}}}}, 0, 0 },
136 1.1 skrll { "ADDRX", 3, {0, {{{0, 0}}}}, 0, 0 },
137 1.1 skrll { "IPH", 4, {0, {{{0, 0}}}}, 0, 0 },
138 1.1 skrll { "IPL", 5, {0, {{{0, 0}}}}, 0, 0 },
139 1.1 skrll { "SPH", 6, {0, {{{0, 0}}}}, 0, 0 },
140 1.1 skrll { "SPL", 7, {0, {{{0, 0}}}}, 0, 0 },
141 1.1 skrll { "PCH", 8, {0, {{{0, 0}}}}, 0, 0 },
142 1.1 skrll { "PCL", 9, {0, {{{0, 0}}}}, 0, 0 },
143 1.1 skrll { "WREG", 10, {0, {{{0, 0}}}}, 0, 0 },
144 1.1 skrll { "STATUS", 11, {0, {{{0, 0}}}}, 0, 0 },
145 1.1 skrll { "DPH", 12, {0, {{{0, 0}}}}, 0, 0 },
146 1.1 skrll { "DPL", 13, {0, {{{0, 0}}}}, 0, 0 },
147 1.1 skrll { "SPDREG", 14, {0, {{{0, 0}}}}, 0, 0 },
148 1.1 skrll { "MULH", 15, {0, {{{0, 0}}}}, 0, 0 },
149 1.1 skrll { "ADDRH", 16, {0, {{{0, 0}}}}, 0, 0 },
150 1.1 skrll { "ADDRL", 17, {0, {{{0, 0}}}}, 0, 0 },
151 1.1 skrll { "DATAH", 18, {0, {{{0, 0}}}}, 0, 0 },
152 1.1 skrll { "DATAL", 19, {0, {{{0, 0}}}}, 0, 0 },
153 1.1 skrll { "INTVECH", 20, {0, {{{0, 0}}}}, 0, 0 },
154 1.1 skrll { "INTVECL", 21, {0, {{{0, 0}}}}, 0, 0 },
155 1.1 skrll { "INTSPD", 22, {0, {{{0, 0}}}}, 0, 0 },
156 1.1 skrll { "INTF", 23, {0, {{{0, 0}}}}, 0, 0 },
157 1.1 skrll { "INTE", 24, {0, {{{0, 0}}}}, 0, 0 },
158 1.1 skrll { "INTED", 25, {0, {{{0, 0}}}}, 0, 0 },
159 1.1 skrll { "FCFG", 26, {0, {{{0, 0}}}}, 0, 0 },
160 1.1 skrll { "TCTRL", 27, {0, {{{0, 0}}}}, 0, 0 },
161 1.1 skrll { "XCFG", 28, {0, {{{0, 0}}}}, 0, 0 },
162 1.1 skrll { "EMCFG", 29, {0, {{{0, 0}}}}, 0, 0 },
163 1.1 skrll { "IPCH", 30, {0, {{{0, 0}}}}, 0, 0 },
164 1.1 skrll { "IPCL", 31, {0, {{{0, 0}}}}, 0, 0 },
165 1.1 skrll { "RAIN", 32, {0, {{{0, 0}}}}, 0, 0 },
166 1.1 skrll { "RAOUT", 33, {0, {{{0, 0}}}}, 0, 0 },
167 1.1 skrll { "RADIR", 34, {0, {{{0, 0}}}}, 0, 0 },
168 1.1 skrll { "LFSRH", 35, {0, {{{0, 0}}}}, 0, 0 },
169 1.1 skrll { "RBIN", 36, {0, {{{0, 0}}}}, 0, 0 },
170 1.1 skrll { "RBOUT", 37, {0, {{{0, 0}}}}, 0, 0 },
171 1.1 skrll { "RBDIR", 38, {0, {{{0, 0}}}}, 0, 0 },
172 1.1 skrll { "LFSRL", 39, {0, {{{0, 0}}}}, 0, 0 },
173 1.1 skrll { "RCIN", 40, {0, {{{0, 0}}}}, 0, 0 },
174 1.1 skrll { "RCOUT", 41, {0, {{{0, 0}}}}, 0, 0 },
175 1.1 skrll { "RCDIR", 42, {0, {{{0, 0}}}}, 0, 0 },
176 1.1 skrll { "LFSRA", 43, {0, {{{0, 0}}}}, 0, 0 },
177 1.1 skrll { "RDIN", 44, {0, {{{0, 0}}}}, 0, 0 },
178 1.1 skrll { "RDOUT", 45, {0, {{{0, 0}}}}, 0, 0 },
179 1.1 skrll { "RDDIR", 46, {0, {{{0, 0}}}}, 0, 0 },
180 1.1 skrll { "REIN", 48, {0, {{{0, 0}}}}, 0, 0 },
181 1.1 skrll { "REOUT", 49, {0, {{{0, 0}}}}, 0, 0 },
182 1.1 skrll { "REDIR", 50, {0, {{{0, 0}}}}, 0, 0 },
183 1.1 skrll { "RFIN", 52, {0, {{{0, 0}}}}, 0, 0 },
184 1.1 skrll { "RFOUT", 53, {0, {{{0, 0}}}}, 0, 0 },
185 1.1 skrll { "RFDIR", 54, {0, {{{0, 0}}}}, 0, 0 },
186 1.1 skrll { "RGOUT", 57, {0, {{{0, 0}}}}, 0, 0 },
187 1.1 skrll { "RGDIR", 58, {0, {{{0, 0}}}}, 0, 0 },
188 1.1 skrll { "RTTMR", 64, {0, {{{0, 0}}}}, 0, 0 },
189 1.1 skrll { "RTCFG", 65, {0, {{{0, 0}}}}, 0, 0 },
190 1.1 skrll { "T0TMR", 66, {0, {{{0, 0}}}}, 0, 0 },
191 1.1 skrll { "T0CFG", 67, {0, {{{0, 0}}}}, 0, 0 },
192 1.1 skrll { "T1CNTH", 68, {0, {{{0, 0}}}}, 0, 0 },
193 1.1 skrll { "T1CNTL", 69, {0, {{{0, 0}}}}, 0, 0 },
194 1.1 skrll { "T1CAP1H", 70, {0, {{{0, 0}}}}, 0, 0 },
195 1.1 skrll { "T1CAP1L", 71, {0, {{{0, 0}}}}, 0, 0 },
196 1.1 skrll { "T1CAP2H", 72, {0, {{{0, 0}}}}, 0, 0 },
197 1.1 skrll { "T1CMP2H", 72, {0, {{{0, 0}}}}, 0, 0 },
198 1.1 skrll { "T1CAP2L", 73, {0, {{{0, 0}}}}, 0, 0 },
199 1.1 skrll { "T1CMP2L", 73, {0, {{{0, 0}}}}, 0, 0 },
200 1.1 skrll { "T1CMP1H", 74, {0, {{{0, 0}}}}, 0, 0 },
201 1.1 skrll { "T1CMP1L", 75, {0, {{{0, 0}}}}, 0, 0 },
202 1.1 skrll { "T1CFG1H", 76, {0, {{{0, 0}}}}, 0, 0 },
203 1.1 skrll { "T1CFG1L", 77, {0, {{{0, 0}}}}, 0, 0 },
204 1.1 skrll { "T1CFG2H", 78, {0, {{{0, 0}}}}, 0, 0 },
205 1.1 skrll { "T1CFG2L", 79, {0, {{{0, 0}}}}, 0, 0 },
206 1.1 skrll { "ADCH", 80, {0, {{{0, 0}}}}, 0, 0 },
207 1.1 skrll { "ADCL", 81, {0, {{{0, 0}}}}, 0, 0 },
208 1.1 skrll { "ADCCFG", 82, {0, {{{0, 0}}}}, 0, 0 },
209 1.1 skrll { "ADCTMR", 83, {0, {{{0, 0}}}}, 0, 0 },
210 1.1 skrll { "T2CNTH", 84, {0, {{{0, 0}}}}, 0, 0 },
211 1.1 skrll { "T2CNTL", 85, {0, {{{0, 0}}}}, 0, 0 },
212 1.1 skrll { "T2CAP1H", 86, {0, {{{0, 0}}}}, 0, 0 },
213 1.1 skrll { "T2CAP1L", 87, {0, {{{0, 0}}}}, 0, 0 },
214 1.1 skrll { "T2CAP2H", 88, {0, {{{0, 0}}}}, 0, 0 },
215 1.1 skrll { "T2CMP2H", 88, {0, {{{0, 0}}}}, 0, 0 },
216 1.1 skrll { "T2CAP2L", 89, {0, {{{0, 0}}}}, 0, 0 },
217 1.1 skrll { "T2CMP2L", 89, {0, {{{0, 0}}}}, 0, 0 },
218 1.1 skrll { "T2CMP1H", 90, {0, {{{0, 0}}}}, 0, 0 },
219 1.1 skrll { "T2CMP1L", 91, {0, {{{0, 0}}}}, 0, 0 },
220 1.1 skrll { "T2CFG1H", 92, {0, {{{0, 0}}}}, 0, 0 },
221 1.1 skrll { "T2CFG1L", 93, {0, {{{0, 0}}}}, 0, 0 },
222 1.1 skrll { "T2CFG2H", 94, {0, {{{0, 0}}}}, 0, 0 },
223 1.1 skrll { "T2CFG2L", 95, {0, {{{0, 0}}}}, 0, 0 },
224 1.1 skrll { "S1TMRH", 96, {0, {{{0, 0}}}}, 0, 0 },
225 1.1 skrll { "S1TMRL", 97, {0, {{{0, 0}}}}, 0, 0 },
226 1.1 skrll { "S1TBUFH", 98, {0, {{{0, 0}}}}, 0, 0 },
227 1.1 skrll { "S1TBUFL", 99, {0, {{{0, 0}}}}, 0, 0 },
228 1.1 skrll { "S1TCFG", 100, {0, {{{0, 0}}}}, 0, 0 },
229 1.1 skrll { "S1RCNT", 101, {0, {{{0, 0}}}}, 0, 0 },
230 1.1 skrll { "S1RBUFH", 102, {0, {{{0, 0}}}}, 0, 0 },
231 1.1 skrll { "S1RBUFL", 103, {0, {{{0, 0}}}}, 0, 0 },
232 1.1 skrll { "S1RCFG", 104, {0, {{{0, 0}}}}, 0, 0 },
233 1.1 skrll { "S1RSYNC", 105, {0, {{{0, 0}}}}, 0, 0 },
234 1.1 skrll { "S1INTF", 106, {0, {{{0, 0}}}}, 0, 0 },
235 1.1 skrll { "S1INTE", 107, {0, {{{0, 0}}}}, 0, 0 },
236 1.1 skrll { "S1MODE", 108, {0, {{{0, 0}}}}, 0, 0 },
237 1.1 skrll { "S1SMASK", 109, {0, {{{0, 0}}}}, 0, 0 },
238 1.1 skrll { "PSPCFG", 110, {0, {{{0, 0}}}}, 0, 0 },
239 1.1 skrll { "CMPCFG", 111, {0, {{{0, 0}}}}, 0, 0 },
240 1.1 skrll { "S2TMRH", 112, {0, {{{0, 0}}}}, 0, 0 },
241 1.1 skrll { "S2TMRL", 113, {0, {{{0, 0}}}}, 0, 0 },
242 1.1 skrll { "S2TBUFH", 114, {0, {{{0, 0}}}}, 0, 0 },
243 1.1 skrll { "S2TBUFL", 115, {0, {{{0, 0}}}}, 0, 0 },
244 1.1 skrll { "S2TCFG", 116, {0, {{{0, 0}}}}, 0, 0 },
245 1.1 skrll { "S2RCNT", 117, {0, {{{0, 0}}}}, 0, 0 },
246 1.1 skrll { "S2RBUFH", 118, {0, {{{0, 0}}}}, 0, 0 },
247 1.1 skrll { "S2RBUFL", 119, {0, {{{0, 0}}}}, 0, 0 },
248 1.1 skrll { "S2RCFG", 120, {0, {{{0, 0}}}}, 0, 0 },
249 1.1 skrll { "S2RSYNC", 121, {0, {{{0, 0}}}}, 0, 0 },
250 1.1 skrll { "S2INTF", 122, {0, {{{0, 0}}}}, 0, 0 },
251 1.1 skrll { "S2INTE", 123, {0, {{{0, 0}}}}, 0, 0 },
252 1.1 skrll { "S2MODE", 124, {0, {{{0, 0}}}}, 0, 0 },
253 1.1 skrll { "S2SMASK", 125, {0, {{{0, 0}}}}, 0, 0 },
254 1.1 skrll { "CALLH", 126, {0, {{{0, 0}}}}, 0, 0 },
255 1.1 skrll { "CALLL", 127, {0, {{{0, 0}}}}, 0, 0 }
256 1.1 skrll };
257 1.1 skrll
258 1.1 skrll CGEN_KEYWORD ip2k_cgen_opval_register_names =
259 1.1 skrll {
260 1.1 skrll & ip2k_cgen_opval_register_names_entries[0],
261 1.1 skrll 121,
262 1.1 skrll 0, 0, 0, 0, ""
263 1.1 skrll };
264 1.1 skrll
265 1.1 skrll
266 1.1 skrll /* The hardware table. */
267 1.1 skrll
268 1.1 skrll #define A(a) (1 << CGEN_HW_##a)
269 1.1 skrll
270 1.1 skrll const CGEN_HW_ENTRY ip2k_cgen_hw_table[] =
271 1.1 skrll {
272 1.1 skrll { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
273 1.1 skrll { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
274 1.1 skrll { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
275 1.1 skrll { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
276 1.1 skrll { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
277 1.1 skrll { "h-spr", HW_H_SPR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
278 1.1 skrll { "h-registers", HW_H_REGISTERS, CGEN_ASM_NONE, 0, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
279 1.1 skrll { "h-stack", HW_H_STACK, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
280 1.1 skrll { "h-pabits", HW_H_PABITS, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
281 1.1 skrll { "h-zbit", HW_H_ZBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
282 1.1 skrll { "h-cbit", HW_H_CBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
283 1.1 skrll { "h-dcbit", HW_H_DCBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
284 1.1 skrll { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
285 1.1 skrll { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
286 1.1 skrll };
287 1.1 skrll
288 1.1 skrll #undef A
289 1.1 skrll
290 1.1 skrll
291 1.1 skrll /* The instruction field table. */
292 1.1 skrll
293 1.1 skrll #define A(a) (1 << CGEN_IFLD_##a)
294 1.1 skrll
295 1.1 skrll const CGEN_IFLD ip2k_cgen_ifld_table[] =
296 1.1 skrll {
297 1.1 skrll { IP2K_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
298 1.1 skrll { IP2K_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
299 1.1 skrll { IP2K_F_IMM8, "f-imm8", 0, 16, 7, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } },
300 1.1 skrll { IP2K_F_REG, "f-reg", 0, 16, 8, 9, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
301 1.1 skrll { IP2K_F_ADDR16CJP, "f-addr16cjp", 0, 16, 12, 13, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
302 1.1 skrll { IP2K_F_DIR, "f-dir", 0, 16, 9, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } },
303 1.1 skrll { IP2K_F_BITNO, "f-bitno", 0, 16, 11, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
304 1.1 skrll { IP2K_F_OP3, "f-op3", 0, 16, 15, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
305 1.1 skrll { IP2K_F_OP4, "f-op4", 0, 16, 15, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
306 1.1 skrll { IP2K_F_OP4MID, "f-op4mid", 0, 16, 11, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
307 1.1 skrll { IP2K_F_OP6, "f-op6", 0, 16, 15, 6, { 0, { { { (1<<MACH_BASE), 0 } } } } },
308 1.1 skrll { IP2K_F_OP8, "f-op8", 0, 16, 15, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } },
309 1.1 skrll { IP2K_F_OP6_10LOW, "f-op6-10low", 0, 16, 9, 10, { 0, { { { (1<<MACH_BASE), 0 } } } } },
310 1.1 skrll { IP2K_F_OP6_7LOW, "f-op6-7low", 0, 16, 9, 7, { 0, { { { (1<<MACH_BASE), 0 } } } } },
311 1.1 skrll { IP2K_F_RETI3, "f-reti3", 0, 16, 2, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
312 1.1 skrll { IP2K_F_SKIPB, "f-skipb", 0, 16, 12, 1, { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
313 1.1 skrll { IP2K_F_PAGE3, "f-page3", 0, 16, 2, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
314 1.1 skrll { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
315 1.1 skrll };
316 1.1 skrll
317 1.1 skrll #undef A
318 1.1 skrll
319 1.1 skrll
320 1.1 skrll
321 1.1 skrll /* multi ifield declarations */
322 1.1 skrll
323 1.1 skrll
324 1.1 skrll
325 1.1 skrll /* multi ifield definitions */
326 1.1 skrll
327 1.1 skrll
328 1.1 skrll /* The operand table. */
329 1.1 skrll
330 1.1 skrll #define A(a) (1 << CGEN_OPERAND_##a)
331 1.1 skrll #define OPERAND(op) IP2K_OPERAND_##op
332 1.1 skrll
333 1.1 skrll const CGEN_OPERAND ip2k_cgen_operand_table[] =
334 1.1 skrll {
335 1.1 skrll /* pc: program counter */
336 1.1 skrll { "pc", IP2K_OPERAND_PC, HW_H_PC, 0, 0,
337 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_NIL] } },
338 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } },
339 1.1 skrll /* addr16cjp: 13-bit address */
340 1.1 skrll { "addr16cjp", IP2K_OPERAND_ADDR16CJP, HW_H_UINT, 12, 13,
341 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_ADDR16CJP] } },
342 1.1 skrll { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
343 1.1 skrll /* fr: register */
344 1.1 skrll { "fr", IP2K_OPERAND_FR, HW_H_REGISTERS, 8, 9,
345 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_REG] } },
346 1.1 skrll { 0|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
347 1.1 skrll /* lit8: 8-bit signed literal */
348 1.1 skrll { "lit8", IP2K_OPERAND_LIT8, HW_H_SINT, 7, 8,
349 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
350 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
351 1.1 skrll /* bitno: bit number */
352 1.1 skrll { "bitno", IP2K_OPERAND_BITNO, HW_H_UINT, 11, 3,
353 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_BITNO] } },
354 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
355 1.1 skrll /* addr16p: page number */
356 1.1 skrll { "addr16p", IP2K_OPERAND_ADDR16P, HW_H_UINT, 2, 3,
357 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_PAGE3] } },
358 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
359 1.1 skrll /* addr16h: high 8 bits of address */
360 1.1 skrll { "addr16h", IP2K_OPERAND_ADDR16H, HW_H_UINT, 7, 8,
361 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
362 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
363 1.1 skrll /* addr16l: low 8 bits of address */
364 1.1 skrll { "addr16l", IP2K_OPERAND_ADDR16L, HW_H_UINT, 7, 8,
365 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_IMM8] } },
366 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
367 1.1 skrll /* reti3: reti flags */
368 1.1 skrll { "reti3", IP2K_OPERAND_RETI3, HW_H_UINT, 2, 3,
369 1.1.1.8 christos { 0, { &ip2k_cgen_ifld_table[IP2K_F_RETI3] } },
370 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
371 1.1 skrll /* pabits: page bits */
372 1.1 skrll { "pabits", IP2K_OPERAND_PABITS, HW_H_PABITS, 0, 0,
373 1.1.1.8 christos { 0, { 0 } },
374 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
375 1.1 skrll /* zbit: zero bit */
376 1.1 skrll { "zbit", IP2K_OPERAND_ZBIT, HW_H_ZBIT, 0, 0,
377 1.1.1.8 christos { 0, { 0 } },
378 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
379 1.1 skrll /* cbit: carry bit */
380 1.1 skrll { "cbit", IP2K_OPERAND_CBIT, HW_H_CBIT, 0, 0,
381 1.1.1.8 christos { 0, { 0 } },
382 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
383 1.1 skrll /* dcbit: digit carry bit */
384 1.1 skrll { "dcbit", IP2K_OPERAND_DCBIT, HW_H_DCBIT, 0, 0,
385 1.1.1.8 christos { 0, { 0 } },
386 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
387 1.1 skrll /* sentinel */
388 1.1 skrll { 0, 0, 0, 0, 0,
389 1.1.1.8 christos { 0, { 0 } },
390 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }
391 1.1 skrll };
392 1.1 skrll
393 1.1 skrll #undef A
394 1.1 skrll
395 1.1 skrll
396 1.1 skrll /* The instruction table. */
397 1.1 skrll
398 1.1 skrll #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
399 1.1 skrll #define A(a) (1 << CGEN_INSN_##a)
400 1.1 skrll
401 1.1 skrll static const CGEN_IBASE ip2k_cgen_insn_table[MAX_INSNS] =
402 1.1 skrll {
403 1.1 skrll /* Special null first entry.
404 1.1 skrll A `num' value of zero is thus invalid.
405 1.1 skrll Also, the special `invalid' insn resides here. */
406 1.1 skrll { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
407 1.1 skrll /* jmp $addr16cjp */
408 1.1 skrll {
409 1.1 skrll IP2K_INSN_JMP, "jmp", "jmp", 16,
410 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
411 1.1 skrll },
412 1.1 skrll /* call $addr16cjp */
413 1.1 skrll {
414 1.1 skrll IP2K_INSN_CALL, "call", "call", 16,
415 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
416 1.1 skrll },
417 1.1 skrll /* sb $fr,$bitno */
418 1.1 skrll {
419 1.1 skrll IP2K_INSN_SB, "sb", "sb", 16,
420 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
421 1.1 skrll },
422 1.1 skrll /* snb $fr,$bitno */
423 1.1 skrll {
424 1.1 skrll IP2K_INSN_SNB, "snb", "snb", 16,
425 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
426 1.1 skrll },
427 1.1 skrll /* setb $fr,$bitno */
428 1.1 skrll {
429 1.1 skrll IP2K_INSN_SETB, "setb", "setb", 16,
430 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
431 1.1 skrll },
432 1.1 skrll /* clrb $fr,$bitno */
433 1.1 skrll {
434 1.1 skrll IP2K_INSN_CLRB, "clrb", "clrb", 16,
435 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
436 1.1 skrll },
437 1.1 skrll /* xor W,#$lit8 */
438 1.1 skrll {
439 1.1 skrll IP2K_INSN_XORW_L, "xorw_l", "xor", 16,
440 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
441 1.1 skrll },
442 1.1 skrll /* and W,#$lit8 */
443 1.1 skrll {
444 1.1 skrll IP2K_INSN_ANDW_L, "andw_l", "and", 16,
445 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
446 1.1 skrll },
447 1.1 skrll /* or W,#$lit8 */
448 1.1 skrll {
449 1.1 skrll IP2K_INSN_ORW_L, "orw_l", "or", 16,
450 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
451 1.1 skrll },
452 1.1 skrll /* add W,#$lit8 */
453 1.1 skrll {
454 1.1 skrll IP2K_INSN_ADDW_L, "addw_l", "add", 16,
455 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
456 1.1 skrll },
457 1.1 skrll /* sub W,#$lit8 */
458 1.1 skrll {
459 1.1 skrll IP2K_INSN_SUBW_L, "subw_l", "sub", 16,
460 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
461 1.1 skrll },
462 1.1 skrll /* cmp W,#$lit8 */
463 1.1 skrll {
464 1.1 skrll IP2K_INSN_CMPW_L, "cmpw_l", "cmp", 16,
465 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
466 1.1 skrll },
467 1.1 skrll /* retw #$lit8 */
468 1.1 skrll {
469 1.1 skrll IP2K_INSN_RETW_L, "retw_l", "retw", 16,
470 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
471 1.1 skrll },
472 1.1 skrll /* cse W,#$lit8 */
473 1.1 skrll {
474 1.1 skrll IP2K_INSN_CSEW_L, "csew_l", "cse", 16,
475 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
476 1.1 skrll },
477 1.1 skrll /* csne W,#$lit8 */
478 1.1 skrll {
479 1.1 skrll IP2K_INSN_CSNEW_L, "csnew_l", "csne", 16,
480 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
481 1.1 skrll },
482 1.1 skrll /* push #$lit8 */
483 1.1 skrll {
484 1.1 skrll IP2K_INSN_PUSH_L, "push_l", "push", 16,
485 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
486 1.1 skrll },
487 1.1 skrll /* muls W,#$lit8 */
488 1.1 skrll {
489 1.1 skrll IP2K_INSN_MULSW_L, "mulsw_l", "muls", 16,
490 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
491 1.1 skrll },
492 1.1 skrll /* mulu W,#$lit8 */
493 1.1 skrll {
494 1.1 skrll IP2K_INSN_MULUW_L, "muluw_l", "mulu", 16,
495 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
496 1.1 skrll },
497 1.1 skrll /* loadl #$lit8 */
498 1.1 skrll {
499 1.1 skrll IP2K_INSN_LOADL_L, "loadl_l", "loadl", 16,
500 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
501 1.1 skrll },
502 1.1 skrll /* loadh #$lit8 */
503 1.1 skrll {
504 1.1 skrll IP2K_INSN_LOADH_L, "loadh_l", "loadh", 16,
505 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
506 1.1 skrll },
507 1.1 skrll /* loadl $addr16l */
508 1.1 skrll {
509 1.1 skrll IP2K_INSN_LOADL_A, "loadl_a", "loadl", 16,
510 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
511 1.1 skrll },
512 1.1 skrll /* loadh $addr16h */
513 1.1 skrll {
514 1.1 skrll IP2K_INSN_LOADH_A, "loadh_a", "loadh", 16,
515 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
516 1.1 skrll },
517 1.1 skrll /* addc $fr,W */
518 1.1 skrll {
519 1.1 skrll IP2K_INSN_ADDCFR_W, "addcfr_w", "addc", 16,
520 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
521 1.1 skrll },
522 1.1 skrll /* addc W,$fr */
523 1.1 skrll {
524 1.1 skrll IP2K_INSN_ADDCW_FR, "addcw_fr", "addc", 16,
525 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
526 1.1 skrll },
527 1.1 skrll /* incsnz $fr */
528 1.1 skrll {
529 1.1 skrll IP2K_INSN_INCSNZ_FR, "incsnz_fr", "incsnz", 16,
530 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
531 1.1 skrll },
532 1.1 skrll /* incsnz W,$fr */
533 1.1 skrll {
534 1.1 skrll IP2K_INSN_INCSNZW_FR, "incsnzw_fr", "incsnz", 16,
535 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
536 1.1 skrll },
537 1.1 skrll /* muls W,$fr */
538 1.1 skrll {
539 1.1 skrll IP2K_INSN_MULSW_FR, "mulsw_fr", "muls", 16,
540 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
541 1.1 skrll },
542 1.1 skrll /* mulu W,$fr */
543 1.1 skrll {
544 1.1 skrll IP2K_INSN_MULUW_FR, "muluw_fr", "mulu", 16,
545 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
546 1.1 skrll },
547 1.1 skrll /* decsnz $fr */
548 1.1 skrll {
549 1.1 skrll IP2K_INSN_DECSNZ_FR, "decsnz_fr", "decsnz", 16,
550 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
551 1.1 skrll },
552 1.1 skrll /* decsnz W,$fr */
553 1.1 skrll {
554 1.1 skrll IP2K_INSN_DECSNZW_FR, "decsnzw_fr", "decsnz", 16,
555 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
556 1.1 skrll },
557 1.1 skrll /* subc W,$fr */
558 1.1 skrll {
559 1.1 skrll IP2K_INSN_SUBCW_FR, "subcw_fr", "subc", 16,
560 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
561 1.1 skrll },
562 1.1 skrll /* subc $fr,W */
563 1.1 skrll {
564 1.1 skrll IP2K_INSN_SUBCFR_W, "subcfr_w", "subc", 16,
565 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
566 1.1 skrll },
567 1.1 skrll /* pop $fr */
568 1.1 skrll {
569 1.1 skrll IP2K_INSN_POP_FR, "pop_fr", "pop", 16,
570 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
571 1.1 skrll },
572 1.1 skrll /* push $fr */
573 1.1 skrll {
574 1.1 skrll IP2K_INSN_PUSH_FR, "push_fr", "push", 16,
575 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
576 1.1 skrll },
577 1.1 skrll /* cse W,$fr */
578 1.1 skrll {
579 1.1 skrll IP2K_INSN_CSEW_FR, "csew_fr", "cse", 16,
580 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
581 1.1 skrll },
582 1.1 skrll /* csne W,$fr */
583 1.1 skrll {
584 1.1 skrll IP2K_INSN_CSNEW_FR, "csnew_fr", "csne", 16,
585 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
586 1.1 skrll },
587 1.1 skrll /* incsz $fr */
588 1.1 skrll {
589 1.1 skrll IP2K_INSN_INCSZ_FR, "incsz_fr", "incsz", 16,
590 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
591 1.1 skrll },
592 1.1 skrll /* incsz W,$fr */
593 1.1 skrll {
594 1.1 skrll IP2K_INSN_INCSZW_FR, "incszw_fr", "incsz", 16,
595 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
596 1.1 skrll },
597 1.1 skrll /* swap $fr */
598 1.1 skrll {
599 1.1 skrll IP2K_INSN_SWAP_FR, "swap_fr", "swap", 16,
600 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
601 1.1 skrll },
602 1.1 skrll /* swap W,$fr */
603 1.1 skrll {
604 1.1 skrll IP2K_INSN_SWAPW_FR, "swapw_fr", "swap", 16,
605 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
606 1.1 skrll },
607 1.1 skrll /* rl $fr */
608 1.1 skrll {
609 1.1 skrll IP2K_INSN_RL_FR, "rl_fr", "rl", 16,
610 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
611 1.1 skrll },
612 1.1 skrll /* rl W,$fr */
613 1.1 skrll {
614 1.1 skrll IP2K_INSN_RLW_FR, "rlw_fr", "rl", 16,
615 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
616 1.1 skrll },
617 1.1 skrll /* rr $fr */
618 1.1 skrll {
619 1.1 skrll IP2K_INSN_RR_FR, "rr_fr", "rr", 16,
620 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
621 1.1 skrll },
622 1.1 skrll /* rr W,$fr */
623 1.1 skrll {
624 1.1 skrll IP2K_INSN_RRW_FR, "rrw_fr", "rr", 16,
625 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
626 1.1 skrll },
627 1.1 skrll /* decsz $fr */
628 1.1 skrll {
629 1.1 skrll IP2K_INSN_DECSZ_FR, "decsz_fr", "decsz", 16,
630 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
631 1.1 skrll },
632 1.1 skrll /* decsz W,$fr */
633 1.1 skrll {
634 1.1 skrll IP2K_INSN_DECSZW_FR, "decszw_fr", "decsz", 16,
635 1.1 skrll { 0|A(SKIP_CTI), { { { (1<<MACH_BASE), 0 } } } }
636 1.1 skrll },
637 1.1 skrll /* inc $fr */
638 1.1 skrll {
639 1.1 skrll IP2K_INSN_INC_FR, "inc_fr", "inc", 16,
640 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
641 1.1 skrll },
642 1.1 skrll /* inc W,$fr */
643 1.1 skrll {
644 1.1 skrll IP2K_INSN_INCW_FR, "incw_fr", "inc", 16,
645 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
646 1.1 skrll },
647 1.1 skrll /* not $fr */
648 1.1 skrll {
649 1.1 skrll IP2K_INSN_NOT_FR, "not_fr", "not", 16,
650 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
651 1.1 skrll },
652 1.1 skrll /* not W,$fr */
653 1.1 skrll {
654 1.1 skrll IP2K_INSN_NOTW_FR, "notw_fr", "not", 16,
655 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
656 1.1 skrll },
657 1.1 skrll /* test $fr */
658 1.1 skrll {
659 1.1 skrll IP2K_INSN_TEST_FR, "test_fr", "test", 16,
660 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
661 1.1 skrll },
662 1.1 skrll /* mov W,#$lit8 */
663 1.1 skrll {
664 1.1 skrll IP2K_INSN_MOVW_L, "movw_l", "mov", 16,
665 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
666 1.1 skrll },
667 1.1 skrll /* mov $fr,W */
668 1.1 skrll {
669 1.1 skrll IP2K_INSN_MOVFR_W, "movfr_w", "mov", 16,
670 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
671 1.1 skrll },
672 1.1 skrll /* mov W,$fr */
673 1.1 skrll {
674 1.1 skrll IP2K_INSN_MOVW_FR, "movw_fr", "mov", 16,
675 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
676 1.1 skrll },
677 1.1 skrll /* add $fr,W */
678 1.1 skrll {
679 1.1 skrll IP2K_INSN_ADDFR_W, "addfr_w", "add", 16,
680 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
681 1.1 skrll },
682 1.1 skrll /* add W,$fr */
683 1.1 skrll {
684 1.1 skrll IP2K_INSN_ADDW_FR, "addw_fr", "add", 16,
685 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
686 1.1 skrll },
687 1.1 skrll /* xor $fr,W */
688 1.1 skrll {
689 1.1 skrll IP2K_INSN_XORFR_W, "xorfr_w", "xor", 16,
690 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
691 1.1 skrll },
692 1.1 skrll /* xor W,$fr */
693 1.1 skrll {
694 1.1 skrll IP2K_INSN_XORW_FR, "xorw_fr", "xor", 16,
695 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
696 1.1 skrll },
697 1.1 skrll /* and $fr,W */
698 1.1 skrll {
699 1.1 skrll IP2K_INSN_ANDFR_W, "andfr_w", "and", 16,
700 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
701 1.1 skrll },
702 1.1 skrll /* and W,$fr */
703 1.1 skrll {
704 1.1 skrll IP2K_INSN_ANDW_FR, "andw_fr", "and", 16,
705 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
706 1.1 skrll },
707 1.1 skrll /* or $fr,W */
708 1.1 skrll {
709 1.1 skrll IP2K_INSN_ORFR_W, "orfr_w", "or", 16,
710 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
711 1.1 skrll },
712 1.1 skrll /* or W,$fr */
713 1.1 skrll {
714 1.1 skrll IP2K_INSN_ORW_FR, "orw_fr", "or", 16,
715 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
716 1.1 skrll },
717 1.1 skrll /* dec $fr */
718 1.1 skrll {
719 1.1 skrll IP2K_INSN_DEC_FR, "dec_fr", "dec", 16,
720 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
721 1.1 skrll },
722 1.1 skrll /* dec W,$fr */
723 1.1 skrll {
724 1.1 skrll IP2K_INSN_DECW_FR, "decw_fr", "dec", 16,
725 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
726 1.1 skrll },
727 1.1 skrll /* sub $fr,W */
728 1.1 skrll {
729 1.1 skrll IP2K_INSN_SUBFR_W, "subfr_w", "sub", 16,
730 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
731 1.1 skrll },
732 1.1 skrll /* sub W,$fr */
733 1.1 skrll {
734 1.1 skrll IP2K_INSN_SUBW_FR, "subw_fr", "sub", 16,
735 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
736 1.1 skrll },
737 1.1 skrll /* clr $fr */
738 1.1 skrll {
739 1.1 skrll IP2K_INSN_CLR_FR, "clr_fr", "clr", 16,
740 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
741 1.1 skrll },
742 1.1 skrll /* cmp W,$fr */
743 1.1 skrll {
744 1.1 skrll IP2K_INSN_CMPW_FR, "cmpw_fr", "cmp", 16,
745 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
746 1.1 skrll },
747 1.1 skrll /* speed #$lit8 */
748 1.1 skrll {
749 1.1 skrll IP2K_INSN_SPEED, "speed", "speed", 16,
750 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
751 1.1 skrll },
752 1.1 skrll /* ireadi */
753 1.1 skrll {
754 1.1 skrll IP2K_INSN_IREADI, "ireadi", "ireadi", 16,
755 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
756 1.1 skrll },
757 1.1 skrll /* iwritei */
758 1.1 skrll {
759 1.1 skrll IP2K_INSN_IWRITEI, "iwritei", "iwritei", 16,
760 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
761 1.1 skrll },
762 1.1 skrll /* fread */
763 1.1 skrll {
764 1.1 skrll IP2K_INSN_FREAD, "fread", "fread", 16,
765 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
766 1.1 skrll },
767 1.1 skrll /* fwrite */
768 1.1 skrll {
769 1.1 skrll IP2K_INSN_FWRITE, "fwrite", "fwrite", 16,
770 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
771 1.1 skrll },
772 1.1 skrll /* iread */
773 1.1 skrll {
774 1.1 skrll IP2K_INSN_IREAD, "iread", "iread", 16,
775 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
776 1.1 skrll },
777 1.1 skrll /* iwrite */
778 1.1 skrll {
779 1.1 skrll IP2K_INSN_IWRITE, "iwrite", "iwrite", 16,
780 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
781 1.1 skrll },
782 1.1 skrll /* page $addr16p */
783 1.1 skrll {
784 1.1 skrll IP2K_INSN_PAGE, "page", "page", 16,
785 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
786 1.1 skrll },
787 1.1 skrll /* system */
788 1.1 skrll {
789 1.1 skrll IP2K_INSN_SYSTEM, "system", "system", 16,
790 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
791 1.1 skrll },
792 1.1 skrll /* reti #$reti3 */
793 1.1 skrll {
794 1.1 skrll IP2K_INSN_RETI, "reti", "reti", 16,
795 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
796 1.1 skrll },
797 1.1 skrll /* ret */
798 1.1 skrll {
799 1.1 skrll IP2K_INSN_RET, "ret", "ret", 16,
800 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
801 1.1 skrll },
802 1.1 skrll /* int */
803 1.1 skrll {
804 1.1 skrll IP2K_INSN_INT, "int", "int", 16,
805 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
806 1.1 skrll },
807 1.1 skrll /* breakx */
808 1.1 skrll {
809 1.1 skrll IP2K_INSN_BREAKX, "breakx", "breakx", 16,
810 1.1 skrll { 0|A(EXT_SKIP_INSN), { { { (1<<MACH_BASE), 0 } } } }
811 1.1 skrll },
812 1.1 skrll /* cwdt */
813 1.1 skrll {
814 1.1 skrll IP2K_INSN_CWDT, "cwdt", "cwdt", 16,
815 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
816 1.1 skrll },
817 1.1 skrll /* ferase */
818 1.1 skrll {
819 1.1 skrll IP2K_INSN_FERASE, "ferase", "ferase", 16,
820 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
821 1.1 skrll },
822 1.1 skrll /* retnp */
823 1.1 skrll {
824 1.1 skrll IP2K_INSN_RETNP, "retnp", "retnp", 16,
825 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
826 1.1 skrll },
827 1.1 skrll /* break */
828 1.1 skrll {
829 1.1 skrll IP2K_INSN_BREAK, "break", "break", 16,
830 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
831 1.1 skrll },
832 1.1 skrll /* nop */
833 1.1 skrll {
834 1.1 skrll IP2K_INSN_NOP, "nop", "nop", 16,
835 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } }
836 1.1 skrll },
837 1.1 skrll };
838 1.1 skrll
839 1.1 skrll #undef OP
840 1.1 skrll #undef A
841 1.1 skrll
842 1.1 skrll /* Initialize anything needed to be done once, before any cpu_open call. */
843 1.1 skrll
844 1.1 skrll static void
845 1.1 skrll init_tables (void)
846 1.1 skrll {
847 1.1 skrll }
848 1.1 skrll
849 1.1.1.6 christos #ifndef opcodes_error_handler
850 1.1.1.6 christos #define opcodes_error_handler(...) \
851 1.1.1.6 christos fprintf (stderr, __VA_ARGS__); fputc ('\n', stderr)
852 1.1.1.6 christos #endif
853 1.1.1.6 christos
854 1.1 skrll static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
855 1.1 skrll static void build_hw_table (CGEN_CPU_TABLE *);
856 1.1 skrll static void build_ifield_table (CGEN_CPU_TABLE *);
857 1.1 skrll static void build_operand_table (CGEN_CPU_TABLE *);
858 1.1 skrll static void build_insn_table (CGEN_CPU_TABLE *);
859 1.1 skrll static void ip2k_cgen_rebuild_tables (CGEN_CPU_TABLE *);
860 1.1 skrll
861 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to look up a mach via its bfd name. */
862 1.1 skrll
863 1.1 skrll static const CGEN_MACH *
864 1.1 skrll lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
865 1.1 skrll {
866 1.1 skrll while (table->name)
867 1.1 skrll {
868 1.1 skrll if (strcmp (name, table->bfd_name) == 0)
869 1.1 skrll return table;
870 1.1 skrll ++table;
871 1.1 skrll }
872 1.1.1.5 christos return NULL;
873 1.1 skrll }
874 1.1 skrll
875 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table. */
876 1.1 skrll
877 1.1 skrll static void
878 1.1 skrll build_hw_table (CGEN_CPU_TABLE *cd)
879 1.1 skrll {
880 1.1 skrll int i;
881 1.1 skrll int machs = cd->machs;
882 1.1 skrll const CGEN_HW_ENTRY *init = & ip2k_cgen_hw_table[0];
883 1.1 skrll /* MAX_HW is only an upper bound on the number of selected entries.
884 1.1 skrll However each entry is indexed by it's enum so there can be holes in
885 1.1 skrll the table. */
886 1.1 skrll const CGEN_HW_ENTRY **selected =
887 1.1 skrll (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
888 1.1 skrll
889 1.1 skrll cd->hw_table.init_entries = init;
890 1.1 skrll cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
891 1.1 skrll memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
892 1.1 skrll /* ??? For now we just use machs to determine which ones we want. */
893 1.1 skrll for (i = 0; init[i].name != NULL; ++i)
894 1.1 skrll if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
895 1.1 skrll & machs)
896 1.1 skrll selected[init[i].type] = &init[i];
897 1.1 skrll cd->hw_table.entries = selected;
898 1.1 skrll cd->hw_table.num_entries = MAX_HW;
899 1.1 skrll }
900 1.1 skrll
901 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table. */
902 1.1 skrll
903 1.1 skrll static void
904 1.1 skrll build_ifield_table (CGEN_CPU_TABLE *cd)
905 1.1 skrll {
906 1.1 skrll cd->ifld_table = & ip2k_cgen_ifld_table[0];
907 1.1 skrll }
908 1.1 skrll
909 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table. */
910 1.1 skrll
911 1.1 skrll static void
912 1.1 skrll build_operand_table (CGEN_CPU_TABLE *cd)
913 1.1 skrll {
914 1.1 skrll int i;
915 1.1 skrll int machs = cd->machs;
916 1.1 skrll const CGEN_OPERAND *init = & ip2k_cgen_operand_table[0];
917 1.1 skrll /* MAX_OPERANDS is only an upper bound on the number of selected entries.
918 1.1 skrll However each entry is indexed by it's enum so there can be holes in
919 1.1 skrll the table. */
920 1.1 skrll const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
921 1.1 skrll
922 1.1 skrll cd->operand_table.init_entries = init;
923 1.1 skrll cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
924 1.1 skrll memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
925 1.1 skrll /* ??? For now we just use mach to determine which ones we want. */
926 1.1 skrll for (i = 0; init[i].name != NULL; ++i)
927 1.1 skrll if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
928 1.1 skrll & machs)
929 1.1 skrll selected[init[i].type] = &init[i];
930 1.1 skrll cd->operand_table.entries = selected;
931 1.1 skrll cd->operand_table.num_entries = MAX_OPERANDS;
932 1.1 skrll }
933 1.1 skrll
934 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to build the hardware table.
935 1.1 skrll ??? This could leave out insns not supported by the specified mach/isa,
936 1.1 skrll but that would cause errors like "foo only supported by bar" to become
937 1.1 skrll "unknown insn", so for now we include all insns and require the app to
938 1.1 skrll do the checking later.
939 1.1 skrll ??? On the other hand, parsing of such insns may require their hardware or
940 1.1 skrll operand elements to be in the table [which they mightn't be]. */
941 1.1 skrll
942 1.1 skrll static void
943 1.1 skrll build_insn_table (CGEN_CPU_TABLE *cd)
944 1.1 skrll {
945 1.1 skrll int i;
946 1.1 skrll const CGEN_IBASE *ib = & ip2k_cgen_insn_table[0];
947 1.1 skrll CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
948 1.1 skrll
949 1.1 skrll memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
950 1.1 skrll for (i = 0; i < MAX_INSNS; ++i)
951 1.1 skrll insns[i].base = &ib[i];
952 1.1 skrll cd->insn_table.init_entries = insns;
953 1.1 skrll cd->insn_table.entry_size = sizeof (CGEN_IBASE);
954 1.1 skrll cd->insn_table.num_init_entries = MAX_INSNS;
955 1.1 skrll }
956 1.1 skrll
957 1.1 skrll /* Subroutine of ip2k_cgen_cpu_open to rebuild the tables. */
958 1.1 skrll
959 1.1 skrll static void
960 1.1 skrll ip2k_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
961 1.1 skrll {
962 1.1 skrll int i;
963 1.1 skrll CGEN_BITSET *isas = cd->isas;
964 1.1 skrll unsigned int machs = cd->machs;
965 1.1 skrll
966 1.1 skrll cd->int_insn_p = CGEN_INT_INSN_P;
967 1.1 skrll
968 1.1 skrll /* Data derived from the isa spec. */
969 1.1 skrll #define UNSET (CGEN_SIZE_UNKNOWN + 1)
970 1.1 skrll cd->default_insn_bitsize = UNSET;
971 1.1 skrll cd->base_insn_bitsize = UNSET;
972 1.1 skrll cd->min_insn_bitsize = 65535; /* Some ridiculously big number. */
973 1.1 skrll cd->max_insn_bitsize = 0;
974 1.1 skrll for (i = 0; i < MAX_ISAS; ++i)
975 1.1 skrll if (cgen_bitset_contains (isas, i))
976 1.1 skrll {
977 1.1 skrll const CGEN_ISA *isa = & ip2k_cgen_isa_table[i];
978 1.1 skrll
979 1.1 skrll /* Default insn sizes of all selected isas must be
980 1.1 skrll equal or we set the result to 0, meaning "unknown". */
981 1.1 skrll if (cd->default_insn_bitsize == UNSET)
982 1.1 skrll cd->default_insn_bitsize = isa->default_insn_bitsize;
983 1.1 skrll else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
984 1.1 skrll ; /* This is ok. */
985 1.1 skrll else
986 1.1 skrll cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
987 1.1 skrll
988 1.1 skrll /* Base insn sizes of all selected isas must be equal
989 1.1 skrll or we set the result to 0, meaning "unknown". */
990 1.1 skrll if (cd->base_insn_bitsize == UNSET)
991 1.1 skrll cd->base_insn_bitsize = isa->base_insn_bitsize;
992 1.1 skrll else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
993 1.1 skrll ; /* This is ok. */
994 1.1 skrll else
995 1.1 skrll cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
996 1.1 skrll
997 1.1 skrll /* Set min,max insn sizes. */
998 1.1 skrll if (isa->min_insn_bitsize < cd->min_insn_bitsize)
999 1.1 skrll cd->min_insn_bitsize = isa->min_insn_bitsize;
1000 1.1 skrll if (isa->max_insn_bitsize > cd->max_insn_bitsize)
1001 1.1 skrll cd->max_insn_bitsize = isa->max_insn_bitsize;
1002 1.1 skrll }
1003 1.1 skrll
1004 1.1 skrll /* Data derived from the mach spec. */
1005 1.1 skrll for (i = 0; i < MAX_MACHS; ++i)
1006 1.1 skrll if (((1 << i) & machs) != 0)
1007 1.1 skrll {
1008 1.1 skrll const CGEN_MACH *mach = & ip2k_cgen_mach_table[i];
1009 1.1 skrll
1010 1.1 skrll if (mach->insn_chunk_bitsize != 0)
1011 1.1 skrll {
1012 1.1 skrll if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
1013 1.1 skrll {
1014 1.1.1.6 christos opcodes_error_handler
1015 1.1.1.6 christos (/* xgettext:c-format */
1016 1.1.1.6 christos _("internal error: ip2k_cgen_rebuild_tables: "
1017 1.1.1.6 christos "conflicting insn-chunk-bitsize values: `%d' vs. `%d'"),
1018 1.1.1.6 christos cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
1019 1.1 skrll abort ();
1020 1.1 skrll }
1021 1.1 skrll
1022 1.1 skrll cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
1023 1.1 skrll }
1024 1.1 skrll }
1025 1.1 skrll
1026 1.1 skrll /* Determine which hw elements are used by MACH. */
1027 1.1 skrll build_hw_table (cd);
1028 1.1 skrll
1029 1.1 skrll /* Build the ifield table. */
1030 1.1 skrll build_ifield_table (cd);
1031 1.1 skrll
1032 1.1 skrll /* Determine which operands are used by MACH/ISA. */
1033 1.1 skrll build_operand_table (cd);
1034 1.1 skrll
1035 1.1 skrll /* Build the instruction table. */
1036 1.1 skrll build_insn_table (cd);
1037 1.1 skrll }
1038 1.1 skrll
1039 1.1 skrll /* Initialize a cpu table and return a descriptor.
1040 1.1 skrll It's much like opening a file, and must be the first function called.
1041 1.1 skrll The arguments are a set of (type/value) pairs, terminated with
1042 1.1 skrll CGEN_CPU_OPEN_END.
1043 1.1 skrll
1044 1.1 skrll Currently supported values:
1045 1.1 skrll CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr
1046 1.1 skrll CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr
1047 1.1 skrll CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
1048 1.1 skrll CGEN_CPU_OPEN_ENDIAN: specify endian choice
1049 1.1.1.8 christos CGEN_CPU_OPEN_INSN_ENDIAN: specify instruction endian choice
1050 1.1 skrll CGEN_CPU_OPEN_END: terminates arguments
1051 1.1 skrll
1052 1.1 skrll ??? Simultaneous multiple isas might not make sense, but it's not (yet)
1053 1.1.1.2 christos precluded. */
1054 1.1 skrll
1055 1.1 skrll CGEN_CPU_DESC
1056 1.1 skrll ip2k_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
1057 1.1 skrll {
1058 1.1 skrll CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
1059 1.1 skrll static int init_p;
1060 1.1 skrll CGEN_BITSET *isas = 0; /* 0 = "unspecified" */
1061 1.1 skrll unsigned int machs = 0; /* 0 = "unspecified" */
1062 1.1 skrll enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
1063 1.1.1.8 christos enum cgen_endian insn_endian = CGEN_ENDIAN_UNKNOWN;
1064 1.1 skrll va_list ap;
1065 1.1 skrll
1066 1.1 skrll if (! init_p)
1067 1.1 skrll {
1068 1.1 skrll init_tables ();
1069 1.1 skrll init_p = 1;
1070 1.1 skrll }
1071 1.1 skrll
1072 1.1 skrll memset (cd, 0, sizeof (*cd));
1073 1.1 skrll
1074 1.1 skrll va_start (ap, arg_type);
1075 1.1 skrll while (arg_type != CGEN_CPU_OPEN_END)
1076 1.1 skrll {
1077 1.1 skrll switch (arg_type)
1078 1.1 skrll {
1079 1.1 skrll case CGEN_CPU_OPEN_ISAS :
1080 1.1 skrll isas = va_arg (ap, CGEN_BITSET *);
1081 1.1 skrll break;
1082 1.1 skrll case CGEN_CPU_OPEN_MACHS :
1083 1.1 skrll machs = va_arg (ap, unsigned int);
1084 1.1 skrll break;
1085 1.1 skrll case CGEN_CPU_OPEN_BFDMACH :
1086 1.1 skrll {
1087 1.1 skrll const char *name = va_arg (ap, const char *);
1088 1.1 skrll const CGEN_MACH *mach =
1089 1.1 skrll lookup_mach_via_bfd_name (ip2k_cgen_mach_table, name);
1090 1.1 skrll
1091 1.1.1.5 christos if (mach != NULL)
1092 1.1.1.5 christos machs |= 1 << mach->num;
1093 1.1 skrll break;
1094 1.1 skrll }
1095 1.1 skrll case CGEN_CPU_OPEN_ENDIAN :
1096 1.1 skrll endian = va_arg (ap, enum cgen_endian);
1097 1.1 skrll break;
1098 1.1.1.8 christos case CGEN_CPU_OPEN_INSN_ENDIAN :
1099 1.1.1.8 christos insn_endian = va_arg (ap, enum cgen_endian);
1100 1.1.1.8 christos break;
1101 1.1 skrll default :
1102 1.1.1.6 christos opcodes_error_handler
1103 1.1.1.6 christos (/* xgettext:c-format */
1104 1.1.1.6 christos _("internal error: ip2k_cgen_cpu_open: "
1105 1.1.1.6 christos "unsupported argument `%d'"),
1106 1.1.1.6 christos arg_type);
1107 1.1 skrll abort (); /* ??? return NULL? */
1108 1.1 skrll }
1109 1.1 skrll arg_type = va_arg (ap, enum cgen_cpu_open_arg);
1110 1.1 skrll }
1111 1.1 skrll va_end (ap);
1112 1.1 skrll
1113 1.1 skrll /* Mach unspecified means "all". */
1114 1.1 skrll if (machs == 0)
1115 1.1 skrll machs = (1 << MAX_MACHS) - 1;
1116 1.1 skrll /* Base mach is always selected. */
1117 1.1 skrll machs |= 1;
1118 1.1 skrll if (endian == CGEN_ENDIAN_UNKNOWN)
1119 1.1 skrll {
1120 1.1 skrll /* ??? If target has only one, could have a default. */
1121 1.1.1.6 christos opcodes_error_handler
1122 1.1.1.6 christos (/* xgettext:c-format */
1123 1.1.1.6 christos _("internal error: ip2k_cgen_cpu_open: no endianness specified"));
1124 1.1 skrll abort ();
1125 1.1 skrll }
1126 1.1 skrll
1127 1.1 skrll cd->isas = cgen_bitset_copy (isas);
1128 1.1 skrll cd->machs = machs;
1129 1.1 skrll cd->endian = endian;
1130 1.1.1.8 christos cd->insn_endian
1131 1.1.1.8 christos = (insn_endian == CGEN_ENDIAN_UNKNOWN ? endian : insn_endian);
1132 1.1 skrll
1133 1.1 skrll /* Table (re)builder. */
1134 1.1 skrll cd->rebuild_tables = ip2k_cgen_rebuild_tables;
1135 1.1 skrll ip2k_cgen_rebuild_tables (cd);
1136 1.1 skrll
1137 1.1 skrll /* Default to not allowing signed overflow. */
1138 1.1 skrll cd->signed_overflow_ok_p = 0;
1139 1.1.1.3 christos
1140 1.1 skrll return (CGEN_CPU_DESC) cd;
1141 1.1 skrll }
1142 1.1 skrll
1143 1.1 skrll /* Cover fn to ip2k_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
1144 1.1 skrll MACH_NAME is the bfd name of the mach. */
1145 1.1 skrll
1146 1.1 skrll CGEN_CPU_DESC
1147 1.1 skrll ip2k_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
1148 1.1 skrll {
1149 1.1 skrll return ip2k_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
1150 1.1 skrll CGEN_CPU_OPEN_ENDIAN, endian,
1151 1.1 skrll CGEN_CPU_OPEN_END);
1152 1.1 skrll }
1153 1.1 skrll
1154 1.1 skrll /* Close a cpu table.
1155 1.1 skrll ??? This can live in a machine independent file, but there's currently
1156 1.1 skrll no place to put this file (there's no libcgen). libopcodes is the wrong
1157 1.1 skrll place as some simulator ports use this but they don't use libopcodes. */
1158 1.1 skrll
1159 1.1 skrll void
1160 1.1 skrll ip2k_cgen_cpu_close (CGEN_CPU_DESC cd)
1161 1.1 skrll {
1162 1.1 skrll unsigned int i;
1163 1.1 skrll const CGEN_INSN *insns;
1164 1.1 skrll
1165 1.1 skrll if (cd->macro_insn_table.init_entries)
1166 1.1 skrll {
1167 1.1 skrll insns = cd->macro_insn_table.init_entries;
1168 1.1 skrll for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
1169 1.1 skrll if (CGEN_INSN_RX ((insns)))
1170 1.1 skrll regfree (CGEN_INSN_RX (insns));
1171 1.1 skrll }
1172 1.1 skrll
1173 1.1 skrll if (cd->insn_table.init_entries)
1174 1.1 skrll {
1175 1.1 skrll insns = cd->insn_table.init_entries;
1176 1.1 skrll for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
1177 1.1 skrll if (CGEN_INSN_RX (insns))
1178 1.1 skrll regfree (CGEN_INSN_RX (insns));
1179 1.1.1.3 christos }
1180 1.1 skrll
1181 1.1.1.8 christos free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
1182 1.1.1.8 christos free ((CGEN_INSN *) cd->insn_table.init_entries);
1183 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
1184 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
1185 1.1 skrll free (cd);
1186 1.1 skrll }
1187 1.1 skrll
1188