m32r-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 m32r.
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 "m32r-desc.h"
34 1.1 skrll #include "m32r-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 { "m32r", MACH_M32R },
52 1.1 skrll { "m32rx", MACH_M32RX },
53 1.1 skrll { "m32r2", MACH_M32R2 },
54 1.1 skrll { "max", MACH_MAX },
55 1.1 skrll { 0, 0 }
56 1.1 skrll };
57 1.1 skrll
58 1.1 skrll static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
59 1.1 skrll {
60 1.1 skrll { "m32r", ISA_M32R },
61 1.1 skrll { "max", ISA_MAX },
62 1.1 skrll { 0, 0 }
63 1.1 skrll };
64 1.1 skrll
65 1.1 skrll static const CGEN_ATTR_ENTRY PIPE_attr[] ATTRIBUTE_UNUSED =
66 1.1 skrll {
67 1.1 skrll { "NONE", PIPE_NONE },
68 1.1 skrll { "O", PIPE_O },
69 1.1 skrll { "S", PIPE_S },
70 1.1 skrll { "OS", PIPE_OS },
71 1.1 skrll { "O_OS", PIPE_O_OS },
72 1.1 skrll { 0, 0 }
73 1.1 skrll };
74 1.1 skrll
75 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_ifield_attr_table[] =
76 1.1 skrll {
77 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
78 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
79 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
80 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
81 1.1 skrll { "RESERVED", &bool_attr[0], &bool_attr[0] },
82 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
83 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] },
84 1.1 skrll { "RELOC", &bool_attr[0], &bool_attr[0] },
85 1.1 skrll { 0, 0, 0 }
86 1.1 skrll };
87 1.1 skrll
88 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_hardware_attr_table[] =
89 1.1 skrll {
90 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
91 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
92 1.1 skrll { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
93 1.1 skrll { "PC", &bool_attr[0], &bool_attr[0] },
94 1.1 skrll { "PROFILE", &bool_attr[0], &bool_attr[0] },
95 1.1 skrll { 0, 0, 0 }
96 1.1 skrll };
97 1.1 skrll
98 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_operand_attr_table[] =
99 1.1 skrll {
100 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
101 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
102 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
103 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
104 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
105 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] },
106 1.1 skrll { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
107 1.1 skrll { "RELAX", &bool_attr[0], &bool_attr[0] },
108 1.1 skrll { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
109 1.1 skrll { "RELOC", &bool_attr[0], &bool_attr[0] },
110 1.1 skrll { 0, 0, 0 }
111 1.1 skrll };
112 1.1 skrll
113 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_insn_attr_table[] =
114 1.1 skrll {
115 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] },
116 1.1 skrll { "PIPE", & PIPE_attr[0], & PIPE_attr[0] },
117 1.1 skrll { "ALIAS", &bool_attr[0], &bool_attr[0] },
118 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
119 1.1 skrll { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
120 1.1 skrll { "COND-CTI", &bool_attr[0], &bool_attr[0] },
121 1.1 skrll { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
122 1.1 skrll { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
123 1.1 skrll { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
124 1.1 skrll { "RELAXED", &bool_attr[0], &bool_attr[0] },
125 1.1 skrll { "NO-DIS", &bool_attr[0], &bool_attr[0] },
126 1.1 skrll { "PBB", &bool_attr[0], &bool_attr[0] },
127 1.1 skrll { "FILL-SLOT", &bool_attr[0], &bool_attr[0] },
128 1.1 skrll { "SPECIAL", &bool_attr[0], &bool_attr[0] },
129 1.1 skrll { "SPECIAL_M32R", &bool_attr[0], &bool_attr[0] },
130 1.1 skrll { "SPECIAL_FLOAT", &bool_attr[0], &bool_attr[0] },
131 1.1 skrll { 0, 0, 0 }
132 1.1 skrll };
133 1.1 skrll
134 1.1 skrll /* Instruction set variants. */
135 1.1 skrll
136 1.1 skrll static const CGEN_ISA m32r_cgen_isa_table[] = {
137 1.1 skrll { "m32r", 32, 32, 16, 32 },
138 1.1 skrll { 0, 0, 0, 0, 0 }
139 1.1 skrll };
140 1.1 skrll
141 1.1 skrll /* Machine variants. */
142 1.1 skrll
143 1.1 skrll static const CGEN_MACH m32r_cgen_mach_table[] = {
144 1.1 skrll { "m32r", "m32r", MACH_M32R, 0 },
145 1.1 skrll { "m32rx", "m32rx", MACH_M32RX, 0 },
146 1.1 skrll { "m32r2", "m32r2", MACH_M32R2, 0 },
147 1.1 skrll { 0, 0, 0, 0 }
148 1.1 skrll };
149 1.1 skrll
150 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_gr_names_entries[] =
151 1.1 skrll {
152 1.1 skrll { "fp", 13, {0, {{{0, 0}}}}, 0, 0 },
153 1.1 skrll { "lr", 14, {0, {{{0, 0}}}}, 0, 0 },
154 1.1 skrll { "sp", 15, {0, {{{0, 0}}}}, 0, 0 },
155 1.1 skrll { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
156 1.1 skrll { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
157 1.1 skrll { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
158 1.1 skrll { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
159 1.1 skrll { "r4", 4, {0, {{{0, 0}}}}, 0, 0 },
160 1.1 skrll { "r5", 5, {0, {{{0, 0}}}}, 0, 0 },
161 1.1 skrll { "r6", 6, {0, {{{0, 0}}}}, 0, 0 },
162 1.1 skrll { "r7", 7, {0, {{{0, 0}}}}, 0, 0 },
163 1.1 skrll { "r8", 8, {0, {{{0, 0}}}}, 0, 0 },
164 1.1 skrll { "r9", 9, {0, {{{0, 0}}}}, 0, 0 },
165 1.1 skrll { "r10", 10, {0, {{{0, 0}}}}, 0, 0 },
166 1.1 skrll { "r11", 11, {0, {{{0, 0}}}}, 0, 0 },
167 1.1 skrll { "r12", 12, {0, {{{0, 0}}}}, 0, 0 },
168 1.1 skrll { "r13", 13, {0, {{{0, 0}}}}, 0, 0 },
169 1.1 skrll { "r14", 14, {0, {{{0, 0}}}}, 0, 0 },
170 1.1 skrll { "r15", 15, {0, {{{0, 0}}}}, 0, 0 }
171 1.1 skrll };
172 1.1 skrll
173 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_gr_names =
174 1.1 skrll {
175 1.1 skrll & m32r_cgen_opval_gr_names_entries[0],
176 1.1 skrll 19,
177 1.1 skrll 0, 0, 0, 0, ""
178 1.1 skrll };
179 1.1 skrll
180 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_cr_names_entries[] =
181 1.1 skrll {
182 1.1 skrll { "psw", 0, {0, {{{0, 0}}}}, 0, 0 },
183 1.1 skrll { "cbr", 1, {0, {{{0, 0}}}}, 0, 0 },
184 1.1 skrll { "spi", 2, {0, {{{0, 0}}}}, 0, 0 },
185 1.1 skrll { "spu", 3, {0, {{{0, 0}}}}, 0, 0 },
186 1.1 skrll { "bpc", 6, {0, {{{0, 0}}}}, 0, 0 },
187 1.1 skrll { "bbpsw", 8, {0, {{{0, 0}}}}, 0, 0 },
188 1.1 skrll { "bbpc", 14, {0, {{{0, 0}}}}, 0, 0 },
189 1.1 skrll { "evb", 5, {0, {{{0, 0}}}}, 0, 0 },
190 1.1 skrll { "cr0", 0, {0, {{{0, 0}}}}, 0, 0 },
191 1.1 skrll { "cr1", 1, {0, {{{0, 0}}}}, 0, 0 },
192 1.1 skrll { "cr2", 2, {0, {{{0, 0}}}}, 0, 0 },
193 1.1 skrll { "cr3", 3, {0, {{{0, 0}}}}, 0, 0 },
194 1.1 skrll { "cr4", 4, {0, {{{0, 0}}}}, 0, 0 },
195 1.1 skrll { "cr5", 5, {0, {{{0, 0}}}}, 0, 0 },
196 1.1 skrll { "cr6", 6, {0, {{{0, 0}}}}, 0, 0 },
197 1.1 skrll { "cr7", 7, {0, {{{0, 0}}}}, 0, 0 },
198 1.1 skrll { "cr8", 8, {0, {{{0, 0}}}}, 0, 0 },
199 1.1 skrll { "cr9", 9, {0, {{{0, 0}}}}, 0, 0 },
200 1.1 skrll { "cr10", 10, {0, {{{0, 0}}}}, 0, 0 },
201 1.1 skrll { "cr11", 11, {0, {{{0, 0}}}}, 0, 0 },
202 1.1 skrll { "cr12", 12, {0, {{{0, 0}}}}, 0, 0 },
203 1.1 skrll { "cr13", 13, {0, {{{0, 0}}}}, 0, 0 },
204 1.1 skrll { "cr14", 14, {0, {{{0, 0}}}}, 0, 0 },
205 1.1 skrll { "cr15", 15, {0, {{{0, 0}}}}, 0, 0 }
206 1.1 skrll };
207 1.1 skrll
208 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_cr_names =
209 1.1 skrll {
210 1.1 skrll & m32r_cgen_opval_cr_names_entries[0],
211 1.1 skrll 24,
212 1.1 skrll 0, 0, 0, 0, ""
213 1.1 skrll };
214 1.1 skrll
215 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_h_accums_entries[] =
216 1.1 skrll {
217 1.1 skrll { "a0", 0, {0, {{{0, 0}}}}, 0, 0 },
218 1.1 skrll { "a1", 1, {0, {{{0, 0}}}}, 0, 0 }
219 1.1 skrll };
220 1.1 skrll
221 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_h_accums =
222 1.1 skrll {
223 1.1 skrll & m32r_cgen_opval_h_accums_entries[0],
224 1.1 skrll 2,
225 1.1 skrll 0, 0, 0, 0, ""
226 1.1 skrll };
227 1.1 skrll
228 1.1 skrll
229 1.1 skrll /* The hardware table. */
230 1.1 skrll
231 1.1 skrll #define A(a) (1 << CGEN_HW_##a)
232 1.1 skrll
233 1.1 skrll const CGEN_HW_ENTRY m32r_cgen_hw_table[] =
234 1.1 skrll {
235 1.1 skrll { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
236 1.1 skrll { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
237 1.1 skrll { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
238 1.1 skrll { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
239 1.1 skrll { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
240 1.1 skrll { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
241 1.1 skrll { "h-hi16", HW_H_HI16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
242 1.1 skrll { "h-slo16", HW_H_SLO16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
243 1.1 skrll { "h-ulo16", HW_H_ULO16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
244 1.1.1.8 christos { "h-gr", HW_H_GR, CGEN_ASM_KEYWORD, & m32r_cgen_opval_gr_names, { 0|A(CACHE_ADDR)|A(PROFILE), { { { (1<<MACH_BASE), 0 } } } } },
245 1.1.1.8 christos { "h-cr", HW_H_CR, CGEN_ASM_KEYWORD, & m32r_cgen_opval_cr_names, { 0, { { { (1<<MACH_BASE), 0 } } } } },
246 1.1 skrll { "h-accum", HW_H_ACCUM, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
247 1.1.1.8 christos { "h-accums", HW_H_ACCUMS, CGEN_ASM_KEYWORD, & m32r_cgen_opval_h_accums, { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } },
248 1.1 skrll { "h-cond", HW_H_COND, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
249 1.1 skrll { "h-psw", HW_H_PSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
250 1.1 skrll { "h-bpsw", HW_H_BPSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
251 1.1 skrll { "h-bbpsw", HW_H_BBPSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
252 1.1 skrll { "h-lock", HW_H_LOCK, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
253 1.1 skrll { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
254 1.1 skrll };
255 1.1 skrll
256 1.1 skrll #undef A
257 1.1 skrll
258 1.1 skrll
259 1.1 skrll /* The instruction field table. */
260 1.1 skrll
261 1.1 skrll #define A(a) (1 << CGEN_IFLD_##a)
262 1.1 skrll
263 1.1 skrll const CGEN_IFLD m32r_cgen_ifld_table[] =
264 1.1 skrll {
265 1.1 skrll { M32R_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
266 1.1 skrll { M32R_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
267 1.1 skrll { M32R_F_OP1, "f-op1", 0, 32, 0, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
268 1.1 skrll { M32R_F_OP2, "f-op2", 0, 32, 8, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
269 1.1 skrll { M32R_F_COND, "f-cond", 0, 32, 4, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
270 1.1 skrll { M32R_F_R1, "f-r1", 0, 32, 4, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
271 1.1 skrll { M32R_F_R2, "f-r2", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
272 1.1 skrll { M32R_F_SIMM8, "f-simm8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } },
273 1.1 skrll { M32R_F_SIMM16, "f-simm16", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } },
274 1.1 skrll { M32R_F_SHIFT_OP2, "f-shift-op2", 0, 32, 8, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
275 1.1 skrll { M32R_F_UIMM3, "f-uimm3", 0, 32, 5, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
276 1.1 skrll { M32R_F_UIMM4, "f-uimm4", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } },
277 1.1 skrll { M32R_F_UIMM5, "f-uimm5", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
278 1.1 skrll { M32R_F_UIMM8, "f-uimm8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } },
279 1.1 skrll { M32R_F_UIMM16, "f-uimm16", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } },
280 1.1 skrll { M32R_F_UIMM24, "f-uimm24", 0, 32, 8, 24, { 0|A(RELOC)|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
281 1.1 skrll { M32R_F_HI16, "f-hi16", 0, 32, 16, 16, { 0|A(SIGN_OPT), { { { (1<<MACH_BASE), 0 } } } } },
282 1.1 skrll { M32R_F_DISP8, "f-disp8", 0, 32, 8, 8, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
283 1.1 skrll { M32R_F_DISP16, "f-disp16", 0, 32, 16, 16, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
284 1.1 skrll { M32R_F_DISP24, "f-disp24", 0, 32, 8, 24, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
285 1.1 skrll { M32R_F_OP23, "f-op23", 0, 32, 9, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } },
286 1.1 skrll { M32R_F_OP3, "f-op3", 0, 32, 14, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } },
287 1.1 skrll { M32R_F_ACC, "f-acc", 0, 32, 8, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } },
288 1.1 skrll { M32R_F_ACCS, "f-accs", 0, 32, 12, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } },
289 1.1 skrll { M32R_F_ACCD, "f-accd", 0, 32, 4, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } },
290 1.1 skrll { M32R_F_BITS67, "f-bits67", 0, 32, 6, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } },
291 1.1 skrll { M32R_F_BIT4, "f-bit4", 0, 32, 4, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } },
292 1.1 skrll { M32R_F_BIT14, "f-bit14", 0, 32, 14, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } },
293 1.1 skrll { M32R_F_IMM1, "f-imm1", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } },
294 1.1 skrll { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
295 1.1 skrll };
296 1.1 skrll
297 1.1 skrll #undef A
298 1.1 skrll
299 1.1 skrll
300 1.1 skrll
301 1.1 skrll /* multi ifield declarations */
302 1.1 skrll
303 1.1 skrll
304 1.1 skrll
305 1.1 skrll /* multi ifield definitions */
306 1.1 skrll
307 1.1 skrll
308 1.1 skrll /* The operand table. */
309 1.1 skrll
310 1.1 skrll #define A(a) (1 << CGEN_OPERAND_##a)
311 1.1 skrll #define OPERAND(op) M32R_OPERAND_##op
312 1.1 skrll
313 1.1 skrll const CGEN_OPERAND m32r_cgen_operand_table[] =
314 1.1 skrll {
315 1.1 skrll /* pc: program counter */
316 1.1 skrll { "pc", M32R_OPERAND_PC, HW_H_PC, 0, 0,
317 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_NIL] } },
318 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } },
319 1.1 skrll /* sr: source register */
320 1.1 skrll { "sr", M32R_OPERAND_SR, HW_H_GR, 12, 4,
321 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } },
322 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
323 1.1 skrll /* dr: destination register */
324 1.1 skrll { "dr", M32R_OPERAND_DR, HW_H_GR, 4, 4,
325 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } },
326 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
327 1.1 skrll /* src1: source register 1 */
328 1.1 skrll { "src1", M32R_OPERAND_SRC1, HW_H_GR, 4, 4,
329 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } },
330 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
331 1.1 skrll /* src2: source register 2 */
332 1.1 skrll { "src2", M32R_OPERAND_SRC2, HW_H_GR, 12, 4,
333 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } },
334 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
335 1.1 skrll /* scr: source control register */
336 1.1 skrll { "scr", M32R_OPERAND_SCR, HW_H_CR, 12, 4,
337 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } },
338 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
339 1.1 skrll /* dcr: destination control register */
340 1.1 skrll { "dcr", M32R_OPERAND_DCR, HW_H_CR, 4, 4,
341 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } },
342 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
343 1.1 skrll /* simm8: 8 bit signed immediate */
344 1.1 skrll { "simm8", M32R_OPERAND_SIMM8, HW_H_SINT, 8, 8,
345 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM8] } },
346 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
347 1.1 skrll /* simm16: 16 bit signed immediate */
348 1.1 skrll { "simm16", M32R_OPERAND_SIMM16, HW_H_SINT, 16, 16,
349 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM16] } },
350 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
351 1.1 skrll /* uimm3: 3 bit unsigned number */
352 1.1 skrll { "uimm3", M32R_OPERAND_UIMM3, HW_H_UINT, 5, 3,
353 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM3] } },
354 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
355 1.1 skrll /* uimm4: 4 bit trap number */
356 1.1 skrll { "uimm4", M32R_OPERAND_UIMM4, HW_H_UINT, 12, 4,
357 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM4] } },
358 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
359 1.1 skrll /* uimm5: 5 bit shift count */
360 1.1 skrll { "uimm5", M32R_OPERAND_UIMM5, HW_H_UINT, 11, 5,
361 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM5] } },
362 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
363 1.1 skrll /* uimm8: 8 bit unsigned immediate */
364 1.1 skrll { "uimm8", M32R_OPERAND_UIMM8, HW_H_UINT, 8, 8,
365 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM8] } },
366 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
367 1.1 skrll /* uimm16: 16 bit unsigned immediate */
368 1.1 skrll { "uimm16", M32R_OPERAND_UIMM16, HW_H_UINT, 16, 16,
369 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM16] } },
370 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } },
371 1.1 skrll /* imm1: 1 bit immediate */
372 1.1 skrll { "imm1", M32R_OPERAND_IMM1, HW_H_UINT, 15, 1,
373 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_IMM1] } },
374 1.1.1.2 christos { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } },
375 1.1 skrll /* accd: accumulator destination register */
376 1.1 skrll { "accd", M32R_OPERAND_ACCD, HW_H_ACCUMS, 4, 2,
377 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACCD] } },
378 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } },
379 1.1 skrll /* accs: accumulator source register */
380 1.1 skrll { "accs", M32R_OPERAND_ACCS, HW_H_ACCUMS, 12, 2,
381 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACCS] } },
382 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } },
383 1.1 skrll /* acc: accumulator reg (d) */
384 1.1 skrll { "acc", M32R_OPERAND_ACC, HW_H_ACCUMS, 8, 1,
385 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACC] } },
386 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } },
387 1.1 skrll /* hash: # prefix */
388 1.1 skrll { "hash", M32R_OPERAND_HASH, HW_H_SINT, 0, 0,
389 1.1.1.8 christos { 0, { 0 } },
390 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
391 1.1 skrll /* hi16: high 16 bit immediate, sign optional */
392 1.1 skrll { "hi16", M32R_OPERAND_HI16, HW_H_HI16, 16, 16,
393 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_HI16] } },
394 1.1 skrll { 0|A(SIGN_OPT), { { { (1<<MACH_BASE), 0 } } } } },
395 1.1 skrll /* slo16: 16 bit signed immediate, for low() */
396 1.1 skrll { "slo16", M32R_OPERAND_SLO16, HW_H_SLO16, 16, 16,
397 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM16] } },
398 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
399 1.1 skrll /* ulo16: 16 bit unsigned immediate, for low() */
400 1.1 skrll { "ulo16", M32R_OPERAND_ULO16, HW_H_ULO16, 16, 16,
401 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM16] } },
402 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } },
403 1.1 skrll /* uimm24: 24 bit address */
404 1.1 skrll { "uimm24", M32R_OPERAND_UIMM24, HW_H_ADDR, 8, 24,
405 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM24] } },
406 1.1.1.2 christos { 0|A(RELOC)|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
407 1.1 skrll /* disp8: 8 bit displacement */
408 1.1 skrll { "disp8", M32R_OPERAND_DISP8, HW_H_IADDR, 8, 8,
409 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP8] } },
410 1.1 skrll { 0|A(RELAX)|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
411 1.1 skrll /* disp16: 16 bit displacement */
412 1.1 skrll { "disp16", M32R_OPERAND_DISP16, HW_H_IADDR, 16, 16,
413 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP16] } },
414 1.1 skrll { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
415 1.1 skrll /* disp24: 24 bit displacement */
416 1.1 skrll { "disp24", M32R_OPERAND_DISP24, HW_H_IADDR, 8, 24,
417 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP24] } },
418 1.1 skrll { 0|A(RELAX)|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
419 1.1 skrll /* condbit: condition bit */
420 1.1 skrll { "condbit", M32R_OPERAND_CONDBIT, HW_H_COND, 0, 0,
421 1.1.1.8 christos { 0, { 0 } },
422 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } },
423 1.1 skrll /* accum: accumulator */
424 1.1 skrll { "accum", M32R_OPERAND_ACCUM, HW_H_ACCUM, 0, 0,
425 1.1.1.8 christos { 0, { 0 } },
426 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } },
427 1.1 skrll /* sentinel */
428 1.1 skrll { 0, 0, 0, 0, 0,
429 1.1.1.8 christos { 0, { 0 } },
430 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }
431 1.1 skrll };
432 1.1 skrll
433 1.1 skrll #undef A
434 1.1 skrll
435 1.1 skrll
436 1.1 skrll /* The instruction table. */
437 1.1 skrll
438 1.1 skrll #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
439 1.1 skrll #define A(a) (1 << CGEN_INSN_##a)
440 1.1 skrll
441 1.1 skrll static const CGEN_IBASE m32r_cgen_insn_table[MAX_INSNS] =
442 1.1 skrll {
443 1.1 skrll /* Special null first entry.
444 1.1 skrll A `num' value of zero is thus invalid.
445 1.1 skrll Also, the special `invalid' insn resides here. */
446 1.1 skrll { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } },
447 1.1 skrll /* add $dr,$sr */
448 1.1 skrll {
449 1.1 skrll M32R_INSN_ADD, "add", "add", 16,
450 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
451 1.1 skrll },
452 1.1 skrll /* add3 $dr,$sr,$hash$slo16 */
453 1.1 skrll {
454 1.1 skrll M32R_INSN_ADD3, "add3", "add3", 32,
455 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
456 1.1 skrll },
457 1.1 skrll /* and $dr,$sr */
458 1.1 skrll {
459 1.1 skrll M32R_INSN_AND, "and", "and", 16,
460 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
461 1.1 skrll },
462 1.1 skrll /* and3 $dr,$sr,$uimm16 */
463 1.1 skrll {
464 1.1 skrll M32R_INSN_AND3, "and3", "and3", 32,
465 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
466 1.1 skrll },
467 1.1 skrll /* or $dr,$sr */
468 1.1 skrll {
469 1.1 skrll M32R_INSN_OR, "or", "or", 16,
470 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
471 1.1 skrll },
472 1.1 skrll /* or3 $dr,$sr,$hash$ulo16 */
473 1.1 skrll {
474 1.1 skrll M32R_INSN_OR3, "or3", "or3", 32,
475 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
476 1.1 skrll },
477 1.1 skrll /* xor $dr,$sr */
478 1.1 skrll {
479 1.1 skrll M32R_INSN_XOR, "xor", "xor", 16,
480 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
481 1.1 skrll },
482 1.1 skrll /* xor3 $dr,$sr,$uimm16 */
483 1.1 skrll {
484 1.1 skrll M32R_INSN_XOR3, "xor3", "xor3", 32,
485 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
486 1.1 skrll },
487 1.1 skrll /* addi $dr,$simm8 */
488 1.1 skrll {
489 1.1 skrll M32R_INSN_ADDI, "addi", "addi", 16,
490 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
491 1.1 skrll },
492 1.1 skrll /* addv $dr,$sr */
493 1.1 skrll {
494 1.1 skrll M32R_INSN_ADDV, "addv", "addv", 16,
495 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
496 1.1 skrll },
497 1.1 skrll /* addv3 $dr,$sr,$simm16 */
498 1.1 skrll {
499 1.1 skrll M32R_INSN_ADDV3, "addv3", "addv3", 32,
500 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
501 1.1 skrll },
502 1.1 skrll /* addx $dr,$sr */
503 1.1 skrll {
504 1.1 skrll M32R_INSN_ADDX, "addx", "addx", 16,
505 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
506 1.1 skrll },
507 1.1 skrll /* bc.s $disp8 */
508 1.1 skrll {
509 1.1 skrll M32R_INSN_BC8, "bc8", "bc.s", 16,
510 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
511 1.1 skrll },
512 1.1 skrll /* bc.l $disp24 */
513 1.1 skrll {
514 1.1 skrll M32R_INSN_BC24, "bc24", "bc.l", 32,
515 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
516 1.1 skrll },
517 1.1 skrll /* beq $src1,$src2,$disp16 */
518 1.1 skrll {
519 1.1 skrll M32R_INSN_BEQ, "beq", "beq", 32,
520 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
521 1.1 skrll },
522 1.1 skrll /* beqz $src2,$disp16 */
523 1.1 skrll {
524 1.1 skrll M32R_INSN_BEQZ, "beqz", "beqz", 32,
525 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
526 1.1 skrll },
527 1.1 skrll /* bgez $src2,$disp16 */
528 1.1 skrll {
529 1.1 skrll M32R_INSN_BGEZ, "bgez", "bgez", 32,
530 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
531 1.1 skrll },
532 1.1 skrll /* bgtz $src2,$disp16 */
533 1.1 skrll {
534 1.1 skrll M32R_INSN_BGTZ, "bgtz", "bgtz", 32,
535 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
536 1.1 skrll },
537 1.1 skrll /* blez $src2,$disp16 */
538 1.1 skrll {
539 1.1 skrll M32R_INSN_BLEZ, "blez", "blez", 32,
540 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
541 1.1 skrll },
542 1.1 skrll /* bltz $src2,$disp16 */
543 1.1 skrll {
544 1.1 skrll M32R_INSN_BLTZ, "bltz", "bltz", 32,
545 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
546 1.1 skrll },
547 1.1 skrll /* bnez $src2,$disp16 */
548 1.1 skrll {
549 1.1 skrll M32R_INSN_BNEZ, "bnez", "bnez", 32,
550 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
551 1.1 skrll },
552 1.1 skrll /* bl.s $disp8 */
553 1.1 skrll {
554 1.1 skrll M32R_INSN_BL8, "bl8", "bl.s", 16,
555 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
556 1.1 skrll },
557 1.1 skrll /* bl.l $disp24 */
558 1.1 skrll {
559 1.1 skrll M32R_INSN_BL24, "bl24", "bl.l", 32,
560 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
561 1.1 skrll },
562 1.1 skrll /* bcl.s $disp8 */
563 1.1 skrll {
564 1.1 skrll M32R_INSN_BCL8, "bcl8", "bcl.s", 16,
565 1.1 skrll { 0|A(FILL_SLOT)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
566 1.1 skrll },
567 1.1 skrll /* bcl.l $disp24 */
568 1.1 skrll {
569 1.1 skrll M32R_INSN_BCL24, "bcl24", "bcl.l", 32,
570 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
571 1.1 skrll },
572 1.1 skrll /* bnc.s $disp8 */
573 1.1 skrll {
574 1.1 skrll M32R_INSN_BNC8, "bnc8", "bnc.s", 16,
575 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
576 1.1 skrll },
577 1.1 skrll /* bnc.l $disp24 */
578 1.1 skrll {
579 1.1 skrll M32R_INSN_BNC24, "bnc24", "bnc.l", 32,
580 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
581 1.1 skrll },
582 1.1 skrll /* bne $src1,$src2,$disp16 */
583 1.1 skrll {
584 1.1 skrll M32R_INSN_BNE, "bne", "bne", 32,
585 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
586 1.1 skrll },
587 1.1 skrll /* bra.s $disp8 */
588 1.1 skrll {
589 1.1 skrll M32R_INSN_BRA8, "bra8", "bra.s", 16,
590 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
591 1.1 skrll },
592 1.1 skrll /* bra.l $disp24 */
593 1.1 skrll {
594 1.1 skrll M32R_INSN_BRA24, "bra24", "bra.l", 32,
595 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
596 1.1 skrll },
597 1.1 skrll /* bncl.s $disp8 */
598 1.1 skrll {
599 1.1 skrll M32R_INSN_BNCL8, "bncl8", "bncl.s", 16,
600 1.1 skrll { 0|A(FILL_SLOT)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
601 1.1 skrll },
602 1.1 skrll /* bncl.l $disp24 */
603 1.1 skrll {
604 1.1 skrll M32R_INSN_BNCL24, "bncl24", "bncl.l", 32,
605 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
606 1.1 skrll },
607 1.1 skrll /* cmp $src1,$src2 */
608 1.1 skrll {
609 1.1 skrll M32R_INSN_CMP, "cmp", "cmp", 16,
610 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
611 1.1 skrll },
612 1.1 skrll /* cmpi $src2,$simm16 */
613 1.1 skrll {
614 1.1 skrll M32R_INSN_CMPI, "cmpi", "cmpi", 32,
615 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
616 1.1 skrll },
617 1.1 skrll /* cmpu $src1,$src2 */
618 1.1 skrll {
619 1.1 skrll M32R_INSN_CMPU, "cmpu", "cmpu", 16,
620 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
621 1.1 skrll },
622 1.1 skrll /* cmpui $src2,$simm16 */
623 1.1 skrll {
624 1.1 skrll M32R_INSN_CMPUI, "cmpui", "cmpui", 32,
625 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
626 1.1 skrll },
627 1.1 skrll /* cmpeq $src1,$src2 */
628 1.1 skrll {
629 1.1 skrll M32R_INSN_CMPEQ, "cmpeq", "cmpeq", 16,
630 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } }
631 1.1 skrll },
632 1.1 skrll /* cmpz $src2 */
633 1.1 skrll {
634 1.1 skrll M32R_INSN_CMPZ, "cmpz", "cmpz", 16,
635 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } }
636 1.1 skrll },
637 1.1 skrll /* div $dr,$sr */
638 1.1 skrll {
639 1.1 skrll M32R_INSN_DIV, "div", "div", 32,
640 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
641 1.1 skrll },
642 1.1 skrll /* divu $dr,$sr */
643 1.1 skrll {
644 1.1 skrll M32R_INSN_DIVU, "divu", "divu", 32,
645 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
646 1.1 skrll },
647 1.1 skrll /* rem $dr,$sr */
648 1.1 skrll {
649 1.1 skrll M32R_INSN_REM, "rem", "rem", 32,
650 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
651 1.1 skrll },
652 1.1 skrll /* remu $dr,$sr */
653 1.1 skrll {
654 1.1 skrll M32R_INSN_REMU, "remu", "remu", 32,
655 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
656 1.1 skrll },
657 1.1 skrll /* remh $dr,$sr */
658 1.1 skrll {
659 1.1 skrll M32R_INSN_REMH, "remh", "remh", 32,
660 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
661 1.1 skrll },
662 1.1 skrll /* remuh $dr,$sr */
663 1.1 skrll {
664 1.1 skrll M32R_INSN_REMUH, "remuh", "remuh", 32,
665 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
666 1.1 skrll },
667 1.1 skrll /* remb $dr,$sr */
668 1.1 skrll {
669 1.1 skrll M32R_INSN_REMB, "remb", "remb", 32,
670 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
671 1.1 skrll },
672 1.1 skrll /* remub $dr,$sr */
673 1.1 skrll {
674 1.1 skrll M32R_INSN_REMUB, "remub", "remub", 32,
675 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
676 1.1 skrll },
677 1.1 skrll /* divuh $dr,$sr */
678 1.1 skrll {
679 1.1 skrll M32R_INSN_DIVUH, "divuh", "divuh", 32,
680 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
681 1.1 skrll },
682 1.1 skrll /* divb $dr,$sr */
683 1.1 skrll {
684 1.1 skrll M32R_INSN_DIVB, "divb", "divb", 32,
685 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
686 1.1 skrll },
687 1.1 skrll /* divub $dr,$sr */
688 1.1 skrll {
689 1.1 skrll M32R_INSN_DIVUB, "divub", "divub", 32,
690 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
691 1.1 skrll },
692 1.1 skrll /* divh $dr,$sr */
693 1.1 skrll {
694 1.1 skrll M32R_INSN_DIVH, "divh", "divh", 32,
695 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
696 1.1 skrll },
697 1.1 skrll /* jc $sr */
698 1.1 skrll {
699 1.1 skrll M32R_INSN_JC, "jc", "jc", 16,
700 1.1 skrll { 0|A(SPECIAL)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
701 1.1 skrll },
702 1.1 skrll /* jnc $sr */
703 1.1 skrll {
704 1.1 skrll M32R_INSN_JNC, "jnc", "jnc", 16,
705 1.1 skrll { 0|A(SPECIAL)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
706 1.1 skrll },
707 1.1 skrll /* jl $sr */
708 1.1 skrll {
709 1.1 skrll M32R_INSN_JL, "jl", "jl", 16,
710 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
711 1.1 skrll },
712 1.1 skrll /* jmp $sr */
713 1.1 skrll {
714 1.1 skrll M32R_INSN_JMP, "jmp", "jmp", 16,
715 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
716 1.1 skrll },
717 1.1 skrll /* ld $dr,@$sr */
718 1.1 skrll {
719 1.1 skrll M32R_INSN_LD, "ld", "ld", 16,
720 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
721 1.1 skrll },
722 1.1 skrll /* ld $dr,@($slo16,$sr) */
723 1.1 skrll {
724 1.1 skrll M32R_INSN_LD_D, "ld-d", "ld", 32,
725 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
726 1.1 skrll },
727 1.1 skrll /* ldb $dr,@$sr */
728 1.1 skrll {
729 1.1 skrll M32R_INSN_LDB, "ldb", "ldb", 16,
730 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
731 1.1 skrll },
732 1.1 skrll /* ldb $dr,@($slo16,$sr) */
733 1.1 skrll {
734 1.1 skrll M32R_INSN_LDB_D, "ldb-d", "ldb", 32,
735 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
736 1.1 skrll },
737 1.1 skrll /* ldh $dr,@$sr */
738 1.1 skrll {
739 1.1 skrll M32R_INSN_LDH, "ldh", "ldh", 16,
740 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
741 1.1 skrll },
742 1.1 skrll /* ldh $dr,@($slo16,$sr) */
743 1.1 skrll {
744 1.1 skrll M32R_INSN_LDH_D, "ldh-d", "ldh", 32,
745 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
746 1.1 skrll },
747 1.1 skrll /* ldub $dr,@$sr */
748 1.1 skrll {
749 1.1 skrll M32R_INSN_LDUB, "ldub", "ldub", 16,
750 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
751 1.1 skrll },
752 1.1 skrll /* ldub $dr,@($slo16,$sr) */
753 1.1 skrll {
754 1.1 skrll M32R_INSN_LDUB_D, "ldub-d", "ldub", 32,
755 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
756 1.1 skrll },
757 1.1 skrll /* lduh $dr,@$sr */
758 1.1 skrll {
759 1.1 skrll M32R_INSN_LDUH, "lduh", "lduh", 16,
760 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
761 1.1 skrll },
762 1.1 skrll /* lduh $dr,@($slo16,$sr) */
763 1.1 skrll {
764 1.1 skrll M32R_INSN_LDUH_D, "lduh-d", "lduh", 32,
765 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
766 1.1 skrll },
767 1.1 skrll /* ld $dr,@$sr+ */
768 1.1 skrll {
769 1.1 skrll M32R_INSN_LD_PLUS, "ld-plus", "ld", 16,
770 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
771 1.1 skrll },
772 1.1 skrll /* ld24 $dr,$uimm24 */
773 1.1 skrll {
774 1.1 skrll M32R_INSN_LD24, "ld24", "ld24", 32,
775 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
776 1.1 skrll },
777 1.1 skrll /* ldi8 $dr,$simm8 */
778 1.1 skrll {
779 1.1 skrll M32R_INSN_LDI8, "ldi8", "ldi8", 16,
780 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
781 1.1 skrll },
782 1.1 skrll /* ldi16 $dr,$hash$slo16 */
783 1.1 skrll {
784 1.1 skrll M32R_INSN_LDI16, "ldi16", "ldi16", 32,
785 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
786 1.1 skrll },
787 1.1 skrll /* lock $dr,@$sr */
788 1.1 skrll {
789 1.1 skrll M32R_INSN_LOCK, "lock", "lock", 16,
790 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
791 1.1 skrll },
792 1.1 skrll /* machi $src1,$src2 */
793 1.1 skrll {
794 1.1 skrll M32R_INSN_MACHI, "machi", "machi", 16,
795 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
796 1.1 skrll },
797 1.1 skrll /* machi $src1,$src2,$acc */
798 1.1 skrll {
799 1.1 skrll M32R_INSN_MACHI_A, "machi-a", "machi", 16,
800 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
801 1.1 skrll },
802 1.1 skrll /* maclo $src1,$src2 */
803 1.1 skrll {
804 1.1 skrll M32R_INSN_MACLO, "maclo", "maclo", 16,
805 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
806 1.1 skrll },
807 1.1 skrll /* maclo $src1,$src2,$acc */
808 1.1 skrll {
809 1.1 skrll M32R_INSN_MACLO_A, "maclo-a", "maclo", 16,
810 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
811 1.1 skrll },
812 1.1 skrll /* macwhi $src1,$src2 */
813 1.1 skrll {
814 1.1 skrll M32R_INSN_MACWHI, "macwhi", "macwhi", 16,
815 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
816 1.1 skrll },
817 1.1 skrll /* macwhi $src1,$src2,$acc */
818 1.1 skrll {
819 1.1 skrll M32R_INSN_MACWHI_A, "macwhi-a", "macwhi", 16,
820 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
821 1.1 skrll },
822 1.1 skrll /* macwlo $src1,$src2 */
823 1.1 skrll {
824 1.1 skrll M32R_INSN_MACWLO, "macwlo", "macwlo", 16,
825 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
826 1.1 skrll },
827 1.1 skrll /* macwlo $src1,$src2,$acc */
828 1.1 skrll {
829 1.1 skrll M32R_INSN_MACWLO_A, "macwlo-a", "macwlo", 16,
830 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
831 1.1 skrll },
832 1.1 skrll /* mul $dr,$sr */
833 1.1 skrll {
834 1.1 skrll M32R_INSN_MUL, "mul", "mul", 16,
835 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_S, 0 } } } }
836 1.1 skrll },
837 1.1 skrll /* mulhi $src1,$src2 */
838 1.1 skrll {
839 1.1 skrll M32R_INSN_MULHI, "mulhi", "mulhi", 16,
840 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
841 1.1 skrll },
842 1.1 skrll /* mulhi $src1,$src2,$acc */
843 1.1 skrll {
844 1.1 skrll M32R_INSN_MULHI_A, "mulhi-a", "mulhi", 16,
845 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
846 1.1 skrll },
847 1.1 skrll /* mullo $src1,$src2 */
848 1.1 skrll {
849 1.1 skrll M32R_INSN_MULLO, "mullo", "mullo", 16,
850 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
851 1.1 skrll },
852 1.1 skrll /* mullo $src1,$src2,$acc */
853 1.1 skrll {
854 1.1 skrll M32R_INSN_MULLO_A, "mullo-a", "mullo", 16,
855 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
856 1.1 skrll },
857 1.1 skrll /* mulwhi $src1,$src2 */
858 1.1 skrll {
859 1.1 skrll M32R_INSN_MULWHI, "mulwhi", "mulwhi", 16,
860 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
861 1.1 skrll },
862 1.1 skrll /* mulwhi $src1,$src2,$acc */
863 1.1 skrll {
864 1.1 skrll M32R_INSN_MULWHI_A, "mulwhi-a", "mulwhi", 16,
865 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
866 1.1 skrll },
867 1.1 skrll /* mulwlo $src1,$src2 */
868 1.1 skrll {
869 1.1 skrll M32R_INSN_MULWLO, "mulwlo", "mulwlo", 16,
870 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
871 1.1 skrll },
872 1.1 skrll /* mulwlo $src1,$src2,$acc */
873 1.1 skrll {
874 1.1 skrll M32R_INSN_MULWLO_A, "mulwlo-a", "mulwlo", 16,
875 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
876 1.1 skrll },
877 1.1 skrll /* mv $dr,$sr */
878 1.1 skrll {
879 1.1 skrll M32R_INSN_MV, "mv", "mv", 16,
880 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
881 1.1 skrll },
882 1.1 skrll /* mvfachi $dr */
883 1.1 skrll {
884 1.1 skrll M32R_INSN_MVFACHI, "mvfachi", "mvfachi", 16,
885 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
886 1.1 skrll },
887 1.1 skrll /* mvfachi $dr,$accs */
888 1.1 skrll {
889 1.1 skrll M32R_INSN_MVFACHI_A, "mvfachi-a", "mvfachi", 16,
890 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
891 1.1 skrll },
892 1.1 skrll /* mvfaclo $dr */
893 1.1 skrll {
894 1.1 skrll M32R_INSN_MVFACLO, "mvfaclo", "mvfaclo", 16,
895 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
896 1.1 skrll },
897 1.1 skrll /* mvfaclo $dr,$accs */
898 1.1 skrll {
899 1.1 skrll M32R_INSN_MVFACLO_A, "mvfaclo-a", "mvfaclo", 16,
900 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
901 1.1 skrll },
902 1.1 skrll /* mvfacmi $dr */
903 1.1 skrll {
904 1.1 skrll M32R_INSN_MVFACMI, "mvfacmi", "mvfacmi", 16,
905 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
906 1.1 skrll },
907 1.1 skrll /* mvfacmi $dr,$accs */
908 1.1 skrll {
909 1.1 skrll M32R_INSN_MVFACMI_A, "mvfacmi-a", "mvfacmi", 16,
910 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
911 1.1 skrll },
912 1.1 skrll /* mvfc $dr,$scr */
913 1.1 skrll {
914 1.1 skrll M32R_INSN_MVFC, "mvfc", "mvfc", 16,
915 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
916 1.1 skrll },
917 1.1 skrll /* mvtachi $src1 */
918 1.1 skrll {
919 1.1 skrll M32R_INSN_MVTACHI, "mvtachi", "mvtachi", 16,
920 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
921 1.1 skrll },
922 1.1 skrll /* mvtachi $src1,$accs */
923 1.1 skrll {
924 1.1 skrll M32R_INSN_MVTACHI_A, "mvtachi-a", "mvtachi", 16,
925 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
926 1.1 skrll },
927 1.1 skrll /* mvtaclo $src1 */
928 1.1 skrll {
929 1.1 skrll M32R_INSN_MVTACLO, "mvtaclo", "mvtaclo", 16,
930 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
931 1.1 skrll },
932 1.1 skrll /* mvtaclo $src1,$accs */
933 1.1 skrll {
934 1.1 skrll M32R_INSN_MVTACLO_A, "mvtaclo-a", "mvtaclo", 16,
935 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
936 1.1 skrll },
937 1.1 skrll /* mvtc $sr,$dcr */
938 1.1 skrll {
939 1.1 skrll M32R_INSN_MVTC, "mvtc", "mvtc", 16,
940 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
941 1.1 skrll },
942 1.1 skrll /* neg $dr,$sr */
943 1.1 skrll {
944 1.1 skrll M32R_INSN_NEG, "neg", "neg", 16,
945 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
946 1.1 skrll },
947 1.1 skrll /* nop */
948 1.1 skrll {
949 1.1 skrll M32R_INSN_NOP, "nop", "nop", 16,
950 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
951 1.1 skrll },
952 1.1 skrll /* not $dr,$sr */
953 1.1 skrll {
954 1.1 skrll M32R_INSN_NOT, "not", "not", 16,
955 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
956 1.1 skrll },
957 1.1 skrll /* rac */
958 1.1 skrll {
959 1.1 skrll M32R_INSN_RAC, "rac", "rac", 16,
960 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
961 1.1 skrll },
962 1.1 skrll /* rac $accd,$accs,$imm1 */
963 1.1 skrll {
964 1.1 skrll M32R_INSN_RAC_DSI, "rac-dsi", "rac", 16,
965 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
966 1.1 skrll },
967 1.1 skrll /* rach */
968 1.1 skrll {
969 1.1 skrll M32R_INSN_RACH, "rach", "rach", 16,
970 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } }
971 1.1 skrll },
972 1.1 skrll /* rach $accd,$accs,$imm1 */
973 1.1 skrll {
974 1.1 skrll M32R_INSN_RACH_DSI, "rach-dsi", "rach", 16,
975 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
976 1.1 skrll },
977 1.1 skrll /* rte */
978 1.1 skrll {
979 1.1 skrll M32R_INSN_RTE, "rte", "rte", 16,
980 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
981 1.1 skrll },
982 1.1 skrll /* seth $dr,$hash$hi16 */
983 1.1 skrll {
984 1.1 skrll M32R_INSN_SETH, "seth", "seth", 32,
985 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
986 1.1 skrll },
987 1.1 skrll /* sll $dr,$sr */
988 1.1 skrll {
989 1.1 skrll M32R_INSN_SLL, "sll", "sll", 16,
990 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
991 1.1 skrll },
992 1.1 skrll /* sll3 $dr,$sr,$simm16 */
993 1.1 skrll {
994 1.1 skrll M32R_INSN_SLL3, "sll3", "sll3", 32,
995 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
996 1.1 skrll },
997 1.1 skrll /* slli $dr,$uimm5 */
998 1.1 skrll {
999 1.1 skrll M32R_INSN_SLLI, "slli", "slli", 16,
1000 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
1001 1.1 skrll },
1002 1.1 skrll /* sra $dr,$sr */
1003 1.1 skrll {
1004 1.1 skrll M32R_INSN_SRA, "sra", "sra", 16,
1005 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
1006 1.1 skrll },
1007 1.1 skrll /* sra3 $dr,$sr,$simm16 */
1008 1.1 skrll {
1009 1.1 skrll M32R_INSN_SRA3, "sra3", "sra3", 32,
1010 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1011 1.1 skrll },
1012 1.1 skrll /* srai $dr,$uimm5 */
1013 1.1 skrll {
1014 1.1 skrll M32R_INSN_SRAI, "srai", "srai", 16,
1015 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
1016 1.1 skrll },
1017 1.1 skrll /* srl $dr,$sr */
1018 1.1 skrll {
1019 1.1 skrll M32R_INSN_SRL, "srl", "srl", 16,
1020 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
1021 1.1 skrll },
1022 1.1 skrll /* srl3 $dr,$sr,$simm16 */
1023 1.1 skrll {
1024 1.1 skrll M32R_INSN_SRL3, "srl3", "srl3", 32,
1025 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1026 1.1 skrll },
1027 1.1 skrll /* srli $dr,$uimm5 */
1028 1.1 skrll {
1029 1.1 skrll M32R_INSN_SRLI, "srli", "srli", 16,
1030 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } }
1031 1.1 skrll },
1032 1.1 skrll /* st $src1,@$src2 */
1033 1.1 skrll {
1034 1.1 skrll M32R_INSN_ST, "st", "st", 16,
1035 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1036 1.1 skrll },
1037 1.1 skrll /* st $src1,@($slo16,$src2) */
1038 1.1 skrll {
1039 1.1 skrll M32R_INSN_ST_D, "st-d", "st", 32,
1040 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1041 1.1 skrll },
1042 1.1 skrll /* stb $src1,@$src2 */
1043 1.1 skrll {
1044 1.1 skrll M32R_INSN_STB, "stb", "stb", 16,
1045 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1046 1.1 skrll },
1047 1.1 skrll /* stb $src1,@($slo16,$src2) */
1048 1.1 skrll {
1049 1.1 skrll M32R_INSN_STB_D, "stb-d", "stb", 32,
1050 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1051 1.1 skrll },
1052 1.1 skrll /* sth $src1,@$src2 */
1053 1.1 skrll {
1054 1.1 skrll M32R_INSN_STH, "sth", "sth", 16,
1055 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1056 1.1 skrll },
1057 1.1 skrll /* sth $src1,@($slo16,$src2) */
1058 1.1 skrll {
1059 1.1 skrll M32R_INSN_STH_D, "sth-d", "sth", 32,
1060 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1061 1.1 skrll },
1062 1.1 skrll /* st $src1,@+$src2 */
1063 1.1 skrll {
1064 1.1 skrll M32R_INSN_ST_PLUS, "st-plus", "st", 16,
1065 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1066 1.1 skrll },
1067 1.1 skrll /* sth $src1,@$src2+ */
1068 1.1 skrll {
1069 1.1 skrll M32R_INSN_STH_PLUS, "sth-plus", "sth", 16,
1070 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
1071 1.1 skrll },
1072 1.1 skrll /* stb $src1,@$src2+ */
1073 1.1 skrll {
1074 1.1 skrll M32R_INSN_STB_PLUS, "stb-plus", "stb", 16,
1075 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
1076 1.1 skrll },
1077 1.1 skrll /* st $src1,@-$src2 */
1078 1.1 skrll {
1079 1.1 skrll M32R_INSN_ST_MINUS, "st-minus", "st", 16,
1080 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1081 1.1 skrll },
1082 1.1 skrll /* sub $dr,$sr */
1083 1.1 skrll {
1084 1.1 skrll M32R_INSN_SUB, "sub", "sub", 16,
1085 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
1086 1.1 skrll },
1087 1.1 skrll /* subv $dr,$sr */
1088 1.1 skrll {
1089 1.1 skrll M32R_INSN_SUBV, "subv", "subv", 16,
1090 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
1091 1.1 skrll },
1092 1.1 skrll /* subx $dr,$sr */
1093 1.1 skrll {
1094 1.1 skrll M32R_INSN_SUBX, "subx", "subx", 16,
1095 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } }
1096 1.1 skrll },
1097 1.1 skrll /* trap $uimm4 */
1098 1.1 skrll {
1099 1.1 skrll M32R_INSN_TRAP, "trap", "trap", 16,
1100 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1101 1.1 skrll },
1102 1.1 skrll /* unlock $src1,@$src2 */
1103 1.1 skrll {
1104 1.1 skrll M32R_INSN_UNLOCK, "unlock", "unlock", 16,
1105 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1106 1.1 skrll },
1107 1.1 skrll /* satb $dr,$sr */
1108 1.1 skrll {
1109 1.1 skrll M32R_INSN_SATB, "satb", "satb", 32,
1110 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
1111 1.1 skrll },
1112 1.1 skrll /* sath $dr,$sr */
1113 1.1 skrll {
1114 1.1 skrll M32R_INSN_SATH, "sath", "sath", 32,
1115 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
1116 1.1 skrll },
1117 1.1 skrll /* sat $dr,$sr */
1118 1.1 skrll {
1119 1.1 skrll M32R_INSN_SAT, "sat", "sat", 32,
1120 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } }
1121 1.1 skrll },
1122 1.1 skrll /* pcmpbz $src2 */
1123 1.1 skrll {
1124 1.1 skrll M32R_INSN_PCMPBZ, "pcmpbz", "pcmpbz", 16,
1125 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } }
1126 1.1 skrll },
1127 1.1 skrll /* sadd */
1128 1.1 skrll {
1129 1.1 skrll M32R_INSN_SADD, "sadd", "sadd", 16,
1130 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
1131 1.1 skrll },
1132 1.1 skrll /* macwu1 $src1,$src2 */
1133 1.1 skrll {
1134 1.1 skrll M32R_INSN_MACWU1, "macwu1", "macwu1", 16,
1135 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
1136 1.1 skrll },
1137 1.1 skrll /* msblo $src1,$src2 */
1138 1.1 skrll {
1139 1.1 skrll M32R_INSN_MSBLO, "msblo", "msblo", 16,
1140 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
1141 1.1 skrll },
1142 1.1 skrll /* mulwu1 $src1,$src2 */
1143 1.1 skrll {
1144 1.1 skrll M32R_INSN_MULWU1, "mulwu1", "mulwu1", 16,
1145 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
1146 1.1 skrll },
1147 1.1 skrll /* maclh1 $src1,$src2 */
1148 1.1 skrll {
1149 1.1 skrll M32R_INSN_MACLH1, "maclh1", "maclh1", 16,
1150 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } }
1151 1.1 skrll },
1152 1.1 skrll /* sc */
1153 1.1 skrll {
1154 1.1 skrll M32R_INSN_SC, "sc", "sc", 16,
1155 1.1 skrll { 0|A(SPECIAL)|A(SKIP_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
1156 1.1 skrll },
1157 1.1 skrll /* snc */
1158 1.1 skrll {
1159 1.1 skrll M32R_INSN_SNC, "snc", "snc", 16,
1160 1.1 skrll { 0|A(SPECIAL)|A(SKIP_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } }
1161 1.1 skrll },
1162 1.1 skrll /* clrpsw $uimm8 */
1163 1.1 skrll {
1164 1.1 skrll M32R_INSN_CLRPSW, "clrpsw", "clrpsw", 16,
1165 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1166 1.1 skrll },
1167 1.1 skrll /* setpsw $uimm8 */
1168 1.1 skrll {
1169 1.1 skrll M32R_INSN_SETPSW, "setpsw", "setpsw", 16,
1170 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1171 1.1 skrll },
1172 1.1 skrll /* bset $uimm3,@($slo16,$sr) */
1173 1.1 skrll {
1174 1.1 skrll M32R_INSN_BSET, "bset", "bset", 32,
1175 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1176 1.1 skrll },
1177 1.1 skrll /* bclr $uimm3,@($slo16,$sr) */
1178 1.1 skrll {
1179 1.1 skrll M32R_INSN_BCLR, "bclr", "bclr", 32,
1180 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } }
1181 1.1 skrll },
1182 1.1 skrll /* btst $uimm3,$sr */
1183 1.1 skrll {
1184 1.1 skrll M32R_INSN_BTST, "btst", "btst", 16,
1185 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } }
1186 1.1 skrll },
1187 1.1 skrll };
1188 1.1 skrll
1189 1.1 skrll #undef OP
1190 1.1 skrll #undef A
1191 1.1 skrll
1192 1.1 skrll /* Initialize anything needed to be done once, before any cpu_open call. */
1193 1.1 skrll
1194 1.1 skrll static void
1195 1.1 skrll init_tables (void)
1196 1.1 skrll {
1197 1.1 skrll }
1198 1.1 skrll
1199 1.1.1.6 christos #ifndef opcodes_error_handler
1200 1.1.1.6 christos #define opcodes_error_handler(...) \
1201 1.1.1.6 christos fprintf (stderr, __VA_ARGS__); fputc ('\n', stderr)
1202 1.1.1.6 christos #endif
1203 1.1.1.6 christos
1204 1.1 skrll static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
1205 1.1 skrll static void build_hw_table (CGEN_CPU_TABLE *);
1206 1.1 skrll static void build_ifield_table (CGEN_CPU_TABLE *);
1207 1.1 skrll static void build_operand_table (CGEN_CPU_TABLE *);
1208 1.1 skrll static void build_insn_table (CGEN_CPU_TABLE *);
1209 1.1 skrll static void m32r_cgen_rebuild_tables (CGEN_CPU_TABLE *);
1210 1.1 skrll
1211 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to look up a mach via its bfd name. */
1212 1.1 skrll
1213 1.1 skrll static const CGEN_MACH *
1214 1.1 skrll lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
1215 1.1 skrll {
1216 1.1 skrll while (table->name)
1217 1.1 skrll {
1218 1.1 skrll if (strcmp (name, table->bfd_name) == 0)
1219 1.1 skrll return table;
1220 1.1 skrll ++table;
1221 1.1 skrll }
1222 1.1.1.5 christos return NULL;
1223 1.1 skrll }
1224 1.1 skrll
1225 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */
1226 1.1 skrll
1227 1.1 skrll static void
1228 1.1 skrll build_hw_table (CGEN_CPU_TABLE *cd)
1229 1.1 skrll {
1230 1.1 skrll int i;
1231 1.1 skrll int machs = cd->machs;
1232 1.1 skrll const CGEN_HW_ENTRY *init = & m32r_cgen_hw_table[0];
1233 1.1 skrll /* MAX_HW is only an upper bound on the number of selected entries.
1234 1.1 skrll However each entry is indexed by it's enum so there can be holes in
1235 1.1 skrll the table. */
1236 1.1 skrll const CGEN_HW_ENTRY **selected =
1237 1.1 skrll (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
1238 1.1 skrll
1239 1.1 skrll cd->hw_table.init_entries = init;
1240 1.1 skrll cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
1241 1.1 skrll memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
1242 1.1 skrll /* ??? For now we just use machs to determine which ones we want. */
1243 1.1 skrll for (i = 0; init[i].name != NULL; ++i)
1244 1.1 skrll if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
1245 1.1 skrll & machs)
1246 1.1 skrll selected[init[i].type] = &init[i];
1247 1.1 skrll cd->hw_table.entries = selected;
1248 1.1 skrll cd->hw_table.num_entries = MAX_HW;
1249 1.1 skrll }
1250 1.1 skrll
1251 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */
1252 1.1 skrll
1253 1.1 skrll static void
1254 1.1 skrll build_ifield_table (CGEN_CPU_TABLE *cd)
1255 1.1 skrll {
1256 1.1 skrll cd->ifld_table = & m32r_cgen_ifld_table[0];
1257 1.1 skrll }
1258 1.1 skrll
1259 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */
1260 1.1 skrll
1261 1.1 skrll static void
1262 1.1 skrll build_operand_table (CGEN_CPU_TABLE *cd)
1263 1.1 skrll {
1264 1.1 skrll int i;
1265 1.1 skrll int machs = cd->machs;
1266 1.1 skrll const CGEN_OPERAND *init = & m32r_cgen_operand_table[0];
1267 1.1 skrll /* MAX_OPERANDS is only an upper bound on the number of selected entries.
1268 1.1 skrll However each entry is indexed by it's enum so there can be holes in
1269 1.1 skrll the table. */
1270 1.1 skrll const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
1271 1.1 skrll
1272 1.1 skrll cd->operand_table.init_entries = init;
1273 1.1 skrll cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
1274 1.1 skrll memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
1275 1.1 skrll /* ??? For now we just use mach to determine which ones we want. */
1276 1.1 skrll for (i = 0; init[i].name != NULL; ++i)
1277 1.1 skrll if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
1278 1.1 skrll & machs)
1279 1.1 skrll selected[init[i].type] = &init[i];
1280 1.1 skrll cd->operand_table.entries = selected;
1281 1.1 skrll cd->operand_table.num_entries = MAX_OPERANDS;
1282 1.1 skrll }
1283 1.1 skrll
1284 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table.
1285 1.1 skrll ??? This could leave out insns not supported by the specified mach/isa,
1286 1.1 skrll but that would cause errors like "foo only supported by bar" to become
1287 1.1 skrll "unknown insn", so for now we include all insns and require the app to
1288 1.1 skrll do the checking later.
1289 1.1 skrll ??? On the other hand, parsing of such insns may require their hardware or
1290 1.1 skrll operand elements to be in the table [which they mightn't be]. */
1291 1.1 skrll
1292 1.1 skrll static void
1293 1.1 skrll build_insn_table (CGEN_CPU_TABLE *cd)
1294 1.1 skrll {
1295 1.1 skrll int i;
1296 1.1 skrll const CGEN_IBASE *ib = & m32r_cgen_insn_table[0];
1297 1.1 skrll CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
1298 1.1 skrll
1299 1.1 skrll memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
1300 1.1 skrll for (i = 0; i < MAX_INSNS; ++i)
1301 1.1 skrll insns[i].base = &ib[i];
1302 1.1 skrll cd->insn_table.init_entries = insns;
1303 1.1 skrll cd->insn_table.entry_size = sizeof (CGEN_IBASE);
1304 1.1 skrll cd->insn_table.num_init_entries = MAX_INSNS;
1305 1.1 skrll }
1306 1.1 skrll
1307 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to rebuild the tables. */
1308 1.1 skrll
1309 1.1 skrll static void
1310 1.1 skrll m32r_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
1311 1.1 skrll {
1312 1.1 skrll int i;
1313 1.1 skrll CGEN_BITSET *isas = cd->isas;
1314 1.1 skrll unsigned int machs = cd->machs;
1315 1.1 skrll
1316 1.1 skrll cd->int_insn_p = CGEN_INT_INSN_P;
1317 1.1 skrll
1318 1.1 skrll /* Data derived from the isa spec. */
1319 1.1 skrll #define UNSET (CGEN_SIZE_UNKNOWN + 1)
1320 1.1 skrll cd->default_insn_bitsize = UNSET;
1321 1.1 skrll cd->base_insn_bitsize = UNSET;
1322 1.1 skrll cd->min_insn_bitsize = 65535; /* Some ridiculously big number. */
1323 1.1 skrll cd->max_insn_bitsize = 0;
1324 1.1 skrll for (i = 0; i < MAX_ISAS; ++i)
1325 1.1 skrll if (cgen_bitset_contains (isas, i))
1326 1.1 skrll {
1327 1.1 skrll const CGEN_ISA *isa = & m32r_cgen_isa_table[i];
1328 1.1 skrll
1329 1.1 skrll /* Default insn sizes of all selected isas must be
1330 1.1 skrll equal or we set the result to 0, meaning "unknown". */
1331 1.1 skrll if (cd->default_insn_bitsize == UNSET)
1332 1.1 skrll cd->default_insn_bitsize = isa->default_insn_bitsize;
1333 1.1 skrll else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
1334 1.1 skrll ; /* This is ok. */
1335 1.1 skrll else
1336 1.1 skrll cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
1337 1.1 skrll
1338 1.1 skrll /* Base insn sizes of all selected isas must be equal
1339 1.1 skrll or we set the result to 0, meaning "unknown". */
1340 1.1 skrll if (cd->base_insn_bitsize == UNSET)
1341 1.1 skrll cd->base_insn_bitsize = isa->base_insn_bitsize;
1342 1.1 skrll else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
1343 1.1 skrll ; /* This is ok. */
1344 1.1 skrll else
1345 1.1 skrll cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
1346 1.1 skrll
1347 1.1 skrll /* Set min,max insn sizes. */
1348 1.1 skrll if (isa->min_insn_bitsize < cd->min_insn_bitsize)
1349 1.1 skrll cd->min_insn_bitsize = isa->min_insn_bitsize;
1350 1.1 skrll if (isa->max_insn_bitsize > cd->max_insn_bitsize)
1351 1.1 skrll cd->max_insn_bitsize = isa->max_insn_bitsize;
1352 1.1 skrll }
1353 1.1 skrll
1354 1.1 skrll /* Data derived from the mach spec. */
1355 1.1 skrll for (i = 0; i < MAX_MACHS; ++i)
1356 1.1 skrll if (((1 << i) & machs) != 0)
1357 1.1 skrll {
1358 1.1 skrll const CGEN_MACH *mach = & m32r_cgen_mach_table[i];
1359 1.1 skrll
1360 1.1 skrll if (mach->insn_chunk_bitsize != 0)
1361 1.1 skrll {
1362 1.1 skrll if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
1363 1.1 skrll {
1364 1.1.1.6 christos opcodes_error_handler
1365 1.1.1.6 christos (/* xgettext:c-format */
1366 1.1.1.6 christos _("internal error: m32r_cgen_rebuild_tables: "
1367 1.1.1.6 christos "conflicting insn-chunk-bitsize values: `%d' vs. `%d'"),
1368 1.1.1.6 christos cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
1369 1.1 skrll abort ();
1370 1.1 skrll }
1371 1.1 skrll
1372 1.1 skrll cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
1373 1.1 skrll }
1374 1.1 skrll }
1375 1.1 skrll
1376 1.1 skrll /* Determine which hw elements are used by MACH. */
1377 1.1 skrll build_hw_table (cd);
1378 1.1 skrll
1379 1.1 skrll /* Build the ifield table. */
1380 1.1 skrll build_ifield_table (cd);
1381 1.1 skrll
1382 1.1 skrll /* Determine which operands are used by MACH/ISA. */
1383 1.1 skrll build_operand_table (cd);
1384 1.1 skrll
1385 1.1 skrll /* Build the instruction table. */
1386 1.1 skrll build_insn_table (cd);
1387 1.1 skrll }
1388 1.1 skrll
1389 1.1 skrll /* Initialize a cpu table and return a descriptor.
1390 1.1 skrll It's much like opening a file, and must be the first function called.
1391 1.1 skrll The arguments are a set of (type/value) pairs, terminated with
1392 1.1 skrll CGEN_CPU_OPEN_END.
1393 1.1 skrll
1394 1.1 skrll Currently supported values:
1395 1.1 skrll CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr
1396 1.1 skrll CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr
1397 1.1 skrll CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
1398 1.1 skrll CGEN_CPU_OPEN_ENDIAN: specify endian choice
1399 1.1.1.8 christos CGEN_CPU_OPEN_INSN_ENDIAN: specify instruction endian choice
1400 1.1 skrll CGEN_CPU_OPEN_END: terminates arguments
1401 1.1 skrll
1402 1.1 skrll ??? Simultaneous multiple isas might not make sense, but it's not (yet)
1403 1.1.1.2 christos precluded. */
1404 1.1 skrll
1405 1.1 skrll CGEN_CPU_DESC
1406 1.1 skrll m32r_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
1407 1.1 skrll {
1408 1.1 skrll CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
1409 1.1 skrll static int init_p;
1410 1.1 skrll CGEN_BITSET *isas = 0; /* 0 = "unspecified" */
1411 1.1 skrll unsigned int machs = 0; /* 0 = "unspecified" */
1412 1.1 skrll enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
1413 1.1.1.8 christos enum cgen_endian insn_endian = CGEN_ENDIAN_UNKNOWN;
1414 1.1 skrll va_list ap;
1415 1.1 skrll
1416 1.1 skrll if (! init_p)
1417 1.1 skrll {
1418 1.1 skrll init_tables ();
1419 1.1 skrll init_p = 1;
1420 1.1 skrll }
1421 1.1 skrll
1422 1.1 skrll memset (cd, 0, sizeof (*cd));
1423 1.1 skrll
1424 1.1 skrll va_start (ap, arg_type);
1425 1.1 skrll while (arg_type != CGEN_CPU_OPEN_END)
1426 1.1 skrll {
1427 1.1 skrll switch (arg_type)
1428 1.1 skrll {
1429 1.1 skrll case CGEN_CPU_OPEN_ISAS :
1430 1.1 skrll isas = va_arg (ap, CGEN_BITSET *);
1431 1.1 skrll break;
1432 1.1 skrll case CGEN_CPU_OPEN_MACHS :
1433 1.1 skrll machs = va_arg (ap, unsigned int);
1434 1.1 skrll break;
1435 1.1 skrll case CGEN_CPU_OPEN_BFDMACH :
1436 1.1 skrll {
1437 1.1 skrll const char *name = va_arg (ap, const char *);
1438 1.1 skrll const CGEN_MACH *mach =
1439 1.1 skrll lookup_mach_via_bfd_name (m32r_cgen_mach_table, name);
1440 1.1 skrll
1441 1.1.1.5 christos if (mach != NULL)
1442 1.1.1.5 christos machs |= 1 << mach->num;
1443 1.1 skrll break;
1444 1.1 skrll }
1445 1.1 skrll case CGEN_CPU_OPEN_ENDIAN :
1446 1.1 skrll endian = va_arg (ap, enum cgen_endian);
1447 1.1 skrll break;
1448 1.1.1.8 christos case CGEN_CPU_OPEN_INSN_ENDIAN :
1449 1.1.1.8 christos insn_endian = va_arg (ap, enum cgen_endian);
1450 1.1.1.8 christos break;
1451 1.1 skrll default :
1452 1.1.1.6 christos opcodes_error_handler
1453 1.1.1.6 christos (/* xgettext:c-format */
1454 1.1.1.6 christos _("internal error: m32r_cgen_cpu_open: "
1455 1.1.1.6 christos "unsupported argument `%d'"),
1456 1.1.1.6 christos arg_type);
1457 1.1 skrll abort (); /* ??? return NULL? */
1458 1.1 skrll }
1459 1.1 skrll arg_type = va_arg (ap, enum cgen_cpu_open_arg);
1460 1.1 skrll }
1461 1.1 skrll va_end (ap);
1462 1.1 skrll
1463 1.1 skrll /* Mach unspecified means "all". */
1464 1.1 skrll if (machs == 0)
1465 1.1 skrll machs = (1 << MAX_MACHS) - 1;
1466 1.1 skrll /* Base mach is always selected. */
1467 1.1 skrll machs |= 1;
1468 1.1 skrll if (endian == CGEN_ENDIAN_UNKNOWN)
1469 1.1 skrll {
1470 1.1 skrll /* ??? If target has only one, could have a default. */
1471 1.1.1.6 christos opcodes_error_handler
1472 1.1.1.6 christos (/* xgettext:c-format */
1473 1.1.1.6 christos _("internal error: m32r_cgen_cpu_open: no endianness specified"));
1474 1.1 skrll abort ();
1475 1.1 skrll }
1476 1.1 skrll
1477 1.1 skrll cd->isas = cgen_bitset_copy (isas);
1478 1.1 skrll cd->machs = machs;
1479 1.1 skrll cd->endian = endian;
1480 1.1.1.8 christos cd->insn_endian
1481 1.1.1.8 christos = (insn_endian == CGEN_ENDIAN_UNKNOWN ? endian : insn_endian);
1482 1.1 skrll
1483 1.1 skrll /* Table (re)builder. */
1484 1.1 skrll cd->rebuild_tables = m32r_cgen_rebuild_tables;
1485 1.1 skrll m32r_cgen_rebuild_tables (cd);
1486 1.1 skrll
1487 1.1 skrll /* Default to not allowing signed overflow. */
1488 1.1 skrll cd->signed_overflow_ok_p = 0;
1489 1.1.1.3 christos
1490 1.1 skrll return (CGEN_CPU_DESC) cd;
1491 1.1 skrll }
1492 1.1 skrll
1493 1.1 skrll /* Cover fn to m32r_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
1494 1.1 skrll MACH_NAME is the bfd name of the mach. */
1495 1.1 skrll
1496 1.1 skrll CGEN_CPU_DESC
1497 1.1 skrll m32r_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
1498 1.1 skrll {
1499 1.1 skrll return m32r_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
1500 1.1 skrll CGEN_CPU_OPEN_ENDIAN, endian,
1501 1.1 skrll CGEN_CPU_OPEN_END);
1502 1.1 skrll }
1503 1.1 skrll
1504 1.1 skrll /* Close a cpu table.
1505 1.1 skrll ??? This can live in a machine independent file, but there's currently
1506 1.1 skrll no place to put this file (there's no libcgen). libopcodes is the wrong
1507 1.1 skrll place as some simulator ports use this but they don't use libopcodes. */
1508 1.1 skrll
1509 1.1 skrll void
1510 1.1 skrll m32r_cgen_cpu_close (CGEN_CPU_DESC cd)
1511 1.1 skrll {
1512 1.1 skrll unsigned int i;
1513 1.1 skrll const CGEN_INSN *insns;
1514 1.1 skrll
1515 1.1 skrll if (cd->macro_insn_table.init_entries)
1516 1.1 skrll {
1517 1.1 skrll insns = cd->macro_insn_table.init_entries;
1518 1.1 skrll for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
1519 1.1 skrll if (CGEN_INSN_RX ((insns)))
1520 1.1 skrll regfree (CGEN_INSN_RX (insns));
1521 1.1 skrll }
1522 1.1 skrll
1523 1.1 skrll if (cd->insn_table.init_entries)
1524 1.1 skrll {
1525 1.1 skrll insns = cd->insn_table.init_entries;
1526 1.1 skrll for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
1527 1.1 skrll if (CGEN_INSN_RX (insns))
1528 1.1 skrll regfree (CGEN_INSN_RX (insns));
1529 1.1.1.3 christos }
1530 1.1 skrll
1531 1.1.1.8 christos free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
1532 1.1.1.8 christos free ((CGEN_INSN *) cd->insn_table.init_entries);
1533 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
1534 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
1535 1.1 skrll free (cd);
1536 1.1 skrll }
1537 1.1 skrll
1538