]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp)
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 28 Jul 2020 10:41:16 +0000 (03:41 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 28 Jul 2020 10:55:53 +0000 (03:55 -0700)
Since (%bp)/(%ebp)/(%rbp) are encoded as 0(%bp)/0(%ebp)/0(%rbp), use
disp32/disp16 on 0(%bp)/0(%ebp)/0(%rbp) for {disp32}.

Note: Since there is no disp32 on 0(%bp), use disp16 instead.

PR gas/26305
* config/tc-i386.c (build_modrm_byte): Use disp32/disp16 on
(%bp)/(%ebp)/(%rbp) for {disp32}.
* doc/c-i386.texi: Update {disp32} documentation.
* testsuite/gas/i386/pseudos.s: Add (%bp)/(%ebp) tests.
* testsuite/gas/i386/x86-64-pseudos.s: Add (%ebp)/(%rbp) tests.
* testsuite/gas/i386/pseudos.d: Updated.
* testsuite/gas/i386/x86-64-pseudos.d: Likewise.

gas/ChangeLog
gas/config/tc-i386.c
gas/doc/c-i386.texi
gas/testsuite/gas/i386/pseudos.d
gas/testsuite/gas/i386/pseudos.s
gas/testsuite/gas/i386/x86-64-pseudos.d
gas/testsuite/gas/i386/x86-64-pseudos.s

index 2bb068f343e073c5cae26c6d6bc4b6f5cd9decd7..ebc99b6e9c63d06440e24177b050c1af8225e0a6 100644 (file)
@@ -1,3 +1,14 @@
+2020-07-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/26305
+       * config/tc-i386.c (build_modrm_byte): Use disp32/disp16 on
+       (%bp)/(%ebp)/(%rbp) for {disp32}.
+       * doc/c-i386.texi: Update {disp32} documentation.
+       * testsuite/gas/i386/pseudos.s: Add (%bp)/(%ebp) tests.
+       * testsuite/gas/i386/x86-64-pseudos.s: Add (%ebp)/(%rbp) tests.
+       * testsuite/gas/i386/pseudos.d: Updated.
+       * testsuite/gas/i386/x86-64-pseudos.d: Likewise.
+
 2020-07-27  H.J. Lu  <hongjiu.lu@intel.com>
 
        * doc/as.texi: Replace preceeded with preceded.
index 9ab841383c5fad93dd1f31a6a042f2f5f18b911b..11d0e992f970fc80ffde7be0247afe8da1363df3 100644 (file)
@@ -8151,7 +8151,12 @@ build_modrm_byte (void)
                      if (operand_type_check (i.types[op], disp) == 0)
                        {
                          /* fake (%bp) into 0(%bp)  */
-                         i.types[op].bitfield.disp8 = 1;
+                         if (i.disp_encoding == disp_encoding_32bit)
+                           /* NB: Use disp16 since there is no disp32
+                              in 16-bit mode.  */
+                           i.types[op].bitfield.disp16 = 1;
+                         else
+                           i.types[op].bitfield.disp8 = 1;
                          fake_zero_displacement = 1;
                        }
                    }
@@ -8196,7 +8201,10 @@ build_modrm_byte (void)
              if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
                {
                  fake_zero_displacement = 1;
-                 i.types[op].bitfield.disp8 = 1;
+                 if (i.disp_encoding == disp_encoding_32bit)
+                   i.types[op].bitfield.disp32 = 1;
+                 else
+                   i.types[op].bitfield.disp8 = 1;
                }
              i.sib.scale = i.log2_scale_factor;
              if (i.index_reg == 0)
index 3813f5eb59d7f3940a7ea92996766e84c82c0354..8be708e7450ad23bc64a89dc10b6564f2d2c029d 100644 (file)
@@ -822,7 +822,7 @@ Different encoding options can be specified via pseudo prefixes:
 @samp{@{disp8@}} -- prefer 8-bit displacement.
 
 @item
-@samp{@{disp32@}} -- prefer 32-bit displacement.
+@samp{@{disp32@}} -- prefer 32-bit (16-bit in 16-bit mode) displacement.
 
 @item
 @samp{@{load@}} -- prefer load-form instruction.
index 00c10a520b1779e5bdf148b0254ff217396e26b0..76aae367b446ab37cfdc2c891bc2bda67a9d2f1b 100644 (file)
@@ -288,6 +288,15 @@ Disassembly of section .text:
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   8a 85 00 00 00 00       mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 46 00             mov    0x0\(%bp\),%al
+ +[a-f0-9]+:   67 8a 46 00             mov    0x0\(%bp\),%al
+ +[a-f0-9]+:   67 8a 86 00 00          mov    0x0\(%bp\),%al
  +[a-f0-9]+:   c4 e1 78 28 d7          vmovaps %xmm7,%xmm2
  +[a-f0-9]+:   c4 e1 78 28 d7          vmovaps %xmm7,%xmm2
  +[a-f0-9]+:   c4 e1 78 29 fa          vmovaps %xmm7,%xmm2
@@ -316,4 +325,13 @@ Disassembly of section .text:
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   0f 28 90 80 00 00 00    movaps 0x80\(%eax\),%xmm2
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   8a 85 00 00 00 00       mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 07                mov    \(%bx\),%al
+ +[a-f0-9]+:   67 8a 46 00             mov    0x0\(%bp\),%al
+ +[a-f0-9]+:   67 8a 46 00             mov    0x0\(%bp\),%al
+ +[a-f0-9]+:   67 8a 86 00 00          mov    0x0\(%bp\),%al
 #pass
index 19900dd7e5999b60d1d879644d6ef89ff48d327e..bc18654ced037e00e57dad3d065059e5fe1b031c 100644 (file)
@@ -293,6 +293,18 @@ _start:
        {disp8} movaps 128(%eax),%xmm2
        {disp32} movaps 128(%eax),%xmm2
 
+       movb (%ebp),%al
+       {disp8} movb (%ebp),%al
+       {disp32} movb (%ebp),%al
+
+       movb (%bx),%al
+       {disp8} movb (%bx),%al
+       {disp32} movb (%bx),%al
+
+       movb (%bp),%al
+       {disp8} movb (%bp),%al
+       {disp32} movb (%bp),%al
+
        .intel_syntax noprefix
        {vex3} vmovaps xmm2,xmm7
        {vex3} {load} vmovaps xmm2,xmm7
@@ -322,3 +334,15 @@ _start:
        movaps xmm2,XMMWORD PTR [eax+128]
        {disp8} movaps xmm2,XMMWORD PTR [eax+128]
        {disp32} movaps xmm2,XMMWORD PTR [eax+128]
+
+       mov al, BYTE PTR [ebp]
+       {disp8} mov al, BYTE PTR [ebp]
+       {disp32} mov al, BYTE PTR [ebp]
+
+       mov al, BYTE PTR [bx]
+       {disp8} mov al, BYTE PTR [bx]
+       {disp32} mov al, BYTE PTR [bx]
+
+       mov al, BYTE PTR [bp]
+       {disp8} mov al, BYTE PTR [bp]
+       {disp32} mov al, BYTE PTR [bp]
index d5f4e0571190c2c6b6c7fc45cb64ffba83aef277..0fb18a33696a389a2b54e6d2e2591e2d2d9eaad6 100644 (file)
@@ -315,6 +315,12 @@ Disassembly of section .text:
  +[a-f0-9]+:   41 0f 28 10             movaps \(%r8\),%xmm2
  +[a-f0-9]+:   40 0f 38 01 01          rex phaddw \(%rcx\),%mm0
  +[a-f0-9]+:   41 0f 38 01 00          phaddw \(%r8\),%mm0
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   8a 85 00 00 00 00       mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   67 8a 45 00             mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 45 00             mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 85 00 00 00 00    mov    0x0\(%ebp\),%al
  +[a-f0-9]+:   c4 e1 78 28 d7          vmovaps %xmm7,%xmm2
  +[a-f0-9]+:   c4 e1 78 28 d7          vmovaps %xmm7,%xmm2
  +[a-f0-9]+:   c4 e1 78 29 fa          vmovaps %xmm7,%xmm2
@@ -353,4 +359,10 @@ Disassembly of section .text:
  +[a-f0-9]+:   41 0f 28 10             movaps \(%r8\),%xmm2
  +[a-f0-9]+:   40 0f 38 01 01          rex phaddw \(%rcx\),%mm0
  +[a-f0-9]+:   41 0f 38 01 00          phaddw \(%r8\),%mm0
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   8a 45 00                mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   8a 85 00 00 00 00       mov    0x0\(%rbp\),%al
+ +[a-f0-9]+:   67 8a 45 00             mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 45 00             mov    0x0\(%ebp\),%al
+ +[a-f0-9]+:   67 8a 85 00 00 00 00    mov    0x0\(%ebp\),%al
 #pass
index 1bd88181212856f25fe47495cf26aa898802309d..3b3638cf750e2ebb5b67a0ac3ae70d334eb3e8fb 100644 (file)
@@ -320,6 +320,14 @@ _start:
        {rex} phaddw (%rcx),%mm0
        {rex} phaddw (%r8),%mm0
 
+       movb (%rbp),%al
+       {disp8} movb (%rbp),%al
+       {disp32} movb (%rbp),%al
+
+       movb (%ebp),%al
+       {disp8} movb (%ebp),%al
+       {disp32} movb (%ebp),%al
+
        .intel_syntax noprefix
        {vex3} vmovaps xmm2,xmm7
        {vex3} {load} vmovaps xmm2,xmm7
@@ -359,3 +367,11 @@ _start:
        {rex} movaps xmm2,XMMWORD PTR [r8]
        {rex} phaddw mm0,QWORD PTR [rcx]
        {rex} phaddw mm0,QWORD PTR [r8]
+
+       mov al, BYTE PTR [rbp]
+       {disp8} mov al, BYTE PTR [rbp]
+       {disp32} mov al, BYTE PTR [rbp]
+
+       mov al, BYTE PTR [ebp]
+       {disp8} mov al, BYTE PTR [ebp]
+       {disp32} mov al, BYTE PTR [ebp]