x86-64: correct / adjust prefix emission
authorJan Beulich <jbeulich@suse.com>
Fri, 27 Dec 2019 08:39:17 +0000 (09:39 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 27 Dec 2019 08:39:17 +0000 (09:39 +0100)
First and foremost REX must come last. Next JumpInterSegment branches
can't possibly have a REX prefix, as they're consistently CpuNo64. And
finally make BND prefix handling in output_branch() consistent with that
of other prefixes in the same function, and make its placement among
prefixes consistent with output_jump() (which, oddly enough, still isn't
the supposedly canonical order specified by the *_PREFIX definitions).

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/x86-64-branch-2.d
gas/testsuite/gas/i386/x86-64-branch-2.s
gas/testsuite/gas/i386/x86-64-branch-3.d
gas/testsuite/gas/i386/x86-64-branch-3.s
gas/testsuite/gas/i386/x86-64-mpx-branch-1.d
gas/testsuite/gas/i386/x86-64-mpx-branch-1.s
gas/testsuite/gas/i386/x86-64-mpx-branch-2.d
gas/testsuite/gas/i386/x86-64-mpx-branch-2.s

index 578d76fe1aa96dbf99ab7a5ee73837aa02261950..286f018747b0564115c2f24a31bcb6785f7d796b 100644 (file)
@@ -1,3 +1,19 @@
+2019-12-27  Jan Beulich  <jbeulich@suse.com>
+
+       * config/tc-i386.c (output_branch): Handle BND prefix the same
+       way as other prefixes. Emit it last before REX.
+       (output_jump): Emit BND before REX.
+       (output_interseg_jump): Don't emit REX.
+       * testsuite/gas/i386/x86-64-branch-2.s,
+       testsuite/gas/i386/x86-64-branch-3.s,
+       testsuite/gas/i386/x86-64-mpx-branch-1.s,
+       testsuite/gas/i386/x86-64-mpx-branch-2.s: Add REX.W cases.
+       * testsuite/gas/i386/x86-64-mpx-branch-2.d: Match output against
+       x86-64-mpx-branch-1.d.
+       * testsuite/gas/i386/x86-64-branch-2.d,
+       testsuite/gas/i386/x86-64-branch-3.d,
+       testsuite/gas/i386/x86-64-mpx-branch-1.d: Adjust expectations.
+
 2019-12-27  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (flip_code16): New.
index 770fa527a06787284aff9523f08b501031a84850..8e89b00f8d1e89ae79815cb1d02ccc0d44a21b6a 100644 (file)
@@ -7910,8 +7910,8 @@ output_branch (void)
   /* BND prefixed jump.  */
   if (i.prefix[BND_PREFIX] != 0)
     {
-      FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
-      i.prefixes -= 1;
+      prefix++;
+      i.prefixes--;
     }
 
   if (i.prefixes != 0 && !intel_syntax)
@@ -7930,6 +7930,8 @@ output_branch (void)
   if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
       || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
     *p++ = i.prefix[SEG_PREFIX];
+  if (i.prefix[BND_PREFIX] != 0)
+    *p++ = BND_PREFIX_OPCODE;
   if (i.prefix[REX_PREFIX] != 0)
     *p++ = i.prefix[REX_PREFIX];
   *p = i.tm.base_opcode;
@@ -8042,16 +8044,16 @@ output_jump (void)
        size = 2;
     }
 
-  if (i.prefix[REX_PREFIX] != 0)
+  /* BND prefixed jump.  */
+  if (i.prefix[BND_PREFIX] != 0)
     {
-      FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
+      FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
       i.prefixes -= 1;
     }
 
-  /* BND prefixed jump.  */
-  if (i.prefix[BND_PREFIX] != 0)
+  if (i.prefix[REX_PREFIX] != 0)
     {
-      FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
+      FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
       i.prefixes -= 1;
     }
 
@@ -8109,11 +8111,8 @@ output_interseg_jump (void)
       i.prefixes -= 1;
       code16 ^= CODE16;
     }
-  if (i.prefix[REX_PREFIX] != 0)
-    {
-      prefix++;
-      i.prefixes -= 1;
-    }
+
+  gas_assert (!i.prefix[REX_PREFIX]);
 
   size = 4;
   if (code16)
index 5078daa197719b875dd67edd7c5f6188d1d975d9..196fa8ed8d6d6619f1769fc2c1a9484a5d04c55a 100644 (file)
@@ -6,10 +6,12 @@
 
 Disassembly of section .text:
 
-0+ <bar-0x4>:
-[      ]*[a-f0-9]+:    66 e9 00 00             jmpw   4 <bar>  2: R_X86_64_PC16        foo-0x2
+0+ <bar-0xb>:
+[      ]*[a-f0-9]+:    66 e9 00 00             jmpw   4 <bar-0x7>      2: R_X86_64_PC16        foo-0x2
+[      ]*[a-f0-9]+:    66 48 e9 00 00 00 00    data16 jmpq b <bar>     7: R_X86_64_PLT32       foo-0x4
 
-0+4 <bar>:
+0+b <bar>:
 [      ]*[a-f0-9]+:    89 c3                   mov    %eax,%ebx
-[      ]*[a-f0-9]+:    66 e8 00 00             callw  a <bar\+0x6>     8: R_X86_64_PC16        foo-0x2
+[      ]*[a-f0-9]+:    66 e8 00 00             callw  11 <bar\+0x6>    f: R_X86_64_PC16        foo-0x2
+[      ]*[a-f0-9]+:    66 48 e8 00 00 00 00    data16 callq 18 <bar\+0xd>      14: R_X86_64_PLT32      foo-0x4
 #pass
index 16c85a3f7b1c1b97d20d1c87d4e7835a9d6bff9d..3a4911b67ce46f88651df197fc3f1d1b71af3b13 100644 (file)
@@ -1,7 +1,9 @@
        .text
        data16 jmp foo
+       data16 rex.w jmp foo
 
 bar:
        mov %eax, %ebx
 
        data16 call foo
+       data16 rex.w call foo
index c66647cd80490a2ca9b1c32b210fdc6cedfd917f..7b9e21dc661feab8139e27f12972d04c89e41f1f 100644 (file)
@@ -6,11 +6,14 @@
 
 Disassembly of section .text:
 
-0+ <bar-0x6>:
-[      ]*[a-f0-9]+:    66 e9 00 00 00 00       data16 jmpq 6 <bar>     2: R_X86_64_PLT32       foo-0x4
+0+ <bar-0xd>:
+[      ]*[a-f0-9]+:    66 e9 00 00 00 00       data16 jmpq 6 <bar-0x7> 2: R_X86_64_PLT32       foo-0x4
+[      ]*[a-f0-9]+:    66 48 e9 00 00 00 00    data16 rex\.W jmpq d <bar>      9: R_X86_64_PLT32       foo-0x4
 
-0+6 <bar>:
+0+d <bar>:
 [      ]*[a-f0-9]+:    89 c3                   mov    %eax,%ebx
-[      ]*[a-f0-9]+:    66 e8 00 00 00 00       data16 callq e <bar\+0x8>       a: R_X86_64_PLT32       foo-0x4
-[      ]*[a-f0-9]+:    66 c7 f8 00 00          xbeginw 13 <bar\+0xd>   11: R_X86_64_PC16       foo-0x2
+[      ]*[a-f0-9]+:    66 e8 00 00 00 00       data16 callq 15 <bar\+0x8>      11: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    66 48 e8 00 00 00 00    data16 rex\.W callq 1c <bar\+0xf>       18: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    66 c7 f8 00 00          xbeginw 21 <bar\+0x14>  1f: R_X86_64_PC16       foo-0x2
+[      ]*[a-f0-9]+:    66 48 c7 f8 00 00 00 00         data16 xbeginq 29 <bar\+0x1c>   25: R_X86_64_PLT32      foo-0x4
 #pass
index 42bdac001fcf61fff15ec4ebfe46cee2fa500d82..cc16487424bc2d53d379079493ae0770f66e6247 100644 (file)
@@ -1,9 +1,12 @@
        .text
        data16 jmp foo
+       data16 rex.w jmp foo
 
 bar:
        mov %eax, %ebx
 
        data16 call foo
+       data16 rex.w call foo
 
        data16 xbegin foo
+       data16 rex.w xbegin foo
index 7ee6c6b82fe0a8e68d916f7b2cb1bdcca460204a..03e9675217dd4b98064f873487357c28865011fb 100644 (file)
@@ -8,22 +8,24 @@
 
 Disassembly of section .text:
 
