diff --git a/gas/ChangeLog b/gas/ChangeLog index 9cf0f71d323..4c02e1dba40 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2007-09-26 Jan Beulich + + * config/tc-i386.c (build_modrm_byte): Also check for RegEip + when considering IP-relative addressing. + 2007-09-26 Jan Beulich * config/tc-i386.h (md_register_arithmetic): Define. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9180adcbe34..fd79330487d 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -4547,7 +4547,8 @@ build_modrm_byte (void) } } /* RIP addressing for 64bit mode. */ - else if (i.base_reg->reg_num == RegRip) + else if (i.base_reg->reg_num == RegRip || + i.base_reg->reg_num == RegEip) { i.rm.regmem = NO_BASE_REGISTER; i.types[op].bitfield.disp8 = 0; @@ -5982,7 +5983,8 @@ i386_index_check (const char *operand_string) || (i.prefix[ADDR_PREFIX] && !i.base_reg->reg_type.bitfield.reg32)) && (i.index_reg - || i.base_reg->reg_num != RegRip)) + || i.base_reg->reg_num != + (i.prefix[ADDR_PREFIX] == 0 ? RegRip : RegEip))) || (i.index_reg && (!i.index_reg->reg_type.bitfield.baseindex || (i.prefix[ADDR_PREFIX] == 0 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index b5992282fa7..fa691771b81 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-09-26 Jan Beulich + + * gas/i386/reloc64.s: Adjust for %eip-relative addressing no + longer generating errors. + * gas/i386/reloc64.d, gas/i386/reloc64.l: Update. + * gas/i386/x86-64-addr32.s: Remove explicit addr32 prefix + for %eip-realtive addressing case. + 2007-09-25 Nathan Sidwell * gas/m68k/br-isaa.d: Dump relocs too. diff --git a/gas/testsuite/gas/i386/reloc64.d b/gas/testsuite/gas/i386/reloc64.d index 333deaa3a61..5c14019d4eb 100644 --- a/gas/testsuite/gas/i386/reloc64.d +++ b/gas/testsuite/gas/i386/reloc64.d @@ -18,6 +18,7 @@ Disassembly of section \.text: .*[ ]+R_X86_64_PC8[ ]+xtrn\+0x0*1 .*[ ]+R_X86_64_PC32[ ]+xtrn\+0xf+c .*[ ]+R_X86_64_PC32[ ]+xtrn\+0xf+c +.*[ ]+R_X86_64_PC32[ ]+xtrn\+0xf+c .*[ ]+R_X86_64_PC8[ ]+xtrn\+0xf+f .*[ ]+R_X86_64_GOT64[ ]+xtrn .*[ ]+R_X86_64_GOT32[ ]+xtrn @@ -28,6 +29,7 @@ Disassembly of section \.text: .*[ ]+R_X86_64_GOTPCREL[ ]+xtrn\+0xf+c .*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0x0*2 .*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0xf+c +.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0xf+c .*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0x0*2 .*[ ]+R_X86_64_PLT32[ ]+xtrn .*[ ]+R_X86_64_PLT32[ ]+xtrn diff --git a/gas/testsuite/gas/i386/reloc64.l b/gas/testsuite/gas/i386/reloc64.l index 87a5c772c32..ded5cabd366 100644 --- a/gas/testsuite/gas/i386/reloc64.l +++ b/gas/testsuite/gas/i386/reloc64.l @@ -1,5 +1,4 @@ .*: Assembler messages: -.*:29: Error: .* .*:35: Error: .* .*:36: Error: .* .*:37: Error: .* @@ -17,7 +16,6 @@ .*:54: Error: .* .*:55: Error: .* .*:57: Error: .* -.*:66: Error: .* .*:73: Error: .* .*:75: Error: .* .*:76: Error: .* diff --git a/gas/testsuite/gas/i386/reloc64.s b/gas/testsuite/gas/i386/reloc64.s index 7fd741af839..f12271d3588 100644 --- a/gas/testsuite/gas/i386/reloc64.s +++ b/gas/testsuite/gas/i386/reloc64.s @@ -26,7 +26,7 @@ ill mov $(xtrn - .), %eax mov $(xtrn - .), %ax mov $(xtrn - .), %al mov xtrn(%rip), %eax -bad mov xtrn(%eip), %eax + mov xtrn(%eip), %eax call xtrn jrcxz xtrn @@ -62,8 +62,8 @@ ill movabs $_GLOBAL_OFFSET_TABLE_, %rax ill add $_GLOBAL_OFFSET_TABLE_, %eax ill add $_GLOBAL_OFFSET_TABLE_, %ax ill add $_GLOBAL_OFFSET_TABLE_, %al - lea _GLOBAL_OFFSET_TABLE_(%rip), %rax #??? -bad lea _GLOBAL_OFFSET_TABLE_(%eip), %rax + lea _GLOBAL_OFFSET_TABLE_(%rip), %rax + lea _GLOBAL_OFFSET_TABLE_(%eip), %rax ill movabs $(_GLOBAL_OFFSET_TABLE_ - .), %rax add $(_GLOBAL_OFFSET_TABLE_ - .), %rax ill add $(_GLOBAL_OFFSET_TABLE_ - .), %eax diff --git a/gas/testsuite/gas/i386/x86-64-addr32.s b/gas/testsuite/gas/i386/x86-64-addr32.s index c32525ffa1f..889c5fd6680 100644 --- a/gas/testsuite/gas/i386/x86-64-addr32.s +++ b/gas/testsuite/gas/i386/x86-64-addr32.s @@ -1,7 +1,7 @@ .text lea symbol(%eax), %rax lea symbol(%r8d), %rax - addr32 lea symbol(%rip), %rax + lea symbol(%eip), %rax addr32 lea symbol, %rax addr32 mov 0x600898,%al addr32 mov 0x600898,%ax diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index add8f6ac5b0..cada41096fd 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2007-09-26 Jan Beulich + + * i386-opc.h (RegEip): Define. + (RegEiz): Adjust. + * i386-reg.tbl: Add eip. Mark rip and eip with RegRex64. + * i386-tbl.h: Re-generate. + 2007-09-25 H.J. Lu * i386-gen.c (process_i386_opcodes): Process opcode_length. diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index b052e81c29c..2f6e5b381b3 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -447,8 +447,9 @@ typedef struct #define RegRex64 0x2 /* Extended 8 bit register. */ unsigned int reg_num; #define RegRip ((unsigned int ) ~0) +#define RegEip (RegRip - 1) /* EIZ and RIZ are fake index registers. */ -#define RegEiz (RegRip - 1) +#define RegEiz (RegEip - 1) #define RegRiz (RegEiz - 1) } reg_entry; diff --git a/opcodes/i386-reg.tbl b/opcodes/i386-reg.tbl index 373aba7c6ae..4a86cff4d7b 100644 --- a/opcodes/i386-reg.tbl +++ b/opcodes/i386-reg.tbl @@ -187,9 +187,10 @@ xmm12, RegXMM, RegRex, 4 xmm13, RegXMM, RegRex, 5 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, RegRip +// No type will make these registers rejected for all purposes except +// for addressing. This saves creating one extra type for RIP/EIP. +rip, BaseIndex, RegRex64, RegRip +eip, BaseIndex, RegRex64, RegEip // No type will make these registers rejected for all purposes except // for addressing. eiz, BaseIndex, 0, RegEiz diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h index 9927bf90634..5926fb89187 100644 --- a/opcodes/i386-tbl.h +++ b/opcodes/i386-tbl.h @@ -13278,7 +13278,11 @@ 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, RegRip }, + RegRex64, RegRip }, + { "eip", + { { 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 } }, + RegRex64, RegEip }, { "eiz", { { 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 } },