decode_table * load_decode_table(char *file_name, int hi_bit_nr) { table *file = table_open(file_name, nr_decode_fields, 0); table_entry *entry; decode_table *table = NULL; decode_table **curr_rule = &table; while ((entry = table_entry_read(file)) != NULL) { decode_table *new_rule = ZALLOC(decode_table); new_rule->type = name2i(entry->fields[op_options], decode_type_map); new_rule->gen = (overriding_gen_type != invalid_gen ? overriding_gen_type : name2i(entry->fields[op_options], decode_gen_map)); new_rule->force_slash = name2i(entry->fields[op_options], decode_slash_map); new_rule->first = target_a2i(hi_bit_nr, entry->fields[op_first]); new_rule->last = target_a2i(hi_bit_nr, entry->fields[op_last]); new_rule->force_first = (strlen(entry->fields[op_force_first]) ? target_a2i(hi_bit_nr, entry->fields[op_force_first]) : new_rule->last + 1); new_rule->force_last = (strlen(entry->fields[op_force_last]) ? target_a2i(hi_bit_nr, entry->fields[op_force_last]) : new_rule->first - 1); new_rule->force_expansion = entry->fields[op_force_expansion]; new_rule->special_mask = a2i(entry->fields[op_special_mask]); new_rule->special_value = a2i(entry->fields[op_special_value]); new_rule->special_constant = a2i(entry->fields[op_special_constant]); *curr_rule = new_rule; curr_rule = &new_rule->next; } return table; }
insn_table * load_insn_table(const char *file_name, decode_table *decode_rules, filter *filters) { table *file = table_open(file_name, nr_insn_table_fields, nr_insn_model_table_fields); insn_table *table = ZALLOC(insn_table); table_entry *file_entry; table->opcode_rule = decode_rules; while ((file_entry = table_entry_read(file)) != NULL) { if (it_is("function", file_entry->fields[insn_flags]) || it_is("internal", file_entry->fields[insn_flags])) { insn_table_insert_function(table, file_entry); } else if (it_is("model", file_entry->fields[insn_flags])) { model_table_insert(table, file_entry); } else if (it_is("model-macro", file_entry->fields[insn_flags])) { model_table_insert_specific(table, file_entry, &model_macros, &last_model_macro); } else if (it_is("model-function", file_entry->fields[insn_flags])) { model_table_insert_specific(table, file_entry, &model_functions, &last_model_function); } else if (it_is("model-internal", file_entry->fields[insn_flags])) { model_table_insert_specific(table, file_entry, &model_internal, &last_model_internal); } else if (it_is("model-static", file_entry->fields[insn_flags])) { model_table_insert_specific(table, file_entry, &model_static, &last_model_static); } else if (it_is("model-data", file_entry->fields[insn_flags])) { model_table_insert_specific(table, file_entry, &model_data, &last_model_data); } else { insn_fields *fields; /* skip instructions that aren't relevant to the mode */ if (is_filtered_out(file_entry->fields[insn_flags], filters)) { fprintf(stderr, "Dropping %s - %s\n", file_entry->fields[insn_name], file_entry->fields[insn_flags]); } else { /* create/insert the new instruction */ fields = parse_insn_format(file_entry, file_entry->fields[insn_format]); insn_table_insert_insn(table, file_entry, fields); } } } return table; }