x86: make {disp16} work similarly to {disp32}
authorJan Beulich <jbeulich@suse.com>
Tue, 12 Apr 2022 07:01:55 +0000 (09:01 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 12 Apr 2022 07:01:55 +0000 (09:01 +0200)
In a few places {disp32} was handled specially when really {disp16}
wants handling just the same.

gas/config/tc-i386.c
gas/testsuite/gas/i386/inval-pseudo.l
gas/testsuite/gas/i386/inval-pseudo.s
gas/testsuite/gas/i386/pseudos.d
gas/testsuite/gas/i386/pseudos.s

index c2678ea10cc9f8ed29c90ca1072c4b45c1b1342c..c26b654eb72695e41d4e424f35114af5d6cb5228 100644 (file)
@@ -4937,7 +4937,7 @@ md_assemble (char *line)
   /* Don't optimize displacement for movabs since it only takes 64bit
      displacement.  */
   if (i.disp_operands
-      && i.disp_encoding != disp_encoding_32bit
+      && i.disp_encoding <= disp_encoding_8bit
       && (flag_code != CODE_64BIT
          || strcmp (mnemonic, "movabs") != 0))
     optimize_disp ();
@@ -6304,7 +6304,7 @@ check_VecOperands (const insn_template *t)
 
   /* Check vector Disp8 operand.  */
   if (t->opcode_modifier.disp8memshift
-      && i.disp_encoding != disp_encoding_32bit)
+      && i.disp_encoding <= disp_encoding_8bit)
     {
       if (i.broadcast.type)
        i.memshift = t->opcode_modifier.broadcast - 1;
@@ -8772,7 +8772,7 @@ output_branch (void)
     }
 
   code16 = flag_code == CODE_16BIT ? CODE16 : 0;
-  size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
+  size = i.disp_encoding > disp_encoding_8bit ? BIG : SMALL;
 
   prefix = 0;
   if (i.prefix[DATA_PREFIX] != 0)
index 9df0a9851fd5e5e90df63872b99095654843c581..f3b027476f820cd4534bb7a628bbe5a7af20ef2c 100644 (file)
@@ -2,6 +2,8 @@
 .*:3: Error: .*
 .*:5: Error: .*
 .*:6: Error: .*
+.*:7: Error: .*
+.*:9: Error: .*
 GAS LISTING .*
 
 
@@ -11,5 +13,7 @@ GAS LISTING .*
 [      ]*4[    ]+\?\?\?\? 90                   nop
 [      ]*5[    ]+\{disp32\} movb \(%bp\),%al
 [      ]*6[    ]+\{disp16\} movb \(%ebp\),%al
-[      ]*7[    ]+\?\?\?\? 00000000             \.p2align 4,0
+[      ]*7[    ]+\{disp16\} jmp \.
+[      ]*8[    ]+\.code16
+[      ]*9[    ]+\{disp32\} jmp \.
 #...
index b5a6233eb1d4dd68acfb86450a114795ff28bbaa..5184b67004a6fd81317d0dd5029b18103e522dee 100644 (file)
@@ -4,4 +4,7 @@
        nop
        {disp32} movb (%bp),%al
        {disp16} movb (%ebp),%al
+       {disp16} jmp .
+       .code16
+       {disp32} jmp .
        .p2align 4,0
index 4f029f154b45b8bcfd7c2794a719cc5ac5e6d3bd..0772c636457f636d3f15b0daa20a1ddeefd69643 100644 (file)
@@ -25,6 +25,7 @@ Disassembly of section .text:
  +[a-f0-9]+:   c5 f8 28 90 80 00 00 00         vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   c5 f8 28 90 80 00 00 00         vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   62 f1 7c 08 28 50 08    vmovaps 0x80\(%eax\),%xmm2
+ +[a-f0-9]+:   67 62 f1 7c 08 28 97 80 00      vmovaps 0x80\(%bx\),%xmm2
  +[a-f0-9]+:   62 f1 7c 08 28 90 80 00 00 00   vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   89 c8                   mov    %ecx,%eax
  +[a-f0-9]+:   8b c1                   mov    %ecx,%eax
@@ -324,6 +325,7 @@ Disassembly of section .text:
  +[a-f0-9]+:   c5 f8 28 90 80 00 00 00         vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   c5 f8 28 90 80 00 00 00         vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   62 f1 7c 08 28 50 08    vmovaps 0x80\(%eax\),%xmm2
+ +[a-f0-9]+:   67 62 f1 7c 08 28 97 80 00      vmovaps 0x80\(%bx\),%xmm2
  +[a-f0-9]+:   62 f1 7c 08 28 90 80 00 00 00   vmovaps 0x80\(%eax\),%xmm2
  +[a-f0-9]+:   89 c8                   mov    %ecx,%eax
  +[a-f0-9]+:   8b c1                   mov    %ecx,%eax
@@ -354,4 +356,6 @@ Disassembly of section .text:
  +[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]+:   e9 fb ff ff ff          jmp    [0-9a-f]* <.*>
+ +[a-f0-9]+:   e9 fd ff ff ff          jmp    [0-9a-f]* <.*>
 #pass
index 603e112ac8ed6660d1d181a37ed0f63b35beaca0..34a461c262e56167d187040f4d69cc38e5efdc40 100644 (file)
@@ -20,6 +20,7 @@ _start:
        {vex} {disp8} vmovaps 128(%eax),%xmm2
        {vex} {disp32} vmovaps 128(%eax),%xmm2
        {evex} {disp8} vmovaps 128(%eax),%xmm2
+       {evex} {disp16} vmovaps 128(%bx),%xmm2
        {evex} {disp32} vmovaps 128(%eax),%xmm2
 
        mov %ecx, %eax
@@ -337,6 +338,7 @@ _start:
        {vex} {disp8} vmovaps xmm2,XMMWORD PTR [eax+128]
        {vex} {disp32} vmovaps xmm2,XMMWORD PTR [eax+128]
        {evex} {disp8} vmovaps xmm2,XMMWORD PTR [eax+128]
+       {evex} {disp16} vmovaps xmm2,XMMWORD PTR [bx+128]
        {evex} {disp32} vmovaps xmm2,XMMWORD PTR [eax+128]
 
        mov eax,ecx
@@ -373,3 +375,8 @@ _start:
        mov al, BYTE PTR [bp]
        {disp8} mov al, BYTE PTR [bp]
        {disp16} mov al, BYTE PTR [bp]
+
+       {disp32} jmp .
+       .code16
+       {disp16} jmp .
+       .byte -1, -1