/* This file is part of the program psim.
- Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
+ Copyright (C) 1994-1998, 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
{
nr += lf_printf (file, "SIM_DESC sd,\n");
nr += lf_printf (file, "%sidecode_cache *cache_entry,\n",
- options.prefix.global.name);
+ options.module.global.prefix.l);
nr += lf_printf (file, "%sinstruction_address cia",
- options.prefix.global.name);
+ options.module.global.prefix.l);
}
else if (options.gen.smp)
{
for (word_nr = 0; word_nr < nr_prefetched_words; word_nr++)
{
nr += lf_printf (file, "%sinstruction_word instruction_%d,\n",
- options.prefix.global.name,
+ options.module.global.prefix.l,
word_nr);
}
nr += lf_printf (file, "%sinstruction_address cia",
- options.prefix.global.name);
+ options.module.global.prefix.l);
}
else
{
for (word_nr = 0; word_nr < nr_prefetched_words; word_nr++)
{
nr += lf_printf (file, "%sinstruction_word instruction_%d,\n",
- options.prefix.global.name,
+ options.module.global.prefix.l,
word_nr);
}
nr += lf_printf (file, "%sinstruction_address cia",
- options.prefix.global.name);
+ options.module.global.prefix.l);
}
return nr;
}
{
int nr = 0;
nr += lf_printf (file, "%sinstruction_address",
- options.prefix.global.name);
+ options.module.global.prefix.l);
return nr;
}
nr += lf_printf (file, "SIM_DESC sd,\n");
for (word_nr = 0; word_nr < nr_prefetched_words; word_nr++)
nr += lf_printf (file, " %sinstruction_word instruction_%d,\n",
- options.prefix.global.name, word_nr);
+ options.module.global.prefix.l, word_nr);
nr += lf_printf (file, " %sinstruction_address cia,\n",
- options.prefix.global.name);
+ options.module.global.prefix.l);
nr += lf_printf (file, " %sidecode_cache *cache_entry",
- options.prefix.global.name);
+ options.module.global.prefix.l);
return nr;
}
else
{
nr = lf_printf (file, "%sidecode_semantic *",
- options.prefix.global.name);
+ options.module.global.prefix.l);
}
return nr;
}
switch (prefix)
{
case function_name_prefix_semantics:
- nr += lf_printf (file, "%s", options.prefix.semantics.name);
+ nr += lf_printf (file, "%s", options.module.semantics.prefix.l);
nr += lf_printf (file, "semantic_");
break;
case function_name_prefix_idecode:
- nr += lf_printf (file, "%s", options.prefix.idecode.name);
+ nr += lf_printf (file, "%s", options.module.idecode.prefix.l);
nr += lf_printf (file, "idecode_");
break;
case function_name_prefix_itable:
- nr += lf_printf (file, "%sitable_", options.prefix.itable.name);
+ nr += lf_printf (file, "%sitable_", options.module.itable.prefix.l);
break;
case function_name_prefix_icache:
- nr += lf_printf (file, "%s", options.prefix.icache.name);
+ nr += lf_printf (file, "%s", options.module.icache.prefix.l);
nr += lf_printf (file, "icache_");
break;
case function_name_prefix_engine:
- nr += lf_printf (file, "%s", options.prefix.engine.name);
+ nr += lf_printf (file, "%s", options.module.engine.prefix.l);
nr += lf_printf (file, "engine_");
default:
break;
nr += lf_printf (file, "_");
}
+ /* the function name */
+ nr += print_c_name (file, basename);
+
/* the format name if available */
if (format_name != NULL)
{
- nr += print_c_name (file, format_name);
nr += lf_printf (file, "_");
+ nr += print_c_name (file, format_name);
}
- /* the function name */
- nr += print_c_name (file, basename);
-
/* the suffix */
nr += print_opcode_bits (file, expanded_bits);
static int
-print_itrace_prefix (lf *file,
- const char *phase_lc)
+print_itrace_prefix (lf *file)
{
- const char *prefix = "trace_one_insn (";
+ const char *prefix = "trace_prefix (";
int indent = strlen (prefix);
- lf_printf (file, "%sSD, CPU, %s, TRACE_LINENUM_P (CPU),\n",
- prefix, (options.gen.delayed_branch ? "cia.ip" : "cia"));
+ lf_printf (file, "%sSD, CPU, cia, CIA, TRACE_LINENUM_P (CPU), \\\n", prefix);
lf_indent (file, +indent);
- lf_printf (file, "%sitable[MY_INDEX].file,\n", options.prefix.itable.name);
- lf_printf (file, "%sitable[MY_INDEX].line_nr,\n", options.prefix.itable.name);
- lf_printf (file, "\"%s\",\n", phase_lc);
- lf_printf (file, "\"%%-18s - ");
+ lf_printf (file, "%sitable[MY_INDEX].file, \\\n", options.module.itable.prefix.l);
+ lf_printf (file, "%sitable[MY_INDEX].line_nr, \\\n", options.module.itable.prefix.l);
+ lf_printf (file, "\"");
return indent;
}
print_itrace_format (lf *file,
insn_mnemonic_entry *assembler)
{
- /* pass=1 is fmt string; pass=2 is is arguments */
+ /* pass=1 is fmt string; pass=2 is arguments */
int pass;
/* print the format string */
for (pass = 1; pass <= 2; pass++)
{
const char *chp = assembler->format;
chp++; /* skip the leading quote */
- /* prefix the format with the insn `name' */
- if (pass == 2)
- {
- lf_printf (file, ",\n");
- lf_printf (file, "%sitable[MY_INDEX].name", options.prefix.itable.name);
- }
/* write out the format/args */
while (*chp != '\0')
{
chp++;
/* now process it */
if (pass == 2)
- lf_printf (file, ",\n");
+ lf_printf (file, ", \\\n");
if (strncmp (fmt, "<", 1) == 0)
/* implicit long int format */
{
lf_printf (file, "%%s");
else
{
- lf_printf (file, "%sstr_", options.prefix.global.name);
+ lf_printf (file, "%sstr_", options.module.global.prefix.l);
lf_write (file, func, strlen_func);
lf_printf (file, " (SD_, ");
lf_write (file, param, strlen_param);
insn_entry *insn,
int idecode)
{
+ /* NB: Here we escape each EOLN. This is so that the the compiler
+ treats a trace function call as a single line. Consequently any
+ errors in the line are refered back to the same igen assembler
+ source line */
const char *phase = (idecode) ? "DECODE" : "INSN";
- const char *phase_lc = (idecode) ? "decode" : "insn";
lf_printf (file, "\n");
lf_indent_suppress (file);
lf_printf (file, "#if defined (WITH_TRACE)\n");
- lf_printf (file, "/* trace the instructions execution if enabled */\n");
- lf_printf (file, "if (TRACE_%s_P (CPU)) {\n", phase);
- lf_indent (file, +2);
- if (insn->mnemonics != NULL)
- {
- insn_mnemonic_entry *assembler = insn->mnemonics;
- int is_first = 1;
- do
- {
- if (assembler->condition != NULL)
- {
- int indent;
- lf_printf (file, "%sif (%s)\n",
- is_first ? "" : "else ",
- assembler->condition);
- lf_indent (file, +2);
- indent = print_itrace_prefix (file, phase_lc);
- print_itrace_format (file, assembler);
- lf_indent (file, -indent);
- lf_indent (file, -2);
- if (assembler->next == NULL)
- error (assembler->line, "Missing final unconditional assembler\n");
- }
- else
- {
- int indent;
- if (!is_first)
- {
- lf_printf (file, "else\n");
- lf_indent (file, +2);
- }
- indent = print_itrace_prefix (file, phase_lc);
- print_itrace_format (file, assembler);
- lf_indent (file, -indent);
- if (!is_first)
+ lf_printf (file, "/* generate a trace prefix if any tracing enabled */\n");
+ lf_printf (file, "if (TRACE_ANY_P (CPU))\n");
+ lf_printf (file, " {\n");
+ lf_indent (file, +4);
+ {
+ if (insn->mnemonics != NULL)
+ {
+ insn_mnemonic_entry *assembler = insn->mnemonics;
+ int is_first = 1;
+ do
+ {
+ if (assembler->condition != NULL)
+ {
+ int indent;
+ lf_printf (file, "%sif (%s)\n",
+ is_first ? "" : "else ",
+ assembler->condition);
+ lf_indent (file, +2);
+ lf_print__line_ref (file, assembler->line);
+ indent = print_itrace_prefix (file);
+ print_itrace_format (file, assembler);
+ lf_print__internal_ref (file);
+ lf_indent (file, -indent);
lf_indent (file, -2);
- if (assembler->next != NULL)
- error (assembler->line, "Unconditional assembler is not last\n");
- }
- is_first = 0;
- assembler = assembler->next;
- }
- while (assembler != NULL);
- }
- else
- {
- int indent = print_itrace_prefix (file, phase_lc);
- lf_printf (file, "?\",\n");
- lf_printf (file, "itable[MY_INDEX].name);\n");
- lf_indent (file, -indent);
- }
- lf_indent (file, -2);
- lf_printf (file, "}\n");
+ if (assembler->next == NULL)
+ error (assembler->line, "Missing final unconditional assembler\n");
+ }
+ else
+ {
+ int indent;
+ if (!is_first)
+ {
+ lf_printf (file, "else\n");
+ lf_indent (file, +2);
+ }
+ lf_print__line_ref (file, assembler->line);
+ indent = print_itrace_prefix (file);
+ print_itrace_format (file, assembler);
+ lf_print__internal_ref (file);
+ lf_indent (file, -indent);
+ if (!is_first)
+ lf_indent (file, -2);
+ if (assembler->next != NULL)
+ error (assembler->line, "Unconditional assembler is not last\n");
+ }
+ is_first = 0;
+ assembler = assembler->next;
+ }
+ while (assembler != NULL);
+ }
+ else
+ {
+ int indent;
+ lf_indent (file, +2);
+ lf_print__line_ref (file, insn->line);
+ indent = print_itrace_prefix (file);
+ lf_printf (file, "%%s\", \\\n");
+ lf_printf (file, "itable[MY_INDEX].name);\n");
+ lf_print__internal_ref (file);
+ lf_indent (file, -indent);
+ lf_indent (file, -2);
+ }
+ lf_printf (file, "/* trace the instruction execution if enabled */\n");
+ lf_printf (file, "if (TRACE_%s_P (CPU))\n", phase);
+ lf_printf (file, " trace_generic (SD, CPU, TRACE_%s_IDX, \" %%s\", itable[MY_INDEX].name);\n", phase);
+ }
+ lf_indent (file, -4);
+ lf_printf (file, " }\n");
lf_indent_suppress (file);
lf_printf (file, "#endif\n");
}
}
+void
+print_include (lf *file,
+ igen_module module)
+{
+ lf_printf (file, "#include \"%s%s.h\"\n", module.prefix.l, module.suffix.l);
+}
+
+void
+print_include_inline (lf *file,
+ igen_module module)
+{
+ lf_printf (file, "#if C_REVEALS_MODULE_P (%s_INLINE)\n", module.suffix.u);
+ lf_printf (file, "#include \"%s%s.c\"\n", module.prefix.l, module.suffix.l);
+ lf_printf (file, "#else\n");
+ print_include (file, module);
+ lf_printf (file, "#endif\n");
+ lf_printf (file, "\n");
+}
+
+void
+print_includes (lf *file)
+{
+ lf_printf (file, "\n");
+ lf_printf (file, "#include \"sim-inline.c\"\n");
+ lf_printf (file, "\n");
+ print_include_inline (file, options.module.itable);
+ print_include_inline (file, options.module.idecode);
+ print_include_inline (file, options.module.support);
+}
+
+
/****************************************************************/
lf_printf (file, "typedef ");
print_semantic_function_type (file);
lf_printf (file, " %sidecode_semantic",
- options.prefix.global.name);
+ options.module.global.prefix.l);
if (word_nr >= 0)
lf_printf (file, "_%d", word_nr);
lf_printf (file, "\n(");
if (options.gen.code == generate_calls)
{
insn_list *semantic;
+ print_includes (file);
+ print_include (file, options.module.semantics);
lf_printf (file, "\n");
- lf_printf (file, "#include \"sim-main.h\"\n");
- lf_printf (file, "#include \"%sitable.h\"\n",
- options.prefix.itable.name);
- lf_printf (file, "#include \"%sidecode.h\"\n",
- options.prefix.idecode.name);
- lf_printf (file, "#include \"%ssemantics.h\"\n",
- options.prefix.semantics.name);
- lf_printf (file, "#include \"%ssupport.h\"\n",
- options.prefix.support.name);
- lf_printf (file, "\n");
+
for (semantic = semantics; semantic != NULL; semantic = semantic->next)
{
/* Ignore any special/internal instructions */
lf_printf (file, "typedef ");
print_icache_function_type(file);
lf_printf (file, " %sidecode_icache_%d\n(",
- options.prefix.global.name,
+ options.module.global.prefix.l,
word_nr);
print_icache_function_formal(file, word_nr);
lf_printf (file, ");\n");
cache_entry *cache_rules)
{
lf_printf (file, "typedef unsigned%d %sinstruction_word;\n",
- options.insn_bit_size, options.prefix.global.name);
+ options.insn_bit_size, options.module.global.prefix.l);
if (options.gen.delayed_branch)
{
lf_printf (file, "typedef struct _%sinstruction_address {\n",
- options.prefix.global.name);
+ options.module.global.prefix.l);
lf_printf (file, " address_word ip; /* instruction pointer */\n");
lf_printf (file, " address_word dp; /* delayed-slot pointer */\n");
- lf_printf (file, "} %sinstruction_address;\n", options.prefix.global.name);
+ lf_printf (file, "} %sinstruction_address;\n", options.module.global.prefix.l);
}
else
{
lf_printf (file, "typedef address_word %sinstruction_address;\n",
- options.prefix.global.name);
+ options.module.global.prefix.l);
}
if (options.gen.nia == nia_is_invalid
- && strlen (options.prefix.global.uname) > 0)
+ && strlen (options.module.global.prefix.u) > 0)
{
lf_indent_suppress (file);
lf_printf (file, "#define %sINVALID_INSTRUCTION_ADDRESS ",
- options.prefix.global.uname);
+ options.module.global.prefix.u);
lf_printf (file, "INVALID_INSTRUCTION_ADDRESS\n");
}
lf_printf (file, "\n");
for (entry = gen->tables; entry != NULL; entry = entry->next)
{
print_idecode_issue_function_header (file,
- entry->processor,
- 0/*is definition*/,
+ (options.gen.multi_sim
+ ? entry->model->name
+ : NULL),
+ is_function_declaration,
+ 1/*ALWAYS ONE WORD*/);
+ }
+ if (options.gen.multi_sim)
+ {
+ print_idecode_issue_function_header (file,
+ NULL,
+ is_function_variable,
1/*ALWAYS ONE WORD*/);
}
}
cache_entry *cache_rules)
{
/* the intro */
- lf_printf (file, "#include \"sim-main.h\"\n");
- lf_printf (file, "#include \"%sidecode.h\"\n", options.prefix.global.name);
- lf_printf (file, "#include \"%ssemantics.h\"\n", options.prefix.global.name);
- lf_printf (file, "#include \"%sicache.h\"\n", options.prefix.global.name);
- lf_printf (file, "#include \"%ssupport.h\"\n", options.prefix.global.name);
- lf_printf (file, "\n");
+ print_includes (file);
+ print_include_inline (file, options.module.semantics);
lf_printf (file, "\n");
print_idecode_globals (file);
if (!options.gen.icache)
{
print_idecode_issue_function_header (file,
- entry->processor,
+ (options.gen.multi_sim
+ ? entry->model->name
+ : NULL),
1/*is definition*/,
1/*ALWAYS ONE WORD*/);
lf_printf (file, "{\n");
lf_indent (file, +2);
lf_printf (file, "%sinstruction_address nia;\n",
- options.prefix.global.name);
+ options.module.global.prefix.l);
print_idecode_body (file, entry->table, "nia =");
lf_printf (file, "return nia;");
lf_indent (file, -2);
gen_list *entry;
lf_printf (file, "#include \"sim-main.h\"\n");
lf_printf (file, "#include \"engine.h\"\n");
+ lf_printf (file, "#include \"idecode.h\"\n");
lf_printf (file, "#include \"bfd.h\"\n");
lf_printf (file, "\n");
+
+ if (options.gen.multi_sim)
+ {
+ print_idecode_issue_function_header (file, NULL, is_function_variable, 1);
+ lf_printf (file, "\n");
+ print_engine_run_function_header (file, NULL, is_function_variable);
+ lf_printf (file, "\n");
+ }
+
lf_printf (file, "void\n");
lf_printf (file, "sim_engine_run (SIM_DESC sd,\n");
lf_printf (file, " int next_cpu_nr,\n");
+ lf_printf (file, " int nr_cpus,\n");
lf_printf (file, " int siggnal)\n");
lf_printf (file, "{\n");
lf_indent (file, +2);
lf_indent (file, +2);
for (entry = gen->tables; entry != NULL; entry = entry->next)
{
- lf_printf (file, "case bfd_mach_%s:\n", entry->processor);
+ if (options.gen.default_model != NULL
+ && (strcmp (entry->model->name, options.gen.default_model) == 0
+ || strcmp (entry->model->full_name, options.gen.default_model) == 0))
+ lf_printf (file, "default:\n");
+ lf_printf (file, "case bfd_mach_%s:\n", entry->model->full_name);
lf_indent (file, +2);
+ print_function_name (file,
+ "issue",
+ NULL, /* format name */
+ NULL, /* NO processor */
+ NULL, /* expanded bits */
+ function_name_prefix_idecode);
+ lf_printf (file, " = ");
+ print_function_name (file,
+ "issue",
+ NULL, /* format name */
+ entry->model->name,
+ NULL, /* expanded bits */
+ function_name_prefix_idecode);
+ lf_printf (file, ";\n");
+ print_function_name (file,
+ "run",
+ NULL, /* format name */
+ NULL, /* NO processor */
+ NULL, /* expanded bits */
+ function_name_prefix_engine);
+ lf_printf (file, " = ");
print_function_name (file,
"run",
NULL, /* format name */
- entry->processor,
+ entry->model->name,
NULL, /* expanded bits */
function_name_prefix_engine);
- lf_printf (file, " (sd, next_cpu_nr, siggnal);\n");
+ lf_printf (file, ";\n");
+ lf_printf (file, "break;\n");
+ lf_indent (file, -2);
+ }
+ if (options.gen.default_model == NULL)
+ {
+ lf_printf (file, "default:\n");
+ lf_indent (file, +2);
+ lf_printf (file, "sim_engine_abort (sd, NULL, NULL_CIA,\n");
+ lf_printf (file, " \"sim_engine_run - unknown machine\");\n");
lf_printf (file, "break;\n");
lf_indent (file, -2);
}
- lf_printf (file, "default:\n");
- lf_indent (file, +2);
- lf_printf (file, "sim_engine_abort (sd, NULL, NULL_CIA,\n");
- lf_printf (file, " \"sim_engine_run - unknown machine\");\n");
- lf_printf (file, "break;\n");
- lf_indent (file, -2);
lf_indent (file, -2);
lf_printf (file, " }\n");
}
- else
- {
- print_function_name (file,
- "run",
- NULL, /* format name */
- NULL, /* NO processor */
- NULL, /* expanded bits */
- function_name_prefix_engine);
- lf_printf (file, " (sd, next_cpu_nr, siggnal);\n");
- }
+ print_function_name (file,
+ "run",
+ NULL, /* format name */
+ NULL, /* NO processor */
+ NULL, /* expanded bits */
+ function_name_prefix_engine);
+ lf_printf (file, " (sd, next_cpu_nr, nr_cpus, siggnal);\n");
lf_indent (file, -2);
lf_printf (file, "}\n");
}
int ch;
lf *standard_out = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "igen");
- INIT_OPTIONS (options);
+ INIT_OPTIONS ();
if (argc == 1)
{
printf ("\t Set the number of the high (most significant) instruction bit (depreciated).\n");
printf ("\t This option can now be set directly in the instruction table.\n");
printf ("\n");
- printf (" -I <icache-size>\n");
- printf ("\t Specify size of the cracking instruction cache (default %d instructions).\n",
- options.gen.icache_size);
- printf ("\t Implies -G icache.\n");
+ printf (" -I <directory>\n");
+ printf ("\t Add <directory> to the list of directories searched when opening a file\n");
printf ("\n");
printf (" -M <model-list>\n");
printf ("\t Filter out any instructions that do not support at least one of the listed\n");
printf ("\t models (An instructions with no model information is considered to support\n");
- printf ("\n all models.).\n");
+ printf ("\t all models.).\n");
printf ("\n");
printf (" -N <nr-cpus>\n");
printf ("\t Generate a simulator supporting <nr-cpus>\n");
printf ("\n");
printf (" -P <prefix>\n");
printf ("\t Prepend global names (except itable) with the string <prefix>.\n");
- printf ("\t Specify -P <module>=<prefix> to set the <modules> prefix.\n");
+ printf ("\t Specify -P <module>=<prefix> to set a specific <module>'s prefix.\n");
+ printf ("\n");
+ printf (" -S <suffix>\n");
+ printf ("\t Replace a global name (suffix) (except itable) with the string <suffix>.\n");
+ printf ("\t Specify -S <module>=<suffix> to change a specific <module>'s name (suffix).\n");
printf ("\n");
printf (" -Werror\n");
printf ("\t Make warnings errors\n");
+ printf (" -Wnodiscard\n");
+ printf ("\t Suppress warnings about discarded functions and instructions\n");
+ printf (" -Wnowidth\n");
+ printf ("\t Suppress warnings about instructions with invalid widths\n");
+ printf (" -Wnounimplemented\n");
+ printf ("\t Suppress warnings about unimplemented instructions\n");
printf ("\n");
printf (" -G [!]<gen-option>\n");
printf ("\t Any of the following options:\n");
printf ("\t gen-delayed-branch - need both cia and nia passed around\n");
printf ("\t gen-direct-access - use #defines to directly access values\n");
printf ("\t gen-zero-r<N> - arch assumes GPR(<N>) == 0, keep it that way\n");
- printf ("\t gen-icache - generate an instruction cracking cache\n");
+ printf ("\t gen-icache[=<N> - generate an instruction cracking cache of size <N>\n");
+ printf ("\t Default size is %d\n", options.gen.icache_size);
printf ("\t gen-insn-in-icache - save original instruction when cracking\n");
- printf ("\t gen-multi-sim - generate multiple simulators - one per model\n");
+ printf ("\t gen-multi-sim[=MODEL] - generate multiple simulators - one per model\n");
+ printf ("\t If specified MODEL is made the default architecture.\n");
printf ("\t By default, a single simulator that will\n");
printf ("\t execute any instruction is generated\n");
printf ("\t gen-multi-word - generate code allowing for multi-word insns\n");
printf ("\t trace-entries - report entries after a rules application\n");
printf ("\t trace-rule-rejection - report each rule as rejected\n");
printf ("\t trace-rule-selection - report each rule as selected\n");
+ printf ("\t trace-insn-insertion - report each instruction as it is inserted into a decode table\n");
+ printf ("\t trace-rule-expansion - report each instruction as it is expanded (before insertion into a decode table)\n");
+ printf ("\t trace-all - enable all trace options\n");
printf ("\n");
- printf ("\t field-widths - instruction formats specify widths (depreciated)\n");
- printf ("\t By default, an instruction format specifies bit\n");
- printf ("\t positions\n");
- printf ("\t This option can now be set directly in the\n");
- printf ("\t instruction table\n");
- printf ("\t jumps - use jumps instead of function calls\n");
- printf ("\t omit-line-numbers - do not include line number information in the output\n");
+ printf ("\t field-widths - instruction formats specify widths (depreciated)\n");
+ printf ("\t By default, an instruction format specifies bit\n");
+ printf ("\t positions\n");
+ printf ("\t This option can now be set directly in the\n");
+ printf ("\t instruction table\n");
+ printf ("\t jumps - use jumps instead of function calls\n");
+ printf ("\t omit-line-numbers - do not include line number information in the output\n");
printf ("\n");
printf ("Input options:\n");
printf ("\n");
break;
case 'I':
- options.gen.icache_size = a2i (optarg);
- options.gen.icache = 1;
+ {
+ table_include **dir = &options.include;
+ while ((*dir) != NULL)
+ dir = &(*dir)->next;
+ (*dir) = ZALLOC (table_include);
+ (*dir)->dir = strdup (optarg);
+ }
break;
case 'B':
break;
case 'P':
+ case 'S':
{
- igen_prefix_name *names;
+ igen_module *names;
+ igen_name *name;
char *chp;
chp = strchr (optarg, '=');
if (chp == NULL)
{
- names = &options.prefix.global;
+ names = &options.module.global;
chp = optarg;
}
else
{
chp = chp + 1; /* skip `=' */
+ names = NULL;
if (strncmp (optarg, "global=", chp - optarg) == 0)
{
- names = &options.prefix.global;
+ names = &options.module.global;
}
if (strncmp (optarg, "engine=", chp - optarg) == 0)
{
- names = &options.prefix.engine;
+ names = &options.module.engine;
}
if (strncmp (optarg, "icache=", chp - optarg) == 0)
{
- names = &options.prefix.icache;
+ names = &options.module.icache;
}
if (strncmp (optarg, "idecode=", chp - optarg) == 0)
{
- names = &options.prefix.idecode;
+ names = &options.module.idecode;
}
if (strncmp (optarg, "itable=", chp - optarg) == 0)
{
- names = &options.prefix.itable;
+ names = &options.module.itable;
}
if (strncmp (optarg, "semantics=", chp - optarg) == 0)
{
- names = &options.prefix.semantics;
+ names = &options.module.semantics;
}
if (strncmp (optarg, "support=", chp - optarg) == 0)
{
- names = &options.prefix.support;
+ names = &options.module.support;
}
- else
+ if (names == NULL)
{
- names = NULL;
error (NULL, "Prefix `%s' unreconized\n", optarg);
}
}
- names->name = strdup (chp);
- names->uname = strdup (chp);
- chp = names->uname;
+ switch (ch)
+ {
+ case 'P':
+ name = &names->prefix;
+ break;
+ case 'S':
+ name = &names->suffix;
+ break;
+ }
+ name->u = strdup (chp);
+ name->l = strdup (chp);
+ chp = name->u;
while (*chp) {
if (islower(*chp))
*chp = toupper(*chp);
chp++;
}
- if (names == &options.prefix.global)
+ if (name == &options.module.global.prefix)
+ {
+ options.module.engine.prefix = options.module.global.prefix;
+ options.module.icache.prefix = options.module.global.prefix;
+ options.module.idecode.prefix = options.module.global.prefix;
+ /* options.module.itable.prefix = options.module.global.prefix; */
+ options.module.semantics.prefix = options.module.global.prefix;
+ options.module.support.prefix = options.module.global.prefix;
+ }
+ if (name == &options.module.global.suffix)
{
- options.prefix.engine = options.prefix.global;
- options.prefix.icache = options.prefix.global;
- options.prefix.idecode = options.prefix.global;
- /* options.prefix.itable = options.prefix.global; */
- options.prefix.semantics = options.prefix.global;
- options.prefix.support = options.prefix.global;
+ options.module.engine.suffix = options.module.global.suffix;
+ options.module.icache.suffix = options.module.global.suffix;
+ options.module.idecode.suffix = options.module.global.suffix;
+ /* options.module.itable.suffix = options.module.global.suffix; */
+ options.module.semantics.suffix = options.module.global.suffix;
+ options.module.support.suffix = options.module.global.suffix;
}
break;
}
{
if (strcmp (optarg, "error") == 0)
options.warning = error;
+ else if (strcmp (optarg, "nodiscard") == 0)
+ options.warn.discard = 0;
+ else if (strcmp (optarg, "discard") == 0)
+ options.warn.discard = 1;
+ else if (strcmp (optarg, "nowidth") == 0)
+ options.warn.width = 0;
+ else if (strcmp (optarg, "width") == 0)
+ options.warn.width = 1;
+ else if (strcmp (optarg, "nounimplemented") == 0)
+ options.warn.unimplemented = 0;
+ else if (strcmp (optarg, "unimplemented") == 0)
+ options.warn.unimplemented = 1;
else
error (NULL, "Unknown -W argument `%s'\n", optarg);
break;
case 'G':
- if (strcmp (optarg, "decode-duplicate") == 0)
- {
- options.decode.duplicate = 1;
- }
- else if (strcmp (optarg, "decode-combine") == 0)
- {
- options.decode.combine = 1;
- }
- else if (strcmp (optarg, "decode-zero-reserved") == 0)
- {
- options.decode.zero_reserved = 1;
- }
-
- else if (strcmp (optarg, "gen-conditional-issue") == 0)
- {
- options.gen.conditional_issue = 1;
- }
- else if (strcmp (optarg, "conditional-issue") == 0)
- {
- options.gen.conditional_issue = 1;
- options.warning (NULL, "Option conditional-issue replaced by gen-conditional-issue\n");
- }
- else if (strcmp (optarg, "gen-delayed-branch") == 0)
- {
- options.gen.delayed_branch = 1;
- }
- else if (strcmp (optarg, "delayed-branch") == 0)
- {
- options.gen.delayed_branch = 1;
- options.warning (NULL, "Option delayed-branch replaced by gen-delayed-branch\n");
- }
- else if (strcmp (optarg, "gen-direct-access") == 0)
- {
- options.gen.direct_access = 1;
- }
- else if (strcmp (optarg, "direct-access") == 0)
- {
- options.gen.direct_access = 1;
- options.warning (NULL, "Option direct-access replaced by gen-direct-access\n");
- }
- else if (strncmp (optarg, "gen-zero-r", strlen ("gen-zero-r")) == 0)
- {
- options.gen.zero_reg = 1;
- options.gen.zero_reg_nr = atoi (optarg + strlen ("gen-zero-r"));
- }
- else if (strncmp (optarg, "zero-r", strlen ("zero-r")) == 0)
- {
- options.gen.zero_reg = 1;
- options.gen.zero_reg_nr = atoi (optarg + strlen ("zero-r"));
- options.warning (NULL, "Option zero-r<N> replaced by gen-zero-r<N>\n");
- }
- else if (strcmp (optarg, "gen-icache") == 0)
- {
- options.gen.icache = 1;
- }
- else if (strcmp (optarg, "gen-insn-in-icache") == 0)
- {
- options.gen.insn_in_icache = 1;
- }
- else if (strcmp (optarg, "gen-multi-sim") == 0)
- {
- options.gen.multi_sim = 1;
- }
- else if (strcmp (optarg, "gen-multi-word") == 0)
- {
- options.gen.multi_word = 1;
- }
- else if (strcmp (optarg, "gen-semantic-icache") == 0)
- {
- options.gen.semantic_icache = 1;
- }
- else if (strcmp (optarg, "gen-slot-verification") == 0)
- {
- options.gen.slot_verification = 1;
- }
- else if (strcmp (optarg, "verify-slot") == 0)
- {
- options.gen.slot_verification = 1;
- options.warning (NULL, "Option verify-slot replaced by gen-slot-verification\n");
- }
- else if (strcmp (optarg, "gen-nia-invalid") == 0)
- {
- options.gen.nia = nia_is_invalid;
- }
- else if (strcmp (optarg, "default-nia-minus-one") == 0)
- {
- options.gen.nia = nia_is_invalid;
- options.warning (NULL, "Option default-nia-minus-one replaced by gen-nia-invalid\n");
- }
- else if (strcmp (optarg, "gen-nia-void") == 0)
- {
- options.gen.nia = nia_is_void;
- }
- else if (strcmp (optarg, "trace-combine") == 0)
- {
- options.trace.combine = 1;
- }
- else if (strcmp (optarg, "trace-entries") == 0)
- {
- options.trace.entries = 1;
- }
- else if (strcmp (optarg, "trace-rule-rejection") == 0)
- {
- options.trace.rule_rejection = 1;
- }
- else if (strcmp (optarg, "trace-rule-selection") == 0)
- {
- options.trace.rule_selection = 1;
- }
- else if (strcmp (optarg, "jumps") == 0)
- {
- options.gen.code = generate_jumps;
- }
- else if (strcmp (optarg, "field-widths") == 0)
- {
- options.insn_specifying_widths = 1;
- }
- else if (strcmp (optarg, "omit-line-numbers") == 0)
- {
- file_references = lf_omit_references;
- }
- else
- error (NULL, "Unknown option %s\n", optarg);
- break;
-
+ {
+ int enable_p;
+ char *argp;
+ if (strncmp (optarg, "no-", strlen ("no-")) == 0)
+ {
+ argp = optarg + strlen ("no-");
+ enable_p = 0;
+ }
+ else if (strncmp (optarg, "!", strlen ("!")) == 0)
+ {
+ argp = optarg + strlen ("no-");
+ enable_p = 0;
+ }
+ else
+ {
+ argp = optarg;
+ enable_p = 1;
+ }
+ if (strcmp (argp, "decode-duplicate") == 0)
+ {
+ options.decode.duplicate = enable_p;
+ }
+ else if (strcmp (argp, "decode-combine") == 0)
+ {
+ options.decode.combine = enable_p;
+ }
+ else if (strcmp (argp, "decode-zero-reserved") == 0)
+ {
+ options.decode.zero_reserved = enable_p;
+ }
+
+ else if (strcmp (argp, "gen-conditional-issue") == 0)
+ {
+ options.gen.conditional_issue = enable_p;
+ }
+ else if (strcmp (argp, "conditional-issue") == 0)
+ {
+ options.gen.conditional_issue = enable_p;
+ options.warning (NULL, "Option conditional-issue replaced by gen-conditional-issue\n");
+ }
+ else if (strcmp (argp, "gen-delayed-branch") == 0)
+ {
+ options.gen.delayed_branch = enable_p;
+ }
+ else if (strcmp (argp, "delayed-branch") == 0)
+ {
+ options.gen.delayed_branch = enable_p;
+ options.warning (NULL, "Option delayed-branch replaced by gen-delayed-branch\n");
+ }
+ else if (strcmp (argp, "gen-direct-access") == 0)
+ {
+ options.gen.direct_access = enable_p;
+ }
+ else if (strcmp (argp, "direct-access") == 0)
+ {
+ options.gen.direct_access = enable_p;
+ options.warning (NULL, "Option direct-access replaced by gen-direct-access\n");
+ }
+ else if (strncmp (argp, "gen-zero-r", strlen ("gen-zero-r")) == 0)
+ {
+ options.gen.zero_reg = enable_p;
+ options.gen.zero_reg_nr = atoi (argp + strlen ("gen-zero-r"));
+ }
+ else if (strncmp (argp, "zero-r", strlen ("zero-r")) == 0)
+ {
+ options.gen.zero_reg = enable_p;
+ options.gen.zero_reg_nr = atoi (argp + strlen ("zero-r"));
+ options.warning (NULL, "Option zero-r<N> replaced by gen-zero-r<N>\n");
+ }
+ else if (strncmp (argp, "gen-icache", strlen ("gen-icache")) == 0)
+ {
+ switch (argp[strlen ("gen-icache")])
+ {
+ case '=':
+ options.gen.icache_size = atoi (argp + strlen ("gen-icache") + 1);
+ options.gen.icache = enable_p;
+ break;
+ case '\0':
+ options.gen.icache = enable_p;
+ break;
+ default:
+ error (NULL, "Expecting -Ggen-icache or -Ggen-icache=<N>\n");
+ }
+ }
+ else if (strcmp (argp, "gen-insn-in-icache") == 0)
+ {
+ options.gen.insn_in_icache = enable_p;
+ }
+ else if (strncmp (argp, "gen-multi-sim", strlen ("gen-multi-sim")) == 0)
+ {
+ char *arg = &argp[strlen ("gen-multi-sim")];
+ switch (arg[0])
+ {
+ case '=':
+ options.gen.multi_sim = enable_p;
+ options.gen.default_model = arg + 1;
+ if (! filter_is_member (options.model_filter, options.gen.default_model))
+ error (NULL, "multi-sim model %s unknown\n", options.gen.default_model);
+ break;
+ case '\0':
+ options.gen.multi_sim = enable_p;
+ options.gen.default_model = NULL;
+ break;
+ default:
+ error (NULL, "Expecting -Ggen-multi-sim or -Ggen-multi-sim=<MODEL>\n");
+ break;
+ }
+ }
+ else if (strcmp (argp, "gen-multi-word") == 0)
+ {
+ options.gen.multi_word = enable_p;
+ }
+ else if (strcmp (argp, "gen-semantic-icache") == 0)
+ {
+ options.gen.semantic_icache = enable_p;
+ }
+ else if (strcmp (argp, "gen-slot-verification") == 0)
+ {
+ options.gen.slot_verification = enable_p;
+ }
+ else if (strcmp (argp, "verify-slot") == 0)
+ {
+ options.gen.slot_verification = enable_p;
+ options.warning (NULL, "Option verify-slot replaced by gen-slot-verification\n");
+ }
+ else if (strcmp (argp, "gen-nia-invalid") == 0)
+ {
+ options.gen.nia = nia_is_invalid;
+ }
+ else if (strcmp (argp, "default-nia-minus-one") == 0)
+ {
+ options.gen.nia = nia_is_invalid;
+ options.warning (NULL, "Option default-nia-minus-one replaced by gen-nia-invalid\n");
+ }
+ else if (strcmp (argp, "gen-nia-void") == 0)
+ {
+ options.gen.nia = nia_is_void;
+ }
+ else if (strcmp (argp, "trace-all") == 0)
+ {
+ memset (&options.trace, enable_p, sizeof (options.trace));
+ }
+ else if (strcmp (argp, "trace-combine") == 0)
+ {
+ options.trace.combine = enable_p;
+ }
+ else if (strcmp (argp, "trace-entries") == 0)
+ {
+ options.trace.entries = enable_p;
+ }
+ else if (strcmp (argp, "trace-rule-rejection") == 0)
+ {
+ options.trace.rule_rejection = enable_p;
+ }
+ else if (strcmp (argp, "trace-rule-selection") == 0)
+ {
+ options.trace.rule_selection = enable_p;
+ }
+ else if (strcmp (argp, "trace-insn-insertion") == 0)
+ {
+ options.trace.insn_insertion = enable_p;
+ }
+ else if (strcmp (argp, "trace-insn-expansion") == 0)
+ {
+ options.trace.insn_expansion = enable_p;
+ }
+ else if (strcmp (argp, "jumps") == 0)
+ {
+ options.gen.code = generate_jumps;
+ }
+ else if (strcmp (argp, "field-widths") == 0)
+ {
+ options.insn_specifying_widths = enable_p;
+ }
+ else if (strcmp (argp, "omit-line-numbers") == 0)
+ {
+ file_references = lf_omit_references;
+ }
+ else
+ {
+ error (NULL, "Unknown option %s\n", optarg);
+ }
+ break;
+ }
+
case 'i':
isa = load_insn_table (optarg, cache_rules);
if (isa->illegal_insn == NULL)