1 /* CPU data for xstormy16.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
7 This file is part of the GNU Binutils and/or GDB, the GNU debugger.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31 #include "xstormy16-desc.h"
32 #include "xstormy16-opc.h"
34 #include "libiberty.h"
38 static const CGEN_ATTR_ENTRY bool_attr
[] =
45 static const CGEN_ATTR_ENTRY MACH_attr
[] =
47 { "base", MACH_BASE
},
48 { "xstormy16", MACH_XSTORMY16
},
53 static const CGEN_ATTR_ENTRY ISA_attr
[] =
55 { "xstormy16", ISA_XSTORMY16
},
60 const CGEN_ATTR_TABLE xstormy16_cgen_ifield_attr_table
[] =
62 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
63 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
64 { "PCREL-ADDR", &bool_attr
[0], &bool_attr
[0] },
65 { "ABS-ADDR", &bool_attr
[0], &bool_attr
[0] },
66 { "RESERVED", &bool_attr
[0], &bool_attr
[0] },
67 { "SIGN-OPT", &bool_attr
[0], &bool_attr
[0] },
68 { "SIGNED", &bool_attr
[0], &bool_attr
[0] },
72 const CGEN_ATTR_TABLE xstormy16_cgen_hardware_attr_table
[] =
74 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
75 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
76 { "CACHE-ADDR", &bool_attr
[0], &bool_attr
[0] },
77 { "PC", &bool_attr
[0], &bool_attr
[0] },
78 { "PROFILE", &bool_attr
[0], &bool_attr
[0] },
82 const CGEN_ATTR_TABLE xstormy16_cgen_operand_attr_table
[] =
84 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
85 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
86 { "PCREL-ADDR", &bool_attr
[0], &bool_attr
[0] },
87 { "ABS-ADDR", &bool_attr
[0], &bool_attr
[0] },
88 { "SIGN-OPT", &bool_attr
[0], &bool_attr
[0] },
89 { "SIGNED", &bool_attr
[0], &bool_attr
[0] },
90 { "NEGATIVE", &bool_attr
[0], &bool_attr
[0] },
91 { "RELAX", &bool_attr
[0], &bool_attr
[0] },
92 { "SEM-ONLY", &bool_attr
[0], &bool_attr
[0] },
96 const CGEN_ATTR_TABLE xstormy16_cgen_insn_attr_table
[] =
98 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
99 { "ALIAS", &bool_attr
[0], &bool_attr
[0] },
100 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
101 { "UNCOND-CTI", &bool_attr
[0], &bool_attr
[0] },
102 { "COND-CTI", &bool_attr
[0], &bool_attr
[0] },
103 { "SKIP-CTI", &bool_attr
[0], &bool_attr
[0] },
104 { "DELAY-SLOT", &bool_attr
[0], &bool_attr
[0] },
105 { "RELAXABLE", &bool_attr
[0], &bool_attr
[0] },
106 { "RELAX", &bool_attr
[0], &bool_attr
[0] },
107 { "NO-DIS", &bool_attr
[0], &bool_attr
[0] },
108 { "PBB", &bool_attr
[0], &bool_attr
[0] },
112 /* Instruction set variants. */
114 static const CGEN_ISA xstormy16_cgen_isa_table
[] = {
115 { "xstormy16", 32, 32, 16, 32 },
119 /* Machine variants. */
121 static const CGEN_MACH xstormy16_cgen_mach_table
[] = {
122 { "xstormy16", "xstormy16", MACH_XSTORMY16
, 16 },
126 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_names_entries
[] =
128 { "r0", 0, {0, {0}}, 0, 0 },
129 { "r1", 1, {0, {0}}, 0, 0 },
130 { "r2", 2, {0, {0}}, 0, 0 },
131 { "r3", 3, {0, {0}}, 0, 0 },
132 { "r4", 4, {0, {0}}, 0, 0 },
133 { "r5", 5, {0, {0}}, 0, 0 },
134 { "r6", 6, {0, {0}}, 0, 0 },
135 { "r7", 7, {0, {0}}, 0, 0 },
136 { "r8", 8, {0, {0}}, 0, 0 },
137 { "r9", 9, {0, {0}}, 0, 0 },
138 { "r10", 10, {0, {0}}, 0, 0 },
139 { "r11", 11, {0, {0}}, 0, 0 },
140 { "r12", 12, {0, {0}}, 0, 0 },
141 { "r13", 13, {0, {0}}, 0, 0 },
142 { "r14", 14, {0, {0}}, 0, 0 },
143 { "r15", 15, {0, {0}}, 0, 0 },
144 { "psw", 14, {0, {0}}, 0, 0 },
145 { "sp", 15, {0, {0}}, 0, 0 }
148 CGEN_KEYWORD xstormy16_cgen_opval_gr_names
=
150 & xstormy16_cgen_opval_gr_names_entries
[0],
155 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_Rb_names_entries
[] =
157 { "r8", 0, {0, {0}}, 0, 0 },
158 { "r9", 1, {0, {0}}, 0, 0 },
159 { "r10", 2, {0, {0}}, 0, 0 },
160 { "r11", 3, {0, {0}}, 0, 0 },
161 { "r12", 4, {0, {0}}, 0, 0 },
162 { "r13", 5, {0, {0}}, 0, 0 },
163 { "r14", 6, {0, {0}}, 0, 0 },
164 { "r15", 7, {0, {0}}, 0, 0 },
165 { "psw", 6, {0, {0}}, 0, 0 },
166 { "sp", 7, {0, {0}}, 0, 0 }
169 CGEN_KEYWORD xstormy16_cgen_opval_gr_Rb_names
=
171 & xstormy16_cgen_opval_gr_Rb_names_entries
[0],
176 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_branchcond_entries
[] =
178 { "ge", 0, {0, {0}}, 0, 0 },
179 { "nc", 1, {0, {0}}, 0, 0 },
180 { "lt", 2, {0, {0}}, 0, 0 },
181 { "c", 3, {0, {0}}, 0, 0 },
182 { "gt", 4, {0, {0}}, 0, 0 },
183 { "hi", 5, {0, {0}}, 0, 0 },
184 { "le", 6, {0, {0}}, 0, 0 },
185 { "ls", 7, {0, {0}}, 0, 0 },
186 { "pl", 8, {0, {0}}, 0, 0 },
187 { "nv", 9, {0, {0}}, 0, 0 },
188 { "mi", 10, {0, {0}}, 0, 0 },
189 { "v", 11, {0, {0}}, 0, 0 },
190 { "nz.b", 12, {0, {0}}, 0, 0 },
191 { "nz", 13, {0, {0}}, 0, 0 },
192 { "z.b", 14, {0, {0}}, 0, 0 },
193 { "z", 15, {0, {0}}, 0, 0 }
196 CGEN_KEYWORD xstormy16_cgen_opval_h_branchcond
=
198 & xstormy16_cgen_opval_h_branchcond_entries
[0],
203 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_wordsize_entries
[] =
205 { ".b", 0, {0, {0}}, 0, 0 },
206 { ".w", 1, {0, {0}}, 0, 0 },
207 { "", 1, {0, {0}}, 0, 0 }
210 CGEN_KEYWORD xstormy16_cgen_opval_h_wordsize
=
212 & xstormy16_cgen_opval_h_wordsize_entries
[0],
218 /* The hardware table. */
220 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
221 #define A(a) (1 << CGEN_HW_##a)
223 #define A(a) (1 << CGEN_HW_/**/a)
226 const CGEN_HW_ENTRY xstormy16_cgen_hw_table
[] =
228 { "h-memory", HW_H_MEMORY
, CGEN_ASM_NONE
, 0, { 0, { (1<<MACH_BASE
) } } },
229 { "h-sint", HW_H_SINT
, CGEN_ASM_NONE
, 0, { 0, { (1<<MACH_BASE
) } } },
230 { "h-uint", HW_H_UINT
, CGEN_ASM_NONE
, 0, { 0, { (1<<MACH_BASE
) } } },
231 { "h-addr", HW_H_ADDR
, CGEN_ASM_NONE
, 0, { 0, { (1<<MACH_BASE
) } } },
232 { "h-iaddr", HW_H_IADDR
, CGEN_ASM_NONE
, 0, { 0, { (1<<MACH_BASE
) } } },
233 { "h-pc", HW_H_PC
, CGEN_ASM_NONE
, 0, { 0|A(PC
), { (1<<MACH_BASE
) } } },
234 { "h-gr", HW_H_GR
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_names
, { 0, { (1<<MACH_BASE
) } } },
235 { "h-Rb", HW_H_RB
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_Rb_names
, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
236 { "h-Rbj", HW_H_RBJ
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_Rb_names
, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
237 { "h-Rpsw", HW_H_RPSW
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
238 { "h-z8", HW_H_Z8
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
239 { "h-z16", HW_H_Z16
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
240 { "h-cy", HW_H_CY
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
241 { "h-hc", HW_H_HC
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
242 { "h-ov", HW_H_OV
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
243 { "h-pt", HW_H_PT
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
244 { "h-s", HW_H_S
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
245 { "h-branchcond", HW_H_BRANCHCOND
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_h_branchcond
, { 0, { (1<<MACH_BASE
) } } },
246 { "h-wordsize", HW_H_WORDSIZE
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_h_wordsize
, { 0, { (1<<MACH_BASE
) } } },
247 { 0, 0, CGEN_ASM_NONE
, 0, {0, {0}} }
253 /* The instruction field table. */
255 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
256 #define A(a) (1 << CGEN_IFLD_##a)
258 #define A(a) (1 << CGEN_IFLD_/**/a)
261 const CGEN_IFLD xstormy16_cgen_ifld_table
[] =
263 { XSTORMY16_F_NIL
, "f-nil", 0, 0, 0, 0, { 0, { (1<<MACH_BASE
) } } },
264 { XSTORMY16_F_ANYOF
, "f-anyof", 0, 0, 0, 0, { 0, { (1<<MACH_BASE
) } } },
265 { XSTORMY16_F_RD
, "f-Rd", 0, 32, 12, 4, { 0, { (1<<MACH_BASE
) } } },
266 { XSTORMY16_F_RDM
, "f-Rdm", 0, 32, 13, 3, { 0, { (1<<MACH_BASE
) } } },
267 { XSTORMY16_F_RM
, "f-Rm", 0, 32, 4, 3, { 0, { (1<<MACH_BASE
) } } },
268 { XSTORMY16_F_RS
, "f-Rs", 0, 32, 8, 4, { 0, { (1<<MACH_BASE
) } } },
269 { XSTORMY16_F_RB
, "f-Rb", 0, 32, 17, 3, { 0, { (1<<MACH_BASE
) } } },
270 { XSTORMY16_F_RBJ
, "f-Rbj", 0, 32, 11, 1, { 0, { (1<<MACH_BASE
) } } },
271 { XSTORMY16_F_OP1
, "f-op1", 0, 32, 0, 4, { 0, { (1<<MACH_BASE
) } } },
272 { XSTORMY16_F_OP2
, "f-op2", 0, 32, 4, 4, { 0, { (1<<MACH_BASE
) } } },
273 { XSTORMY16_F_OP2A
, "f-op2a", 0, 32, 4, 3, { 0, { (1<<MACH_BASE
) } } },
274 { XSTORMY16_F_OP2M
, "f-op2m", 0, 32, 7, 1, { 0, { (1<<MACH_BASE
) } } },
275 { XSTORMY16_F_OP3
, "f-op3", 0, 32, 8, 4, { 0, { (1<<MACH_BASE
) } } },
276 { XSTORMY16_F_OP3A
, "f-op3a", 0, 32, 8, 2, { 0, { (1<<MACH_BASE
) } } },
277 { XSTORMY16_F_OP3B
, "f-op3b", 0, 32, 8, 3, { 0, { (1<<MACH_BASE
) } } },
278 { XSTORMY16_F_OP4
, "f-op4", 0, 32, 12, 4, { 0, { (1<<MACH_BASE
) } } },
279 { XSTORMY16_F_OP4M
, "f-op4m", 0, 32, 12, 1, { 0, { (1<<MACH_BASE
) } } },
280 { XSTORMY16_F_OP4B
, "f-op4b", 0, 32, 15, 1, { 0, { (1<<MACH_BASE
) } } },
281 { XSTORMY16_F_OP5
, "f-op5", 0, 32, 16, 4, { 0, { (1<<MACH_BASE
) } } },
282 { XSTORMY16_F_OP5A
, "f-op5a", 0, 32, 16, 1, { 0, { (1<<MACH_BASE
) } } },
283 { XSTORMY16_F_OP
, "f-op", 0, 32, 0, 16, { 0, { (1<<MACH_BASE
) } } },
284 { XSTORMY16_F_IMM2
, "f-imm2", 0, 32, 10, 2, { 0, { (1<<MACH_BASE
) } } },
285 { XSTORMY16_F_IMM3
, "f-imm3", 0, 32, 4, 3, { 0, { (1<<MACH_BASE
) } } },
286 { XSTORMY16_F_IMM3B
, "f-imm3b", 0, 32, 17, 3, { 0, { (1<<MACH_BASE
) } } },
287 { XSTORMY16_F_IMM4
, "f-imm4", 0, 32, 8, 4, { 0, { (1<<MACH_BASE
) } } },
288 { XSTORMY16_F_IMM8
, "f-imm8", 0, 32, 8, 8, { 0, { (1<<MACH_BASE
) } } },
289 { XSTORMY16_F_IMM12
, "f-imm12", 0, 32, 20, 12, { 0, { (1<<MACH_BASE
) } } },
290 { XSTORMY16_F_IMM16
, "f-imm16", 0, 32, 16, 16, { 0|A(SIGN_OPT
), { (1<<MACH_BASE
) } } },
291 { XSTORMY16_F_LMEM8
, "f-lmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR
), { (1<<MACH_BASE
) } } },
292 { XSTORMY16_F_HMEM8
, "f-hmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR
), { (1<<MACH_BASE
) } } },
293 { XSTORMY16_F_REL8_2
, "f-rel8-2", 0, 32, 8, 8, { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
294 { XSTORMY16_F_REL8_4
, "f-rel8-4", 0, 32, 8, 8, { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
295 { XSTORMY16_F_REL12
, "f-rel12", 0, 32, 20, 12, { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
296 { XSTORMY16_F_REL12A
, "f-rel12a", 0, 32, 4, 11, { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
297 { XSTORMY16_F_ABS24_1
, "f-abs24-1", 0, 32, 8, 8, { 0, { (1<<MACH_BASE
) } } },
298 { XSTORMY16_F_ABS24_2
, "f-abs24-2", 0, 32, 16, 16, { 0, { (1<<MACH_BASE
) } } },
299 { 0, 0, 0, 0, 0, 0, {0, {0}} }
306 /* multi ifield declarations */
308 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD
[];
311 /* multi ifield definitions */
313 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD
[] =
315 { 0, &(xstormy16_cgen_ifld_table
[34]) },
316 { 0, &(xstormy16_cgen_ifld_table
[35]) },
320 /* The operand table. */
322 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
323 #define A(a) (1 << CGEN_OPERAND_##a)
325 #define A(a) (1 << CGEN_OPERAND_/**/a)
327 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
328 #define OPERAND(op) XSTORMY16_OPERAND_##op
330 #define OPERAND(op) XSTORMY16_OPERAND_/**/op
333 const CGEN_OPERAND xstormy16_cgen_operand_table
[] =
335 /* pc: program counter */
336 { "pc", XSTORMY16_OPERAND_PC
, HW_H_PC
, 0, 0,
337 { 0, &(xstormy16_cgen_ifld_table
[0]) },
338 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
340 { "psw-z8", XSTORMY16_OPERAND_PSW_Z8
, HW_H_Z8
, 0, 0,
342 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
344 { "psw-z16", XSTORMY16_OPERAND_PSW_Z16
, HW_H_Z16
, 0, 0,
346 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
348 { "psw-cy", XSTORMY16_OPERAND_PSW_CY
, HW_H_CY
, 0, 0,
350 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
352 { "psw-hc", XSTORMY16_OPERAND_PSW_HC
, HW_H_HC
, 0, 0,
354 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
356 { "psw-ov", XSTORMY16_OPERAND_PSW_OV
, HW_H_OV
, 0, 0,
358 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
360 { "psw-pt", XSTORMY16_OPERAND_PSW_PT
, HW_H_PT
, 0, 0,
362 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
364 { "psw-s", XSTORMY16_OPERAND_PSW_S
, HW_H_S
, 0, 0,
366 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
367 /* Rd: general register destination */
368 { "Rd", XSTORMY16_OPERAND_RD
, HW_H_GR
, 12, 4,
369 { 0, &(xstormy16_cgen_ifld_table
[2]) },
370 { 0, { (1<<MACH_BASE
) } } },
371 /* Rdm: general register destination */
372 { "Rdm", XSTORMY16_OPERAND_RDM
, HW_H_GR
, 13, 3,
373 { 0, &(xstormy16_cgen_ifld_table
[3]) },
374 { 0, { (1<<MACH_BASE
) } } },
375 /* Rm: general register for memory */
376 { "Rm", XSTORMY16_OPERAND_RM
, HW_H_GR
, 4, 3,
377 { 0, &(xstormy16_cgen_ifld_table
[4]) },
378 { 0, { (1<<MACH_BASE
) } } },
379 /* Rs: general register source */
380 { "Rs", XSTORMY16_OPERAND_RS
, HW_H_GR
, 8, 4,
381 { 0, &(xstormy16_cgen_ifld_table
[5]) },
382 { 0, { (1<<MACH_BASE
) } } },
383 /* Rb: base register */
384 { "Rb", XSTORMY16_OPERAND_RB
, HW_H_RB
, 17, 3,
385 { 0, &(xstormy16_cgen_ifld_table
[6]) },
386 { 0, { (1<<MACH_BASE
) } } },
387 /* Rbj: base register for jump */
388 { "Rbj", XSTORMY16_OPERAND_RBJ
, HW_H_RBJ
, 11, 1,
389 { 0, &(xstormy16_cgen_ifld_table
[7]) },
390 { 0, { (1<<MACH_BASE
) } } },
391 /* bcond2: branch condition opcode */
392 { "bcond2", XSTORMY16_OPERAND_BCOND2
, HW_H_BRANCHCOND
, 4, 4,
393 { 0, &(xstormy16_cgen_ifld_table
[9]) },
394 { 0, { (1<<MACH_BASE
) } } },
395 /* ws2: word size opcode */
396 { "ws2", XSTORMY16_OPERAND_WS2
, HW_H_WORDSIZE
, 7, 1,
397 { 0, &(xstormy16_cgen_ifld_table
[11]) },
398 { 0, { (1<<MACH_BASE
) } } },
399 /* bcond5: branch condition opcode */
400 { "bcond5", XSTORMY16_OPERAND_BCOND5
, HW_H_BRANCHCOND
, 16, 4,
401 { 0, &(xstormy16_cgen_ifld_table
[18]) },
402 { 0, { (1<<MACH_BASE
) } } },
403 /* imm2: 2 bit unsigned immediate */
404 { "imm2", XSTORMY16_OPERAND_IMM2
, HW_H_UINT
, 10, 2,
405 { 0, &(xstormy16_cgen_ifld_table
[21]) },
406 { 0, { (1<<MACH_BASE
) } } },
407 /* imm3: 3 bit unsigned immediate */
408 { "imm3", XSTORMY16_OPERAND_IMM3
, HW_H_UINT
, 4, 3,
409 { 0, &(xstormy16_cgen_ifld_table
[22]) },
410 { 0, { (1<<MACH_BASE
) } } },
411 /* imm3b: 3 bit unsigned immediate for bit tests */
412 { "imm3b", XSTORMY16_OPERAND_IMM3B
, HW_H_UINT
, 17, 3,
413 { 0, &(xstormy16_cgen_ifld_table
[23]) },
414 { 0, { (1<<MACH_BASE
) } } },
415 /* imm4: 4 bit unsigned immediate */
416 { "imm4", XSTORMY16_OPERAND_IMM4
, HW_H_UINT
, 8, 4,
417 { 0, &(xstormy16_cgen_ifld_table
[24]) },
418 { 0, { (1<<MACH_BASE
) } } },
419 /* imm8: 8 bit unsigned immediate */
420 { "imm8", XSTORMY16_OPERAND_IMM8
, HW_H_UINT
, 8, 8,
421 { 0, &(xstormy16_cgen_ifld_table
[25]) },
422 { 0, { (1<<MACH_BASE
) } } },
423 /* imm8small: 8 bit unsigned immediate */
424 { "imm8small", XSTORMY16_OPERAND_IMM8SMALL
, HW_H_UINT
, 8, 8,
425 { 0, &(xstormy16_cgen_ifld_table
[25]) },
426 { 0, { (1<<MACH_BASE
) } } },
427 /* imm12: 12 bit signed immediate */
428 { "imm12", XSTORMY16_OPERAND_IMM12
, HW_H_SINT
, 20, 12,
429 { 0, &(xstormy16_cgen_ifld_table
[26]) },
430 { 0, { (1<<MACH_BASE
) } } },
431 /* imm16: 16 bit immediate */
432 { "imm16", XSTORMY16_OPERAND_IMM16
, HW_H_UINT
, 16, 16,
433 { 0, &(xstormy16_cgen_ifld_table
[27]) },
434 { 0|A(SIGN_OPT
), { (1<<MACH_BASE
) } } },
435 /* lmem8: 8 bit unsigned immediate low memory */
436 { "lmem8", XSTORMY16_OPERAND_LMEM8
, HW_H_UINT
, 8, 8,
437 { 0, &(xstormy16_cgen_ifld_table
[28]) },
438 { 0|A(ABS_ADDR
), { (1<<MACH_BASE
) } } },
439 /* hmem8: 8 bit unsigned immediate high memory */
440 { "hmem8", XSTORMY16_OPERAND_HMEM8
, HW_H_UINT
, 8, 8,
441 { 0, &(xstormy16_cgen_ifld_table
[29]) },
442 { 0|A(ABS_ADDR
), { (1<<MACH_BASE
) } } },
443 /* rel8-2: 8 bit relative address */
444 { "rel8-2", XSTORMY16_OPERAND_REL8_2
, HW_H_UINT
, 8, 8,
445 { 0, &(xstormy16_cgen_ifld_table
[30]) },
446 { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
447 /* rel8-4: 8 bit relative address */
448 { "rel8-4", XSTORMY16_OPERAND_REL8_4
, HW_H_UINT
, 8, 8,
449 { 0, &(xstormy16_cgen_ifld_table
[31]) },
450 { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
451 /* rel12: 12 bit relative address */
452 { "rel12", XSTORMY16_OPERAND_REL12
, HW_H_UINT
, 20, 12,
453 { 0, &(xstormy16_cgen_ifld_table
[32]) },
454 { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
455 /* rel12a: 12 bit relative address */
456 { "rel12a", XSTORMY16_OPERAND_REL12A
, HW_H_UINT
, 4, 11,
457 { 0, &(xstormy16_cgen_ifld_table
[33]) },
458 { 0|A(PCREL_ADDR
), { (1<<MACH_BASE
) } } },
459 /* abs24: 24 bit absolute address */
460 { "abs24", XSTORMY16_OPERAND_ABS24
, HW_H_UINT
, 8, 24,
461 { 2, &(XSTORMY16_F_ABS24_MULTI_IFIELD
[0]) },
462 { 0|A(ABS_ADDR
)|A(VIRTUAL
), { (1<<MACH_BASE
) } } },
463 /* psw: program status word */
464 { "psw", XSTORMY16_OPERAND_PSW
, HW_H_GR
, 0, 0,
466 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
467 /* Rpsw: N0-N3 of the program status word */
468 { "Rpsw", XSTORMY16_OPERAND_RPSW
, HW_H_RPSW
, 0, 0,
470 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
471 /* sp: stack pointer */
472 { "sp", XSTORMY16_OPERAND_SP
, HW_H_GR
, 0, 0,
474 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
476 { "R0", XSTORMY16_OPERAND_R0
, HW_H_GR
, 0, 0,
478 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
480 { "R1", XSTORMY16_OPERAND_R1
, HW_H_GR
, 0, 0,
482 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
484 { "R2", XSTORMY16_OPERAND_R2
, HW_H_GR
, 0, 0,
486 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
488 { "R8", XSTORMY16_OPERAND_R8
, HW_H_GR
, 0, 0,
490 { 0|A(SEM_ONLY
), { (1<<MACH_BASE
) } } },
491 { 0, 0, 0, 0, 0, {0, {0}} }
497 /* The instruction table. */
499 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
500 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
501 #define A(a) (1 << CGEN_INSN_##a)
503 #define A(a) (1 << CGEN_INSN_/**/a)
506 static const CGEN_IBASE xstormy16_cgen_insn_table
[MAX_INSNS
] =
508 /* Special null first entry.
509 A `num' value of zero is thus invalid.
510 Also, the special `invalid' insn resides here. */
511 { 0, 0, 0, 0, {0, {0}} },
512 /* mov$ws2 $lmem8,#$imm16 */
514 XSTORMY16_INSN_MOVLMEMIMM
, "movlmemimm", "mov", 32,
515 { 0, { (1<<MACH_BASE
) } }
517 /* mov$ws2 $hmem8,#$imm16 */
519 XSTORMY16_INSN_MOVHMEMIMM
, "movhmemimm", "mov", 32,
520 { 0, { (1<<MACH_BASE
) } }
522 /* mov$ws2 $Rm,$lmem8 */
524 XSTORMY16_INSN_MOVLGRMEM
, "movlgrmem", "mov", 16,
525 { 0, { (1<<MACH_BASE
) } }
527 /* mov$ws2 $Rm,$hmem8 */
529 XSTORMY16_INSN_MOVHGRMEM
, "movhgrmem", "mov", 16,
530 { 0, { (1<<MACH_BASE
) } }
532 /* mov$ws2 $lmem8,$Rm */
534 XSTORMY16_INSN_MOVLMEMGR
, "movlmemgr", "mov", 16,
535 { 0, { (1<<MACH_BASE
) } }
537 /* mov$ws2 $hmem8,$Rm */
539 XSTORMY16_INSN_MOVHMEMGR
, "movhmemgr", "mov", 16,
540 { 0, { (1<<MACH_BASE
) } }
542 /* mov$ws2 $Rdm,($Rs) */
544 XSTORMY16_INSN_MOVGRGRI
, "movgrgri", "mov", 16,
545 { 0, { (1<<MACH_BASE
) } }
547 /* mov$ws2 $Rdm,($Rs++) */
549 XSTORMY16_INSN_MOVGRGRIPOSTINC
, "movgrgripostinc", "mov", 16,
550 { 0, { (1<<MACH_BASE
) } }
552 /* mov$ws2 $Rdm,(--$Rs) */
554 XSTORMY16_INSN_MOVGRGRIPREDEC
, "movgrgripredec", "mov", 16,
555 { 0, { (1<<MACH_BASE
) } }
557 /* mov$ws2 ($Rs),$Rdm */
559 XSTORMY16_INSN_MOVGRIGR
, "movgrigr", "mov", 16,
560 { 0, { (1<<MACH_BASE
) } }
562 /* mov$ws2 ($Rs++),$Rdm */
564 XSTORMY16_INSN_MOVGRIPOSTINCGR
, "movgripostincgr", "mov", 16,
565 { 0, { (1<<MACH_BASE
) } }
567 /* mov$ws2 (--$Rs),$Rdm */
569 XSTORMY16_INSN_MOVGRIPREDECGR
, "movgripredecgr", "mov", 16,
570 { 0, { (1<<MACH_BASE
) } }
572 /* mov$ws2 $Rdm,($Rs,$imm12) */
574 XSTORMY16_INSN_MOVGRGRII
, "movgrgrii", "mov", 32,
575 { 0, { (1<<MACH_BASE
) } }
577 /* mov$ws2 $Rdm,($Rs++,$imm12) */
579 XSTORMY16_INSN_MOVGRGRIIPOSTINC
, "movgrgriipostinc", "mov", 32,
580 { 0, { (1<<MACH_BASE
) } }
582 /* mov$ws2 $Rdm,(--$Rs,$imm12) */
584 XSTORMY16_INSN_MOVGRGRIIPREDEC
, "movgrgriipredec", "mov", 32,
585 { 0, { (1<<MACH_BASE
) } }
587 /* mov$ws2 ($Rs,$imm12),$Rdm */
589 XSTORMY16_INSN_MOVGRIIGR
, "movgriigr", "mov", 32,
590 { 0, { (1<<MACH_BASE
) } }
592 /* mov$ws2 ($Rs++,$imm12),$Rdm */
594 XSTORMY16_INSN_MOVGRIIPOSTINCGR
, "movgriipostincgr", "mov", 32,
595 { 0, { (1<<MACH_BASE
) } }
597 /* mov$ws2 (--$Rs,$imm12),$Rdm */
599 XSTORMY16_INSN_MOVGRIIPREDECGR
, "movgriipredecgr", "mov", 32,
600 { 0, { (1<<MACH_BASE
) } }
604 XSTORMY16_INSN_MOVGRGR
, "movgrgr", "mov", 16,
605 { 0, { (1<<MACH_BASE
) } }
607 /* mov.w Rx,#$imm8 */
609 XSTORMY16_INSN_MOVWIMM8
, "movwimm8", "mov.w", 16,
610 { 0, { (1<<MACH_BASE
) } }
612 /* mov.w $Rm,#$imm8small */
614 XSTORMY16_INSN_MOVWGRIMM8
, "movwgrimm8", "mov.w", 16,
615 { 0, { (1<<MACH_BASE
) } }
617 /* mov.w $Rd,#$imm16 */
619 XSTORMY16_INSN_MOVWGRIMM16
, "movwgrimm16", "mov.w", 32,
620 { 0, { (1<<MACH_BASE
) } }
624 XSTORMY16_INSN_MOVLOWGR
, "movlowgr", "mov.b", 16,
625 { 0, { (1<<MACH_BASE
) } }
629 XSTORMY16_INSN_MOVHIGHGR
, "movhighgr", "mov.b", 16,
630 { 0, { (1<<MACH_BASE
) } }
632 /* movf$ws2 $Rdm,($Rs) */
634 XSTORMY16_INSN_MOVFGRGRI
, "movfgrgri", "movf", 16,
635 { 0, { (1<<MACH_BASE
) } }
637 /* movf$ws2 $Rdm,($Rs++) */
639 XSTORMY16_INSN_MOVFGRGRIPOSTINC
, "movfgrgripostinc", "movf", 16,
640 { 0, { (1<<MACH_BASE
) } }
642 /* movf$ws2 $Rdm,(--$Rs) */
644 XSTORMY16_INSN_MOVFGRGRIPREDEC
, "movfgrgripredec", "movf", 16,
645 { 0, { (1<<MACH_BASE
) } }
647 /* movf$ws2 ($Rs),$Rdm */
649 XSTORMY16_INSN_MOVFGRIGR
, "movfgrigr", "movf", 16,
650 { 0, { (1<<MACH_BASE
) } }
652 /* movf$ws2 ($Rs++),$Rdm */
654 XSTORMY16_INSN_MOVFGRIPOSTINCGR
, "movfgripostincgr", "movf", 16,
655 { 0, { (1<<MACH_BASE
) } }
657 /* movf$ws2 (--$Rs),$Rdm */
659 XSTORMY16_INSN_MOVFGRIPREDECGR
, "movfgripredecgr", "movf", 16,
660 { 0, { (1<<MACH_BASE
) } }
662 /* movf$ws2 $Rdm,($Rb,$Rs,$imm12) */
664 XSTORMY16_INSN_MOVFGRGRII
, "movfgrgrii", "movf", 32,
665 { 0, { (1<<MACH_BASE
) } }
667 /* movf$ws2 $Rdm,($Rb,$Rs++,$imm12) */
669 XSTORMY16_INSN_MOVFGRGRIIPOSTINC
, "movfgrgriipostinc", "movf", 32,
670 { 0, { (1<<MACH_BASE
) } }
672 /* movf$ws2 $Rdm,($Rb,--$Rs,$imm12) */
674 XSTORMY16_INSN_MOVFGRGRIIPREDEC
, "movfgrgriipredec", "movf", 32,
675 { 0, { (1<<MACH_BASE
) } }
677 /* movf$ws2 ($Rb,$Rs,$imm12),$Rdm */
679 XSTORMY16_INSN_MOVFGRIIGR
, "movfgriigr", "movf", 32,
680 { 0, { (1<<MACH_BASE
) } }
682 /* movf$ws2 ($Rb,$Rs++,$imm12),$Rdm */
684 XSTORMY16_INSN_MOVFGRIIPOSTINCGR
, "movfgriipostincgr", "movf", 32,
685 { 0, { (1<<MACH_BASE
) } }
687 /* movf$ws2 ($Rb,--$Rs,$imm12),$Rdm */
689 XSTORMY16_INSN_MOVFGRIIPREDECGR
, "movfgriipredecgr", "movf", 32,
690 { 0, { (1<<MACH_BASE
) } }
694 XSTORMY16_INSN_MASKGRGR
, "maskgrgr", "mask", 16,
695 { 0, { (1<<MACH_BASE
) } }
697 /* mask $Rd,#$imm16 */
699 XSTORMY16_INSN_MASKGRIMM16
, "maskgrimm16", "mask", 32,
700 { 0, { (1<<MACH_BASE
) } }
704 XSTORMY16_INSN_PUSHGR
, "pushgr", "push", 16,
705 { 0, { (1<<MACH_BASE
) } }
709 XSTORMY16_INSN_POPGR
, "popgr", "pop", 16,
710 { 0, { (1<<MACH_BASE
) } }
714 XSTORMY16_INSN_SWPN
, "swpn", "swpn", 16,
715 { 0, { (1<<MACH_BASE
) } }
719 XSTORMY16_INSN_SWPB
, "swpb", "swpb", 16,
720 { 0, { (1<<MACH_BASE
) } }
724 XSTORMY16_INSN_SWPW
, "swpw", "swpw", 16,
725 { 0, { (1<<MACH_BASE
) } }
729 XSTORMY16_INSN_ANDGRGR
, "andgrgr", "and", 16,
730 { 0, { (1<<MACH_BASE
) } }
734 XSTORMY16_INSN_ANDIMM8
, "andimm8", "and", 16,
735 { 0, { (1<<MACH_BASE
) } }
737 /* and $Rd,#$imm16 */
739 XSTORMY16_INSN_ANDGRIMM16
, "andgrimm16", "and", 32,
740 { 0, { (1<<MACH_BASE
) } }
744 XSTORMY16_INSN_ORGRGR
, "orgrgr", "or", 16,
745 { 0, { (1<<MACH_BASE
) } }
749 XSTORMY16_INSN_ORIMM8
, "orimm8", "or", 16,
750 { 0, { (1<<MACH_BASE
) } }
754 XSTORMY16_INSN_ORGRIMM16
, "orgrimm16", "or", 32,
755 { 0, { (1<<MACH_BASE
) } }
759 XSTORMY16_INSN_XORGRGR
, "xorgrgr", "xor", 16,
760 { 0, { (1<<MACH_BASE
) } }
764 XSTORMY16_INSN_XORIMM8
, "xorimm8", "xor", 16,
765 { 0, { (1<<MACH_BASE
) } }
767 /* xor $Rd,#$imm16 */
769 XSTORMY16_INSN_XORGRIMM16
, "xorgrimm16", "xor", 32,
770 { 0, { (1<<MACH_BASE
) } }
774 XSTORMY16_INSN_NOTGR
, "notgr", "not", 16,
775 { 0, { (1<<MACH_BASE
) } }
779 XSTORMY16_INSN_ADDGRGR
, "addgrgr", "add", 16,
780 { 0, { (1<<MACH_BASE
) } }
784 XSTORMY16_INSN_ADDGRIMM4
, "addgrimm4", "add", 16,
785 { 0, { (1<<MACH_BASE
) } }
789 XSTORMY16_INSN_ADDIMM8
, "addimm8", "add", 16,
790 { 0, { (1<<MACH_BASE
) } }
792 /* add $Rd,#$imm16 */
794 XSTORMY16_INSN_ADDGRIMM16
, "addgrimm16", "add", 32,
795 { 0, { (1<<MACH_BASE
) } }
799 XSTORMY16_INSN_ADCGRGR
, "adcgrgr", "adc", 16,
800 { 0, { (1<<MACH_BASE
) } }
804 XSTORMY16_INSN_ADCGRIMM4
, "adcgrimm4", "adc", 16,
805 { 0, { (1<<MACH_BASE
) } }
809 XSTORMY16_INSN_ADCIMM8
, "adcimm8", "adc", 16,
810 { 0, { (1<<MACH_BASE
) } }
812 /* adc $Rd,#$imm16 */
814 XSTORMY16_INSN_ADCGRIMM16
, "adcgrimm16", "adc", 32,
815 { 0, { (1<<MACH_BASE
) } }
819 XSTORMY16_INSN_SUBGRGR
, "subgrgr", "sub", 16,
820 { 0, { (1<<MACH_BASE
) } }
824 XSTORMY16_INSN_SUBGRIMM4
, "subgrimm4", "sub", 16,
825 { 0, { (1<<MACH_BASE
) } }
829 XSTORMY16_INSN_SUBIMM8
, "subimm8", "sub", 16,
830 { 0, { (1<<MACH_BASE
) } }
832 /* sub $Rd,#$imm16 */
834 XSTORMY16_INSN_SUBGRIMM16
, "subgrimm16", "sub", 32,
835 { 0, { (1<<MACH_BASE
) } }
839 XSTORMY16_INSN_SBCGRGR
, "sbcgrgr", "sbc", 16,
840 { 0, { (1<<MACH_BASE
) } }
844 XSTORMY16_INSN_SBCGRIMM4
, "sbcgrimm4", "sbc", 16,
845 { 0, { (1<<MACH_BASE
) } }
849 XSTORMY16_INSN_SBCGRIMM8
, "sbcgrimm8", "sbc", 16,
850 { 0, { (1<<MACH_BASE
) } }
852 /* sbc $Rd,#$imm16 */
854 XSTORMY16_INSN_SBCGRIMM16
, "sbcgrimm16", "sbc", 32,
855 { 0, { (1<<MACH_BASE
) } }
859 XSTORMY16_INSN_INCGRIMM2
, "incgrimm2", "inc", 16,
860 { 0, { (1<<MACH_BASE
) } }
864 XSTORMY16_INSN_DECGRIMM2
, "decgrimm2", "dec", 16,
865 { 0, { (1<<MACH_BASE
) } }
869 XSTORMY16_INSN_RRCGRGR
, "rrcgrgr", "rrc", 16,
870 { 0, { (1<<MACH_BASE
) } }
874 XSTORMY16_INSN_RRCGRIMM4
, "rrcgrimm4", "rrc", 16,
875 { 0, { (1<<MACH_BASE
) } }
879 XSTORMY16_INSN_RLCGRGR
, "rlcgrgr", "rlc", 16,
880 { 0, { (1<<MACH_BASE
) } }
884 XSTORMY16_INSN_RLCGRIMM4
, "rlcgrimm4", "rlc", 16,
885 { 0, { (1<<MACH_BASE
) } }
889 XSTORMY16_INSN_SHRGRGR
, "shrgrgr", "shr", 16,
890 { 0, { (1<<MACH_BASE
) } }
894 XSTORMY16_INSN_SHRGRIMM
, "shrgrimm", "shr", 16,
895 { 0, { (1<<MACH_BASE
) } }
899 XSTORMY16_INSN_SHLGRGR
, "shlgrgr", "shl", 16,
900 { 0, { (1<<MACH_BASE
) } }
904 XSTORMY16_INSN_SHLGRIMM
, "shlgrimm", "shl", 16,
905 { 0, { (1<<MACH_BASE
) } }
909 XSTORMY16_INSN_ASRGRGR
, "asrgrgr", "asr", 16,
910 { 0, { (1<<MACH_BASE
) } }
914 XSTORMY16_INSN_ASRGRIMM
, "asrgrimm", "asr", 16,
915 { 0, { (1<<MACH_BASE
) } }
917 /* set1 $Rd,#$imm4 */
919 XSTORMY16_INSN_SET1GRIMM
, "set1grimm", "set1", 16,
920 { 0, { (1<<MACH_BASE
) } }
924 XSTORMY16_INSN_SET1GRGR
, "set1grgr", "set1", 16,
925 { 0, { (1<<MACH_BASE
) } }
927 /* set1 $lmem8,#$imm3 */
929 XSTORMY16_INSN_SET1LMEMIMM
, "set1lmemimm", "set1", 16,
930 { 0, { (1<<MACH_BASE
) } }
932 /* set1 $hmem8,#$imm3 */
934 XSTORMY16_INSN_SET1HMEMIMM
, "set1hmemimm", "set1", 16,
935 { 0, { (1<<MACH_BASE
) } }
937 /* clr1 $Rd,#$imm4 */
939 XSTORMY16_INSN_CLR1GRIMM
, "clr1grimm", "clr1", 16,
940 { 0, { (1<<MACH_BASE
) } }
944 XSTORMY16_INSN_CLR1GRGR
, "clr1grgr", "clr1", 16,
945 { 0, { (1<<MACH_BASE
) } }
947 /* clr1 $lmem8,#$imm3 */
949 XSTORMY16_INSN_CLR1LMEMIMM
, "clr1lmemimm", "clr1", 16,
950 { 0, { (1<<MACH_BASE
) } }
952 /* clr1 $hmem8,#$imm3 */
954 XSTORMY16_INSN_CLR1HMEMIMM
, "clr1hmemimm", "clr1", 16,
955 { 0, { (1<<MACH_BASE
) } }
959 XSTORMY16_INSN_CBWGR
, "cbwgr", "cbw", 16,
960 { 0, { (1<<MACH_BASE
) } }
964 XSTORMY16_INSN_REVGR
, "revgr", "rev", 16,
965 { 0, { (1<<MACH_BASE
) } }
967 /* b$bcond5 $Rd,$Rs,$rel12 */
969 XSTORMY16_INSN_BCCGRGR
, "bccgrgr", "b", 32,
970 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
972 /* b$bcond5 $Rm,#$imm8,$rel12 */
974 XSTORMY16_INSN_BCCGRIMM8
, "bccgrimm8", "b", 32,
975 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
977 /* b$bcond2 Rx,#$imm16,${rel8-4} */
979 XSTORMY16_INSN_BCCIMM16
, "bccimm16", "b", 32,
980 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
982 /* bn $Rd,#$imm4,$rel12 */
984 XSTORMY16_INSN_BNGRIMM4
, "bngrimm4", "bn", 32,
985 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
987 /* bn $Rd,$Rs,$rel12 */
989 XSTORMY16_INSN_BNGRGR
, "bngrgr", "bn", 32,
990 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
992 /* bn $lmem8,#$imm3b,$rel12 */
994 XSTORMY16_INSN_BNLMEMIMM
, "bnlmemimm", "bn", 32,
995 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
997 /* bn $hmem8,#$imm3b,$rel12 */
999 XSTORMY16_INSN_BNHMEMIMM
, "bnhmemimm", "bn", 32,
1000 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1002 /* bp $Rd,#$imm4,$rel12 */
1004 XSTORMY16_INSN_BPGRIMM4
, "bpgrimm4", "bp", 32,
1005 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1007 /* bp $Rd,$Rs,$rel12 */
1009 XSTORMY16_INSN_BPGRGR
, "bpgrgr", "bp", 32,
1010 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1012 /* bp $lmem8,#$imm3b,$rel12 */
1014 XSTORMY16_INSN_BPLMEMIMM
, "bplmemimm", "bp", 32,
1015 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1017 /* bp $hmem8,#$imm3b,$rel12 */
1019 XSTORMY16_INSN_BPHMEMIMM
, "bphmemimm", "bp", 32,
1020 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1022 /* b$bcond2 ${rel8-2} */
1024 XSTORMY16_INSN_BCC
, "bcc", "b", 16,
1025 { 0|A(COND_CTI
), { (1<<MACH_BASE
) } }
1029 XSTORMY16_INSN_BGR
, "bgr", "br", 16,
1030 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1034 XSTORMY16_INSN_BR
, "br", "br", 16,
1035 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1039 XSTORMY16_INSN_JMP
, "jmp", "jmp", 16,
1040 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1044 XSTORMY16_INSN_JMPF
, "jmpf", "jmpf", 32,
1045 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1049 XSTORMY16_INSN_CALLRGR
, "callrgr", "callr", 16,
1050 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1054 XSTORMY16_INSN_CALLRIMM
, "callrimm", "callr", 16,
1055 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1059 XSTORMY16_INSN_CALLGR
, "callgr", "call", 16,
1060 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1064 XSTORMY16_INSN_CALLFIMM
, "callfimm", "callf", 32,
1065 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1069 XSTORMY16_INSN_ICALLRGR
, "icallrgr", "icallr", 16,
1070 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1072 /* icall $Rbj,$Rd */
1074 XSTORMY16_INSN_ICALLGR
, "icallgr", "icall", 16,
1075 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1079 XSTORMY16_INSN_ICALLFIMM
, "icallfimm", "icallf", 32,
1080 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1084 XSTORMY16_INSN_IRET
, "iret", "iret", 16,
1085 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1089 XSTORMY16_INSN_RET
, "ret", "ret", 16,
1090 { 0|A(UNCOND_CTI
), { (1<<MACH_BASE
) } }
1094 XSTORMY16_INSN_MUL
, "mul", "mul", 16,
1095 { 0, { (1<<MACH_BASE
) } }
1099 XSTORMY16_INSN_DIV
, "div", "div", 16,
1100 { 0, { (1<<MACH_BASE
) } }
1104 XSTORMY16_INSN_NOP
, "nop", "nop", 16,
1105 { 0, { (1<<MACH_BASE
) } }
1109 XSTORMY16_INSN_HALT
, "halt", "halt", 16,
1110 { 0, { (1<<MACH_BASE
) } }
1114 XSTORMY16_INSN_HOLD
, "hold", "hold", 16,
1115 { 0, { (1<<MACH_BASE
) } }
1119 XSTORMY16_INSN_HOLDX
, "holdx", "holdx", 16,
1120 { 0, { (1<<MACH_BASE
) } }
1124 XSTORMY16_INSN_BRK
, "brk", "brk", 16,
1125 { 0, { (1<<MACH_BASE
) } }
1129 XSTORMY16_INSN_SYSCALL
, "syscall", "--unused--", 16,
1130 { 0, { (1<<MACH_BASE
) } }
1137 /* Initialize anything needed to be done once, before any cpu_open call. */
1138 static void init_tables
PARAMS ((void));
1145 static const CGEN_MACH
* lookup_mach_via_bfd_name
1146 PARAMS ((const CGEN_MACH
*, const char *));
1147 static void build_hw_table
PARAMS ((CGEN_CPU_TABLE
*));
1148 static void build_ifield_table
PARAMS ((CGEN_CPU_TABLE
*));
1149 static void build_operand_table
PARAMS ((CGEN_CPU_TABLE
*));
1150 static void build_insn_table
PARAMS ((CGEN_CPU_TABLE
*));
1151 static void xstormy16_cgen_rebuild_tables
PARAMS ((CGEN_CPU_TABLE
*));
1153 /* Subroutine of xstormy16_cgen_cpu_open to look up a mach via its bfd name. */
1155 static const CGEN_MACH
*
1156 lookup_mach_via_bfd_name (table
, name
)
1157 const CGEN_MACH
*table
;
1162 if (strcmp (name
, table
->bfd_name
) == 0)
1169 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table. */
1176 int machs
= cd
->machs
;
1177 const CGEN_HW_ENTRY
*init
= & xstormy16_cgen_hw_table
[0];
1178 /* MAX_HW is only an upper bound on the number of selected entries.
1179 However each entry is indexed by it's enum so there can be holes in
1181 const CGEN_HW_ENTRY
**selected
=
1182 (const CGEN_HW_ENTRY
**) xmalloc (MAX_HW
* sizeof (CGEN_HW_ENTRY
*));
1184 cd
->hw_table
.init_entries
= init
;
1185 cd
->hw_table
.entry_size
= sizeof (CGEN_HW_ENTRY
);
1186 memset (selected
, 0, MAX_HW
* sizeof (CGEN_HW_ENTRY
*));
1187 /* ??? For now we just use machs to determine which ones we want. */
1188 for (i
= 0; init
[i
].name
!= NULL
; ++i
)
1189 if (CGEN_HW_ATTR_VALUE (&init
[i
], CGEN_HW_MACH
)
1191 selected
[init
[i
].type
] = &init
[i
];
1192 cd
->hw_table
.entries
= selected
;
1193 cd
->hw_table
.num_entries
= MAX_HW
;
1196 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table. */
1199 build_ifield_table (cd
)
1202 cd
->ifld_table
= & xstormy16_cgen_ifld_table
[0];
1205 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table. */
1208 build_operand_table (cd
)
1212 int machs
= cd
->machs
;
1213 const CGEN_OPERAND
*init
= & xstormy16_cgen_operand_table
[0];
1214 /* MAX_OPERANDS is only an upper bound on the number of selected entries.
1215 However each entry is indexed by it's enum so there can be holes in
1217 const CGEN_OPERAND
**selected
=
1218 (const CGEN_OPERAND
**) xmalloc (MAX_OPERANDS
* sizeof (CGEN_OPERAND
*));
1220 cd
->operand_table
.init_entries
= init
;
1221 cd
->operand_table
.entry_size
= sizeof (CGEN_OPERAND
);
1222 memset (selected
, 0, MAX_OPERANDS
* sizeof (CGEN_OPERAND
*));
1223 /* ??? For now we just use mach to determine which ones we want. */
1224 for (i
= 0; init
[i
].name
!= NULL
; ++i
)
1225 if (CGEN_OPERAND_ATTR_VALUE (&init
[i
], CGEN_OPERAND_MACH
)
1227 selected
[init
[i
].type
] = &init
[i
];
1228 cd
->operand_table
.entries
= selected
;
1229 cd
->operand_table
.num_entries
= MAX_OPERANDS
;
1232 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table.
1233 ??? This could leave out insns not supported by the specified mach/isa,
1234 but that would cause errors like "foo only supported by bar" to become
1235 "unknown insn", so for now we include all insns and require the app to
1236 do the checking later.
1237 ??? On the other hand, parsing of such insns may require their hardware or
1238 operand elements to be in the table [which they mightn't be]. */
1241 build_insn_table (cd
)
1245 const CGEN_IBASE
*ib
= & xstormy16_cgen_insn_table
[0];
1246 CGEN_INSN
*insns
= (CGEN_INSN
*) xmalloc (MAX_INSNS
* sizeof (CGEN_INSN
));
1248 memset (insns
, 0, MAX_INSNS
* sizeof (CGEN_INSN
));
1249 for (i
= 0; i
< MAX_INSNS
; ++i
)
1250 insns
[i
].base
= &ib
[i
];
1251 cd
->insn_table
.init_entries
= insns
;
1252 cd
->insn_table
.entry_size
= sizeof (CGEN_IBASE
);
1253 cd
->insn_table
.num_init_entries
= MAX_INSNS
;
1256 /* Subroutine of xstormy16_cgen_cpu_open to rebuild the tables. */
1259 xstormy16_cgen_rebuild_tables (cd
)
1263 unsigned int isas
= cd
->isas
;
1264 unsigned int machs
= cd
->machs
;
1266 cd
->int_insn_p
= CGEN_INT_INSN_P
;
1268 /* Data derived from the isa spec. */
1269 #define UNSET (CGEN_SIZE_UNKNOWN + 1)
1270 cd
->default_insn_bitsize
= UNSET
;
1271 cd
->base_insn_bitsize
= UNSET
;
1272 cd
->min_insn_bitsize
= 65535; /* some ridiculously big number */
1273 cd
->max_insn_bitsize
= 0;
1274 for (i
= 0; i
< MAX_ISAS
; ++i
)
1275 if (((1 << i
) & isas
) != 0)
1277 const CGEN_ISA
*isa
= & xstormy16_cgen_isa_table
[i
];
1279 /* Default insn sizes of all selected isas must be
1280 equal or we set the result to 0, meaning "unknown". */
1281 if (cd
->default_insn_bitsize
== UNSET
)
1282 cd
->default_insn_bitsize
= isa
->default_insn_bitsize
;
1283 else if (isa
->default_insn_bitsize
== cd
->default_insn_bitsize
)
1286 cd
->default_insn_bitsize
= CGEN_SIZE_UNKNOWN
;
1288 /* Base insn sizes of all selected isas must be equal
1289 or we set the result to 0, meaning "unknown". */
1290 if (cd
->base_insn_bitsize
== UNSET
)
1291 cd
->base_insn_bitsize
= isa
->base_insn_bitsize
;
1292 else if (isa
->base_insn_bitsize
== cd
->base_insn_bitsize
)
1295 cd
->base_insn_bitsize
= CGEN_SIZE_UNKNOWN
;
1297 /* Set min,max insn sizes. */
1298 if (isa
->min_insn_bitsize
< cd
->min_insn_bitsize
)
1299 cd
->min_insn_bitsize
= isa
->min_insn_bitsize
;
1300 if (isa
->max_insn_bitsize
> cd
->max_insn_bitsize
)
1301 cd
->max_insn_bitsize
= isa
->max_insn_bitsize
;
1304 /* Data derived from the mach spec. */
1305 for (i
= 0; i
< MAX_MACHS
; ++i
)
1306 if (((1 << i
) & machs
) != 0)
1308 const CGEN_MACH
*mach
= & xstormy16_cgen_mach_table
[i
];
1310 if (mach
->insn_chunk_bitsize
!= 0)
1312 if (cd
->insn_chunk_bitsize
!= 0 && cd
->insn_chunk_bitsize
!= mach
->insn_chunk_bitsize
)
1314 fprintf (stderr
, "xstormy16_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
1315 cd
->insn_chunk_bitsize
, mach
->insn_chunk_bitsize
);
1319 cd
->insn_chunk_bitsize
= mach
->insn_chunk_bitsize
;
1323 /* Determine which hw elements are used by MACH. */
1324 build_hw_table (cd
);
1326 /* Build the ifield table. */
1327 build_ifield_table (cd
);
1329 /* Determine which operands are used by MACH/ISA. */
1330 build_operand_table (cd
);
1332 /* Build the instruction table. */
1333 build_insn_table (cd
);
1336 /* Initialize a cpu table and return a descriptor.
1337 It's much like opening a file, and must be the first function called.
1338 The arguments are a set of (type/value) pairs, terminated with
1341 Currently supported values:
1342 CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr
1343 CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr
1344 CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
1345 CGEN_CPU_OPEN_ENDIAN: specify endian choice
1346 CGEN_CPU_OPEN_END: terminates arguments
1348 ??? Simultaneous multiple isas might not make sense, but it's not (yet)
1351 ??? We only support ISO C stdargs here, not K&R.
1352 Laziness, plus experiment to see if anything requires K&R - eventually
1353 K&R will no longer be supported - e.g. GDB is currently trying this. */
1356 xstormy16_cgen_cpu_open (enum cgen_cpu_open_arg arg_type
, ...)
1358 CGEN_CPU_TABLE
*cd
= (CGEN_CPU_TABLE
*) xmalloc (sizeof (CGEN_CPU_TABLE
));
1360 unsigned int isas
= 0; /* 0 = "unspecified" */
1361 unsigned int machs
= 0; /* 0 = "unspecified" */
1362 enum cgen_endian endian
= CGEN_ENDIAN_UNKNOWN
;
1371 memset (cd
, 0, sizeof (*cd
));
1373 va_start (ap
, arg_type
);
1374 while (arg_type
!= CGEN_CPU_OPEN_END
)
1378 case CGEN_CPU_OPEN_ISAS
:
1379 isas
= va_arg (ap
, unsigned int);
1381 case CGEN_CPU_OPEN_MACHS
:
1382 machs
= va_arg (ap
, unsigned int);
1384 case CGEN_CPU_OPEN_BFDMACH
:
1386 const char *name
= va_arg (ap
, const char *);
1387 const CGEN_MACH
*mach
=
1388 lookup_mach_via_bfd_name (xstormy16_cgen_mach_table
, name
);
1390 machs
|= 1 << mach
->num
;
1393 case CGEN_CPU_OPEN_ENDIAN
:
1394 endian
= va_arg (ap
, enum cgen_endian
);
1397 fprintf (stderr
, "xstormy16_cgen_cpu_open: unsupported argument `%d'\n",
1399 abort (); /* ??? return NULL? */
1401 arg_type
= va_arg (ap
, enum cgen_cpu_open_arg
);
1405 /* mach unspecified means "all" */
1407 machs
= (1 << MAX_MACHS
) - 1;
1408 /* base mach is always selected */
1410 /* isa unspecified means "all" */
1412 isas
= (1 << MAX_ISAS
) - 1;
1413 if (endian
== CGEN_ENDIAN_UNKNOWN
)
1415 /* ??? If target has only one, could have a default. */
1416 fprintf (stderr
, "xstormy16_cgen_cpu_open: no endianness specified\n");
1422 cd
->endian
= endian
;
1423 /* FIXME: for the sparc case we can determine insn-endianness statically.
1424 The worry here is where both data and insn endian can be independently
1425 chosen, in which case this function will need another argument.
1426 Actually, will want to allow for more arguments in the future anyway. */
1427 cd
->insn_endian
= endian
;
1429 /* Table (re)builder. */
1430 cd
->rebuild_tables
= xstormy16_cgen_rebuild_tables
;
1431 xstormy16_cgen_rebuild_tables (cd
);
1433 /* Default to not allowing signed overflow. */
1434 cd
->signed_overflow_ok_p
= 0;
1436 return (CGEN_CPU_DESC
) cd
;
1439 /* Cover fn to xstormy16_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
1440 MACH_NAME is the bfd name of the mach. */
1443 xstormy16_cgen_cpu_open_1 (mach_name
, endian
)
1444 const char *mach_name
;
1445 enum cgen_endian endian
;
1447 return xstormy16_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH
, mach_name
,
1448 CGEN_CPU_OPEN_ENDIAN
, endian
,
1452 /* Close a cpu table.
1453 ??? This can live in a machine independent file, but there's currently
1454 no place to put this file (there's no libcgen). libopcodes is the wrong
1455 place as some simulator ports use this but they don't use libopcodes. */
1458 xstormy16_cgen_cpu_close (cd
)
1464 if (cd
->macro_insn_table
.init_entries
)
1466 insns
= cd
->macro_insn_table
.init_entries
;
1467 for (i
= 0; i
< cd
->macro_insn_table
.num_init_entries
; ++i
, ++insns
)
1469 if (CGEN_INSN_RX ((insns
)))
1470 regfree(CGEN_INSN_RX (insns
));
1474 if (cd
->insn_table
.init_entries
)
1476 insns
= cd
->insn_table
.init_entries
;
1477 for (i
= 0; i
< cd
->insn_table
.num_init_entries
; ++i
, ++insns
)
1479 if (CGEN_INSN_RX (insns
))
1480 regfree(CGEN_INSN_RX (insns
));
1486 if (cd
->macro_insn_table
.init_entries
)
1487 free ((CGEN_INSN
*) cd
->macro_insn_table
.init_entries
);
1489 if (cd
->insn_table
.init_entries
)
1490 free ((CGEN_INSN
*) cd
->insn_table
.init_entries
);
1492 if (cd
->hw_table
.entries
)
1493 free ((CGEN_HW_ENTRY
*) cd
->hw_table
.entries
);
1495 if (cd
->operand_table
.entries
)
1496 free ((CGEN_HW_ENTRY
*) cd
->operand_table
.entries
);