This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
>We only use regsym in one place, for indirect register operands. So it >looks we only need the 11 or so IND_* registers in regsym, plus some >code to do a bounds check and complain if we don't have an IND_* >register here. Or maybe insert an invalid symbol so that the problem >will be detected later. > >Moving it to the end of md sounds reasonable too, as this is a rarely >used field, so we may as well move it out of the way of the more >important fields. Here is the patch to do that, plus again a little cleanup (using unsigned-s for register numbers seems more reasonable and should, when it comes to array indexing, allow the compiler to produce better code. Built and tested on ia64-unknown-linux-gnu. Jan gas/ 2005-11-10 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.c (md): Rename regsym to indregsym and move it to the end of the structure. (ar): Field regnum is unsigned. (cr): Likewise: (indirect_reg): Likewise. (declare_register_set): Parameter regnum is unsigned. (declare_register): Parameter numregs and base_regnum are unsigned. So is the local loop variable. (md_begin): Restrict scope of local variable regnum, which also is unsigned. Replace loops with function calls where possible. Re-order things so that register groups are kept together. Remove all uses of regsym except for indirect registers. Replace use of regsym by indregsym for indirect registers. (ia64_optimize_expr): Replace use of regsym by indregsym for indirect registers, with appropriate bias. --- /home/jbeulich/src/binutils/mainline/2005-11-09/gas/config/tc-ia64.c 2005-10-24 09:41:42.000000000 +0200 +++ 2005-11-09/gas/config/tc-ia64.c 2005-11-10 15:36:00.210902180 +0100 @@ -225,8 +225,6 @@ static struct struct hash_control *const_hash; /* constant hash table */ struct hash_control *entry_hash; /* code entry hint hash table */ - symbolS *regsym[REG_NUM]; - /* If X_op is != O_absent, the registername for the instruction's qualifying predicate. If NULL, p0 is assumed for instructions that are predicatable. */ @@ -328,6 +326,8 @@ static struct int pointer_size; /* size in bytes of a pointer */ int pointer_size_shift; /* shift size of a pointer for alignment */ + + symbolS *indregsym[IND_RR - IND_CPUID + 1]; } md; @@ -363,7 +363,7 @@ static unsigned char le_nop_stop[16] = static const struct { const char *name; - int regnum; + unsigned int regnum; } ar[] = { @@ -402,7 +402,7 @@ ar[] = static const struct { const char *name; - int regnum; + unsigned int regnum; } cr[] = { @@ -490,7 +490,7 @@ const_bits[] = static const struct { const char *name; - int regnum; + unsigned int regnum; } indirect_reg[] = { @@ -810,8 +810,8 @@ static void dot_dv_mode PARAMS ((int)); static void dot_entry PARAMS ((int)); static void dot_mem_offset PARAMS ((int)); static void add_unwind_entry PARAMS((unw_rec_list *, int)); -static symbolS *declare_register PARAMS ((const char *name, int regnum)); -static void declare_register_set PARAMS ((const char *, int, int)); +static symbolS *declare_register PARAMS ((const char *name, unsigned int regnum)); +static void declare_register_set PARAMS ((const char *, unsigned int, unsigned int)); static unsigned int operand_width PARAMS ((enum ia64_opnd)); static enum operand_match_result operand_match PARAMS ((const struct ia64_opcode *idesc, int index, @@ -5599,7 +5599,7 @@ pseudo_opcode[] = static symbolS * declare_register (name, regnum) const char *name; - int regnum; + unsigned int regnum; { const char *err; symbolS *sym; @@ -5617,11 +5617,11 @@ declare_register (name, regnum) static void declare_register_set (prefix, num_regs, base_regnum) const char *prefix; - int num_regs; - int base_regnum; + unsigned int num_regs; + unsigned int base_regnum; { char name[8]; - int i; + unsigned int i; for (i = 0; i < num_regs; ++i) { @@ -7371,7 +7371,7 @@ extra_goodness (int templ, int slot) void md_begin () { - int i, j, k, t, goodness, best, regnum, ok; + int i, j, k, t, goodness, best, ok; const char *err; char name[8]; @@ -7546,81 +7546,52 @@ md_begin () md.entry_hash = hash_new (); /* general registers: */ - for (i = REG_GR; i < REG_GR + 128; ++i) - { - sprintf (name, "r%d", i - REG_GR); - md.regsym[i] = declare_register (name, i); - } + declare_register_set ("r", 128, REG_GR); + declare_register ("gp", REG_GR + 1); + declare_register ("sp", REG_GR + 12); + declare_register ("tp", REG_GR + 13); + declare_register_set ("ret", 4, REG_GR + 8); /* floating point registers: */ - for (i = REG_FR; i < REG_FR + 128; ++i) - { - sprintf (name, "f%d", i - REG_FR); - md.regsym[i] = declare_register (name, i); - } - - /* application registers: */ - for (i = REG_AR; i < REG_AR + 128; ++i) - { - sprintf (name, "ar%d", i - REG_AR); - md.regsym[i] = declare_register (name, i); - } - - /* control registers: */ - for (i = REG_CR; i < REG_CR + 128; ++i) - { - sprintf (name, "cr%d", i - REG_CR); - md.regsym[i] = declare_register (name, i); - } - - /* predicate registers: */ - for (i = REG_P; i < REG_P + 64; ++i) - { - sprintf (name, "p%d", i - REG_P); - md.regsym[i] = declare_register (name, i); - } + declare_register_set ("f", 128, REG_FR); + declare_register_set ("farg", 8, REG_FR + 8); + declare_register_set ("fret", 8, REG_FR + 8); /* branch registers: */ - for (i = REG_BR; i < REG_BR + 8; ++i) - { - sprintf (name, "b%d", i - REG_BR); - md.regsym[i] = declare_register (name, i); - } - - md.regsym[REG_IP] = declare_register ("ip", REG_IP); - md.regsym[REG_CFM] = declare_register ("cfm", REG_CFM); - md.regsym[REG_PR] = declare_register ("pr", REG_PR); - md.regsym[REG_PR_ROT] = declare_register ("pr.rot", REG_PR_ROT); - md.regsym[REG_PSR] = declare_register ("psr", REG_PSR); - md.regsym[REG_PSR_L] = declare_register ("psr.l", REG_PSR_L); - md.regsym[REG_PSR_UM] = declare_register ("psr.um", REG_PSR_UM); + declare_register_set ("b", 8, REG_BR); + declare_register ("rp", REG_BR + 0); - for (i = 0; i < NELEMS (indirect_reg); ++i) - { - regnum = indirect_reg[i].regnum; - md.regsym[regnum] = declare_register (indirect_reg[i].name, regnum); - } + /* predicate registers: */ + declare_register_set ("p", 64, REG_P); + declare_register ("pr", REG_PR); + declare_register ("pr.rot", REG_PR_ROT); - /* define synonyms for application registers: */ + /* application registers: */ + declare_register_set ("ar", 128, REG_AR); for (i = 0; i < NELEMS (ar); ++i) declare_register (ar[i].name, REG_AR + ar[i].regnum); - /* define synonyms for control registers: */ + /* control registers: */ + declare_register_set ("cr", 128, REG_CR); for (i = 0; i < NELEMS (cr); ++i) declare_register (cr[i].name, REG_CR + cr[i].regnum); - declare_register ("gp", REG_GR + 1); - declare_register ("sp", REG_GR + 12); - declare_register ("tp", REG_GR + 13); - declare_register ("rp", REG_BR + 0); + declare_register ("ip", REG_IP); + declare_register ("cfm", REG_CFM); + declare_register ("psr", REG_PSR); + declare_register ("psr.l", REG_PSR_L); + declare_register ("psr.um", REG_PSR_UM); + + for (i = 0; i < NELEMS (indirect_reg); ++i) + { + unsigned int regnum = indirect_reg[i].regnum; + + md.indregsym[regnum - IND_CPUID] = declare_register (indirect_reg[i].name, regnum); + } /* pseudo-registers used to specify unwind info: */ declare_register ("psp", REG_PSP); - declare_register_set ("ret", 4, REG_GR + 8); - declare_register_set ("farg", 8, REG_FR + 8); - declare_register_set ("fret", 8, REG_FR + 8); - for (i = 0; i < NELEMS (const_bits); ++i) { err = hash_insert (md.const_hash, const_bits[i].name, @@ -8018,7 +7989,7 @@ ia64_optimize_expr (l, op, r) r->X_add_number = REG_GR; } l->X_op = O_index; - l->X_op_symbol = md.regsym[l->X_add_number]; + l->X_op_symbol = md.indregsym[l->X_add_number - IND_CPUID]; l->X_add_number = r->X_add_number; return 1; }
Attachment:
binutils-mainline-ia64-regsym-2.patch
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |