binutils: support for the SPARC M8 processor
[deliverable/binutils-gdb.git] / sim / igen / gen-idecode.c
index 639b5631dddf2512ddc8b57941e74eb06347c749..2b890471668b4b3a753721610b948768115d918b 100644 (file)
@@ -1,6 +1,6 @@
 /* The IGEN simulator generator for GDB, the GNU Debugger.
 
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright 2002-2017 Free Software Foundation, Inc.
 
    Contributed by Andrew Cagney.
 
@@ -8,7 +8,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +17,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 #include "misc.h"
@@ -708,327 +706,6 @@ print_idecode_body (lf *file, gen_entry *table, const char *result)
 
 /****************************************************************/
 
-#if 0
-static void
-print_jump (lf *file, int is_tail)
-{
-  if (is_tail)
-    {
-      lf_putstr (file, "if (keep_running != NULL && !*keep_running)\n");
-      lf_putstr (file, "  cpu_halt(cpu, nia, was_continuing, 0/*na*/);\n");
-    }
-
-  if (!options.generate_smp)
-    {
-      lf_putstr (file, "if (WITH_EVENTS) {\n");
-      lf_putstr (file, "  if (event_queue_tick(events)) {\n");
-      lf_putstr (file, "    cpu_set_program_counter(cpu, nia);\n");
-      lf_putstr (file, "    event_queue_process(events);\n");
-      lf_putstr (file, "    nia = cpu_get_program_counter(cpu);\n");
-      lf_putstr (file, "  }\n");
-      lf_putstr (file, "}\n");
-    }
-
-  if (options.generate_smp)
-    {
-      if (is_tail)
-       {
-         lf_putstr (file, "cpu_set_program_counter(cpu, nia);\n");
-       }
-      lf_putstr (file, "if (WITH_EVENTS) {\n");
-      lf_putstr (file, "  current_cpu += 1;\n");
-      lf_putstr (file, "  if (current_cpu >= nr_cpus) {\n");
-      lf_putstr (file, "    if (event_queue_tick(events)) {\n");
-      lf_putstr (file, "      event_queue_process(events);\n");
-      lf_putstr (file, "    }\n");
-      lf_putstr (file, "    current_cpu = 0;\n");
-      lf_putstr (file, "  }\n");
-      lf_putstr (file, "}\n");
-      lf_putstr (file, "else {\n");
-      lf_putstr (file, "  current_cpu = (current_cpu + 1) % nr_cpus;\n");
-      lf_putstr (file, "}\n");
-      lf_putstr (file, "cpu = cpus[current_cpu];\n");
-      lf_putstr (file, "nia = cpu_get_program_counter(cpu);\n");
-    }
-
-  if (options.gen.icache)
-    {
-      lf_putstr (file, "cache_entry = cpu_icache_entry(cpu, nia);\n");
-      lf_putstr (file, "if (cache_entry->address == nia) {\n");
-      lf_putstr (file, "  /* cache hit */\n");
-      lf_putstr (file, "  goto *cache_entry->semantic;\n");
-      lf_putstr (file, "}\n");
-      if (is_tail)
-       {
-         lf_putstr (file, "goto cache_miss;\n");
-       }
-    }
-
-  if (!options.gen.icache && is_tail)
-    {
-      lf_printf (file, "goto idecode;\n");
-    }
-
-}
-#endif
-
-
-
-#if 0
-static void
-print_jump_insn (lf *file,
-                insn_entry * instruction,
-                insn_bits * expanded_bits,
-                opcode_field *opcodes, cache_entry *cache_rules)
-{
-
-  /* what we are for the moment */
-  lf_printf (file, "\n");
-  print_my_defines (file, expanded_bits, instruction->name);
-
-  /* output the icache entry */
-  if (options.gen.icache)
-    {
-      lf_printf (file, "\n");
-      lf_indent (file, -1);
-      print_function_name (file,
-                          instruction->name,
-                          expanded_bits, function_name_prefix_icache);
-      lf_printf (file, ":\n");
-      lf_indent (file, +1);
-      lf_printf (file, "{\n");
-      lf_indent (file, +2);
-      lf_putstr (file, "const unsigned_word cia = nia;\n");
-      print_itrace (file, instruction, 1 /*putting-value-in-cache */ );
-      print_idecode_validate (file, instruction, opcodes);
-      lf_printf (file, "\n");
-      lf_printf (file, "{\n");
-      lf_indent (file, +2);
-      print_icache_body (file, instruction, expanded_bits, cache_rules, 0,     /*use_defines */
-                        put_values_in_icache);
-      lf_printf (file, "cache_entry->address = nia;\n");
-      lf_printf (file, "cache_entry->semantic = &&");
-      print_function_name (file,
-                          instruction->name,
-                          expanded_bits, function_name_prefix_semantics);
-      lf_printf (file, ";\n");
-      if (options.gen.semantic_icache)
-       {
-         print_semantic_body (file, instruction, expanded_bits, opcodes);
-         print_jump (file, 1 /*is-tail */ );
-       }
-      else
-       {
-         lf_printf (file, "/* goto ");
-         print_function_name (file,
-                              instruction->name,
-                              expanded_bits, function_name_prefix_semantics);
-         lf_printf (file, "; */\n");
-       }
-      lf_indent (file, -2);
-      lf_putstr (file, "}\n");
-      lf_indent (file, -2);
-      lf_printf (file, "}\n");
-    }
-
-  /* print the semantics */
-  lf_printf (file, "\n");
-  lf_indent (file, -1);
-  print_function_name (file,
-                      instruction->name,
-                      expanded_bits, function_name_prefix_semantics);
-  lf_printf (file, ":\n");
-  lf_indent (file, +1);
-  lf_printf (file, "{\n");
-  lf_indent (file, +2);
-  lf_putstr (file, "const unsigned_word cia = nia;\n");
-  print_icache_body (file,
-                    instruction,
-                    expanded_bits,
-                    cache_rules,
-                    (options.gen.direct_access
-                     ? define_variables
-                     : declare_variables),
-                    (options.gen.icache
-                     ? get_values_from_icache : do_not_use_icache));
-  print_semantic_body (file, instruction, expanded_bits, opcodes);
-  if (options.gen.direct_access)
-    print_icache_body (file,
-                      instruction,
-                      expanded_bits,
-                      cache_rules,
-                      undef_variables,
-                      (options.gen.icache
-                       ? get_values_from_icache : do_not_use_icache));
-  print_jump (file, 1 /*is tail */ );
-  lf_indent (file, -2);
-  lf_printf (file, "}\n");
-}
-#endif
-
-
-#if 0
-static void
-print_jump_definition (lf *file,
-                      gen_entry *entry,
-                      insn_entry * insn, int depth, void *data)
-{
-  cache_entry *cache_rules = (cache_entry *) data;
-  if (options.generate_expanded_instructions)
-    {
-      ASSERT (entry->nr_insns == 1
-             && entry->opcode == NULL
-             && entry->parent != NULL && entry->parent->opcode != NULL);
-      ASSERT (entry->nr_insns == 1
-             && entry->opcode == NULL
-             && entry->parent != NULL
-             && entry->parent->opcode != NULL
-             && entry->parent->opcode_rule != NULL);
-      print_jump_insn (file,
-                      entry->insns->words[0]->insn,
-                      entry->expanded_bits, entry->opcode, cache_rules);
-    }
-  else
-    {
-      print_jump_insn (file,
-                      instruction->words[0]->insn, NULL, NULL, cache_rules);
-    }
-}
-#endif
-
-#if 0
-static void
-print_jump_internal_function (lf *file,
-                             gen_entry *table,
-                             function_entry * function, void *data)
-{
-  if (function->is_internal)
-    {
-      lf_printf (file, "\n");
-      lf_print__line_ref (file, function->line);
-      lf_indent (file, -1);
-      print_function_name (file,
-                          function->name,
-                          NULL,
-                          (options.gen.icache
-                           ? function_name_prefix_icache
-                           : function_name_prefix_semantics));
-      lf_printf (file, ":\n");
-      lf_indent (file, +1);
-      lf_printf (file, "{\n");
-      lf_indent (file, +2);
-      lf_printf (file, "const unsigned_word cia = nia;\n");
-      table_print_code (file, function->code);
-      lf_print__internal_ref (file);
-      print_sim_engine_abort (file, "Internal function must longjump");
-      lf_indent (file, -2);
-      lf_printf (file, "}\n");
-    }
-}
-#endif
-
-
-
-#if 0
-static void
-print_jump_until_stop_body (lf *file,
-                           insn_table *table, cache_table * cache_rules)
-{
-  lf_printf (file, "{\n");
-  lf_indent (file, +2);
-  lf_putstr (file, "jmp_buf halt;\n");
-  lf_putstr (file, "jmp_buf restart;\n");
-  lf_putstr (file, "sim_cpu *cpu = NULL;\n");
-  lf_putstr (file, "unsigned_word nia = -1;\n");
-  lf_putstr (file, "instruction_word instruction = 0;\n");
-  if ((code & generate_with_icache))
-    {
-      lf_putstr (file, "idecode_cache *cache_entry = NULL;\n");
-    }
-  if (generate_smp)
-    {
-      lf_putstr (file, "int current_cpu = -1;\n");
-    }
-
-  /* all the switches and tables - they know about jumping */
-  print_idecode_lookups (file, table, cache_rules);
-
-  /* start the simulation up */
-  if ((code & generate_with_icache))
-    {
-      lf_putstr (file, "\n");
-      lf_putstr (file, "{\n");
-      lf_putstr (file, "  int cpu_nr;\n");
-      lf_putstr (file, "  for (cpu_nr = 0; cpu_nr < nr_cpus; cpu_nr++)\n");
-      lf_putstr (file, "    cpu_flush_icache(cpus[cpu_nr]);\n");
-      lf_putstr (file, "}\n");
-    }
-
-  lf_putstr (file, "\n");
-  lf_putstr (file, "psim_set_halt_and_restart(system, &halt, &restart);\n");
-
-  lf_putstr (file, "\n");
-  lf_putstr (file, "if (setjmp(halt))\n");
-  lf_putstr (file, "  return;\n");
-
-  lf_putstr (file, "\n");
-  lf_putstr (file, "setjmp(restart);\n");
-
-  lf_putstr (file, "\n");
-  if (!generate_smp)
-    {
-      lf_putstr (file, "cpu = cpus[0];\n");
-      lf_putstr (file, "nia = cpu_get_program_counter(cpu);\n");
-    }
-  else
-    {
-      lf_putstr (file, "current_cpu = psim_last_cpu(system);\n");
-    }
-
-  if (!(code & generate_with_icache))
-    {
-      lf_printf (file, "\n");
-      lf_indent (file, -1);
-      lf_printf (file, "idecode:\n");
-      lf_indent (file, +1);
-    }
-
-  print_jump (file, 0 /*is_tail */ );
-
-  if ((code & generate_with_icache))
-    {
-      lf_indent (file, -1);
-      lf_printf (file, "cache_miss:\n");
-      lf_indent (file, +1);
-    }
-
-  lf_putstr (file, "instruction\n");
-  lf_putstr (file, "  = vm_instruction_map_read(cpu_instruction_map(cpu),\n");
-  lf_putstr (file, "                            cpu, nia);\n");
-  print_idecode_body (file, table, "/*IGORE*/");
-
-  /* print out a table of all the internals functions */
-  insn_table_traverse_function (table,
-                               file, NULL, print_jump_internal_function);
-
-  /* print out a table of all the instructions */
-  if (generate_expanded_instructions)
-    insn_table_traverse_tree (table, file, cache_rules, 1, NULL,       /* start */
-                             print_jump_definition,    /* leaf */
-                             NULL,     /* end */
-                             NULL);    /* padding */
-  else
-    insn_table_traverse_insn (table,
-                             file, cache_rules, print_jump_definition);
-  lf_indent (file, -2);
-  lf_printf (file, "}\n");
-}
-#endif
-
-/****************************************************************/
-
-
-
 /* Output code to do any final checks on the decoded instruction.
    This includes things like verifying any on decoded fields have the
    correct value and checking that (for floating point) floating point
@@ -1073,7 +750,13 @@ print_idecode_validate (lf *file,
            /* Only need to validate constant (and reserved)
               bits. Skip any others */
            if (field->type != insn_field_int
-               && field->type != insn_field_reserved)
+               && field->type != insn_field_reserved
+               /* Consider a named field equal to a value to be just as
+                  constant as an integer field.  */
+               && (field->type != insn_field_string
+                   || field->conditions == NULL
+                   || field->conditions->test != insn_field_cond_eq
+                   || field->conditions->type != insn_field_cond_value))
              continue;
 
            /* Look through the list of opcode paths that lead to this
This page took 0.029415 seconds and 4 git commands to generate.