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: Optimize rip check


rip is a fake register in x86 assembler. I am checking in this
patch to optimize rip check.


H.J.
---
gas/

2007-09-17  H.J. Lu  <hongjiu.lu@intel.com>

	* config/tc-i386.c (baseindex): Removed.
	(build_modrm_byte): Check reg_num for RIP register instead of
	reg_type.
	(i386_index_check): Likewise.

opcodes/

2007-09-17  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-opc.h (RegRip): New.

	* i386-reg.tbl (rip): Use RegRip for reg_num.
	* i386-tbl.h: Regenerated.

--- binutils/gas/config/tc-i386.c.rip	2007-09-17 11:50:30.000000000 -0700
+++ binutils/gas/config/tc-i386.c	2007-09-17 17:41:01.000000000 -0700
@@ -1098,7 +1098,6 @@ static const i386_operand_type disp32s =
 static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
 static const i386_operand_type anydisp
   = OPERAND_TYPE_ANYDISP;
-static const i386_operand_type baseindex = OPERAND_TYPE_BASEINDEX;
 static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
 static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
 static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
@@ -4541,7 +4540,7 @@ build_modrm_byte (void)
 		}
 	    }
 	  /* RIP addressing for 64bit mode.  */
-	  else if (UINTS_EQUAL (i.base_reg->reg_type, baseindex))
+	  else if (i.base_reg->reg_num == RegRip)
 	    {
 	      i.rm.regmem = NO_BASE_REGISTER;
 	      i.types[op].bitfield.disp8 = 0;
@@ -5977,7 +5976,7 @@ i386_index_check (const char *operand_st
 	       || (i.prefix[ADDR_PREFIX]
 		   && !i.base_reg->reg_type.bitfield.reg32))
 	   && (i.index_reg
-	       || !UINTS_EQUAL (i.base_reg->reg_type, baseindex)))
+	       || i.base_reg->reg_num != RegRip))
 	  || (i.index_reg
 	      && (!i.index_reg->reg_type.bitfield.baseindex
 		  || (i.prefix[ADDR_PREFIX] == 0
--- binutils/opcodes/i386-opc.h.rip	2007-09-14 12:23:43.000000000 -0700
+++ binutils/opcodes/i386-opc.h	2007-09-17 17:43:55.000000000 -0700
@@ -443,6 +443,7 @@ typedef struct
 #define RegRex	    0x1  /* Extended register.  */
 #define RegRex64    0x2  /* Extended 8 bit register.  */
   unsigned int reg_num;
+#define RegRip	((unsigned int ) ~0)
 }
 reg_entry;
 
--- binutils/opcodes/i386-reg.tbl.rip	2007-09-17 17:49:11.000000000 -0700
+++ binutils/opcodes/i386-reg.tbl	2007-09-17 17:50:33.000000000 -0700
@@ -189,7 +189,7 @@ xmm14, RegXMM, RegRex, 6
 xmm15, RegXMM, RegRex, 7
 // No type will make this register rejected for all purposes except
 // for addressing.  This saves creating one extra type for RIP.
-rip, BaseIndex, 0, 0
+rip, BaseIndex, 0, RegRip
 // fp regs.
 st(0), FloatReg|FloatAcc, 0, 0
 st(1), FloatReg, 0, 1
--- binutils/opcodes/i386-tbl.h.rip	2007-09-14 12:23:44.000000000 -0700
+++ binutils/opcodes/i386-tbl.h	2007-09-17 17:50:45.000000000 -0700
@@ -13278,7 +13278,7 @@ const reg_entry i386_regtab[] =
   { "rip",
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
-    0, 0 },
+    0, RegRip },
   { "st(0)",
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 } },


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]