void print_itrace(lf *file, table_entry *file_entry, int idecode) { lf_print__external_reference(file, file_entry->line_nr, file_entry->file_name); lf_printf(file, "ITRACE(trace_%s, (\"%s %s\\n\"));\n", (idecode ? "idecode" : "semantics"), (idecode ? "idecode" : "semantics"), file_entry->fields[insn_name]); lf_print__internal_reference(file); }
static void print_icache_extraction(lf *file, insn *instruction, const char *entry_name, const char *entry_type, const char *entry_expression, const char *original_name, const char *file_name, int line_nr, insn_field *cur_field, insn_bits *bits, icache_decl_type what_to_declare, icache_body_type what_to_do, const char *reason) { const char *expression; ASSERT(entry_name != NULL); /* Define a storage area for the cache element */ if (what_to_declare == undef_variables) { /* We've finished with the value - destory it */ lf_indent_suppress(file); lf_printf(file, "#undef %s\n", entry_name); return; } else if (what_to_declare == define_variables) { lf_indent_suppress(file); lf_printf(file, "#define %s ", entry_name); } else { if (file_name != NULL) lf_print__external_reference(file, line_nr, file_name); lf_printf(file, "%s const %s UNUSED = ", entry_type == NULL ? "unsigned" : entry_type, entry_name); } /* define a value for that storage area as determined by what is in the cache */ if (bits != NULL && strcmp(entry_name, cur_field->val_string) == 0 && ((bits->opcode->is_boolean && bits->value == 0) || (!bits->opcode->is_boolean))) { /* The simple field has been made constant (as a result of expanding instructions or similar). Remember that for a boolean field, value is either 0 (implying the required boolean_constant) or nonzero (implying some other value and handled later below) - Define the variable accordingly */ expression = "constant field"; ASSERT(bits->field == cur_field); ASSERT(entry_type == NULL); if (bits->opcode->is_boolean) lf_printf(file, "%d", bits->opcode->boolean_constant); else if (bits->opcode->last < bits->field->last) lf_printf(file, "%d", bits->value << (bits->field->last - bits->opcode->last)); else lf_printf(file, "%d", bits->value); } else if (bits != NULL && original_name != NULL && strncmp(entry_name, original_name, strlen(original_name)) == 0 && strncmp(entry_name + strlen(original_name), "_is_", strlen("_is_")) == 0 && ((bits->opcode->is_boolean && (atol(entry_name + strlen(original_name) + strlen("_is_")) == bits->opcode->boolean_constant)) || (!bits->opcode->is_boolean))) { expression = "constant compare"; /* An entry, derived from ORIGINAL_NAME, is testing to see of the ORIGINAL_NAME has a specific constant value. That value matching a boolean or constant field */ if (bits->opcode->is_boolean) lf_printf(file, "%d /* %s == %d */", bits->value == 0, original_name, bits->opcode->boolean_constant); else if (bits->opcode->last < bits->field->last) lf_printf(file, "%d /* %s == %d */", (atol(entry_name + strlen(original_name) + strlen("_is_")) == (bits->value << (bits->field->last - bits->opcode->last))), original_name, (bits->value << (bits->field->last - bits->opcode->last))); else lf_printf(file, "%d /* %s == %d */", (atol(entry_name + strlen(original_name) + strlen("_is_")) == bits->value), original_name, bits->value); } else { /* put the field in the local variable, possibly also enter it into the cache */ expression = "extraction"; /* handle the cache */ if ((what_to_do & get_values_from_icache) || (what_to_do & put_values_in_icache)) { lf_printf(file, "cache_entry->crack.%s.%s", instruction->file_entry->fields[insn_form], entry_name); if (what_to_do & put_values_in_icache) /* also put it in the cache? */ lf_printf(file, " = "); } if ((what_to_do & put_values_in_icache) || what_to_do == do_not_use_icache) { if (cur_field != NULL && strcmp(entry_name, cur_field->val_string) == 0) lf_printf(file, "EXTRACTED32(instruction, %d, %d)", i2target(hi_bit_nr, cur_field->first), i2target(hi_bit_nr, cur_field->last)); else if (entry_expression != NULL) lf_printf(file, "%s", entry_expression); else lf_printf(file, "eval_%s", entry_name); } } if (!((what_to_declare == define_variables) || (what_to_declare == undef_variables))) lf_printf(file, ";"); if (reason != NULL) lf_printf(file, " /* %s - %s */", reason, expression); lf_printf(file, "\n"); }