static void gen_icache_h(insn_table *table, lf *file, igen_code generate) { lf_printf(file, "typedef %s idecode_icache\n(%s);\n", ICACHE_FUNCTION_TYPE, ICACHE_FUNCTION_FORMAL); lf_printf(file, "\n"); if ((code & generate_calls) && (code & generate_with_icache)) { insn_table_traverse_function(table, file, NULL, print_icache_internal_function_declaration); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, NULL, 1, NULL, /* start */ print_icache_declaration, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, NULL, print_icache_declaration); } else { lf_print__this_file_is_empty(file); } }
static void gen_semantics_h(insn_table *table, lf *file, igen_code generate) { lf_printf(file, "typedef %s idecode_semantic\n(%s);\n", SEMANTIC_FUNCTION_TYPE, SEMANTIC_FUNCTION_FORMAL); lf_printf(file, "\n"); if ((code & generate_calls)) { lf_printf(file, "extern int option_mpc860c0;\n"); lf_printf(file, "#define PAGE_SIZE 0x1000\n"); lf_printf(file, "\n"); lf_printf(file, "PSIM_EXTERN_SEMANTICS(void)\n"); lf_printf(file, "semantic_init(device* root);\n"); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, NULL, 1, NULL, /* start */ print_semantic_declaration, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, NULL, print_semantic_declaration); } else { lf_print__this_file_is_empty(file); } }
int insn_table_depth(insn_table *table) { int depth = 0; insn_table_traverse_tree(table, NULL, &depth, 1, NULL, /*start*/ update_depth, NULL, /*end*/ NULL); /*padding*/ return depth; }
extern void insn_table_traverse_tree(insn_table *table, lf *file, void *data, int depth, leaf_handler *start, insn_handler *leaf, leaf_handler *end, padding_handler *padding) { insn_table *entry; int entry_nr; ASSERT(table != NULL && table->opcode != NULL && table->nr_entries > 0 && table->entries != 0); if (start != NULL && depth >= 0) start(table, file, data, depth); for (entry_nr = 0, entry = table->entries; entry_nr < (table->opcode->is_boolean ? 2 : (1 << (table->opcode->last - table->opcode->first + 1))); entry_nr ++) { if (entry == NULL || (!table->opcode->is_boolean && entry_nr < entry->opcode_nr)) { if (padding != NULL && depth >= 0) padding(table, file, data, depth, entry_nr); } else { ASSERT(entry != NULL && (entry->opcode_nr == entry_nr || table->opcode->is_boolean)); if (entry->opcode != NULL && depth != 0) { insn_table_traverse_tree(entry, file, data, depth+1, start, leaf, end, padding); } else if (depth >= 0) { if (leaf != NULL) leaf(entry, file, data, entry->insns, depth); } entry = entry->sibling; } } if (end != NULL && depth >= 0) end(table, file, data, depth); }
static void gen_semantics_c(insn_table *table, cache_table *cache_rules, lf *file, igen_code generate) { if ((code & generate_calls)) { 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, "#ifdef HAVE_COMMON_FPU\n"); lf_printf(file, "#include \"sim-inline.h\"\n"); lf_printf(file, "#include \"sim-fpu.h\"\n"); lf_printf(file, "#endif\n"); lf_printf(file, "#include \"support.h\"\n"); lf_printf(file, "\n"); lf_printf(file, "int option_mpc860c0 = 0;\n"); lf_printf(file, "\n"); lf_printf(file, "PSIM_EXTERN_SEMANTICS(void)\n"); lf_printf(file, "semantic_init(device* root)\n"); lf_printf(file, "{\n"); lf_printf(file, " option_mpc860c0 = 0;\n"); lf_printf(file, " if (tree_find_property(root, \"/options/mpc860c0\"))\n"); lf_printf(file, " option_mpc860c0 = tree_find_integer_property(root, \"/options/mpc860c0\");\n"); lf_printf(file, " option_mpc860c0 *= 4; /* convert word count to byte count */\n"); lf_printf(file, "}\n"); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, cache_rules, 1, NULL, /* start */ print_semantic_definition, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, cache_rules, print_semantic_definition); } else { lf_print__this_file_is_empty(file); } }
static void gen_icache_c(insn_table *table, cache_table *cache_rules, lf *file, igen_code generate) { /* output `internal' invalid/floating-point unavailable functions where needed */ if ((code & generate_calls) && (code & generate_with_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, "#ifdef HAVE_COMMON_FPU\n"); lf_printf(file, "#include \"sim-inline.h\"\n"); lf_printf(file, "#include \"sim-fpu.h\"\n"); lf_printf(file, "#endif\n"); lf_printf(file, "#include \"support.h\"\n"); lf_printf(file, "\n"); insn_table_traverse_function(table, file, NULL, print_icache_internal_function_definition); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, cache_rules, 1, NULL, /* start */ print_icache_definition, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, cache_rules, print_icache_definition); } else { lf_print__this_file_is_empty(file); } }