Make TUI borders respect "set style enabled"
[deliverable/binutils-gdb.git] / sim / igen / gen-idecode.c
index a670e3d289bd571e77b95d587b1b09454d85e8f2..b8f8ca15061bef7e53420675ea55b5973f7bda19 100644 (file)
@@ -1,22 +1,24 @@
-/*  This file is part of the program psim.
-
-    Copyright (C) 1994-1998, Andrew Cagney <cagney@highland.com.au>
-
-    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
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    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.
-    */
+/* The IGEN simulator generator for GDB, the GNU Debugger.
+
+   Copyright 2002-2020 Free Software Foundation, Inc.
+
+   Contributed by Andrew Cagney.
+
+   This file is part of GDB.
+
+   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 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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, see <http://www.gnu.org/licenses/>.  */
+
 
 #include "misc.h"
 #include "lf.h"
 
 
 static void
-lf_print_opcodes (lf *file,
-                 gen_entry *table)
+lf_print_opcodes (lf *file, gen_entry *table)
 {
-  if (table != NULL)
+  if (table !=NULL)
     {
       while (1)
        {
          ASSERT (table->opcode != NULL);
          lf_printf (file, "_%d_%d",
-                    table->opcode->first,
-                    table->opcode->last);
-         if (table->parent == NULL) break;
+                    table->opcode->first, table->opcode->last);
+         if (table->parent == NULL)
+           break;
          lf_printf (file, "__%d", table->opcode_nr);
          table = table->parent;
        }
@@ -64,12 +65,12 @@ print_idecode_ifetch (lf *file,
 {
   int word_nr;
   for (word_nr = previous_nr_prefetched_words;
-       word_nr < current_nr_prefetched_words;
-       word_nr ++)
+       word_nr < current_nr_prefetched_words; word_nr++)
     {
-      lf_printf (file, "instruction_word instruction_%d = IMEM%d_IMMED (cia, %d);\n",
+      lf_printf (file,
+                "instruction_word instruction_%d = IMEM%d_IMMED (cia, %d);\n",
                 word_nr, options.insn_bit_size, word_nr);
-      
+
     }
 }
 
@@ -79,8 +80,7 @@ print_idecode_ifetch (lf *file,
 
 
 static void
-lf_print_table_name (lf *file,
-                    gen_entry *table)
+lf_print_table_name (lf *file, gen_entry *table)
 {
   lf_printf (file, "idecode_table");
   lf_print_opcodes (file, table);
@@ -89,9 +89,7 @@ lf_print_table_name (lf *file,
 
 
 static void
-print_idecode_table (lf *file,
-                    gen_entry *entry,
-                    const char *result)
+print_idecode_table (lf *file, gen_entry *entry, const char *result)
 {
   lf_printf (file, "/* prime the search */\n");
   lf_printf (file, "idecode_table_entry *table = ");
@@ -102,7 +100,7 @@ print_idecode_table (lf *file,
             i2target (options.hi_bit_nr, entry->opcode->first),
             i2target (options.hi_bit_nr, entry->opcode->last));
   lf_printf (file, "idecode_table_entry *table_entry = table + opcode;\n");
-  
+
   lf_printf (file, "\n");
   lf_printf (file, "/* iterate until a leaf */\n");
   lf_printf (file, "while (1) {\n");
@@ -125,7 +123,7 @@ print_idecode_table (lf *file,
   lf_printf (file, "    table_entry = table + opcode;\n");
   lf_printf (file, "  }\n");
   lf_printf (file, "}\n");
-  
+
   lf_printf (file, "\n");
   lf_printf (file, "/* call the leaf code */\n");
   if (options.gen.code == generate_jumps)
@@ -137,14 +135,16 @@ print_idecode_table (lf *file,
       lf_printf (file, "%s ", result);
       if (options.gen.icache)
        {
-         lf_printf (file, "(((idecode_icache*)table_entry->function_or_table)\n");
+         lf_printf (file,
+                    "(((idecode_icache*)table_entry->function_or_table)\n");
          lf_printf (file, "  (");
          print_icache_function_actual (file, 1);
          lf_printf (file, "));\n");
        }
       else
        {
-         lf_printf (file, "((idecode_semantic*)table_entry->function_or_table)\n");
+         lf_printf (file,
+                    "((idecode_semantic*)table_entry->function_or_table)\n");
          lf_printf (file, "  (");
          print_semantic_function_actual (file, 1);
          lf_printf (file, ");\n");
@@ -154,10 +154,7 @@ print_idecode_table (lf *file,
 
 
 static void
-print_idecode_table_start (lf *file,
-                          gen_entry *table,
-                          int depth,
-                          void *data)
+print_idecode_table_start (lf *file, gen_entry *table, int depth, void *data)
 {
   ASSERT (depth == 0);
   /* start of the table */
@@ -171,10 +168,7 @@ print_idecode_table_start (lf *file,
 }
 
 static void
-print_idecode_table_leaf (lf *file,
-                         gen_entry *entry,
-                         int depth,
-                         void *data)
+print_idecode_table_leaf (lf *file, gen_entry *entry, int depth, void *data)
 {
   gen_entry *master_entry;
   ASSERT (entry->parent != NULL);
@@ -234,9 +228,9 @@ print_idecode_table_leaf (lf *file,
       else
        {
          /* table `calling' another table */
-         lf_printf (file, "%d, ", options.insn_bit_size - entry->opcode->last - 1);
-         lf_printf (file, "MASK%d(%d,%d), ",
-                    options.insn_bit_size,
+         lf_printf (file, "%d, ",
+                    options.insn_bit_size - entry->opcode->last - 1);
+         lf_printf (file, "MASK%d(%d,%d), ", options.insn_bit_size,
                     i2target (options.hi_bit_nr, entry->opcode->first),
                     i2target (options.hi_bit_nr, entry->opcode->last));
          lf_printf (file, "0, ");
@@ -247,23 +241,20 @@ print_idecode_table_leaf (lf *file,
 }
 
 static void
-print_idecode_table_end (lf *file,
-                        gen_entry *table,
-                        int depth,
-                        void *data)
+print_idecode_table_end (lf *file, gen_entry *table, int depth, void *data)
 {
   ASSERT (depth == 0);
-  if (table->opcode_rule->gen == array_gen) {
-    lf_printf (file, "};\n");
-  }
+  if (table->opcode_rule->gen == array_gen)
+    {
+      lf_printf (file, "};\n");
+    }
 }
 
 /****************************************************************/
 
 
 static void
-print_goto_switch_name (lf *file,
-                       gen_entry *entry)
+print_goto_switch_name (lf *file, gen_entry *entry)
 {
   lf_printf (file, "case_");
   if (entry->opcode == NULL)
@@ -279,21 +270,19 @@ print_goto_switch_name (lf *file,
     }
   else
     {
-      lf_print_table_name(file, entry);
+      lf_print_table_name (file, entry);
     }
 }
 
 static void
 print_goto_switch_table_leaf (lf *file,
-                             gen_entry *entry,
-                             int depth,
-                             void *data)
+                             gen_entry *entry, int depth, void *data)
 {
   ASSERT (entry->parent != NULL);
   ASSERT (depth == 0);
   ASSERT (entry->parent->opcode_rule->gen == goto_switch_gen);
   ASSERT (entry->parent->opcode);
-  
+
   lf_printf (file, "/* %d */ &&", entry->opcode_nr);
   if (entry->combined_parent != NULL)
     print_goto_switch_name (file, entry->combined_parent);
@@ -303,8 +292,7 @@ print_goto_switch_table_leaf (lf *file,
 }
 
 static void
-print_goto_switch_break (lf *file,
-                        gen_entry *entry)
+print_goto_switch_break (lf *file, gen_entry *entry)
 {
   lf_printf (file, "goto break_");
   lf_print_table_name (file, entry->parent);
@@ -313,41 +301,31 @@ print_goto_switch_break (lf *file,
 
 
 static void
-print_goto_switch_table (lf *file,
-                        gen_entry *table)
+print_goto_switch_table (lf *file, gen_entry *table)
 {
   lf_printf (file, "const static void *");
   lf_print_table_name (file, table);
   lf_printf (file, "[] = {\n");
   lf_indent (file, +2);
-  gen_entry_traverse_tree (file, table,
-                          0,
-                          NULL/*start*/,
-                          print_goto_switch_table_leaf,
-                          NULL/*end*/,
-                          NULL/*data*/);
+  gen_entry_traverse_tree (file, table, 0, NULL /*start */ ,
+                          print_goto_switch_table_leaf, NULL /*end */ ,
+                          NULL /*data */ );
   lf_indent (file, -2);
   lf_printf (file, "};\n");
 }
 
 
-void print_idecode_switch
-(lf *file, 
- gen_entry *table,
- const char *result);
+void print_idecode_switch (lf *file, gen_entry *table, const char *result);
 
 static void
-print_idecode_switch_start (lf *file,
-                           gen_entry *table,
-                           int depth,
-                           void *data)
+print_idecode_switch_start (lf *file, gen_entry *table, int depth, void *data)
 {
   /* const char *result = data; */
   ASSERT (depth == 0);
   ASSERT (table->opcode_rule->gen == switch_gen
          || table->opcode_rule->gen == goto_switch_gen
          || table->opcode_rule->gen == padded_switch_gen);
-  
+
   if (table->opcode->is_boolean
       || table->opcode_rule->gen == switch_gen
       || table->opcode_rule->gen == padded_switch_gen)
@@ -389,16 +367,13 @@ print_idecode_switch_start (lf *file,
     }
   else
     {
-      ASSERT("bad switch" == NULL);
+      ASSERT ("bad switch" == NULL);
     }
 }
 
 
 static void
-print_idecode_switch_leaf (lf *file,
-                          gen_entry *entry,
-                          int depth,
-                          void *data)
+print_idecode_switch_leaf (lf *file, gen_entry *entry, int depth, void *data)
 {
   const char *result = data;
   ASSERT (entry->parent != NULL);
@@ -407,19 +382,17 @@ print_idecode_switch_leaf (lf *file,
          || entry->parent->opcode_rule->gen == goto_switch_gen
          || entry->parent->opcode_rule->gen == padded_switch_gen);
   ASSERT (entry->parent->opcode);
-  
+
   /* skip over any instructions combined into another entry */
   if (entry->combined_parent != NULL)
     return;
 
-  if (entry->parent->opcode->is_boolean
-          && entry->opcode_nr == 0)
+  if (entry->parent->opcode->is_boolean && entry->opcode_nr == 0)
     {
       /* case: boolean false target */
       lf_printf (file, "case %d:\n", entry->parent->opcode->boolean_constant);
     }
-  else if (entry->parent->opcode->is_boolean
-          && entry->opcode_nr != 0)
+  else if (entry->parent->opcode->is_boolean && entry->opcode_nr != 0)
     {
       /* case: boolean true case */
       lf_printf (file, "default:\n");
@@ -471,7 +444,9 @@ print_idecode_switch_leaf (lf *file,
        if (options.gen.code == generate_calls)
          {
            lf_printf (file, " (");
-           print_semantic_function_actual (file, entry->insns->semantic->nr_prefetched_words);
+           print_semantic_function_actual (file,
+                                           entry->insns->semantic->
+                                           nr_prefetched_words);
            lf_printf (file, ")");
          }
        lf_printf (file, ";\n");
@@ -508,7 +483,7 @@ print_idecode_switch_leaf (lf *file,
       }
     else if (entry->parent->opcode_rule->gen == goto_switch_gen)
       {
-       print_goto_switch_break(file, entry);
+       print_goto_switch_break (file, entry);
       }
     else
       {
@@ -521,8 +496,7 @@ print_idecode_switch_leaf (lf *file,
 
 
 static void
-print_idecode_switch_illegal (lf *file,
-                             const char *result)
+print_idecode_switch_illegal (lf *file, const char *result)
 {
   lf_indent (file, +2);
   print_idecode_invalid (file, result, invalid_illegal);
@@ -531,10 +505,7 @@ print_idecode_switch_illegal (lf *file,
 }
 
 static void
-print_idecode_switch_end (lf *file,
-                         gen_entry *table,
-                         int depth,
-                         void *data)
+print_idecode_switch_end (lf *file, gen_entry *table, int depth, void *data)
 {
   const char *result = data;
   ASSERT (depth == 0);
@@ -542,7 +513,7 @@ print_idecode_switch_end (lf *file,
          || table->opcode_rule->gen == goto_switch_gen
          || table->opcode_rule->gen == padded_switch_gen);
   ASSERT (table->opcode);
-  
+
   if (table->opcode->is_boolean)
     {
       lf_printf (file, "}\n");
@@ -555,7 +526,8 @@ print_idecode_switch_end (lf *file,
       lf_indent (file, +2);
       if (table->nr_entries == table->opcode->nr_opcodes)
        {
-         print_sim_engine_abort (file, "Internal error - bad switch generated");
+         print_sim_engine_abort (file,
+                                 "Internal error - bad switch generated");
          lf_printf (file, "%sNULL_CIA;\n", result);
          lf_printf (file, "break;\n");
        }
@@ -574,7 +546,7 @@ print_idecode_switch_end (lf *file,
       lf_printf (file, ":\n");
       print_idecode_invalid (file, result, invalid_illegal);
       lf_printf (file, "break_");
-      lf_print_table_name(file, table);
+      lf_print_table_name (file, table);
       lf_printf (file, ":;\n");
       if (table->parent != NULL
          && (table->parent->opcode_rule->gen == switch_gen
@@ -593,16 +565,13 @@ print_idecode_switch_end (lf *file,
 
 
 void
-print_idecode_switch (lf *file, 
-                     gen_entry *table,
-                     const char *result)
+print_idecode_switch (lf *file, gen_entry *table, const char *result)
 {
   gen_entry_traverse_tree (file, table,
                           0,
                           print_idecode_switch_start,
                           print_idecode_switch_leaf,
-                          print_idecode_switch_end,
-                          (void*)result);
+                          print_idecode_switch_end, (void *) result);
 }
 
 
@@ -653,47 +622,35 @@ print_idecode_switch_function_header (lf *file,
 
 
 static void
-idecode_declare_if_switch (lf *file,
-                          gen_entry *table,
-                          int depth,
-                          void *data)
+idecode_declare_if_switch (lf *file, gen_entry *table, int depth, void *data)
 {
-  if ((table->opcode_rule->gen == switch_gen
-       || table->opcode_rule->gen == goto_switch_gen
-       || table->opcode_rule->gen == padded_switch_gen)
-      && table->parent != NULL /* don't declare the top one yet */
+  if ((table->opcode_rule->gen == switch_gen || table->opcode_rule->gen == goto_switch_gen || table->opcode_rule->gen == padded_switch_gen) &&table->parent != NULL    /* don't declare the top one yet */
       && table->parent->opcode_rule->gen == array_gen)
     {
       print_idecode_switch_function_header (file,
                                            table,
-                                           0/*isnt function definition*/,
+                                           0 /*isnt function definition */ ,
                                            0);
     }
 }
 
 
 static void
-idecode_expand_if_switch (lf *file,
-                         gen_entry *table,
-                         int depth,
-                         void *data)
+idecode_expand_if_switch (lf *file, gen_entry *table, int depth, void *data)
 {
-  if ((table->opcode_rule->gen == switch_gen
-       || table->opcode_rule->gen == goto_switch_gen
-       || table->opcode_rule->gen == padded_switch_gen)
-      && table->parent != NULL /* don't expand the top one yet */
+  if ((table->opcode_rule->gen == switch_gen || table->opcode_rule->gen == goto_switch_gen || table->opcode_rule->gen == padded_switch_gen) &&table->parent != NULL    /* don't expand the top one yet */
       && table->parent->opcode_rule->gen == array_gen)
     {
-      print_idecode_switch_function_header(file,
-                                          table,
-                                          1/*is function definition*/,
-                                          0);
+      print_idecode_switch_function_header (file,
+                                           table,
+                                           1 /*is function definition */ ,
+                                           0);
       if (options.gen.code == generate_calls)
        {
          lf_printf (file, "{\n");
          lf_indent (file, +2);
        }
-      print_idecode_switch(file, table, "return");
+      print_idecode_switch (file, table, "return");
       if (options.gen.code == generate_calls)
        {
          lf_indent (file, -2);
@@ -707,45 +664,32 @@ idecode_expand_if_switch (lf *file,
 
 
 void
-print_idecode_lookups (lf *file,
-                      gen_entry *table,
-                      cache_entry *cache_rules)
+print_idecode_lookups (lf *file, gen_entry *table, cache_entry *cache_rules)
 {
   int depth;
-  
+
   /* output switch function declarations where needed by tables */
-  gen_entry_traverse_tree (file, table,
-                          1,
-                          idecode_declare_if_switch, /* START */
-                          NULL, NULL,
-                          NULL);
-  
+  gen_entry_traverse_tree (file, table, 1, idecode_declare_if_switch,  /* START */
+                          NULL, NULL, NULL);
+
   /* output tables where needed */
-  for (depth = gen_entry_depth (table);
-       depth > 0;
-       depth--)
+  for (depth = gen_entry_depth (table); depth > 0; depth--)
     {
       gen_entry_traverse_tree (file, table,
-                              1-depth,
+                              1 - depth,
                               print_idecode_table_start,
                               print_idecode_table_leaf,
-                              print_idecode_table_end,
-                              NULL);
+                              print_idecode_table_end, NULL);
     }
-  
+
   /* output switch functions where needed */
-  gen_entry_traverse_tree (file, table,
-                           1,
-                           idecode_expand_if_switch, /* START */
-                           NULL, NULL,
-                           NULL);
+  gen_entry_traverse_tree (file, table, 1, idecode_expand_if_switch,   /* START */
+                          NULL, NULL, NULL);
 }
 
 
 void
-print_idecode_body (lf *file,
-                   gen_entry *table,
-                   const char *result)
+print_idecode_body (lf *file, gen_entry *table, const char *result)
 {
   if (table->opcode_rule->gen == switch_gen
       || table->opcode_rule->gen == goto_switch_gen
@@ -762,353 +706,6 @@ print_idecode_body (lf *file,
 
 /****************************************************************/
 
-#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
@@ -1116,8 +713,7 @@ print_jump_until_stop_body(lf *file,
 
 void
 print_idecode_validate (lf *file,
-                       insn_entry *instruction,
-                       insn_opcodes *opcode_paths)
+                       insn_entry * instruction, insn_opcodes *opcode_paths)
 {
   /* Validate: unchecked instruction fields
 
@@ -1150,27 +746,30 @@ print_idecode_validate (lf *file,
            /* Make space for the next bit */
            check_mask <<= 1;
            check_val <<= 1;
-           
+
            /* Only need to validate constant (and reserved)
-               bits. Skip any others */
+              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
-               instruction.  See if any have failed to check the
-               relevant bit */
+              instruction.  See if any have failed to check the
+              relevant bit */
            if (opcode_paths != NULL)
              {
                insn_opcodes *entry;
-               for (entry = opcode_paths;
-                    entry != NULL;
-                    entry = entry->next)
+               for (entry = opcode_paths; entry != NULL; entry = entry->next)
                  {
                    opcode_field *opcode;
                    for (opcode = entry->opcode;
-                        opcode != NULL;
-                        opcode = opcode->parent)
+                        opcode != NULL; opcode = opcode->parent)
                      {
                        if (opcode->word_nr == word_nr
                            && opcode->first <= bit_nr
@@ -1184,14 +783,14 @@ print_idecode_validate (lf *file,
                  }
                if (entry == NULL)
                  /* all the opcode paths decoded on BIT_NR, no need
-                     to check it */
+                    to check it */
                  continue;
              }
-           
+
            check_mask |= 1;
            check_val |= bit->value;
          }
-       
+
        /* if any bits not checked by opcode tables, output code to check them */
        if (check_mask)
          {
@@ -1201,23 +800,23 @@ print_idecode_validate (lf *file,
                lf_printf (file, "  {\n");
                lf_indent (file, +4);
              }
-           nr_checks ++;
+           nr_checks++;
            if (options.insn_bit_size > 32)
              {
-               lf_printf (file, "if ((instruction_%d\n", word_nr); 
+               lf_printf (file, "if ((instruction_%d\n", word_nr);
                lf_printf (file, "     & UNSIGNED64 (0x%08lx%08lx))\n",
-                          (unsigned long)(check_mask >> 32),
-                          (unsigned long)(check_mask));
+                          (unsigned long) (check_mask >> 32),
+                          (unsigned long) (check_mask));
                lf_printf (file, "    != UNSIGNED64 (0x%08lx%08lx))\n",
-                          (unsigned long)(check_val >> 32),
-                          (unsigned long)(check_val));
+                          (unsigned long) (check_val >> 32),
+                          (unsigned long) (check_val));
              }
            else
              {
-               lf_printf (file, "if ((instruction_%d & 0x%08lx) != 0x%08lx)\n",
-                          word_nr,
-                          (unsigned long)(check_mask),
-                          (unsigned long)(check_val));
+               lf_printf (file,
+                          "if ((instruction_%d & 0x%08lx) != 0x%08lx)\n",
+                          word_nr, (unsigned long) (check_mask),
+                          (unsigned long) (check_val));
              }
            lf_indent (file, +2);
            print_idecode_invalid (file, "return", invalid_illegal);
@@ -1229,12 +828,12 @@ print_idecode_validate (lf *file,
        lf_indent (file, -4);
        lf_printf (file, "  }\n");
       }
-    lf_indent_suppress(file);
+    lf_indent_suppress (file);
     lf_printf (file, "#endif\n");
   }
 
   /* Validate: Floating Point hardware
-     
+
      If the simulator is being built with out floating point hardware
      (different to it being disabled in the MSR) then floating point
      instructions are invalid */
@@ -1245,7 +844,8 @@ print_idecode_validate (lf *file,
        lf_indent_suppress (file);
        lf_printf (file, "#if defined(CURRENT_FLOATING_POINT)\n");
        lf_printf (file, "/* Validate: FP hardware exists */\n");
-       lf_printf (file, "if (CURRENT_FLOATING_POINT != HARD_FLOATING_POINT) {\n");
+       lf_printf (file,
+                  "if (CURRENT_FLOATING_POINT != HARD_FLOATING_POINT) {\n");
        lf_indent (file, +2);
        print_idecode_invalid (file, "return", invalid_illegal);
        lf_indent (file, -2);
@@ -1273,14 +873,14 @@ print_idecode_validate (lf *file,
        lf_printf (file, "/* Validate: FP available according to cpu */\n");
        lf_printf (file, "if (!IS_FP_AVAILABLE) {\n");
        lf_indent (file, +2);
-       print_idecode_invalid (file, "return",  invalid_fp_unavailable);
+       print_idecode_invalid (file, "return", invalid_fp_unavailable);
        lf_indent (file, -2);
        lf_printf (file, "}\n");
        lf_indent_suppress (file);
        lf_printf (file, "#endif\n");
       }
   }
-  
+
   /* Validate: Validate Instruction in correct slot
 
      Some architectures place restrictions on the slot that an
@@ -1293,7 +893,8 @@ print_idecode_validate (lf *file,
        lf_printf (file, "\n");
        lf_indent_suppress (file);
        lf_printf (file, "#if defined(IS_WRONG_SLOT)\n");
-       lf_printf (file, "/* Validate: Instruction issued in correct slot */\n");
+       lf_printf (file,
+                  "/* Validate: Instruction issued in correct slot */\n");
        lf_printf (file, "if (IS_WRONG_SLOT) {\n");
        lf_indent (file, +2);
        print_idecode_invalid (file, "return", invalid_wrong_slot);
@@ -1303,7 +904,7 @@ print_idecode_validate (lf *file,
        lf_printf (file, "#endif\n");
       }
   }
-  
+
 }
 
 
@@ -1322,13 +923,11 @@ print_idecode_issue_function_header (lf *file,
     {
     case is_function_declaration:
       lf_print__function_type_function (file, print_semantic_function_type,
-                                       "INLINE_IDECODE",
-                                       " ");
+                                       "INLINE_IDECODE", " ");
       break;
     case is_function_definition:
       lf_print__function_type_function (file, print_semantic_function_type,
-                                       "INLINE_IDECODE",
-                                       "\n");
+                                       "INLINE_IDECODE", "\n");
       break;
     case is_function_variable:
       print_semantic_function_type (file);
@@ -1339,8 +938,7 @@ print_idecode_issue_function_header (lf *file,
                                "issue",
                                NULL,
                                processor,
-                               NULL,
-                               function_name_prefix_idecode);
+                               NULL, function_name_prefix_idecode);
   switch (decl_type)
     {
     case is_function_definition:
This page took 0.035883 seconds and 4 git commands to generate.