/*  This file is part of the program psim.

    Copyright (C) 1994,1995,1996, 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 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/>.
 
    */


/* What does the instruction look like - bit ordering and size */
extern int hi_bit_nr;
extern int insn_bit_size;


/* generation options: */


enum {
  generate_with_direct_access = 0x1,
  generate_with_icache = 0x2,
  generate_with_semantic_icache = 0x4,
  generate_with_insn_in_icache = 0x8,
};


typedef enum {

  /* Transfer control to an instructions semantic code using the the
     standard call/return mechanism */

  generate_calls = 0x100,

  /* In addition, when referring to fields access them directly instead
     of via variables */

  generate_calls_with_direct_access
    = generate_calls | generate_with_direct_access,

  /* In addition, pre-decode an instructions opcode fields (entering
     them into an icache) so that semantic code can avoid the need to
     re-decode fields each time it is executed */

  generate_calls_with_icache
    = generate_calls | generate_with_icache,

  /* In addition, the instruction decode code includes a duplicated
     copy of the instructions semantic code.  This avoids the need to
     perform two calls (one to decode an instructions opcode fields
     and one to execute the instruction) when there is a miss of the
     icache */

  generate_calls_with_semantic_icache
    = generate_calls_with_icache | generate_with_semantic_icache,

  /* In addition, the semantic function refers to icache entries
     directly instead of first moving them into local variables */

  generate_calls_with_direct_access_icache
    = generate_calls_with_icache | generate_with_direct_access,

  generate_calls_with_direct_access_semantic_icache
    = generate_calls_with_direct_access_icache | generate_with_semantic_icache,


  /* Transfer control to an instructions semantic code using
     (computed) goto's instead of the more conventional call/return
     mechanism */

  generate_jumps = 0x200,

  /* As for generate jumps but with instruction fields accessed
     directly */

  generate_jumps_with_direct_access
    = generate_jumps | generate_with_direct_access,

  /* As for generate_calls_with_icache but applies to jumping code */

  generate_jumps_with_icache
    = generate_jumps | generate_with_icache,

  /* As for generate_calls_with_semantic_icache but applies to jumping
     code */

  generate_jumps_with_semantic_icache
    = generate_jumps_with_icache | generate_with_semantic_icache,

  /* As for generate_calls_with_direct_access */

  generate_jumps_with_direct_access_icache
    = generate_jumps_with_icache | generate_with_direct_access,

  generate_jumps_with_direct_access_semantic_icache
    = generate_jumps_with_direct_access_icache | generate_with_semantic_icache,

} igen_code;

extern igen_code code;




extern int icache_size;


/* Instruction expansion?

   Should the semantic code for each instruction, when the opportunity
   arrises, be expanded according to the variable opcode files that
   the instruction decode process renders constant */

extern int generate_expanded_instructions;


/* SMP?

   Should the generated code include SMP support (>0) and if so, for
   how many processors? */

extern int generate_smp;




/* Misc junk */



/* Function header definitions */


/* Cache functions: */

#define ICACHE_FUNCTION_FORMAL \
"cpu *processor,\n\
 instruction_word instruction,\n\
 unsigned_word cia,\n\
 idecode_cache *cache_entry"

#define ICACHE_FUNCTION_ACTUAL "processor, instruction, cia, cache_entry"

#define ICACHE_FUNCTION_TYPE \
((code & generate_with_semantic_icache) \
 ? SEMANTIC_FUNCTION_TYPE \
 : "idecode_semantic *")


/* Semantic functions: */

#define SEMANTIC_FUNCTION_FORMAL \
((code & generate_with_icache) \
 ? "cpu *processor,\n idecode_cache *cache_entry,\n unsigned_word cia" \
 : "cpu *processor,\n instruction_word instruction,\n unsigned_word cia")

#define SEMANTIC_FUNCTION_ACTUAL \
((code & generate_with_icache) \
 ? "processor, instruction, cia, cache_entry" \
 : "processor, instruction, cia")

#define SEMANTIC_FUNCTION_TYPE "unsigned_word"



extern void print_my_defines
(lf *file,
 insn_bits *expanded_bits,
 table_entry *file_entry);

extern void print_itrace
(lf *file,
 table_entry *file_entry,
 int idecode);


typedef enum {
  function_name_prefix_semantics,
  function_name_prefix_idecode,
  function_name_prefix_itable,
  function_name_prefix_icache,
  function_name_prefix_none
} lf_function_name_prefixes;

extern int print_function_name
(lf *file,
 const char *basename,
 insn_bits *expanded_bits,
 lf_function_name_prefixes prefix);
