diff options
Diffstat (limited to 'opcodes/ia64-gen.c')
-rw-r--r-- | opcodes/ia64-gen.c | 136 |
1 files changed, 68 insertions, 68 deletions
diff --git a/opcodes/ia64-gen.c b/opcodes/ia64-gen.c index 54aa605..ad8f6d9 100644 --- a/opcodes/ia64-gen.c +++ b/opcodes/ia64-gen.c @@ -22,15 +22,15 @@ /* While the ia64-opc-* set of opcode tables are easy to maintain, they waste a tremendous amount of space. ia64-gen rearranges the - instructions into a directed acyclic graph (DAG) of instruction opcodes and - their possible completers, as well as compacting the set of strings used. + instructions into a directed acyclic graph (DAG) of instruction opcodes and + their possible completers, as well as compacting the set of strings used. The disassembler table consists of a state machine that does branching based on the bits of the opcode being disassembled. The state encodings have been chosen to minimize the amount of space - required. + required. - The resource table is constructed based on some text dependency tables, + The resource table is constructed based on some text dependency tables, which are also easier to maintain than the final representation. */ #include "sysdep.h" @@ -172,7 +172,7 @@ struct bittree alphabetical order. */ /* One entry in the string table. */ -struct string_entry +struct string_entry { /* The index in the ia64_strings[] array for this entry. */ int num; @@ -188,11 +188,11 @@ int strtabtotlen = 0; struct rdep { char *name; /* Resource name. */ - unsigned + unsigned mode:2, /* RAW, WAW, or WAR. */ semantics:3; /* Dependency semantics. */ char *extra; /* Additional semantics info. */ - int nchks; + int nchks; int total_chks; /* Total #of terminal insns. */ int *chks; /* Insn classes which read (RAW), write (WAW), or write (WAR) this rsrc. */ @@ -211,12 +211,12 @@ static int rdepstotlen = 0; /* Array of all instruction classes. */ struct iclass -{ +{ char *name; /* Instruction class name. */ int is_class; /* Is a class, not a terminal. */ - int nsubs; + int nsubs; int *subs; /* Other classes within this class. */ - int nxsubs; + int nxsubs; int xsubs[4]; /* Exclusions. */ char *comment; /* Optional comment. */ int note; /* Optional note. */ @@ -301,7 +301,7 @@ static void fail (const char *message, ...) { va_list args; - + va_start (args, message); fprintf (stderr, _("%s: Error: "), program_name); vfprintf (stderr, message, args); @@ -336,7 +336,7 @@ insert_resource (const char *name, enum ia64_dependency_mode type) rdeps[rdepslen]->name = xstrdup (name); rdeps[rdepslen]->mode = type; rdeps[rdepslen]->waw_special = 0; - + return rdeps[rdepslen++]; } @@ -405,7 +405,7 @@ insert_deplist (int count, unsigned short *deps) /* Add the given pair of dependency lists to the opcode dependency list. */ static short -insert_dependencies (int nchks, unsigned short *chks, +insert_dependencies (int nchks, unsigned short *chks, int nregs, unsigned short *regs) { struct opdep *pair; @@ -419,14 +419,14 @@ insert_dependencies (int nchks, unsigned short *chks, chkind = insert_deplist (nchks, chks); for (i = 0; i < opdeplen; i++) - if (opdeps[i]->chk == chkind + if (opdeps[i]->chk == chkind && opdeps[i]->reg == regind) return i; pair = tmalloc (struct opdep); pair->chk = chkind; pair->reg = regind; - + if (opdeplen == opdeptotlen) { opdeptotlen += 20; @@ -438,7 +438,7 @@ insert_dependencies (int nchks, unsigned short *chks, return opdeplen++; } -static void +static void mark_used (struct iclass *ic, int clear_terminals) { int i; @@ -521,7 +521,7 @@ fetch_insn_class (const char *full_name, int create) if (strcmp (name, ics[i]->name) == 0 && ((comment == NULL && ics[i]->comment == NULL) || (comment != NULL && ics[i]->comment != NULL - && strncmp (ics[i]->comment, comment, + && strncmp (ics[i]->comment, comment, strlen (ics[i]->comment)) == 0)) && note == ics[i]->note) return i; @@ -623,10 +623,10 @@ load_insn_classes (void) int iclass; char *name; char *tmp; - + if (fgets (buf, sizeof (buf), fp) == NULL) break; - + while (ISSPACE (buf[strlen (buf) - 1])) buf[strlen (buf) - 1] = '\0'; @@ -670,9 +670,9 @@ load_insn_classes (void) } if (*tmp == ',') *tmp++ = '\0'; - + ics[iclass]->subs = (int *) - xrealloc ((void *)ics[iclass]->subs, + xrealloc ((void *)ics[iclass]->subs, (ics[iclass]->nsubs + 1) * sizeof (int)); sub = fetch_insn_class (subname, 1); @@ -682,7 +682,7 @@ load_insn_classes (void) } /* Make sure classes come before terminals. */ - qsort ((void *)ics[iclass]->subs, + qsort ((void *)ics[iclass]->subs, ics[iclass]->nsubs, sizeof(int), sub_compare); } fclose (fp); @@ -712,7 +712,7 @@ parse_resource_users (const char *ref, int **usersp, int *nusersp, int iclass; int create = 0; char *name; - + while (ISSPACE (*tmp)) ++tmp; name = tmp; @@ -720,7 +720,7 @@ parse_resource_users (const char *ref, int **usersp, int *nusersp, ++tmp; c = *tmp; *tmp++ = '\0'; - + xsect = strchr (name, '\\'); if ((notestr = strstr (name, "+")) != NULL) { @@ -738,7 +738,7 @@ parse_resource_users (const char *ref, int **usersp, int *nusersp, if (!xsect) *notestr = '\0'; } - else + else note = 0; /* All classes are created when the insn class table is parsed; @@ -748,7 +748,7 @@ parse_resource_users (const char *ref, int **usersp, int *nusersp, table). */ if (! CONST_STRNEQ (name, "IC:") || xsect != NULL) create = 1; - + iclass = fetch_insn_class (name, create); if (iclass != -1) { @@ -788,7 +788,7 @@ parse_semantics (char *sem) return IA64_DVS_SPECIFIC; else if (strcmp (sem, "stop") == 0) return IA64_DVS_STOP; - else + else return IA64_DVS_OTHER; } @@ -835,7 +835,7 @@ load_depfile (const char *filename, enum ia64_dependency_mode mode) while (*tmp != ';') ++tmp; *tmp++ = '\0'; - + while (ISSPACE (*tmp)) ++tmp; regp = tmp; @@ -883,7 +883,7 @@ load_dependencies (void) } /* Is the given operand an indirect register file operand? */ -static int +static int irf_operand (int op, const char *field) { if (!field) @@ -910,7 +910,7 @@ irf_operand (int op, const char *field) /* Handle mov_ar, mov_br, mov_cr, move_dahr, mov_indirect, mov_ip, mov_pr, * mov_psr, and mov_um insn classes. */ static int -in_iclass_mov_x (struct ia64_opcode *idesc, struct iclass *ic, +in_iclass_mov_x (struct ia64_opcode *idesc, struct iclass *ic, const char *format, const char *field) { int plain_mov = strcmp (idesc->name, "mov") == 0; @@ -1031,7 +1031,7 @@ in_iclass_mov_x (struct ia64_opcode *idesc, struct iclass *ic, /* Is the given opcode in the given insn class? */ static int -in_iclass (struct ia64_opcode *idesc, struct iclass *ic, +in_iclass (struct ia64_opcode *idesc, struct iclass *ic, const char *format, const char *field, int *notep) { int i; @@ -1049,7 +1049,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, { warn (_("most recent format '%s'\nappears more restrictive than '%s'\n"), ic->comment, format); - format = ic->comment; + format = ic->comment; } } else @@ -1074,7 +1074,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, int len = strlen(ic->name); resolved = ((strncmp (ic->name, idesc->name, len) == 0) - && (idesc->name[len] == '\0' + && (idesc->name[len] == '\0' || idesc->name[len] == '.')); /* All break, nop, and hint variations must match exactly. */ @@ -1162,7 +1162,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, resolved = 0; } - /* Misc brl variations ('.cond' is optional); + /* Misc brl variations ('.cond' is optional); plain brl matches brl.cond. */ if (!resolved && (strcmp (idesc->name, "brl") == 0 @@ -1173,7 +1173,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, } /* Misc br variations ('.cond' is optional). */ - if (!resolved + if (!resolved && (strcmp (idesc->name, "br") == 0 || CONST_STRNEQ (idesc->name, "br.")) && strcmp (ic->name, "br.cond") == 0) @@ -1190,8 +1190,8 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, /* probe variations. */ if (!resolved && CONST_STRNEQ (idesc->name, "probe")) { - resolved = strcmp (ic->name, "probe") == 0 - && !((strstr (idesc->name, "fault") != NULL) + resolved = strcmp (ic->name, "probe") == 0 + && !((strstr (idesc->name, "fault") != NULL) ^ (format && strstr (format, "M40") != NULL)); } @@ -1226,7 +1226,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, resolved = in_iclass_mov_x (idesc, ic, format, field); } - /* Keep track of this so we can flag any insn classes which aren't + /* Keep track of this so we can flag any insn classes which aren't mapped onto at least one real insn. */ if (resolved) ic->terminal_resolved = 1; @@ -1248,7 +1248,7 @@ in_iclass (struct ia64_opcode *idesc, struct iclass *ic, break; } } - + /* If it's in this IC, add the IC note (if any) to the insn. */ if (resolved) { @@ -1483,7 +1483,7 @@ lookup_specifier (const char *name) return IA64_RS_PMD; if (strstr (name, "RR#") != NULL) return IA64_RS_RR; - + warn (_("Don't know how to specify # dependency %s\n"), name); } @@ -1514,7 +1514,7 @@ print_dependency_table (void) { int i, j; - if (debug) + if (debug) { for (i=0;i < iclen;i++) { @@ -1530,7 +1530,7 @@ print_dependency_table (void) ics[i]->name); } } - else + else { if (!ics[i]->terminal_resolved && !ics[i]->orphan) { @@ -1556,16 +1556,16 @@ print_dependency_table (void) if (debug > 1) for (i = 0; i < rdepslen; i++) - { + { static const char *mode_str[] = { "RAW", "WAW", "WAR" }; if (rdeps[i]->total_chks == 0) { if (rdeps[i]->total_regs) - warn (_("Warning: rsrc %s (%s) has no chks\n"), + warn (_("Warning: rsrc %s (%s) has no chks\n"), rdeps[i]->name, mode_str[rdeps[i]->mode]); else - warn (_("Warning: rsrc %s (%s) has no chks or regs\n"), + warn (_("Warning: rsrc %s (%s) has no chks or regs\n"), rdeps[i]->name, mode_str[rdeps[i]->mode]); } else if (rdeps[i]->total_regs == 0) @@ -1579,7 +1579,7 @@ print_dependency_table (void) for (i = 0; i < rdepslen; i++) { /* '%', '#', AR[], CR[], or PSR. indicates we need to specify the actual - resource used. */ + resource used. */ int specifier = lookup_specifier (rdeps[i]->name); int regindex = lookup_regindex (rdeps[i]->name, specifier); @@ -1633,11 +1633,11 @@ print_dependency_table (void) printf (" { "); if (opdeps[i]->chk == -1) printf ("0, NULL, "); - else + else printf ("NELS(dep%d), dep%d, ", opdeps[i]->chk, opdeps[i]->chk); if (opdeps[i]->reg == -1) printf ("0, NULL, "); - else + else printf ("NELS(dep%d), dep%d, ", opdeps[i]->reg, opdeps[i]->reg); printf ("},\n"); } @@ -1656,7 +1656,7 @@ insert_string (char *str) { strtabtotlen += 20; string_table = (struct string_entry **) - xrealloc (string_table, + xrealloc (string_table, sizeof (struct string_entry **) * strtabtotlen); } @@ -1729,7 +1729,7 @@ make_bittree_entry (void) res->bits_to_skip = 0; return res; } - + static struct disent * add_dis_table_ent (struct disent *which, int insn, int order, @@ -1794,7 +1794,7 @@ insert_bit_table_ent (struct bittree *curr_ent, int bit, ia64_insn opcode, if (bit == -1) { - struct disent *nent = add_dis_table_ent (curr_ent->disent, + struct disent *nent = add_dis_table_ent (curr_ent->disent, opcodenum, order, completer_index); curr_ent->disent = nent; @@ -1833,8 +1833,8 @@ add_dis_entry (struct bittree *first, ia64_insn opcode, ia64_insn mask, if (ent->is_terminal) { - insert_bit_table_ent (bittree, 40, newopcode, mask, - opcodenum, opcode_count - ent->order - 1, + insert_bit_table_ent (bittree, 40, newopcode, mask, + opcodenum, opcode_count - ent->order - 1, (completer_index << 1) | 1); } completer_index <<= 1; @@ -2013,7 +2013,7 @@ gen_dis_table (struct bittree *ent) else idest = ent->disent->ournum; - /* If the destination offset for the if (bit is 1) test is less + /* If the destination offset for the if (bit is 1) test is less than 256 bytes away, we can store it as 8-bits instead of 16; the instruction has bit 5 set for the 16-bit address, and bit 4 for the 8-bit address. Since we've already allocated 16 @@ -2108,7 +2108,7 @@ gen_dis_table (struct bittree *ent) { if (ent->skip_flag) printf ("%d: skipping %d\n", our_offset, ent->bits_to_skip); - + if (ent->bits[0] != NULL) printf ("%d: if (0:%d) goto %d\n", our_offset, zero_count + 1, zero_dest); @@ -2164,7 +2164,7 @@ generate_disassembler (void) if (ptr->opcode->type != IA64_TYPE_DYN) add_dis_entry (bittree, - ptr->opcode->opcode, ptr->opcode->mask, + ptr->opcode->opcode, ptr->opcode->mask, ptr->main_index, ptr->completers, 1); } @@ -2189,7 +2189,7 @@ print_string_table (void) for (x = 0; x < strtablen; x++) { int len; - + if (strlen (string_table[x]->s) > 75) abort (); @@ -2291,7 +2291,7 @@ insert_gclist (struct completer_entry *ent) end = i - 1; else if (c == 0) { - while (i > 0 + while (i > 0 && ent->name->num == glist[i - 1]->name->num) i--; @@ -2368,7 +2368,7 @@ compute_completer_bits (struct main_entry *ment, struct completer_entry *ent) while (p != NULL && ! p->is_terminal) p = p->parent; - + if (p != NULL) p_bits = p->bits; else @@ -2421,7 +2421,7 @@ collapse_redundant_completers (void) /* Attach two lists of dependencies to each opcode. 1) all resources which, when already marked in use, conflict with this - opcode (chks) + opcode (chks) 2) all resources which must be marked in use when this opcode is used (regs). */ static int @@ -2432,7 +2432,7 @@ insert_opcode_dependencies (struct ia64_opcode *opc, (79) and cmpxchng has the most regs (54) so 100 here should be enough. */ int i; int nregs = 0; - unsigned short regs[256]; + unsigned short regs[256]; int nchks = 0; unsigned short chks[256]; /* Flag insns for which no class matched; there should be none. */ @@ -2504,7 +2504,7 @@ insert_opcode_dependencies (struct ia64_opcode *opc, if (no_class_found) warn (_("opcode %s has no class (ops %d %d %d)\n"), - opc->name, + opc->name, opc->operands[0], opc->operands[1], opc->operands[2]); return insert_dependencies (nchks, chks, nregs, regs); @@ -2600,7 +2600,7 @@ print_completer_entry (struct completer_entry *ent) if (bits & 0xffffffff00000000LL) abort (); } - + printf (" { 0x%x, 0x%x, %d, %d, %d, %d, %d, %d },\n", (int)bits, (int)mask, @@ -2629,7 +2629,7 @@ opcodes_eq (struct ia64_opcode *opc1, struct ia64_opcode *opc2) int x; int plen1, plen2; - if ((opc1->mask != opc2->mask) || (opc1->type != opc2->type) + if ((opc1->mask != opc2->mask) || (opc1->type != opc2->type) || (opc1->num_outputs != opc2->num_outputs) || (opc1->flags != opc2->flags)) return 0; @@ -2664,7 +2664,7 @@ add_opcode_entry (struct ia64_opcode *opc) name = insert_string (prefix); /* Walk the list of opcode table entries. If it's a new - instruction, allocate and fill in a new entry. Note + instruction, allocate and fill in a new entry. Note the main table is alphabetical by opcode name. */ while (*place != NULL) @@ -2766,7 +2766,7 @@ shrink (struct ia64_opcode *table) /* Program options. */ #define OPTION_SRCDIR 200 -struct option long_options[] = +struct option long_options[] = { {"srcdir", required_argument, NULL, OPTION_SRCDIR}, {"debug", no_argument, NULL, 'd'}, @@ -2796,7 +2796,7 @@ main (int argc, char **argv) extern int chdir (char *); char *srcdir = NULL; int c; - + program_name = *argv; xmalloc_set_program_name (program_name); @@ -2824,7 +2824,7 @@ main (int argc, char **argv) if (optind != argc) usage (stdout, 1); - if (srcdir != NULL) + if (srcdir != NULL) if (chdir (srcdir) != 0) fail (_("unable to change directory to \"%s\", errno = %s\n"), srcdir, strerror (errno)); |