When explicitly specified, gas encoded a pointless zero displacement in memory addressing forms. Since this is not normally desired and was most likely just an oversight, this patch adds an adjustment to eliminate the displacement in that case. Built and tested on i686-pc-linux-gnu and x86_64-unknown-linux-gnu. Jan gas/ 2005-05-06 Jan Beulich * config/tc-i386.c (optimize_disp): Discard displacement entirely when zero and not required by encoding constraints. gas/testsuite/ 2005-05-06 Jan Beulich * gas/i386/tlsd.[sd]: Adjust to not assume zero displacement will actually be present in memory addressing. * gas/i386/tlspic.[sd]: Likewise. --- /home/jbeulich/src/binutils/mainline/2005-05-06/gas/config/tc-i386.c 2005-05-06 08:24:28.000000000 +0200 +++ 2005-05-06/gas/config/tc-i386.c 2005-05-06 11:45:55.861726528 +0200 @@ -2069,7 +2082,13 @@ optimize_disp () disp &= (((offsetT) 2 << 31) - 1); disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31); } - if (flag_code == CODE_64BIT) + if (!disp && (i.types[op] & BaseIndex)) + { + i.types[op] &= ~Disp; + i.op[op].disps = 0; + i.disp_operands--; + } + else if (flag_code == CODE_64BIT) { if (fits_in_signed_long (disp)) i.types[op] |= Disp32S; --- /home/jbeulich/src/binutils/mainline/2005-05-06/gas/testsuite/gas/i386/tlsd.d 2002-05-23 15:12:50.000000000 +0200 +++ 2005-05-06/gas/testsuite/gas/i386/tlsd.d 2005-05-06 11:01:48.000000000 +0200 @@ -22,10 +22,10 @@ Disassembly of section .text: [ ]+1f: R_386_TLS_LDM bar 23: e8 fc ff ff ff [ ]*call 24 [ ]+24: R_386_PLT32 ___tls_get_addr - 28: 8d 7f 00 [ ]*lea 0x0\(%edi\),%edi + 28: 83 c7 00 [ ]*add \$0x0,%edi 2b: 8d 90 00 00 00 00 [ ]*lea 0x0\(%eax\),%edx [ ]+2d: R_386_TLS_LDO_32 bar - 31: 8d 76 00 [ ]*lea 0x0\(%esi\),%esi + 31: 83 c6 00 [ ]*add \$0x0,%esi 34: 8d 88 00 00 00 00 [ ]*lea 0x0\(%eax\),%ecx [ ]+36: R_386_TLS_LDO_32 baz 3a: 8b 5d fc [ ]*mov 0xfffffffc\(%ebp\),%ebx --- /home/jbeulich/src/binutils/mainline/2005-05-06/gas/testsuite/gas/i386/tlsd.s 2002-05-23 15:12:50.000000000 +0200 +++ 2005-05-06/gas/testsuite/gas/i386/tlsd.s 2005-05-06 11:03:36.000000000 +0200 @@ -26,13 +26,13 @@ fn: call ___tls_get_addr@PLT /* Just show that there can be arbitrary instructions here */ - leal 0(%edi, 1), %edi + addl $0, %edi leal bar@DTPOFF(%eax), %edx /* %edx now contains &bar */ /* Again, arbitrary instructions */ - leal 0(%esi, 1), %esi + addl $0, %esi leal baz@DTPOFF(%eax), %ecx /* %ecx now contains &baz */ --- /home/jbeulich/src/binutils/mainline/2005-05-06/gas/testsuite/gas/i386/tlspic.d 2002-09-19 21:01:13.000000000 +0200 +++ 2005-05-06/gas/testsuite/gas/i386/tlspic.d 2005-05-06 11:04:11.000000000 +0200 @@ -1,5 +1,5 @@ #objdump: -dr -#name: i386 non-pic tls +#name: i386 pic tls .*: +file format .* @@ -15,12 +15,12 @@ Disassembly of section .text: b: 81 c3 03 00 00 00 [ ]*add \$0x3,%ebx [ ]+d: R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 11: 65 a1 00 00 00 00 [ ]*mov %gs:0x0,%eax - 17: 8d 76 00 [ ]*lea 0x0\(%esi\),%esi + 17: 83 c6 00 [ ]*add \$0x0,%esi 1a: 2b 83 00 00 00 00 [ ]*sub 0x0\(%ebx\),%eax [ ]+1c: R_386_TLS_IE_32 foo 20: 8b 83 00 00 00 00 [ ]*mov 0x0\(%ebx\),%eax [ ]+22: R_386_TLS_GOTIE foo - 26: 8d 76 00 [ ]*lea 0x0\(%esi\),%esi + 26: 83 c6 00 [ ]*add \$0x0,%esi 29: 65 8b 00 [ ]*mov %gs:\(%eax\),%eax 2c: 65 8b 0d 00 00 00 00 [ ]*mov %gs:0x0,%ecx 33: 03 8b 00 00 00 00 [ ]*add 0x0\(%ebx\),%ecx --- /home/jbeulich/src/binutils/mainline/2005-05-06/gas/testsuite/gas/i386/tlspic.s 2002-09-19 21:01:13.000000000 +0200 +++ 2005-05-06/gas/testsuite/gas/i386/tlspic.s 2005-05-06 11:03:48.000000000 +0200 @@ -17,7 +17,7 @@ fn: movl %gs:0, %eax /* Arbitrary instructions in between. */ - leal 0(%esi, 1), %esi + addl $0, %esi subl foo@GOTTPOFF(%ebx), %eax /* %eax now contains &foo */ @@ -26,7 +26,7 @@ fn: movl foo@GOTNTPOFF(%ebx), %eax /* Arbitrary instructions in between. */ - leal 0(%esi, 1), %esi + addl $0, %esi movl %gs:(%eax), %eax /* %eax now contains foo */