1 /* The IGEN simulator generator for GDB, the GNU Debugger.
3 Copyright 2002-2016 Free Software Foundation, Inc.
5 Contributed by Andrew Cagney.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
31 #include "ld-decode.h"
35 #include "gen-semantics.h"
36 #include "gen-icache.h"
37 #include "gen-idecode.h"
41 print_semantic_function_header (lf *file,
43 const char *format_name,
44 opcode_bits *expanded_bits,
45 int is_function_definition,
46 int nr_prefetched_words)
49 lf_printf (file, "\n");
50 lf_print__function_type_function (file, print_semantic_function_type,
52 (is_function_definition ? "\n" : " "));
53 indent = print_function_name (file,
58 function_name_prefix_semantics);
59 if (is_function_definition)
61 indent += lf_printf (file, " ");
62 lf_indent (file, +indent);
66 lf_printf (file, "\n");
68 lf_printf (file, "(");
70 print_semantic_function_formal (file, nr_prefetched_words);
72 lf_printf (file, ")");
73 if (is_function_definition)
75 lf_indent (file, -indent);
79 lf_printf (file, ";");
81 lf_printf (file, "\n");
85 print_semantic_declaration (lf *file,
87 opcode_bits *expanded_bits,
88 insn_opcodes *opcodes, int nr_prefetched_words)
90 print_semantic_function_header (file,
94 0 /* is not function definition */ ,
100 /* generate the semantics.c file */
104 print_idecode_invalid (lf *file, const char *result, invalid_type type)
112 case invalid_illegal:
115 case invalid_fp_unavailable:
116 name = "fp_unavailable";
118 case invalid_wrong_slot:
122 if (options.gen.code == generate_jumps)
124 lf_printf (file, "goto %s_%s;\n",
125 (options.gen.icache ? "icache" : "semantic"), name);
127 else if (options.gen.icache)
129 lf_printf (file, "%s %sicache_%s (", result,
130 options.module.global.prefix.l, name);
131 print_icache_function_actual (file, 0);
132 lf_printf (file, ");\n");
136 lf_printf (file, "%s %ssemantic_%s (", result,
137 options.module.global.prefix.l, name);
138 print_semantic_function_actual (file, 0);
139 lf_printf (file, ");\n");
145 print_semantic_body (lf *file,
146 insn_entry * instruction,
147 opcode_bits *expanded_bits, insn_opcodes *opcodes)
149 /* validate the instruction, if a cache this has already been done */
150 if (!options.gen.icache)
152 print_idecode_validate (file, instruction, opcodes);
155 print_itrace (file, instruction, 0 /*put_value_in_cache */ );
157 /* generate the instruction profile call - this is delayed until
158 after the instruction has been verified. The count macro
159 generated is prefixed by ITABLE_PREFIX */
161 lf_printf (file, "\n");
162 lf_indent_suppress (file);
163 lf_printf (file, "#if defined (%sPROFILE_COUNT_INSN)\n",
164 options.module.itable.prefix.u);
165 lf_printf (file, "%sPROFILE_COUNT_INSN (CPU, CIA, MY_INDEX);\n",
166 options.module.itable.prefix.u);
167 lf_indent_suppress (file);
168 lf_printf (file, "#endif\n");
171 /* generate the model call - this is delayed until after the
172 instruction has been verified */
174 lf_printf (file, "\n");
175 lf_indent_suppress (file);
176 lf_printf (file, "#if defined (WITH_MON)\n");
177 lf_printf (file, "/* monitoring: */\n");
178 lf_printf (file, "if (WITH_MON & MONITOR_INSTRUCTION_ISSUE)\n");
179 lf_printf (file, " mon_issue (");
180 print_function_name (file,
182 instruction->format_name,
183 NULL, NULL, function_name_prefix_itable);
184 lf_printf (file, ", cpu, cia);\n");
185 lf_indent_suppress (file);
186 lf_printf (file, "#endif\n");
187 lf_printf (file, "\n");
190 /* determine the new instruction address */
192 lf_printf (file, "/* keep the next instruction address handy */\n");
193 if (options.gen.nia == nia_is_invalid)
195 lf_printf (file, "nia = %sINVALID_INSTRUCTION_ADDRESS;\n",
196 options.module.global.prefix.u);
200 int nr_immeds = instruction->nr_words - 1;
201 if (options.gen.delayed_branch)
205 lf_printf (file, "cia.dp += %d * %d; %s\n",
206 options.insn_bit_size / 8, nr_immeds,
207 "/* skip dp immeds */");
209 lf_printf (file, "nia.ip = cia.dp; %s\n",
210 "/* instruction pointer */");
211 lf_printf (file, "nia.dp = cia.dp + %d; %s\n",
212 options.insn_bit_size / 8,
213 "/* delayed-slot pointer */");
219 lf_printf (file, "nia = cia + %d * (%d + 1); %s\n",
220 options.insn_bit_size / 8, nr_immeds,
221 "/* skip immeds as well */");
226 lf_printf (file, "nia = cia + %d;\n",
227 options.insn_bit_size / 8);
233 /* if conditional, generate code to verify that the instruction
235 if (filter_is_member (instruction->options, "c")
236 || options.gen.conditional_issue)
238 lf_printf (file, "\n");
239 lf_printf (file, "/* execute only if conditional passes */\n");
240 lf_printf (file, "if (IS_CONDITION_OK)\n");
241 lf_printf (file, " {\n");
242 lf_indent (file, +4);
243 /* FIXME - need to log a conditional failure */
246 /* Architecture expects a REG to be zero. Instead of having to
247 check every read to see if it is refering to that REG just zap it
248 at the start of every instruction */
249 if (options.gen.zero_reg)
251 lf_printf (file, "\n");
252 lf_printf (file, "/* Architecture expects REG to be zero */\n");
253 lf_printf (file, "GPR_CLEAR(%d);\n", options.gen.zero_reg_nr);
256 /* generate the code (or at least something */
257 lf_printf (file, "\n");
258 lf_printf (file, "/* semantics: */\n");
259 if (instruction->code != NULL)
262 lf_printf (file, "{\n");
263 lf_indent (file, +2);
264 lf_print__line_ref (file, instruction->code->line);
265 table_print_code (file, instruction->code);
266 lf_indent (file, -2);
267 lf_printf (file, "}\n");
268 lf_print__internal_ref (file);
270 else if (filter_is_member (instruction->options, "nop"))
272 lf_print__internal_ref (file);
276 const char *prefix = "sim_engine_abort (";
277 int indent = strlen (prefix);
278 /* abort so it is implemented now */
279 lf_print__line_ref (file, instruction->line);
280 lf_printf (file, "%sSD, CPU, cia, \\\n", prefix);
281 lf_indent (file, +indent);
282 lf_printf (file, "\"%s:%d:0x%%08lx:%%s unimplemented\\n\", \\\n",
283 filter_filename (instruction->line->file_name),
284 instruction->line->line_nr);
285 lf_printf (file, "(long) CIA, \\\n");
286 lf_printf (file, "%sitable[MY_INDEX].name);\n",
287 options.module.itable.prefix.l);
288 lf_indent (file, -indent);
289 lf_print__internal_ref (file);
292 /* Close off the conditional execution */
293 if (filter_is_member (instruction->options, "c")
294 || options.gen.conditional_issue)
296 lf_indent (file, -4);
297 lf_printf (file, " }\n");
302 print_c_semantic (lf *file,
303 insn_entry * instruction,
304 opcode_bits *expanded_bits,
305 insn_opcodes *opcodes,
306 cache_entry *cache_rules, int nr_prefetched_words)
309 lf_printf (file, "{\n");
310 lf_indent (file, +2);
312 print_my_defines (file,
314 instruction->format_name, expanded_bits);
315 lf_printf (file, "\n");
316 print_icache_body (file,
320 (options.gen.direct_access
322 : declare_variables),
324 ? get_values_from_icache
325 : do_not_use_icache), nr_prefetched_words);
327 lf_printf (file, "%sinstruction_address nia;\n",
328 options.module.global.prefix.l);
329 print_semantic_body (file, instruction, expanded_bits, opcodes);
330 lf_printf (file, "return nia;\n");
332 /* generate something to clean up any #defines created for the cache */
333 if (options.gen.direct_access)
335 print_icache_body (file,
341 ? get_values_from_icache
342 : do_not_use_icache), nr_prefetched_words);
345 lf_indent (file, -2);
346 lf_printf (file, "}\n");
350 print_c_semantic_function (lf *file,
351 insn_entry * instruction,
352 opcode_bits *expanded_bits,
353 insn_opcodes *opcodes,
354 cache_entry *cache_rules, int nr_prefetched_words)
356 /* build the semantic routine to execute the instruction */
357 print_semantic_function_header (file,
359 instruction->format_name,
361 1 /*is-function-definition */ ,
362 nr_prefetched_words);
363 print_c_semantic (file,
365 expanded_bits, opcodes, cache_rules, nr_prefetched_words);
369 print_semantic_definition (lf *file,
371 opcode_bits *expanded_bits,
372 insn_opcodes *opcodes,
373 cache_entry *cache_rules, int nr_prefetched_words)
375 print_c_semantic_function (file,
378 opcodes, cache_rules, nr_prefetched_words);