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