-0+ <foo1-0xc>:
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 6 <foo1-0x6>  2: R_X86_64_PC32        \*ABS\*\+0x10003c
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq c <foo1>       8: R_X86_64_PC32        \*ABS\*\+0x10003c
+0+ <foo1-0x1c>:
+[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 6 <foo1-0x16> 2: R_X86_64_PC32        \*ABS\*\+0x10003c
+[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq c <foo1-0x10>  8: R_X86_64_PC32        \*ABS\*\+0x10003c
+[      ]*[a-f0-9]+:    66 f2 48 e8 00 00 00 00         data16 bnd callq 14 <foo1-0x8>  10: R_X86_64_PC32       \*ABS\*\+0x10003c
+[      ]*[a-f0-9]+:    66 f2 48 e9 00 00 00 00         data16 bnd jmpq 1c <foo1>       18: R_X86_64_PC32       \*ABS\*\+0x10003c
 
-0+c <foo1>:
-[      ]*[a-f0-9]+:    f2 eb fd                bnd jmp c <foo1>
-[      ]*[a-f0-9]+:    f2 72 fa                bnd jb c <foo1>
-[      ]*[a-f0-9]+:    f2 e8 f4 ff ff ff       bnd callq c <foo1>
-[      ]*[a-f0-9]+:    f2 eb 09                bnd jmp 24 <foo2>
-[      ]*[a-f0-9]+:    f2 72 06                bnd jb 24 <foo2>
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 24 <foo2>
+0+1c <foo1>:
+[      ]*[a-f0-9]+:    f2 eb fd                bnd jmp 1c <foo1>
+[      ]*[a-f0-9]+:    f2 72 fa                bnd jb 1c <foo1>
+[      ]*[a-f0-9]+:    f2 e8 f4 ff ff ff       bnd callq 1c <foo1>
+[      ]*[a-f0-9]+:    f2 eb 09                bnd jmp 34 <foo2>
+[      ]*[a-f0-9]+:    f2 72 06                bnd jb 34 <foo2>
+[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 34 <foo2>
 
-0+24 <foo2>:
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 2a <foo2\+0x6> 26: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 31 <foo2\+0xd>   2d: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 37 <foo2\+0x13>       33: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 3d <foo2\+0x19>        39: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 44 <foo2\+0x20>  40: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 4a <foo2\+0x26>       46: R_X86_64_PLT32      foo-0x4
+0+34 <foo2>:
+[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 3a <foo2\+0x6> 36: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 41 <foo2\+0xd>   3d: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 47 <foo2\+0x13>       43: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 4d <foo2\+0x19>        49: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 54 <foo2\+0x20>  50: R_X86_64_PLT32      foo-0x4
+[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 5a <foo2\+0x26>       56: R_X86_64_PLT32      foo-0x4
index 3cdb1091724ff82528cf5854a040586227b6b564..16cd019ab4d539c024e0ac8b6ec75a2e7be59d9e 100644 (file)
@@ -2,6 +2,9 @@
        bnd call        0x100040
        bnd jmp         0x100040
 
+       bnd data16 rex.w call   0x100040
+       bnd data16 rex.w jmp    0x100040
+
 foo1:
        bnd jmp         foo1
        bnd jb          foo1
index 96e000936f131528ba1de56cff0a1cd85e740ece..c61b3af69e8023d80cc37b92afe6f473db8b0868 100644 (file)
@@ -1,29 +1,5 @@
 #as: -J -madd-bnd-prefix
 #objdump: -dwr
 #name: x86-64 branch with BND prefix
+#dump: x86-64-mpx-branch-1.d
 #notarget: *-*-solaris*
-
-.*: +file format .*
-
-
-Disassembly of section .text:
-
-0+ <foo1-0xc>:
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 6 <foo1-0x6>  2: R_X86_64_PC32        \*ABS\*\+0x10003c
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq c <foo1>       8: R_X86_64_PC32        \*ABS\*\+0x10003c
-
-0+c <foo1>:
-[      ]*[a-f0-9]+:    f2 eb fd                bnd jmp c <foo1>
-[      ]*[a-f0-9]+:    f2 72 fa                bnd jb c <foo1>
-[      ]*[a-f0-9]+:    f2 e8 f4 ff ff ff       bnd callq c <foo1>
-[      ]*[a-f0-9]+:    f2 eb 09                bnd jmp 24 <foo2>
-[      ]*[a-f0-9]+:    f2 72 06                bnd jb 24 <foo2>
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 24 <foo2>
-
-0+24 <foo2>:
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 2a <foo2\+0x6> 26: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 31 <foo2\+0xd>   2d: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 37 <foo2\+0x13>       33: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e9 00 00 00 00       bnd jmpq 3d <foo2\+0x19>        39: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 0f 82 00 00 00 00    bnd jb 44 <foo2\+0x20>  40: R_X86_64_PLT32      foo-0x4
-[      ]*[a-f0-9]+:    f2 e8 00 00 00 00       bnd callq 4a <foo2\+0x26>       46: R_X86_64_PLT32      foo-0x4
index 5fe90883a6eed32cd5aecf16ab5bea4a5033b43c..15c53b0da193a3988a96d025bcac4042ba5f6a8a 100644 (file)
@@ -2,6 +2,9 @@
        call    0x100040
        jmp     0x100040
 
+       data16 rex.w call       0x100040
+       data16 rex.w jmp        0x100040
+
 foo1:
        jmp     foo1
        jb      foo1