x86: Check register operand for AddrPrefixOpReg
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 30 Sep 2020 23:33:35 +0000 (16:33 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 30 Sep 2020 23:33:52 +0000 (16:33 -0700)
If the address prefix changes the register operand, we need to check the
register operand when the memory operand is RIP-relative.

PR gas/26685
* config/tc-i386.c (process_suffix): Check the register operand
for the address size prefix if the memory operand is symbol(%rip).
* testsuite/gas/i386/x86-64-enqcmd.s: Add tests with RIP-relative
addressing.
* testsuite/gas/i386/x86-64-movdir.s: Likewise.
* testsuite/gas/i386/x86-64-enqcmd-intel.d: Updated.
* testsuite/gas/i386/x86-64-enqcmd.d: Likewise.
* testsuite/gas/i386/x86-64-movdir-intel.d: Likewise.
* testsuite/gas/i386/x86-64-movdir.d: Likewise.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/x86-64-enqcmd-intel.d
gas/testsuite/gas/i386/x86-64-enqcmd.d
gas/testsuite/gas/i386/x86-64-enqcmd.s
gas/testsuite/gas/i386/x86-64-movdir-intel.d
gas/testsuite/gas/i386/x86-64-movdir.d
gas/testsuite/gas/i386/x86-64-movdir.s

index 100d8172249a40e7a87bd96b0ebb703ff3d00917..f12a18a72d1a7b1b55932d9e1c4d1c47a5e01a32 100644 (file)
@@ -1,3 +1,16 @@
+2020-09-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/26685
+       * config/tc-i386.c (process_suffix): Check the register operand
+       for the address size prefix if the memory operand is symbol(%rip).
+       * testsuite/gas/i386/x86-64-enqcmd.s: Add tests with RIP-relative
+       addressing.
+       * testsuite/gas/i386/x86-64-movdir.s: Likewise.
+       * testsuite/gas/i386/x86-64-enqcmd-intel.d: Updated.
+       * testsuite/gas/i386/x86-64-enqcmd.d: Likewise.
+       * testsuite/gas/i386/x86-64-movdir-intel.d: Likewise.
+       * testsuite/gas/i386/x86-64-movdir.d: Likewise.
+
 2020-09-30  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * config/tc-aarch64.c: Add Cortex-A78 and Cortex-A78AE cores.
index 4891c45a1ab22a882ad6db116bf312ad9f96d2af..094f555ea01e7d551c39aa438ce89205cc232d46 100644 (file)
@@ -7178,6 +7178,19 @@ process_suffix (void)
          unsigned int op;
          enum { need_word, need_dword, need_qword } need;
 
+         /* Check the register operand for the address size prefix if
+            the memory operand is symbol(%rip).  */
+         if (i.mem_operands == 1
+             && i.reg_operands == 1
+             && i.operands == 2
+             && i.base_reg
+             && i.base_reg->reg_num == RegIP
+             && i.base_reg->reg_type.bitfield.qword
+             && i.types[1].bitfield.class == Reg
+             && i.op[1].regs->reg_type.bitfield.dword
+             && !add_prefix (ADDR_PREFIX_OPCODE))
+           return 0;
+
          if (flag_code == CODE_32BIT)
            need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
          else if (i.prefix[ADDR_PREFIX])
index e483d570b92533c658a7f9789c242565f6d0f45e..64d325171b5d3fa973ae5a6107c55dd320dd0e6c 100644 (file)
@@ -9,12 +9,24 @@
 Disassembly of section \.text:
 
 0+ <_start>:
-[      ]*[a-f0-9]+:[   ]*f2 0f 38 f8 01[       ]*enqcmd rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 f2 0f 38 f8 01[    ]*enqcmd eax,\[ecx\]
-[      ]*[a-f0-9]+:[   ]*f3 0f 38 f8 01[       ]*enqcmds rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 f3 0f 38 f8 01[    ]*enqcmds eax,\[ecx\]
-[      ]*[a-f0-9]+:[   ]*f2 0f 38 f8 01[       ]*enqcmd rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 f2 0f 38 f8 01[    ]*enqcmd eax,\[ecx\]
-[      ]*[a-f0-9]+:[   ]*f3 0f 38 f8 01[       ]*enqcmds rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 f3 0f 38 f8 01[    ]*enqcmds eax,\[ecx\]
+ +[a-f0-9]+:   f2 0f 38 f8 01          enqcmd rax,\[rcx\]
+ +[a-f0-9]+:   67 f2 0f 38 f8 01       enqcmd eax,\[ecx\]
+ +[a-f0-9]+:   f3 0f 38 f8 01          enqcmds rax,\[rcx\]
+ +[a-f0-9]+:   67 f3 0f 38 f8 01       enqcmds eax,\[ecx\]
+ +[a-f0-9]+:   f2 0f 38 f8 0d 00 00 00 00      enqcmd rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   f3 0f 38 f8 0d 00 00 00 00      enqcmds rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   f2 0f 38 f8 01          enqcmd rax,\[rcx\]
+ +[a-f0-9]+:   67 f2 0f 38 f8 01       enqcmd eax,\[ecx\]
+ +[a-f0-9]+:   f3 0f 38 f8 01          enqcmds rax,\[rcx\]
+ +[a-f0-9]+:   67 f3 0f 38 f8 01       enqcmds eax,\[ecx\]
+ +[a-f0-9]+:   f2 0f 38 f8 0d 00 00 00 00      enqcmd rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   f3 0f 38 f8 0d 00 00 00 00      enqcmds rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds ecx,\[eip\+0x0\]        #.*
 #pass
index 337febf320fef9d8479578dd38dc95113f158937..5f6676636eb5e4a7bab27dc075606de104134692 100644 (file)
@@ -9,12 +9,24 @@
 Disassembly of section \.text:
 
 0+ <_start>:
-[      ]*[a-f0-9]+:[   ]*f2 0f 38 f8 01[       ]*enqcmd \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 f2 0f 38 f8 01[    ]*enqcmd \(%ecx\),%eax
-[      ]*[a-f0-9]+:[   ]*f3 0f 38 f8 01[       ]*enqcmds \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 f3 0f 38 f8 01[    ]*enqcmds \(%ecx\),%eax
-[      ]*[a-f0-9]+:[   ]*f2 0f 38 f8 01[       ]*enqcmd \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 f2 0f 38 f8 01[    ]*enqcmd \(%ecx\),%eax
-[      ]*[a-f0-9]+:[   ]*f3 0f 38 f8 01[       ]*enqcmds \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 f3 0f 38 f8 01[    ]*enqcmds \(%ecx\),%eax
+ +[a-f0-9]+:   f2 0f 38 f8 01          enqcmd \(%rcx\),%rax
+ +[a-f0-9]+:   67 f2 0f 38 f8 01       enqcmd \(%ecx\),%eax
+ +[a-f0-9]+:   f3 0f 38 f8 01          enqcmds \(%rcx\),%rax
+ +[a-f0-9]+:   67 f3 0f 38 f8 01       enqcmds \(%ecx\),%eax
+ +[a-f0-9]+:   f2 0f 38 f8 0d 00 00 00 00      enqcmd 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   f3 0f 38 f8 0d 00 00 00 00      enqcmds 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   f2 0f 38 f8 01          enqcmd \(%rcx\),%rax
+ +[a-f0-9]+:   67 f2 0f 38 f8 01       enqcmd \(%ecx\),%eax
+ +[a-f0-9]+:   f3 0f 38 f8 01          enqcmds \(%rcx\),%rax
+ +[a-f0-9]+:   67 f3 0f 38 f8 01       enqcmds \(%ecx\),%eax
+ +[a-f0-9]+:   f2 0f 38 f8 0d 00 00 00 00      enqcmd 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 f2 0f 38 f8 0d 00 00 00 00   enqcmd 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   f3 0f 38 f8 0d 00 00 00 00      enqcmds 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 f3 0f 38 f8 0d 00 00 00 00   enqcmds 0x0\(%eip\),%ecx        #.*
 #pass
index f790b28fc20435a90fa7768a77b9fa7c89ff808c..d1f3aca5ce5b6334a8366e4008ec898625b02952 100644 (file)
@@ -7,9 +7,21 @@ _start:
        enqcmd (%ecx),%eax
        enqcmds (%rcx),%rax
        enqcmds (%ecx),%eax
+       enqcmd foo(%rip),%rcx
+       enqcmd foo(%rip),%ecx
+       enqcmd foo(%eip),%ecx
+       enqcmds foo(%rip),%rcx
+       enqcmds foo(%rip),%ecx
+       enqcmds foo(%eip),%ecx
 
        .intel_syntax noprefix
        enqcmd rax,[rcx]
        enqcmd eax,[ecx]
        enqcmds rax,[rcx]
        enqcmds eax,[ecx]
+       enqcmd rcx,[rip+foo]
+       enqcmd ecx,[rip+foo]
+       enqcmd ecx,[eip+foo]
+       enqcmds rcx,[rip+foo]
+       enqcmds ecx,[rip+foo]
+       enqcmds ecx,[eip+foo]
index 0f3a5abd610d39fdc00e27fa61985856aa3715df..fe92e80d7159ef3049b916b1903a771368443478 100644 (file)
@@ -9,13 +9,19 @@
 Disassembly of section \.text:
 
 0+ <_start>:
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri QWORD PTR \[rcx\],rax
-[      ]*[a-f0-9]+:[   ]*66 0f 38 f8 01[       ]*movdir64b rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 66 0f 38 f8 01[    ]*movdir64b eax,\[ecx]
-[      ]*[a-f0-9]+:[   ]*0f 38 f9 01[  ]*movdiri DWORD PTR \[rcx\],eax
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri QWORD PTR \[rcx\],rax
-[      ]*[a-f0-9]+:[   ]*0f 38 f9 01[  ]*movdiri DWORD PTR \[rcx\],eax
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri QWORD PTR \[rcx\],rax
-[      ]*[a-f0-9]+:[   ]*66 0f 38 f8 01[       ]*movdir64b rax,\[rcx\]
-[      ]*[a-f0-9]+:[   ]*67 66 0f 38 f8 01[    ]*movdir64b eax,\[ecx\]
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri QWORD PTR \[rcx\],rax
+ +[a-f0-9]+:   66 0f 38 f8 01          movdir64b rax,\[rcx\]
+ +[a-f0-9]+:   67 66 0f 38 f8 01       movdir64b eax,\[ecx\]
+ +[a-f0-9]+:   66 0f 38 f8 0d 00 00 00 00      movdir64b rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   0f 38 f9 01             movdiri DWORD PTR \[rcx\],eax
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri QWORD PTR \[rcx\],rax
+ +[a-f0-9]+:   0f 38 f9 01             movdiri DWORD PTR \[rcx\],eax
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri QWORD PTR \[rcx\],rax
+ +[a-f0-9]+:   66 0f 38 f8 01          movdir64b rax,\[rcx\]
+ +[a-f0-9]+:   67 66 0f 38 f8 01       movdir64b eax,\[ecx\]
+ +[a-f0-9]+:   66 0f 38 f8 0d 00 00 00 00      movdir64b rcx,\[rip\+0x0\]        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b ecx,\[eip\+0x0\]        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b ecx,\[eip\+0x0\]        #.*
 #pass
index 2deab8928e666c5037b8d83ae0d50d45a7fba0ac..297c63fd002b891bba22a4d43d9595e83f12f30e 100644 (file)
@@ -9,13 +9,19 @@
 Disassembly of section \.text:
 
 0+ <_start>:
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri %rax,\(%rcx\)
-[      ]*[a-f0-9]+:[   ]*66 0f 38 f8 01[       ]*movdir64b \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 66 0f 38 f8 01[    ]*movdir64b \(%ecx\),%eax
-[      ]*[a-f0-9]+:[   ]*0f 38 f9 01[  ]*movdiri %eax,\(%rcx\)
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri %rax,\(%rcx\)
-[      ]*[a-f0-9]+:[   ]*0f 38 f9 01[  ]*movdiri %eax,\(%rcx\)
-[      ]*[a-f0-9]+:[   ]*48 0f 38 f9 01[       ]*movdiri %rax,\(%rcx\)
-[      ]*[a-f0-9]+:[   ]*66 0f 38 f8 01[       ]*movdir64b \(%rcx\),%rax
-[      ]*[a-f0-9]+:[   ]*67 66 0f 38 f8 01[    ]*movdir64b \(%ecx\),%eax
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri %rax,\(%rcx\)
+ +[a-f0-9]+:   66 0f 38 f8 01          movdir64b \(%rcx\),%rax
+ +[a-f0-9]+:   67 66 0f 38 f8 01       movdir64b \(%ecx\),%eax
+ +[a-f0-9]+:   66 0f 38 f8 0d 00 00 00 00      movdir64b 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   0f 38 f9 01             movdiri %eax,\(%rcx\)
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri %rax,\(%rcx\)
+ +[a-f0-9]+:   0f 38 f9 01             movdiri %eax,\(%rcx\)
+ +[a-f0-9]+:   48 0f 38 f9 01          movdiri %rax,\(%rcx\)
+ +[a-f0-9]+:   66 0f 38 f8 01          movdir64b \(%rcx\),%rax
+ +[a-f0-9]+:   67 66 0f 38 f8 01       movdir64b \(%ecx\),%eax
+ +[a-f0-9]+:   66 0f 38 f8 0d 00 00 00 00      movdir64b 0x0\(%rip\),%rcx        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b 0x0\(%eip\),%ecx        #.*
+ +[a-f0-9]+:   67 66 0f 38 f8 0d 00 00 00 00   movdir64b 0x0\(%eip\),%ecx        #.*
 #pass
index 6f9032dc4b34354ee1ec4fade597366dd43a6ef4..33b60318813f928079fdb1e9a0137d254c809418 100644 (file)
@@ -6,6 +6,9 @@ _start:
        movdiri %rax, (%rcx)
        movdir64b (%rcx),%rax
        movdir64b (%ecx),%eax
+       movdir64b foo(%rip),%rcx
+       movdir64b foo(%rip),%ecx
+       movdir64b foo(%eip),%ecx
 
        .intel_syntax noprefix
        movdiri [rcx],eax
@@ -14,3 +17,6 @@ _start:
        movdiri qword ptr [rcx],rax
        movdir64b rax,[rcx]
        movdir64b eax,[ecx]
+       movdir64b rcx,[rip+foo]
+       movdir64b ecx,[rip+foo]
+       movdir64b ecx,[eip+foo]