| /* 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 refering 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 oportunity | |
| 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); |