binutils: support for the SPARC M8 processor
[deliverable/binutils-gdb.git] / sim / igen / gen-idecode.c
index 1d4f6314dea76dc81c2f17fbe170ca4bd2b98d03..2b890471668b4b3a753721610b948768115d918b 100644 (file)
@@ -1,6 +1,6 @@
 /* The IGEN simulator generator for GDB, the GNU Debugger.
 
-   Copyright 2002, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright 2002-2017 Free Software Foundation, Inc.
 
    Contributed by Andrew Cagney.
 
@@ -706,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
@@ -1071,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.02657 seconds and 4 git commands to generate.