x86-64: Display eiz for address with the addr32 prefix
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Aug 2018 16:55:43 +0000 (09:55 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Aug 2018 16:56:00 +0000 (09:56 -0700)
In 64-bit mode, display eiz for address with the addr32 prefix and without
base nor index registers.  For

mov -0xccddef(,%eiz,), %rax

disassembler now displays:

67 48 8b 04 25 11 22 33 ff  mov -0xccddef(,%eiz,1),%rax

instead of

67 48 8b 04 25 11 22 33 ff  addr32 mov 0xffffffffff332211,%rax

gas/

* testsuite/gas/i386/evex-no-scale-64.d: Updated.
* testsuite/gas/i386/x86-64-addr32-intel.d: Likewise.
* testsuite/gas/i386/x86-64-addr32.d: Likewise.
* testsuite/gas/i386/ilp32/x86-64-addr32-intel.d: Likewise.
* testsuite/gas/i386/ilp32/x86-64-addr32.d: Likewise.
* testsuite/gas/i386/x86-64-addr32.s: Add %eiz tests.

opcodes/

* i386-dis.c (OP_E_memory): In 64-bit mode, display eiz for
address with the addr32 prefix and without base nor index
registers.

gas/ChangeLog
gas/testsuite/gas/i386/evex-no-scale-64.d
gas/testsuite/gas/i386/ilp32/x86-64-addr32-intel.d
gas/testsuite/gas/i386/ilp32/x86-64-addr32.d
gas/testsuite/gas/i386/x86-64-addr32-intel.d
gas/testsuite/gas/i386/x86-64-addr32.d
gas/testsuite/gas/i386/x86-64-addr32.s
opcodes/ChangeLog
opcodes/i386-dis.c

index 5adf8cbbb69966677d8d9327550ee9a5cb929d54..df36d50a247272a9debc4b2e40004c854efd6a1f 100644 (file)
@@ -1,3 +1,12 @@
+2018-08-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * testsuite/gas/i386/evex-no-scale-64.d: Updated.
+       * testsuite/gas/i386/x86-64-addr32-intel.d: Likewise.
+       * testsuite/gas/i386/x86-64-addr32.d: Likewise.
+       * testsuite/gas/i386/ilp32/x86-64-addr32-intel.d: Likewise.
+       * testsuite/gas/i386/ilp32/x86-64-addr32.d: Likewise.
+       * testsuite/gas/i386/x86-64-addr32.s: Add %eiz tests.
+
 2018-08-14  Robert Yang  <liezhi.yang@windriver.com>
 
        * as.c (main): Improve check for input file matching output file.
index d52d947ab3a6eecb865e112d4c418454620fcd25..33623656eefbc6fcc8046bbbffbdff8d598c25a8 100644 (file)
@@ -10,5 +10,5 @@ Disassembly of section .text:
  +[a-f0-9]+:   62 f1 7c 48 28 04 05 40 00 00 00        vmovaps 0x40\(,%rax,1\),%zmm0
  +[a-f0-9]+:   62 f1 7c 48 28 04 25 40 00 00 00        vmovaps 0x40,%zmm0
  +[a-f0-9]+:   67 62 f1 7c 48 28 04 05 40 00 00 00     vmovaps 0x40\(,%eax,1\),%zmm0
- +[a-f0-9]+:   67 62 f1 7c 48 28 04 25 40 00 00 00     addr32 vmovaps 0x40,%zmm0
+ +[a-f0-9]+:   67 62 f1 7c 48 28 04 25 40 00 00 00     vmovaps 0x40\(,%eiz,1\),%zmm0
  +[a-f0-9]+:   62 f1 7c 48 28 04 25 40 00 00 00        vmovaps 0x40,%zmm0
index 7edce62ecb8462562a73b61c5f1d9e3ff3d8bd3a..86e8cf8039a85924ac5097328940b4dfafdc800d 100644 (file)
@@ -11,17 +11,19 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    67 48 8d 80 00 00 00 00[        ]+lea[  ]+rax,\[eax\+0x0\].*
 [      ]*[a-f0-9]+:    67 49 8d 80 00 00 00 00[        ]+lea[  ]+rax,\[r8d\+0x0\].*
 [      ]*[a-f0-9]+:    67 48 8d 05 00 00 00 00[        ]+lea[  ]+rax,\[eip\+0x0\].*
-[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00      addr32 lea rax,ds:0x0.*
+[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00      lea[ ]+rax,\[eiz\*1\+0x0\].*
 [      ]*[a-f0-9]+:    67 a0 98 08 60 00       addr32 mov al,ds:0x600898
 [      ]*[a-f0-9]+:    67 66 a1 98 08 60 00    addr32 mov ax,ds:0x600898
 [      ]*[a-f0-9]+:    67 a1 98 08 60 00       addr32 mov eax,ds:0x600898
 [      ]*[a-f0-9]+:    67 48 a1 98 08 60 00    addr32 mov rax,ds:0x600898
 [      ]*[a-f0-9]+:    67 48 a1 98 08 80 00    addr32 mov rax,ds:0x800898
-[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      addr32 mov rbx,QWORD PTR ds:0x800898
+[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      mov[ ]+rbx,QWORD PTR \[eiz\*1\+0x800898\]
 [      ]*[a-f0-9]+:    67 a2 98 08 60 00       addr32 mov ds:0x600898,al
 [      ]*[a-f0-9]+:    67 66 a3 98 08 60 00    addr32 mov ds:0x600898,ax
 [      ]*[a-f0-9]+:    67 a3 98 08 60 00       addr32 mov ds:0x600898,eax
 [      ]*[a-f0-9]+:    67 48 a3 98 08 60 00    addr32 mov ds:0x600898,rax
 [      ]*[a-f0-9]+:    67 48 a3 98 08 80 00    addr32 mov ds:0x800898,rax
-[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      addr32 mov QWORD PTR ds:0x800898,rbx
+[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      mov[ ]+QWORD PTR \[eiz\*1\+0x800898\],rbx
+[      ]*[a-f0-9]+:    67 89 04 25 11 22 33 ff         mov[ ]+DWORD PTR \[eiz\*1-0xccddef\],eax
+[      ]*[a-f0-9]+:    67 89 04 65 11 22 33 ff         mov[ ]+DWORD PTR \[eiz\*2-0xccddef\],eax
 #pass
index c2e17d15eb740eedb9083a4e1e386d4733abd544..b866473acc622abbdf6fc19bfa40abf0e9890d9a 100644 (file)
@@ -11,17 +11,19 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    67 48 8d 80 00 00 00 00[        ]+lea[  ]+0x0\(%eax\),%rax.*
 [      ]*[a-f0-9]+:    67 49 8d 80 00 00 00 00[        ]+lea[  ]+0x0\(%r8d\),%rax.*
 [      ]*[a-f0-9]+:    67 48 8d 05 00 00 00 00[        ]+lea[  ]+0x0\(%eip\),%rax.*
-[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00[     ]+addr32 lea[   ]+0x0,%rax.*
+[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00[     ]+lea[  ]+0x0\(,%eiz,1\),%rax.*
 [      ]*[a-f0-9]+:    67 a0 98 08 60 00       addr32 mov 0x600898,%al
 [      ]*[a-f0-9]+:    67 66 a1 98 08 60 00    addr32 mov 0x600898,%ax
 [      ]*[a-f0-9]+:    67 a1 98 08 60 00       addr32 mov 0x600898,%eax
 [      ]*[a-f0-9]+:    67 48 a1 98 08 60 00    addr32 mov 0x600898,%rax
 [      ]*[a-f0-9]+:    67 48 a1 98 08 80 00    addr32 mov 0x800898,%rax
-[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      addr32 mov 0x800898,%rbx
+[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      mov[ ]+0x800898\(,%eiz,1\),%rbx
 [      ]*[a-f0-9]+:    67 a2 98 08 60 00       addr32 mov %al,0x600898
 [      ]*[a-f0-9]+:    67 66 a3 98 08 60 00    addr32 mov %ax,0x600898
 [      ]*[a-f0-9]+:    67 a3 98 08 60 00       addr32 mov %eax,0x600898
 [      ]*[a-f0-9]+:    67 48 a3 98 08 60 00    addr32 mov %rax,0x600898
 [      ]*[a-f0-9]+:    67 48 a3 98 08 80 00    addr32 mov %rax,0x800898
-[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      addr32 mov %rbx,0x800898
+[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      mov[ ]+%rbx,0x800898\(,%eiz,1\)
+[      ]*[a-f0-9]+:    67 89 04 25 11 22 33 ff         mov[ ]+%eax,-0xccddef\(,%eiz,1\)
+[      ]*[a-f0-9]+:    67 89 04 65 11 22 33 ff         mov[ ]+%eax,-0xccddef\(,%eiz,2\)
 #pass
index 3a7a0c0f631fa4dc9a325e55eb8add3208461c0c..ec0966caf4eb01b006901b33fb060c4af4e45b44 100644 (file)
@@ -11,17 +11,19 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    67 48 8d 80 00 00 00 00[        ]+lea[  ]+rax,\[eax\+0x0\].*
 [      ]*[a-f0-9]+:    67 49 8d 80 00 00 00 00[        ]+lea[  ]+rax,\[r8d\+0x0\].*
 [      ]*[a-f0-9]+:    67 48 8d 05 00 00 00 00[        ]+lea[  ]+rax,\[eip\+0x0\].*
-[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00      addr32 lea rax,ds:0x0.*
+[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00      lea[ ]+rax,\[eiz\*1\+0x0\].*
 [      ]*[a-f0-9]+:    67 a0 98 08 60 00       addr32 mov al,ds:0x600898
 [      ]*[a-f0-9]+:    67 66 a1 98 08 60 00    addr32 mov ax,ds:0x600898
 [      ]*[a-f0-9]+:    67 a1 98 08 60 00       addr32 mov eax,ds:0x600898
 [      ]*[a-f0-9]+:    67 48 a1 98 08 60 00    addr32 mov rax,ds:0x600898
 [      ]*[a-f0-9]+:    67 48 a1 98 08 80 00    addr32 mov rax,ds:0x800898
-[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      addr32 mov rbx,QWORD PTR ds:0x800898
+[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      mov[ ]+rbx,QWORD PTR \[eiz\*1\+0x800898\]
 [      ]*[a-f0-9]+:    67 a2 98 08 60 00       addr32 mov ds:0x600898,al
 [      ]*[a-f0-9]+:    67 66 a3 98 08 60 00    addr32 mov ds:0x600898,ax
 [      ]*[a-f0-9]+:    67 a3 98 08 60 00       addr32 mov ds:0x600898,eax
 [      ]*[a-f0-9]+:    67 48 a3 98 08 60 00    addr32 mov ds:0x600898,rax
 [      ]*[a-f0-9]+:    67 48 a3 98 08 80 00    addr32 mov ds:0x800898,rax
-[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      addr32 mov QWORD PTR ds:0x800898,rbx
+[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      mov[ ]+QWORD PTR \[eiz\*1\+0x800898\],rbx
+[      ]*[a-f0-9]+:    67 89 04 25 11 22 33 ff         mov[ ]+DWORD PTR \[eiz\*1-0xccddef\],eax
+[      ]*[a-f0-9]+:    67 89 04 65 11 22 33 ff         mov[ ]+DWORD PTR \[eiz\*2-0xccddef\],eax
 #pass
index b00e0231da398f4f633a36cadc4f76aaf1d6a3ca..6b73de951fe0a2d5244530772dae095f24c92d14 100644 (file)
@@ -10,17 +10,19 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    67 48 8d 80 00 00 00 00[        ]+lea[  ]+0x0\(%eax\),%rax.*
 [      ]*[a-f0-9]+:    67 49 8d 80 00 00 00 00[        ]+lea[  ]+0x0\(%r8d\),%rax.*
 [      ]*[a-f0-9]+:    67 48 8d 05 00 00 00 00[        ]+lea[  ]+0x0\(%eip\),%rax.*
-[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00[     ]+addr32 lea[   ]+0x0,%rax.*
+[      ]*[a-f0-9]+:    67 48 8d 04 25 00 00 00 00[     ]+lea[ ]+0x0\(,%eiz,1\),%rax.*
 [      ]*[a-f0-9]+:    67 a0 98 08 60 00       addr32 mov 0x600898,%al
 [      ]*[a-f0-9]+:    67 66 a1 98 08 60 00    addr32 mov 0x600898,%ax
 [      ]*[a-f0-9]+:    67 a1 98 08 60 00       addr32 mov 0x600898,%eax
 [      ]*[a-f0-9]+:    67 48 a1 98 08 60 00    addr32 mov 0x600898,%rax
 [      ]*[a-f0-9]+:    67 48 a1 98 08 80 00    addr32 mov 0x800898,%rax
-[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      addr32 mov 0x800898,%rbx
+[      ]*[a-f0-9]+:    67 48 8b 1c 25 98 08 80 00      mov[ ]+0x800898\(,%eiz,1\),%rbx
 [      ]*[a-f0-9]+:    67 a2 98 08 60 00       addr32 mov %al,0x600898
 [      ]*[a-f0-9]+:    67 66 a3 98 08 60 00    addr32 mov %ax,0x600898
 [      ]*[a-f0-9]+:    67 a3 98 08 60 00       addr32 mov %eax,0x600898
 [      ]*[a-f0-9]+:    67 48 a3 98 08 60 00    addr32 mov %rax,0x600898
 [      ]*[a-f0-9]+:    67 48 a3 98 08 80 00    addr32 mov %rax,0x800898
-[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      addr32 mov %rbx,0x800898
+[      ]*[a-f0-9]+:    67 48 89 1c 25 98 08 80 00      mov[ ]+%rbx,0x800898\(,%eiz,1\)
+[      ]*[a-f0-9]+:    67 89 04 25 11 22 33 ff         mov[ ]+%eax,-0xccddef\(,%eiz,1\)
+[      ]*[a-f0-9]+:    67 89 04 65 11 22 33 ff         mov[ ]+%eax,-0xccddef\(,%eiz,2\)
 #pass
index 7f661ec2655ed8edb1149ef0e2134423cc3c96ad..5acdce9dae8ab5b996988d4dc13735f59a14cb7a 100644 (file)
@@ -1,4 +1,5 @@
-.text
+       .text
+       .allow_index_reg
        lea             symbol(%eax), %rax
        lea             symbol(%r8d), %rax
        lea             symbol(%eip), %rax
@@ -15,3 +16,5 @@
        addr32 mov      %rax,0x600898
        addr32 mov      %rax,0x800898
        addr32 mov      %rbx,0x800898
+       mov             %eax, -0xccddef(,%eiz,)
+       mov             %eax, -0xccddef(,%eiz,2)
index d20b7e94889da57d398c591b90bbafb3d620d3f5..78b92696a431214e74b9ff77f74532a3f8035123 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * i386-dis.c (OP_E_memory): In 64-bit mode, display eiz for
+       address with the addr32 prefix and without base nor index
+       registers.
+
 2018-08-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * i386-gen.c (cpu_flag_init): Add CpuCMOV and CpuFXSR to
index 42d219cb119f809af2be4970d6f18f0378de4b25..77f2e2a3d37c1ca7c26e28f877ec6f3d8db8a5b2 100644 (file)
@@ -15337,6 +15337,7 @@ OP_E_memory (int bytemode, int sizeflag)
       int havebase;
       int haveindex;
       int needindex;
+      int needaddr32;
       int base, rbase;
       int vindex = 0;
       int scale = 0;
@@ -15433,12 +15434,27 @@ OP_E_memory (int bytemode, int sizeflag)
          break;
        }
 
-      /* In 32bit mode, we need index register to tell [offset] from
-        [eiz*1 + offset].  */
-      needindex = (havesib
-                  && !havebase
-                  && !haveindex
-                  && address_mode == mode_32bit);
+      needindex = 0;
+      needaddr32 = 0;
+      if (havesib
+         && !havebase
+         && !haveindex
+         && address_mode != mode_16bit)
+       {
+         if (address_mode == mode_64bit)
+           {
+             /* Display eiz instead of addr32.  */
+             needindex = addr32flag;
+             needaddr32 = 1;
+           }
+         else
+           {
+             /* In 32-bit mode, we need index register to tell [offset]
+                from [eiz*1 + offset].  */
+             needindex = 1;
+           }
+       }
+
       havedisp = (havebase
                  || needindex
                  || (havesib && (haveindex || scale != 0)));
@@ -15458,7 +15474,7 @@ OP_E_memory (int bytemode, int sizeflag)
              }
          }
 
-      if ((havebase || haveindex || riprel)
+      if ((havebase || haveindex || needaddr32 || riprel)
          && (bytemode != v_bnd_mode)
          && (bytemode != bnd_mode)
          && (bytemode != bnd_swap_mode))