void gen_support_c (lf *file, insn_table *table) { lf_printf (file, "#include \"sim-main.h\"\n"); lf_printf (file, "#include \"%sidecode.h\"\n", options.module.idecode.prefix.l); lf_printf (file, "#include \"%sitable.h\"\n", options.module.itable.prefix.l); lf_printf (file, "#include \"%ssupport.h\"\n", options.module.support.prefix.l); lf_printf (file, "\n"); /* output a definition (c-code) for all functions */ function_entry_traverse (file, table->functions, support_c_function, NULL); }
static void gen_icache_h (lf *file, insn_list *semantic, function_entry *functions, int max_nr_words) { int word_nr; for (word_nr = 0; word_nr <= max_nr_words; word_nr++) { lf_printf (file, "typedef "); print_icache_function_type(file); lf_printf (file, " %sidecode_icache_%d\n(", options.module.global.prefix.l, word_nr); print_icache_function_formal(file, word_nr); lf_printf (file, ");\n"); lf_printf (file, "\n"); } if (options.gen.code == generate_calls && options.gen.icache) { function_entry_traverse (file, functions, print_icache_internal_function_declaration, NULL); while (semantic != NULL) { print_icache_declaration (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, semantic->nr_prefetched_words); semantic = semantic->next; } } else { lf_print__this_file_is_empty (file, "generating jump engine"); } }
static void gen_icache_c (lf *file, insn_list *semantic, function_entry *functions, cache_entry *cache_rules) { /* output `internal' invalid/floating-point unavailable functions where needed */ if (options.gen.code == generate_calls && options.gen.icache) { lf_printf (file, "\n"); lf_printf (file, "#include \"cpu.h\"\n"); lf_printf (file, "#include \"idecode.h\"\n"); lf_printf (file, "#include \"semantics.h\"\n"); lf_printf (file, "#include \"icache.h\"\n"); lf_printf (file, "#include \"support.h\"\n"); lf_printf (file, "\n"); function_entry_traverse (file, functions, print_icache_internal_function_definition, NULL); lf_printf (file, "\n"); while (semantic != NULL) { print_icache_definition (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, cache_rules, semantic->nr_prefetched_words); semantic = semantic->next; } } else { lf_print__this_file_is_empty (file, "generating jump engine"); } }
extern void gen_support_h (lf *file, insn_table *table) { /* output the definition of `SD_' */ if (options.gen.smp) { lf_printf (file, "#define SD CPU_STATE (cpu)\n"); lf_printf (file, "#define CPU cpu\n"); lf_printf (file, "#define CPU_ cpu\n"); } else { lf_printf (file, "#define SD sd\n"); lf_printf (file, "#define CPU (STATE_CPU (sd, 0))\n"); lf_printf (file, "#define CPU_ sd\n"); } lf_printf (file, "#define CIA_ cia\n"); if (options.gen.delayed_branch) { lf_printf (file, "#define CIA cia.ip\n"); lf_printf (file, "/* #define NIA nia.dp -- do not define, ambigious */\n"); } else { lf_printf (file, "#define CIA cia\n"); lf_printf (file, "#define NIA nia\n"); } lf_printf (file, "\n"); lf_printf (file, "#define SD_ CPU_, CIA_, MY_INDEX\n"); lf_printf (file, "#define _SD SD_ /* deprecated */\n"); lf_printf (file, "\n"); /* Map <PREFIX>_xxxx onto the shorter xxxx for the following names: instruction_word idecode_issue semantic_illegal Map defined here as name space problems are created when the name is defined in idecode.h */ if (strcmp (options.module.idecode.prefix.l, "") != 0) { lf_indent_suppress (file); lf_printf (file, "#define %s %s%s\n", "instruction_word", options.module.idecode.prefix.l, "instruction_word"); lf_printf (file, "\n"); lf_indent_suppress (file); lf_printf (file, "#define %s %s%s\n", "idecode_issue", options.module.idecode.prefix.l, "idecode_issue"); lf_printf (file, "\n"); lf_indent_suppress (file); lf_printf (file, "#define %s %s%s\n", "semantic_illegal", options.module.idecode.prefix.l, "semantic_illegal"); lf_printf (file, "\n"); } /* output a declaration for all functions */ function_entry_traverse (file, table->functions, support_h_function, NULL); lf_printf (file, "\n"); lf_printf (file, "#if defined(SUPPORT_INLINE)\n"); lf_printf (file, "# if ((SUPPORT_INLINE & INCLUDE_MODULE)\\\n"); lf_printf (file, " && (SUPPORT_INLINE & INCLUDED_BY_MODULE))\n"); lf_printf (file, "# include \"%ssupport.c\"\n", options.module.support.prefix.l); lf_printf (file, "# endif\n"); lf_printf (file, "#endif\n"); }