1 /* CPU data for xstormy16.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright 1996-2010 Free Software Foundation, Inc.
7 This file is part of the GNU Binutils and/or GDB, the GNU debugger.
9 This file 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 3, or (at your option)
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 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 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
31 #include "xstormy16-desc.h"
32 #include "xstormy16-opc.h"
34 #include "libiberty.h"
39 static const CGEN_ATTR_ENTRY bool_attr
[] =
46 static const CGEN_ATTR_ENTRY MACH_attr
[] ATTRIBUTE_UNUSED
=
48 { "base", MACH_BASE
},
49 { "xstormy16", MACH_XSTORMY16
},
54 static const CGEN_ATTR_ENTRY ISA_attr
[] ATTRIBUTE_UNUSED
=
56 { "xstormy16", ISA_XSTORMY16
},
61 const CGEN_ATTR_TABLE xstormy16_cgen_ifield_attr_table
[] =
63 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
64 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
65 { "PCREL-ADDR", &bool_attr
[0], &bool_attr
[0] },
66 { "ABS-ADDR", &bool_attr
[0], &bool_attr
[0] },
67 { "RESERVED", &bool_attr
[0], &bool_attr
[0] },
68 { "SIGN-OPT", &bool_attr
[0], &bool_attr
[0] },
69 { "SIGNED", &bool_attr
[0], &bool_attr
[0] },
73 const CGEN_ATTR_TABLE xstormy16_cgen_hardware_attr_table
[] =
75 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
76 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
77 { "CACHE-ADDR", &bool_attr
[0], &bool_attr
[0] },
78 { "PC", &bool_attr
[0], &bool_attr
[0] },
79 { "PROFILE", &bool_attr
[0], &bool_attr
[0] },
83 const CGEN_ATTR_TABLE xstormy16_cgen_operand_attr_table
[] =
85 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
86 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
87 { "PCREL-ADDR", &bool_attr
[0], &bool_attr
[0] },
88 { "ABS-ADDR", &bool_attr
[0], &bool_attr
[0] },
89 { "SIGN-OPT", &bool_attr
[0], &bool_attr
[0] },
90 { "SIGNED", &bool_attr
[0], &bool_attr
[0] },
91 { "NEGATIVE", &bool_attr
[0], &bool_attr
[0] },
92 { "RELAX", &bool_attr
[0], &bool_attr
[0] },
93 { "SEM-ONLY", &bool_attr
[0], &bool_attr
[0] },
97 const CGEN_ATTR_TABLE xstormy16_cgen_insn_attr_table
[] =
99 { "MACH", & MACH_attr
[0], & MACH_attr
[0] },
100 { "ALIAS", &bool_attr
[0], &bool_attr
[0] },
101 { "VIRTUAL", &bool_attr
[0], &bool_attr
[0] },
102 { "UNCOND-CTI", &bool_attr
[0], &bool_attr
[0] },
103 { "COND-CTI", &bool_attr
[0], &bool_attr
[0] },
104 { "SKIP-CTI", &bool_attr
[0], &bool_attr
[0] },
105 { "DELAY-SLOT", &bool_attr
[0], &bool_attr
[0] },
106 { "RELAXABLE", &bool_attr
[0], &bool_attr
[0] },
107 { "RELAXED", &bool_attr
[0], &bool_attr
[0] },
108 { "NO-DIS", &bool_attr
[0], &bool_attr
[0] },
109 { "PBB", &bool_attr
[0], &bool_attr
[0] },
113 /* Instruction set variants. */
115 static const CGEN_ISA xstormy16_cgen_isa_table
[] = {
116 { "xstormy16", 32, 32, 16, 32 },
120 /* Machine variants. */
122 static const CGEN_MACH xstormy16_cgen_mach_table
[] = {
123 { "xstormy16", "xstormy16", MACH_XSTORMY16
, 16 },
127 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_names_entries
[] =
129 { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
130 { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
131 { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
132 { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
133 { "r4", 4, {0, {{{0, 0}}}}, 0, 0 },
134 { "r5", 5, {0, {{{0, 0}}}}, 0, 0 },
135 { "r6", 6, {0, {{{0, 0}}}}, 0, 0 },
136 { "r7", 7, {0, {{{0, 0}}}}, 0, 0 },
137 { "r8", 8, {0, {{{0, 0}}}}, 0, 0 },
138 { "r9", 9, {0, {{{0, 0}}}}, 0, 0 },
139 { "r10", 10, {0, {{{0, 0}}}}, 0, 0 },
140 { "r11", 11, {0, {{{0, 0}}}}, 0, 0 },
141 { "r12", 12, {0, {{{0, 0}}}}, 0, 0 },
142 { "r13", 13, {0, {{{0, 0}}}}, 0, 0 },
143 { "r14", 14, {0, {{{0, 0}}}}, 0, 0 },
144 { "r15", 15, {0, {{{0, 0}}}}, 0, 0 },
145 { "psw", 14, {0, {{{0, 0}}}}, 0, 0 },
146 { "sp", 15, {0, {{{0, 0}}}}, 0, 0 }
149 CGEN_KEYWORD xstormy16_cgen_opval_gr_names
=
151 & xstormy16_cgen_opval_gr_names_entries
[0],
156 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_gr_Rb_names_entries
[] =
158 { "r8", 0, {0, {{{0, 0}}}}, 0, 0 },
159 { "r9", 1, {0, {{{0, 0}}}}, 0, 0 },
160 { "r10", 2, {0, {{{0, 0}}}}, 0, 0 },
161 { "r11", 3, {0, {{{0, 0}}}}, 0, 0 },
162 { "r12", 4, {0, {{{0, 0}}}}, 0, 0 },
163 { "r13", 5, {0, {{{0, 0}}}}, 0, 0 },
164 { "r14", 6, {0, {{{0, 0}}}}, 0, 0 },
165 { "r15", 7, {0, {{{0, 0}}}}, 0, 0 },
166 { "psw", 6, {0, {{{0, 0}}}}, 0, 0 },
167 { "sp", 7, {0, {{{0, 0}}}}, 0, 0 }
170 CGEN_KEYWORD xstormy16_cgen_opval_gr_Rb_names
=
172 & xstormy16_cgen_opval_gr_Rb_names_entries
[0],
177 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_branchcond_entries
[] =
179 { "ge", 0, {0, {{{0, 0}}}}, 0, 0 },
180 { "nc", 1, {0, {{{0, 0}}}}, 0, 0 },
181 { "lt", 2, {0, {{{0, 0}}}}, 0, 0 },
182 { "c", 3, {0, {{{0, 0}}}}, 0, 0 },
183 { "gt", 4, {0, {{{0, 0}}}}, 0, 0 },
184 { "hi", 5, {0, {{{0, 0}}}}, 0, 0 },
185 { "le", 6, {0, {{{0, 0}}}}, 0, 0 },
186 { "ls", 7, {0, {{{0, 0}}}}, 0, 0 },
187 { "pl", 8, {0, {{{0, 0}}}}, 0, 0 },
188 { "nv", 9, {0, {{{0, 0}}}}, 0, 0 },
189 { "mi", 10, {0, {{{0, 0}}}}, 0, 0 },
190 { "v", 11, {0, {{{0, 0}}}}, 0, 0 },
191 { "nz.b", 12, {0, {{{0, 0}}}}, 0, 0 },
192 { "nz", 13, {0, {{{0, 0}}}}, 0, 0 },
193 { "z.b", 14, {0, {{{0, 0}}}}, 0, 0 },
194 { "z", 15, {0, {{{0, 0}}}}, 0, 0 }
197 CGEN_KEYWORD xstormy16_cgen_opval_h_branchcond
=
199 & xstormy16_cgen_opval_h_branchcond_entries
[0],
204 static CGEN_KEYWORD_ENTRY xstormy16_cgen_opval_h_wordsize_entries
[] =
206 { ".b", 0, {0, {{{0, 0}}}}, 0, 0 },
207 { ".w", 1, {0, {{{0, 0}}}}, 0, 0 },
208 { "", 1, {0, {{{0, 0}}}}, 0, 0 }
211 CGEN_KEYWORD xstormy16_cgen_opval_h_wordsize
=
213 & xstormy16_cgen_opval_h_wordsize_entries
[0],
219 /* The hardware table. */
221 #define A(a) (1 << CGEN_HW_##a)
223 const CGEN_HW_ENTRY xstormy16_cgen_hw_table
[] =
225 { "h-memory", HW_H_MEMORY
, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
226 { "h-sint", HW_H_SINT
, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
227 { "h-uint", HW_H_UINT
, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
228 { "h-addr", HW_H_ADDR
, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
229 { "h-iaddr", HW_H_IADDR
, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
230 { "h-pc", HW_H_PC
, CGEN_ASM_NONE
, 0, { 0|A(PC
), { { { (1<<MACH_BASE
), 0 } } } } },
231 { "h-gr", HW_H_GR
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_names
, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
232 { "h-Rb", HW_H_RB
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_Rb_names
, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
233 { "h-Rbj", HW_H_RBJ
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_gr_Rb_names
, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
234 { "h-Rpsw", HW_H_RPSW
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
235 { "h-z8", HW_H_Z8
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
236 { "h-z16", HW_H_Z16
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
237 { "h-cy", HW_H_CY
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
238 { "h-hc", HW_H_HC
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
239 { "h-ov", HW_H_OV
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
240 { "h-pt", HW_H_PT
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
241 { "h-s", HW_H_S
, CGEN_ASM_NONE
, 0, { 0|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
242 { "h-branchcond", HW_H_BRANCHCOND
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_h_branchcond
, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
243 { "h-wordsize", HW_H_WORDSIZE
, CGEN_ASM_KEYWORD
, (PTR
) & xstormy16_cgen_opval_h_wordsize
, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
244 { 0, 0, CGEN_ASM_NONE
, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } }
250 /* The instruction field table. */
252 #define A(a) (1 << CGEN_IFLD_##a)
254 const CGEN_IFLD xstormy16_cgen_ifld_table
[] =
256 { XSTORMY16_F_NIL
, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
257 { XSTORMY16_F_ANYOF
, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
258 { XSTORMY16_F_RD
, "f-Rd", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
259 { XSTORMY16_F_RDM
, "f-Rdm", 0, 32, 13, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
260 { XSTORMY16_F_RM
, "f-Rm", 0, 32, 4, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
261 { XSTORMY16_F_RS
, "f-Rs", 0, 32, 8, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
262 { XSTORMY16_F_RB
, "f-Rb", 0, 32, 17, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
263 { XSTORMY16_F_RBJ
, "f-Rbj", 0, 32, 11, 1, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
264 { XSTORMY16_F_OP1
, "f-op1", 0, 32, 0, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
265 { XSTORMY16_F_OP2
, "f-op2", 0, 32, 4, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
266 { XSTORMY16_F_OP2A
, "f-op2a", 0, 32, 4, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
267 { XSTORMY16_F_OP2M
, "f-op2m", 0, 32, 7, 1, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
268 { XSTORMY16_F_OP3
, "f-op3", 0, 32, 8, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
269 { XSTORMY16_F_OP3A
, "f-op3a", 0, 32, 8, 2, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
270 { XSTORMY16_F_OP3B
, "f-op3b", 0, 32, 8, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
271 { XSTORMY16_F_OP4
, "f-op4", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
272 { XSTORMY16_F_OP4M
, "f-op4m", 0, 32, 12, 1, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
273 { XSTORMY16_F_OP4B
, "f-op4b", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
274 { XSTORMY16_F_OP5
, "f-op5", 0, 32, 16, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
275 { XSTORMY16_F_OP5A
, "f-op5a", 0, 32, 16, 1, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
276 { XSTORMY16_F_OP
, "f-op", 0, 32, 0, 16, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
277 { XSTORMY16_F_IMM2
, "f-imm2", 0, 32, 10, 2, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
278 { XSTORMY16_F_IMM3
, "f-imm3", 0, 32, 4, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
279 { XSTORMY16_F_IMM3B
, "f-imm3b", 0, 32, 17, 3, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
280 { XSTORMY16_F_IMM4
, "f-imm4", 0, 32, 8, 4, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
281 { XSTORMY16_F_IMM8
, "f-imm8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
282 { XSTORMY16_F_IMM12
, "f-imm12", 0, 32, 20, 12, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
283 { XSTORMY16_F_IMM16
, "f-imm16", 0, 32, 16, 16, { 0|A(SIGN_OPT
), { { { (1<<MACH_BASE
), 0 } } } } },
284 { XSTORMY16_F_LMEM8
, "f-lmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
285 { XSTORMY16_F_HMEM8
, "f-hmem8", 0, 32, 8, 8, { 0|A(ABS_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
286 { XSTORMY16_F_REL8_2
, "f-rel8-2", 0, 32, 8, 8, { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
287 { XSTORMY16_F_REL8_4
, "f-rel8-4", 0, 32, 8, 8, { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
288 { XSTORMY16_F_REL12
, "f-rel12", 0, 32, 20, 12, { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
289 { XSTORMY16_F_REL12A
, "f-rel12a", 0, 32, 4, 11, { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
290 { XSTORMY16_F_ABS24_1
, "f-abs24-1", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
291 { XSTORMY16_F_ABS24_2
, "f-abs24-2", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
292 { XSTORMY16_F_ABS24
, "f-abs24", 0, 0, 0, 0,{ 0|A(ABS_ADDR
)|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
293 { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } }
300 /* multi ifield declarations */
302 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD
[];
305 /* multi ifield definitions */
307 const CGEN_MAYBE_MULTI_IFLD XSTORMY16_F_ABS24_MULTI_IFIELD
[] =
309 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_ABS24_1
] } },
310 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_ABS24_2
] } },
311 { 0, { (const PTR
) 0 } }
314 /* The operand table. */
316 #define A(a) (1 << CGEN_OPERAND_##a)
317 #define OPERAND(op) XSTORMY16_OPERAND_##op
319 const CGEN_OPERAND xstormy16_cgen_operand_table
[] =
321 /* pc: program counter */
322 { "pc", XSTORMY16_OPERAND_PC
, HW_H_PC
, 0, 0,
323 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_NIL
] } },
324 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
326 { "psw-z8", XSTORMY16_OPERAND_PSW_Z8
, HW_H_Z8
, 0, 0,
327 { 0, { (const PTR
) 0 } },
328 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
330 { "psw-z16", XSTORMY16_OPERAND_PSW_Z16
, HW_H_Z16
, 0, 0,
331 { 0, { (const PTR
) 0 } },
332 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
334 { "psw-cy", XSTORMY16_OPERAND_PSW_CY
, HW_H_CY
, 0, 0,
335 { 0, { (const PTR
) 0 } },
336 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
338 { "psw-hc", XSTORMY16_OPERAND_PSW_HC
, HW_H_HC
, 0, 0,
339 { 0, { (const PTR
) 0 } },
340 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
342 { "psw-ov", XSTORMY16_OPERAND_PSW_OV
, HW_H_OV
, 0, 0,
343 { 0, { (const PTR
) 0 } },
344 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
346 { "psw-pt", XSTORMY16_OPERAND_PSW_PT
, HW_H_PT
, 0, 0,
347 { 0, { (const PTR
) 0 } },
348 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
350 { "psw-s", XSTORMY16_OPERAND_PSW_S
, HW_H_S
, 0, 0,
351 { 0, { (const PTR
) 0 } },
352 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
353 /* Rd: general register destination */
354 { "Rd", XSTORMY16_OPERAND_RD
, HW_H_GR
, 12, 4,
355 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RD
] } },
356 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
357 /* Rdm: general register destination */
358 { "Rdm", XSTORMY16_OPERAND_RDM
, HW_H_GR
, 13, 3,
359 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RDM
] } },
360 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
361 /* Rm: general register for memory */
362 { "Rm", XSTORMY16_OPERAND_RM
, HW_H_GR
, 4, 3,
363 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RM
] } },
364 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
365 /* Rs: general register source */
366 { "Rs", XSTORMY16_OPERAND_RS
, HW_H_GR
, 8, 4,
367 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RS
] } },
368 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
369 /* Rb: base register */
370 { "Rb", XSTORMY16_OPERAND_RB
, HW_H_RB
, 17, 3,
371 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RB
] } },
372 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
373 /* Rbj: base register for jump */
374 { "Rbj", XSTORMY16_OPERAND_RBJ
, HW_H_RBJ
, 11, 1,
375 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_RBJ
] } },
376 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
377 /* bcond2: branch condition opcode */
378 { "bcond2", XSTORMY16_OPERAND_BCOND2
, HW_H_BRANCHCOND
, 4, 4,
379 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_OP2
] } },
380 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
381 /* ws2: word size opcode */
382 { "ws2", XSTORMY16_OPERAND_WS2
, HW_H_WORDSIZE
, 7, 1,
383 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_OP2M
] } },
384 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
385 /* bcond5: branch condition opcode */
386 { "bcond5", XSTORMY16_OPERAND_BCOND5
, HW_H_BRANCHCOND
, 16, 4,
387 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_OP5
] } },
388 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
389 /* imm2: 2 bit unsigned immediate */
390 { "imm2", XSTORMY16_OPERAND_IMM2
, HW_H_UINT
, 10, 2,
391 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM2
] } },
392 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
393 /* imm3: 3 bit unsigned immediate */
394 { "imm3", XSTORMY16_OPERAND_IMM3
, HW_H_UINT
, 4, 3,
395 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM3
] } },
396 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
397 /* imm3b: 3 bit unsigned immediate for bit tests */
398 { "imm3b", XSTORMY16_OPERAND_IMM3B
, HW_H_UINT
, 17, 3,
399 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM3B
] } },
400 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
401 /* imm4: 4 bit unsigned immediate */
402 { "imm4", XSTORMY16_OPERAND_IMM4
, HW_H_UINT
, 8, 4,
403 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM4
] } },
404 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
405 /* imm8: 8 bit unsigned immediate */
406 { "imm8", XSTORMY16_OPERAND_IMM8
, HW_H_UINT
, 8, 8,
407 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM8
] } },
408 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
409 /* imm8small: 8 bit unsigned immediate */
410 { "imm8small", XSTORMY16_OPERAND_IMM8SMALL
, HW_H_UINT
, 8, 8,
411 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM8
] } },
412 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
413 /* imm12: 12 bit signed immediate */
414 { "imm12", XSTORMY16_OPERAND_IMM12
, HW_H_SINT
, 20, 12,
415 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM12
] } },
416 { 0, { { { (1<<MACH_BASE
), 0 } } } } },
417 /* imm16: 16 bit immediate */
418 { "imm16", XSTORMY16_OPERAND_IMM16
, HW_H_UINT
, 16, 16,
419 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_IMM16
] } },
420 { 0|A(SIGN_OPT
), { { { (1<<MACH_BASE
), 0 } } } } },
421 /* lmem8: 8 bit unsigned immediate low memory */
422 { "lmem8", XSTORMY16_OPERAND_LMEM8
, HW_H_UINT
, 8, 8,
423 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_LMEM8
] } },
424 { 0|A(ABS_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
425 /* hmem8: 8 bit unsigned immediate high memory */
426 { "hmem8", XSTORMY16_OPERAND_HMEM8
, HW_H_UINT
, 8, 8,
427 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_HMEM8
] } },
428 { 0|A(ABS_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
429 /* rel8-2: 8 bit relative address */
430 { "rel8-2", XSTORMY16_OPERAND_REL8_2
, HW_H_UINT
, 8, 8,
431 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_REL8_2
] } },
432 { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
433 /* rel8-4: 8 bit relative address */
434 { "rel8-4", XSTORMY16_OPERAND_REL8_4
, HW_H_UINT
, 8, 8,
435 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_REL8_4
] } },
436 { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
437 /* rel12: 12 bit relative address */
438 { "rel12", XSTORMY16_OPERAND_REL12
, HW_H_UINT
, 20, 12,
439 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_REL12
] } },
440 { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
441 /* rel12a: 12 bit relative address */
442 { "rel12a", XSTORMY16_OPERAND_REL12A
, HW_H_UINT
, 4, 11,
443 { 0, { (const PTR
) &xstormy16_cgen_ifld_table
[XSTORMY16_F_REL12A
] } },
444 { 0|A(PCREL_ADDR
), { { { (1<<MACH_BASE
), 0 } } } } },
445 /* abs24: 24 bit absolute address */
446 { "abs24", XSTORMY16_OPERAND_ABS24
, HW_H_UINT
, 8, 24,
447 { 2, { (const PTR
) &XSTORMY16_F_ABS24_MULTI_IFIELD
[0] } },
448 { 0|A(ABS_ADDR
)|A(VIRTUAL
), { { { (1<<MACH_BASE
), 0 } } } } },
449 /* psw: program status word */
450 { "psw", XSTORMY16_OPERAND_PSW
, HW_H_GR
, 0, 0,
451 { 0, { (const PTR
) 0 } },
452 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
453 /* Rpsw: N0-N3 of the program status word */
454 { "Rpsw", XSTORMY16_OPERAND_RPSW
, HW_H_RPSW
, 0, 0,
455 { 0, { (const PTR
) 0 } },
456 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
457 /* sp: stack pointer */
458 { "sp", XSTORMY16_OPERAND_SP
, HW_H_GR
, 0, 0,
459 { 0, { (const PTR
) 0 } },
460 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
462 { "R0", XSTORMY16_OPERAND_R0
, HW_H_GR
, 0, 0,
463 { 0, { (const PTR
) 0 } },
464 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
466 { "R1", XSTORMY16_OPERAND_R1
, HW_H_GR
, 0, 0,
467 { 0, { (const PTR
) 0 } },
468 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
470 { "R2", XSTORMY16_OPERAND_R2
, HW_H_GR
, 0, 0,
471 { 0, { (const PTR
) 0 } },
472 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
474 { "R8", XSTORMY16_OPERAND_R8
, HW_H_GR
, 0, 0,
475 { 0, { (const PTR
) 0 } },
476 { 0|A(SEM_ONLY
), { { { (1<<MACH_BASE
), 0 } } } } },
479 { 0, { (const PTR
) 0 } },
480 { 0, { { { (1<<MACH_BASE
), 0 } } } } }
486 /* The instruction table. */
488 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
489 #define A(a) (1 << CGEN_INSN_##a)
491 static const CGEN_IBASE xstormy16_cgen_insn_table
[MAX_INSNS
] =
493 /* Special null first entry.
494 A `num' value of zero is thus invalid.
495 Also, the special `invalid' insn resides here. */
496 { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE
), 0 } } } } },
497 /* mov$ws2 $lmem8,#$imm16 */
499 XSTORMY16_INSN_MOVLMEMIMM
, "movlmemimm", "mov", 32,
500 { 0, { { { (1<<MACH_BASE
), 0 } } } }
502 /* mov$ws2 $hmem8,#$imm16 */
504 XSTORMY16_INSN_MOVHMEMIMM
, "movhmemimm", "mov", 32,
505 { 0, { { { (1<<MACH_BASE
), 0 } } } }
507 /* mov$ws2 $Rm,$lmem8 */
509 XSTORMY16_INSN_MOVLGRMEM
, "movlgrmem", "mov", 16,
510 { 0, { { { (1<<MACH_BASE
), 0 } } } }
512 /* mov$ws2 $Rm,$hmem8 */
514 XSTORMY16_INSN_MOVHGRMEM
, "movhgrmem", "mov", 16,
515 { 0, { { { (1<<MACH_BASE
), 0 } } } }
517 /* mov$ws2 $lmem8,$Rm */
519 XSTORMY16_INSN_MOVLMEMGR
, "movlmemgr", "mov", 16,
520 { 0, { { { (1<<MACH_BASE
), 0 } } } }
522 /* mov$ws2 $hmem8,$Rm */
524 XSTORMY16_INSN_MOVHMEMGR
, "movhmemgr", "mov", 16,
525 { 0, { { { (1<<MACH_BASE
), 0 } } } }
527 /* mov$ws2 $Rdm,($Rs) */
529 XSTORMY16_INSN_MOVGRGRI
, "movgrgri", "mov", 16,
530 { 0, { { { (1<<MACH_BASE
), 0 } } } }
532 /* mov$ws2 $Rdm,($Rs++) */
534 XSTORMY16_INSN_MOVGRGRIPOSTINC
, "movgrgripostinc", "mov", 16,
535 { 0, { { { (1<<MACH_BASE
), 0 } } } }
537 /* mov$ws2 $Rdm,(--$Rs) */
539 XSTORMY16_INSN_MOVGRGRIPREDEC
, "movgrgripredec", "mov", 16,
540 { 0, { { { (1<<MACH_BASE
), 0 } } } }
542 /* mov$ws2 ($Rs),$Rdm */
544 XSTORMY16_INSN_MOVGRIGR
, "movgrigr", "mov", 16,
545 { 0, { { { (1<<MACH_BASE
), 0 } } } }
547 /* mov$ws2 ($Rs++),$Rdm */
549 XSTORMY16_INSN_MOVGRIPOSTINCGR
, "movgripostincgr", "mov", 16,
550 { 0, { { { (1<<MACH_BASE
), 0 } } } }
552 /* mov$ws2 (--$Rs),$Rdm */
554 XSTORMY16_INSN_MOVGRIPREDECGR
, "movgripredecgr", "mov", 16,
555 { 0, { { { (1<<MACH_BASE
), 0 } } } }
557 /* mov$ws2 $Rdm,($Rs,$imm12) */
559 XSTORMY16_INSN_MOVGRGRII
, "movgrgrii", "mov", 32,
560 { 0, { { { (1<<MACH_BASE
), 0 } } } }
562 /* mov$ws2 $Rdm,($Rs++,$imm12) */
564 XSTORMY16_INSN_MOVGRGRIIPOSTINC
, "movgrgriipostinc", "mov", 32,
565 { 0, { { { (1<<MACH_BASE
), 0 } } } }
567 /* mov$ws2 $Rdm,(--$Rs,$imm12) */
569 XSTORMY16_INSN_MOVGRGRIIPREDEC
, "movgrgriipredec", "mov", 32,
570 { 0, { { { (1<<MACH_BASE
), 0 } } } }
572 /* mov$ws2 ($Rs,$imm12),$Rdm */
574 XSTORMY16_INSN_MOVGRIIGR
, "movgriigr", "mov", 32,
575 { 0, { { { (1<<MACH_BASE
), 0 } } } }
577 /* mov$ws2 ($Rs++,$imm12),$Rdm */
579 XSTORMY16_INSN_MOVGRIIPOSTINCGR
, "movgriipostincgr", "mov", 32,
580 { 0, { { { (1<<MACH_BASE
), 0 } } } }
582 /* mov$ws2 (--$Rs,$imm12),$Rdm */
584 XSTORMY16_INSN_MOVGRIIPREDECGR
, "movgriipredecgr", "mov", 32,
585 { 0, { { { (1<<MACH_BASE
), 0 } } } }
589 XSTORMY16_INSN_MOVGRGR
, "movgrgr", "mov", 16,
590 { 0, { { { (1<<MACH_BASE
), 0 } } } }
592 /* mov.w Rx,#$imm8 */
594 XSTORMY16_INSN_MOVWIMM8
, "movwimm8", "mov.w", 16,
595 { 0, { { { (1<<MACH_BASE
), 0 } } } }
597 /* mov.w $Rm,#$imm8small */
599 XSTORMY16_INSN_MOVWGRIMM8
, "movwgrimm8", "mov.w", 16,
600 { 0, { { { (1<<MACH_BASE
), 0 } } } }
602 /* mov.w $Rd,#$imm16 */
604 XSTORMY16_INSN_MOVWGRIMM16
, "movwgrimm16", "mov.w", 32,
605 { 0, { { { (1<<MACH_BASE
), 0 } } } }
609 XSTORMY16_INSN_MOVLOWGR
, "movlowgr", "mov.b", 16,
610 { 0, { { { (1<<MACH_BASE
), 0 } } } }
614 XSTORMY16_INSN_MOVHIGHGR
, "movhighgr", "mov.b", 16,
615 { 0, { { { (1<<MACH_BASE
), 0 } } } }
617 /* movf$ws2 $Rdm,($Rs) */
619 XSTORMY16_INSN_MOVFGRGRI
, "movfgrgri", "movf", 16,
620 { 0, { { { (1<<MACH_BASE
), 0 } } } }
622 /* movf$ws2 $Rdm,($Rs++) */
624 XSTORMY16_INSN_MOVFGRGRIPOSTINC
, "movfgrgripostinc", "movf", 16,
625 { 0, { { { (1<<MACH_BASE
), 0 } } } }
627 /* movf$ws2 $Rdm,(--$Rs) */
629 XSTORMY16_INSN_MOVFGRGRIPREDEC
, "movfgrgripredec", "movf", 16,
630 { 0, { { { (1<<MACH_BASE
), 0 } } } }
632 /* movf$ws2 ($Rs),$Rdm */
634 XSTORMY16_INSN_MOVFGRIGR
, "movfgrigr", "movf", 16,
635 { 0, { { { (1<<MACH_BASE
), 0 } } } }
637 /* movf$ws2 ($Rs++),$Rdm */
639 XSTORMY16_INSN_MOVFGRIPOSTINCGR
, "movfgripostincgr", "movf", 16,
640 { 0, { { { (1<<MACH_BASE
), 0 } } } }
642 /* movf$ws2 (--$Rs),$Rdm */
644 XSTORMY16_INSN_MOVFGRIPREDECGR
, "movfgripredecgr", "movf", 16,
645 { 0, { { { (1<<MACH_BASE
), 0 } } } }
647 /* movf$ws2 $Rdm,($Rb,$Rs,$imm12) */
649 XSTORMY16_INSN_MOVFGRGRII
, "movfgrgrii", "movf", 32,
650 { 0, { { { (1<<MACH_BASE
), 0 } } } }
652 /* movf$ws2 $Rdm,($Rb,$Rs++,$imm12) */
654 XSTORMY16_INSN_MOVFGRGRIIPOSTINC
, "movfgrgriipostinc", "movf", 32,
655 { 0, { { { (1<<MACH_BASE
), 0 } } } }
657 /* movf$ws2 $Rdm,($Rb,--$Rs,$imm12) */
659 XSTORMY16_INSN_MOVFGRGRIIPREDEC
, "movfgrgriipredec", "movf", 32,
660 { 0, { { { (1<<MACH_BASE
), 0 } } } }
662 /* movf$ws2 ($Rb,$Rs,$imm12),$Rdm */
664 XSTORMY16_INSN_MOVFGRIIGR
, "movfgriigr", "movf", 32,
665 { 0, { { { (1<<MACH_BASE
), 0 } } } }
667 /* movf$ws2 ($Rb,$Rs++,$imm12),$Rdm */
669 XSTORMY16_INSN_MOVFGRIIPOSTINCGR
, "movfgriipostincgr", "movf", 32,
670 { 0, { { { (1<<MACH_BASE
), 0 } } } }
672 /* movf$ws2 ($Rb,--$Rs,$imm12),$Rdm */
674 XSTORMY16_INSN_MOVFGRIIPREDECGR
, "movfgriipredecgr", "movf", 32,
675 { 0, { { { (1<<MACH_BASE
), 0 } } } }
679 XSTORMY16_INSN_MASKGRGR
, "maskgrgr", "mask", 16,
680 { 0, { { { (1<<MACH_BASE
), 0 } } } }
682 /* mask $Rd,#$imm16 */
684 XSTORMY16_INSN_MASKGRIMM16
, "maskgrimm16", "mask", 32,
685 { 0, { { { (1<<MACH_BASE
), 0 } } } }
689 XSTORMY16_INSN_PUSHGR
, "pushgr", "push", 16,
690 { 0, { { { (1<<MACH_BASE
), 0 } } } }
694 XSTORMY16_INSN_POPGR
, "popgr", "pop", 16,
695 { 0, { { { (1<<MACH_BASE
), 0 } } } }
699 XSTORMY16_INSN_SWPN
, "swpn", "swpn", 16,
700 { 0, { { { (1<<MACH_BASE
), 0 } } } }
704 XSTORMY16_INSN_SWPB
, "swpb", "swpb", 16,
705 { 0, { { { (1<<MACH_BASE
), 0 } } } }
709 XSTORMY16_INSN_SWPW
, "swpw", "swpw", 16,
710 { 0, { { { (1<<MACH_BASE
), 0 } } } }
714 XSTORMY16_INSN_ANDGRGR
, "andgrgr", "and", 16,
715 { 0, { { { (1<<MACH_BASE
), 0 } } } }
719 XSTORMY16_INSN_ANDIMM8
, "andimm8", "and", 16,
720 { 0, { { { (1<<MACH_BASE
), 0 } } } }
722 /* and $Rd,#$imm16 */
724 XSTORMY16_INSN_ANDGRIMM16
, "andgrimm16", "and", 32,
725 { 0, { { { (1<<MACH_BASE
), 0 } } } }
729 XSTORMY16_INSN_ORGRGR
, "orgrgr", "or", 16,
730 { 0, { { { (1<<MACH_BASE
), 0 } } } }
734 XSTORMY16_INSN_ORIMM8
, "orimm8", "or", 16,
735 { 0, { { { (1<<MACH_BASE
), 0 } } } }
739 XSTORMY16_INSN_ORGRIMM16
, "orgrimm16", "or", 32,
740 { 0, { { { (1<<MACH_BASE
), 0 } } } }
744 XSTORMY16_INSN_XORGRGR
, "xorgrgr", "xor", 16,
745 { 0, { { { (1<<MACH_BASE
), 0 } } } }
749 XSTORMY16_INSN_XORIMM8
, "xorimm8", "xor", 16,
750 { 0, { { { (1<<MACH_BASE
), 0 } } } }
752 /* xor $Rd,#$imm16 */
754 XSTORMY16_INSN_XORGRIMM16
, "xorgrimm16", "xor", 32,
755 { 0, { { { (1<<MACH_BASE
), 0 } } } }
759 XSTORMY16_INSN_NOTGR
, "notgr", "not", 16,
760 { 0, { { { (1<<MACH_BASE
), 0 } } } }
764 XSTORMY16_INSN_ADDGRGR
, "addgrgr", "add", 16,
765 { 0, { { { (1<<MACH_BASE
), 0 } } } }
769 XSTORMY16_INSN_ADDGRIMM4
, "addgrimm4", "add", 16,
770 { 0, { { { (1<<MACH_BASE
), 0 } } } }
774 XSTORMY16_INSN_ADDIMM8
, "addimm8", "add", 16,
775 { 0, { { { (1<<MACH_BASE
), 0 } } } }
777 /* add $Rd,#$imm16 */
779 XSTORMY16_INSN_ADDGRIMM16
, "addgrimm16", "add", 32,
780 { 0, { { { (1<<MACH_BASE
), 0 } } } }
784 XSTORMY16_INSN_ADCGRGR
, "adcgrgr", "adc", 16,
785 { 0, { { { (1<<MACH_BASE
), 0 } } } }
789 XSTORMY16_INSN_ADCGRIMM4
, "adcgrimm4", "adc", 16,
790 { 0, { { { (1<<MACH_BASE
), 0 } } } }
794 XSTORMY16_INSN_ADCIMM8
, "adcimm8", "adc", 16,
795 { 0, { { { (1<<MACH_BASE
), 0 } } } }
797 /* adc $Rd,#$imm16 */
799 XSTORMY16_INSN_ADCGRIMM16
, "adcgrimm16", "adc", 32,
800 { 0, { { { (1<<MACH_BASE
), 0 } } } }
804 XSTORMY16_INSN_SUBGRGR
, "subgrgr", "sub", 16,
805 { 0, { { { (1<<MACH_BASE
), 0 } } } }
809 XSTORMY16_INSN_SUBGRIMM4
, "subgrimm4", "sub", 16,
810 { 0, { { { (1<<MACH_BASE
), 0 } } } }
814 XSTORMY16_INSN_SUBIMM8
, "subimm8", "sub", 16,
815 { 0, { { { (1<<MACH_BASE
), 0 } } } }
817 /* sub $Rd,#$imm16 */
819 XSTORMY16_INSN_SUBGRIMM16
, "subgrimm16", "sub", 32,
820 { 0, { { { (1<<MACH_BASE
), 0 } } } }
824 XSTORMY16_INSN_SBCGRGR
, "sbcgrgr", "sbc", 16,
825 { 0, { { { (1<<MACH_BASE
), 0 } } } }
829 XSTORMY16_INSN_SBCGRIMM4
, "sbcgrimm4", "sbc", 16,
830 { 0, { { { (1<<MACH_BASE
), 0 } } } }
834 XSTORMY16_INSN_SBCGRIMM8
, "sbcgrimm8", "sbc", 16,
835 { 0, { { { (1<<MACH_BASE
), 0 } } } }
837 /* sbc $Rd,#$imm16 */
839 XSTORMY16_INSN_SBCGRIMM16
, "sbcgrimm16", "sbc", 32,
840 { 0, { { { (1<<MACH_BASE
), 0 } } } }
844 XSTORMY16_INSN_INCGRIMM2
, "incgrimm2", "inc", 16,
845 { 0, { { { (1<<MACH_BASE
), 0 } } } }
849 XSTORMY16_INSN_DECGRIMM2
, "decgrimm2", "dec", 16,
850 { 0, { { { (1<<MACH_BASE
), 0 } } } }
854 XSTORMY16_INSN_RRCGRGR
, "rrcgrgr", "rrc", 16,
855 { 0, { { { (1<<MACH_BASE
), 0 } } } }
859 XSTORMY16_INSN_RRCGRIMM4
, "rrcgrimm4", "rrc", 16,
860 { 0, { { { (1<<MACH_BASE
), 0 } } } }
864 XSTORMY16_INSN_RLCGRGR
, "rlcgrgr", "rlc", 16,
865 { 0, { { { (1<<MACH_BASE
), 0 } } } }
869 XSTORMY16_INSN_RLCGRIMM4
, "rlcgrimm4", "rlc", 16,
870 { 0, { { { (1<<MACH_BASE
), 0 } } } }
874 XSTORMY16_INSN_SHRGRGR
, "shrgrgr", "shr", 16,
875 { 0, { { { (1<<MACH_BASE
), 0 } } } }
879 XSTORMY16_INSN_SHRGRIMM
, "shrgrimm", "shr", 16,
880 { 0, { { { (1<<MACH_BASE
), 0 } } } }
884 XSTORMY16_INSN_SHLGRGR
, "shlgrgr", "shl", 16,
885 { 0, { { { (1<<MACH_BASE
), 0 } } } }
889 XSTORMY16_INSN_SHLGRIMM
, "shlgrimm", "shl", 16,
890 { 0, { { { (1<<MACH_BASE
), 0 } } } }
894 XSTORMY16_INSN_ASRGRGR
, "asrgrgr", "asr", 16,
895 { 0, { { { (1<<MACH_BASE
), 0 } } } }
899 XSTORMY16_INSN_ASRGRIMM
, "asrgrimm", "asr", 16,
900 { 0, { { { (1<<MACH_BASE
), 0 } } } }
902 /* set1 $Rd,#$imm4 */
904 XSTORMY16_INSN_SET1GRIMM
, "set1grimm", "set1", 16,
905 { 0, { { { (1<<MACH_BASE
), 0 } } } }
909 XSTORMY16_INSN_SET1GRGR
, "set1grgr", "set1", 16,
910 { 0, { { { (1<<MACH_BASE
), 0 } } } }
912 /* set1 $lmem8,#$imm3 */
914 XSTORMY16_INSN_SET1LMEMIMM
, "set1lmemimm", "set1", 16,
915 { 0, { { { (1<<MACH_BASE
), 0 } } } }
917 /* set1 $hmem8,#$imm3 */
919 XSTORMY16_INSN_SET1HMEMIMM
, "set1hmemimm", "set1", 16,
920 { 0, { { { (1<<MACH_BASE
), 0 } } } }
922 /* clr1 $Rd,#$imm4 */
924 XSTORMY16_INSN_CLR1GRIMM
, "clr1grimm", "clr1", 16,
925 { 0, { { { (1<<MACH_BASE
), 0 } } } }
929 XSTORMY16_INSN_CLR1GRGR
, "clr1grgr", "clr1", 16,
930 { 0, { { { (1<<MACH_BASE
), 0 } } } }
932 /* clr1 $lmem8,#$imm3 */
934 XSTORMY16_INSN_CLR1LMEMIMM
, "clr1lmemimm", "clr1", 16,
935 { 0, { { { (1<<MACH_BASE
), 0 } } } }
937 /* clr1 $hmem8,#$imm3 */
939 XSTORMY16_INSN_CLR1HMEMIMM
, "clr1hmemimm", "clr1", 16,
940 { 0, { { { (1<<MACH_BASE
), 0 } } } }
944 XSTORMY16_INSN_CBWGR
, "cbwgr", "cbw", 16,
945 { 0, { { { (1<<MACH_BASE
), 0 } } } }
949 XSTORMY16_INSN_REVGR
, "revgr", "rev", 16,
950 { 0, { { { (1<<MACH_BASE
), 0 } } } }
952 /* b$bcond5 $Rd,$Rs,$rel12 */
954 XSTORMY16_INSN_BCCGRGR
, "bccgrgr", "b", 32,
955 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
957 /* b$bcond5 $Rm,#$imm8,$rel12 */
959 XSTORMY16_INSN_BCCGRIMM8
, "bccgrimm8", "b", 32,
960 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
962 /* b$bcond2 Rx,#$imm16,${rel8-4} */
964 XSTORMY16_INSN_BCCIMM16
, "bccimm16", "b", 32,
965 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
967 /* bn $Rd,#$imm4,$rel12 */
969 XSTORMY16_INSN_BNGRIMM4
, "bngrimm4", "bn", 32,
970 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
972 /* bn $Rd,$Rs,$rel12 */
974 XSTORMY16_INSN_BNGRGR
, "bngrgr", "bn", 32,
975 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
977 /* bn $lmem8,#$imm3b,$rel12 */
979 XSTORMY16_INSN_BNLMEMIMM
, "bnlmemimm", "bn", 32,
980 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
982 /* bn $hmem8,#$imm3b,$rel12 */
984 XSTORMY16_INSN_BNHMEMIMM
, "bnhmemimm", "bn", 32,
985 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
987 /* bp $Rd,#$imm4,$rel12 */
989 XSTORMY16_INSN_BPGRIMM4
, "bpgrimm4", "bp", 32,
990 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
992 /* bp $Rd,$Rs,$rel12 */
994 XSTORMY16_INSN_BPGRGR
, "bpgrgr", "bp", 32,
995 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
997 /* bp $lmem8,#$imm3b,$rel12 */
999 XSTORMY16_INSN_BPLMEMIMM
, "bplmemimm", "bp", 32,
1000 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1002 /* bp $hmem8,#$imm3b,$rel12 */
1004 XSTORMY16_INSN_BPHMEMIMM
, "bphmemimm", "bp", 32,
1005 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1007 /* b$bcond2 ${rel8-2} */
1009 XSTORMY16_INSN_BCC
, "bcc", "b", 16,
1010 { 0|A(COND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1014 XSTORMY16_INSN_BGR
, "bgr", "br", 16,
1015 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1019 XSTORMY16_INSN_BR
, "br", "br", 16,
1020 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1024 XSTORMY16_INSN_JMP
, "jmp", "jmp", 16,
1025 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1029 XSTORMY16_INSN_JMPF
, "jmpf", "jmpf", 32,
1030 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1034 XSTORMY16_INSN_CALLRGR
, "callrgr", "callr", 16,
1035 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1039 XSTORMY16_INSN_CALLRIMM
, "callrimm", "callr", 16,
1040 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1044 XSTORMY16_INSN_CALLGR
, "callgr", "call", 16,
1045 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1049 XSTORMY16_INSN_CALLFIMM
, "callfimm", "callf", 32,
1050 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1054 XSTORMY16_INSN_ICALLRGR
, "icallrgr", "icallr", 16,
1055 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1057 /* icall $Rbj,$Rd */
1059 XSTORMY16_INSN_ICALLGR
, "icallgr", "icall", 16,
1060 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1064 XSTORMY16_INSN_ICALLFIMM
, "icallfimm", "icallf", 32,
1065 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1069 XSTORMY16_INSN_IRET
, "iret", "iret", 16,
1070 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1074 XSTORMY16_INSN_RET
, "ret", "ret", 16,
1075 { 0|A(UNCOND_CTI
), { { { (1<<MACH_BASE
), 0 } } } }
1079 XSTORMY16_INSN_MUL
, "mul", "mul", 16,
1080 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1084 XSTORMY16_INSN_DIV
, "div", "div", 16,
1085 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1089 XSTORMY16_INSN_SDIV
, "sdiv", "sdiv", 16,
1090 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1094 XSTORMY16_INSN_SDIVLH
, "sdivlh", "sdivlh", 16,
1095 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1099 XSTORMY16_INSN_DIVLH
, "divlh", "divlh", 16,
1100 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1104 XSTORMY16_INSN_RESET
, "reset", "reset", 16,
1105 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1109 XSTORMY16_INSN_NOP
, "nop", "nop", 16,
1110 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1114 XSTORMY16_INSN_HALT
, "halt", "halt", 16,
1115 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1119 XSTORMY16_INSN_HOLD
, "hold", "hold", 16,
1120 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1124 XSTORMY16_INSN_HOLDX
, "holdx", "holdx", 16,
1125 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1129 XSTORMY16_INSN_BRK
, "brk", "brk", 16,
1130 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1134 XSTORMY16_INSN_SYSCALL
, "syscall", "--unused--", 16,
1135 { 0, { { { (1<<MACH_BASE
), 0 } } } }
1142 /* Initialize anything needed to be done once, before any cpu_open call. */
1149 static const CGEN_MACH
* lookup_mach_via_bfd_name (const CGEN_MACH
*, const char *);
1150 static void build_hw_table (CGEN_CPU_TABLE
*);
1151 static void build_ifield_table (CGEN_CPU_TABLE
*);
1152 static void build_operand_table (CGEN_CPU_TABLE
*);
1153 static void build_insn_table (CGEN_CPU_TABLE
*);
1154 static void xstormy16_cgen_rebuild_tables (CGEN_CPU_TABLE
*);
1156 /* Subroutine of xstormy16_cgen_cpu_open to look up a mach via its bfd name. */
1158 static const CGEN_MACH
*
1159 lookup_mach_via_bfd_name (const CGEN_MACH
*table
, const char *name
)
1163 if (strcmp (name
, table
->bfd_name
) == 0)
1170 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table. */
1173 build_hw_table (CGEN_CPU_TABLE
*cd
)
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 (CGEN_CPU_TABLE
*cd
)
1201 cd
->ifld_table
= & xstormy16_cgen_ifld_table
[0];
1204 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table. */
1207 build_operand_table (CGEN_CPU_TABLE
*cd
)
1210 int machs
= cd
->machs
;
1211 const CGEN_OPERAND
*init
= & xstormy16_cgen_operand_table
[0];
1212 /* MAX_OPERANDS is only an upper bound on the number of selected entries.
1213 However each entry is indexed by it's enum so there can be holes in
1215 const CGEN_OPERAND
**selected
= xmalloc (MAX_OPERANDS
* sizeof (* selected
));
1217 cd
->operand_table
.init_entries
= init
;
1218 cd
->operand_table
.entry_size
= sizeof (CGEN_OPERAND
);
1219 memset (selected
, 0, MAX_OPERANDS
* sizeof (CGEN_OPERAND
*));
1220 /* ??? For now we just use mach to determine which ones we want. */
1221 for (i
= 0; init
[i
].name
!= NULL
; ++i
)
1222 if (CGEN_OPERAND_ATTR_VALUE (&init
[i
], CGEN_OPERAND_MACH
)
1224 selected
[init
[i
].type
] = &init
[i
];
1225 cd
->operand_table
.entries
= selected
;
1226 cd
->operand_table
.num_entries
= MAX_OPERANDS
;
1229 /* Subroutine of xstormy16_cgen_cpu_open to build the hardware table.
1230 ??? This could leave out insns not supported by the specified mach/isa,
1231 but that would cause errors like "foo only supported by bar" to become
1232 "unknown insn", so for now we include all insns and require the app to
1233 do the checking later.
1234 ??? On the other hand, parsing of such insns may require their hardware or
1235 operand elements to be in the table [which they mightn't be]. */
1238 build_insn_table (CGEN_CPU_TABLE
*cd
)
1241 const CGEN_IBASE
*ib
= & xstormy16_cgen_insn_table
[0];
1242 CGEN_INSN
*insns
= xmalloc (MAX_INSNS
* sizeof (CGEN_INSN
));
1244 memset (insns
, 0, MAX_INSNS
* sizeof (CGEN_INSN
));
1245 for (i
= 0; i
< MAX_INSNS
; ++i
)
1246 insns
[i
].base
= &ib
[i
];
1247 cd
->insn_table
.init_entries
= insns
;
1248 cd
->insn_table
.entry_size
= sizeof (CGEN_IBASE
);
1249 cd
->insn_table
.num_init_entries
= MAX_INSNS
;
1252 /* Subroutine of xstormy16_cgen_cpu_open to rebuild the tables. */
1255 xstormy16_cgen_rebuild_tables (CGEN_CPU_TABLE
*cd
)
1258 CGEN_BITSET
*isas
= cd
->isas
;
1259 unsigned int machs
= cd
->machs
;
1261 cd
->int_insn_p
= CGEN_INT_INSN_P
;
1263 /* Data derived from the isa spec. */
1264 #define UNSET (CGEN_SIZE_UNKNOWN + 1)
1265 cd
->default_insn_bitsize
= UNSET
;
1266 cd
->base_insn_bitsize
= UNSET
;
1267 cd
->min_insn_bitsize
= 65535; /* Some ridiculously big number. */
1268 cd
->max_insn_bitsize
= 0;
1269 for (i
= 0; i
< MAX_ISAS
; ++i
)
1270 if (cgen_bitset_contains (isas
, i
))
1272 const CGEN_ISA
*isa
= & xstormy16_cgen_isa_table
[i
];
1274 /* Default insn sizes of all selected isas must be
1275 equal or we set the result to 0, meaning "unknown". */
1276 if (cd
->default_insn_bitsize
== UNSET
)
1277 cd
->default_insn_bitsize
= isa
->default_insn_bitsize
;
1278 else if (isa
->default_insn_bitsize
== cd
->default_insn_bitsize
)
1281 cd
->default_insn_bitsize
= CGEN_SIZE_UNKNOWN
;
1283 /* Base insn sizes of all selected isas must be equal
1284 or we set the result to 0, meaning "unknown". */
1285 if (cd
->base_insn_bitsize
== UNSET
)
1286 cd
->base_insn_bitsize
= isa
->base_insn_bitsize
;
1287 else if (isa
->base_insn_bitsize
== cd
->base_insn_bitsize
)
1290 cd
->base_insn_bitsize
= CGEN_SIZE_UNKNOWN
;
1292 /* Set min,max insn sizes. */
1293 if (isa
->min_insn_bitsize
< cd
->min_insn_bitsize
)
1294 cd
->min_insn_bitsize
= isa
->min_insn_bitsize
;
1295 if (isa
->max_insn_bitsize
> cd
->max_insn_bitsize
)
1296 cd
->max_insn_bitsize
= isa
->max_insn_bitsize
;
1299 /* Data derived from the mach spec. */
1300 for (i
= 0; i
< MAX_MACHS
; ++i
)
1301 if (((1 << i
) & machs
) != 0)
1303 const CGEN_MACH
*mach
= & xstormy16_cgen_mach_table
[i
];
1305 if (mach
->insn_chunk_bitsize
!= 0)
1307 if (cd
->insn_chunk_bitsize
!= 0 && cd
->insn_chunk_bitsize
!= mach
->insn_chunk_bitsize
)
1309 fprintf (stderr
, "xstormy16_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
1310 cd
->insn_chunk_bitsize
, mach
->insn_chunk_bitsize
);
1314 cd
->insn_chunk_bitsize
= mach
->insn_chunk_bitsize
;
1318 /* Determine which hw elements are used by MACH. */
1319 build_hw_table (cd
);
1321 /* Build the ifield table. */
1322 build_ifield_table (cd
);
1324 /* Determine which operands are used by MACH/ISA. */
1325 build_operand_table (cd
);
1327 /* Build the instruction table. */
1328 build_insn_table (cd
);
1331 /* Initialize a cpu table and return a descriptor.
1332 It's much like opening a file, and must be the first function called.
1333 The arguments are a set of (type/value) pairs, terminated with
1336 Currently supported values:
1337 CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr
1338 CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr
1339 CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
1340 CGEN_CPU_OPEN_ENDIAN: specify endian choice
1341 CGEN_CPU_OPEN_END: terminates arguments
1343 ??? Simultaneous multiple isas might not make sense, but it's not (yet)
1347 xstormy16_cgen_cpu_open (enum cgen_cpu_open_arg arg_type
, ...)
1349 CGEN_CPU_TABLE
*cd
= (CGEN_CPU_TABLE
*) xmalloc (sizeof (CGEN_CPU_TABLE
));
1351 CGEN_BITSET
*isas
= 0; /* 0 = "unspecified" */
1352 unsigned int machs
= 0; /* 0 = "unspecified" */
1353 enum cgen_endian endian
= CGEN_ENDIAN_UNKNOWN
;
1362 memset (cd
, 0, sizeof (*cd
));
1364 va_start (ap
, arg_type
);
1365 while (arg_type
!= CGEN_CPU_OPEN_END
)
1369 case CGEN_CPU_OPEN_ISAS
:
1370 isas
= va_arg (ap
, CGEN_BITSET
*);
1372 case CGEN_CPU_OPEN_MACHS
:
1373 machs
= va_arg (ap
, unsigned int);
1375 case CGEN_CPU_OPEN_BFDMACH
:
1377 const char *name
= va_arg (ap
, const char *);
1378 const CGEN_MACH
*mach
=
1379 lookup_mach_via_bfd_name (xstormy16_cgen_mach_table
, name
);
1381 machs
|= 1 << mach
->num
;
1384 case CGEN_CPU_OPEN_ENDIAN
:
1385 endian
= va_arg (ap
, enum cgen_endian
);
1388 fprintf (stderr
, "xstormy16_cgen_cpu_open: unsupported argument `%d'\n",
1390 abort (); /* ??? return NULL? */
1392 arg_type
= va_arg (ap
, enum cgen_cpu_open_arg
);
1396 /* Mach unspecified means "all". */
1398 machs
= (1 << MAX_MACHS
) - 1;
1399 /* Base mach is always selected. */
1401 if (endian
== CGEN_ENDIAN_UNKNOWN
)
1403 /* ??? If target has only one, could have a default. */
1404 fprintf (stderr
, "xstormy16_cgen_cpu_open: no endianness specified\n");
1408 cd
->isas
= cgen_bitset_copy (isas
);
1410 cd
->endian
= endian
;
1411 /* FIXME: for the sparc case we can determine insn-endianness statically.
1412 The worry here is where both data and insn endian can be independently
1413 chosen, in which case this function will need another argument.
1414 Actually, will want to allow for more arguments in the future anyway. */
1415 cd
->insn_endian
= endian
;
1417 /* Table (re)builder. */
1418 cd
->rebuild_tables
= xstormy16_cgen_rebuild_tables
;
1419 xstormy16_cgen_rebuild_tables (cd
);
1421 /* Default to not allowing signed overflow. */
1422 cd
->signed_overflow_ok_p
= 0;
1424 return (CGEN_CPU_DESC
) cd
;
1427 /* Cover fn to xstormy16_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
1428 MACH_NAME is the bfd name of the mach. */
1431 xstormy16_cgen_cpu_open_1 (const char *mach_name
, enum cgen_endian endian
)
1433 return xstormy16_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH
, mach_name
,
1434 CGEN_CPU_OPEN_ENDIAN
, endian
,
1438 /* Close a cpu table.
1439 ??? This can live in a machine independent file, but there's currently
1440 no place to put this file (there's no libcgen). libopcodes is the wrong
1441 place as some simulator ports use this but they don't use libopcodes. */
1444 xstormy16_cgen_cpu_close (CGEN_CPU_DESC cd
)
1447 const CGEN_INSN
*insns
;
1449 if (cd
->macro_insn_table
.init_entries
)
1451 insns
= cd
->macro_insn_table
.init_entries
;
1452 for (i
= 0; i
< cd
->macro_insn_table
.num_init_entries
; ++i
, ++insns
)
1453 if (CGEN_INSN_RX ((insns
)))
1454 regfree (CGEN_INSN_RX (insns
));
1457 if (cd
->insn_table
.init_entries
)
1459 insns
= cd
->insn_table
.init_entries
;
1460 for (i
= 0; i
< cd
->insn_table
.num_init_entries
; ++i
, ++insns
)
1461 if (CGEN_INSN_RX (insns
))
1462 regfree (CGEN_INSN_RX (insns
));
1465 if (cd
->macro_insn_table
.init_entries
)
1466 free ((CGEN_INSN
*) cd
->macro_insn_table
.init_entries
);
1468 if (cd
->insn_table
.init_entries
)
1469 free ((CGEN_INSN
*) cd
->insn_table
.init_entries
);
1471 if (cd
->hw_table
.entries
)
1472 free ((CGEN_HW_ENTRY
*) cd
->hw_table
.entries
);
1474 if (cd
->operand_table
.entries
)
1475 free ((CGEN_HW_ENTRY
*) cd
->operand_table
.entries
);