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]

[PATCH] Re: [PATCH] ia64: register symbol generation


>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]