[llvm] r335384 - [X86] Don't accept (%si, %bp) 16-bit address expressions.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 22 13:20:38 PDT 2018


Author: ctopper
Date: Fri Jun 22 13:20:38 2018
New Revision: 335384

URL: http://llvm.org/viewvc/llvm-project?rev=335384&view=rev
Log:
[X86] Don't accept (%si,%bp) 16-bit address expressions.

The second register is the index register and should only be %si or %di if used with a base register. And in that case the base register should be %bp or %bx.

This makes us compatible with gas.

We do still need to support both orders with Intel syntax which uses [bp+si] and [si+bp]

Added:
    llvm/trunk/test/MC/X86/intel-syntax-32.s
Modified:
    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
    llvm/trunk/test/MC/X86/address-size.s
    llvm/trunk/test/MC/X86/intel-syntax.s
    llvm/trunk/test/MC/X86/x86_errors.s

Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=335384&r1=335383&r2=335384&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Fri Jun 22 13:20:38 2018
@@ -1021,10 +1021,8 @@ static bool CheckBaseRegAndIndexRegAndSc
         ErrMsg = "base register is 16-bit, but index register is not";
         return true;
       }
-      if (((BaseReg == X86::BX || BaseReg == X86::BP) &&
-           IndexReg != X86::SI && IndexReg != X86::DI) ||
-          ((BaseReg == X86::SI || BaseReg == X86::DI) &&
-           IndexReg != X86::BX && IndexReg != X86::BP)) {
+      if ((BaseReg != X86::BX && BaseReg != X86::BP) ||
+          (IndexReg != X86::SI && IndexReg != X86::DI)) {
         ErrMsg = "invalid 16-bit base/index register combination";
         return true;
       }
@@ -1860,6 +1858,13 @@ std::unique_ptr<X86Operand> X86AsmParser
   unsigned IndexReg = SM.getIndexReg();
   unsigned Scale = SM.getScale();
 
+  // If this is a 16-bit addressing mode with the base and index in the wrong
+  // order, swap them so CheckBaseRegAndIndexRegAndScale doesn't fail. It is
+  // shared with att syntax where order matters.
+  if ((BaseReg == X86::SI || BaseReg == X86::DI) &&
+      (IndexReg == X86::BX || IndexReg == X86::BP))
+    std::swap(BaseReg, IndexReg);
+
   if ((BaseReg || IndexReg) &&
       CheckBaseRegAndIndexRegAndScale(BaseReg, IndexReg, Scale, is64BitMode(),
                                       ErrMsg))

Modified: llvm/trunk/test/MC/X86/address-size.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/address-size.s?rev=335384&r1=335383&r2=335384&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/address-size.s (original)
+++ llvm/trunk/test/MC/X86/address-size.s Fri Jun 22 13:20:38 2018
@@ -23,8 +23,6 @@
 // CHECK: encoding: [0xc6,0x04,0x00]
 	movb	$0x0, (%esi)
 // CHECK: encoding: [0x67,0xc6,0x06,0x00]
-	movb	$0x5a, (%di,%bp,1)
-// CHECK: encoding: [0xc6,0x03,0x5a]
 	movb	$0x5a, (%bp,%di,1)
 // CHECK: encoding: [0xc6,0x03,0x5a]
 	movb	$0x5a, (%bp,%si,1)

Added: llvm/trunk/test/MC/X86/intel-syntax-32.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/intel-syntax-32.s?rev=335384&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/intel-syntax-32.s (added)
+++ llvm/trunk/test/MC/X86/intel-syntax-32.s Fri Jun 22 13:20:38 2018
@@ -0,0 +1,6 @@
+// RUN: llvm-mc -triple i686-unknown-unknown -x86-asm-syntax=intel %s | FileCheck %s
+
+// CHECK: leaw	(%bp,%si), %ax
+lea ax, [bp+si]
+// CHECK: leaw	(%bp,%si), %ax
+lea ax, [si+bp]

Modified: llvm/trunk/test/MC/X86/intel-syntax.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/intel-syntax.s?rev=335384&r1=335383&r2=335384&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/intel-syntax.s (original)
+++ llvm/trunk/test/MC/X86/intel-syntax.s Fri Jun 22 13:20:38 2018
@@ -888,3 +888,4 @@ sysexitq
 sysret
 // CHECK: sysretq
 sysretq
+

Modified: llvm/trunk/test/MC/X86/x86_errors.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/x86_errors.s?rev=335384&r1=335383&r2=335384&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/x86_errors.s (original)
+++ llvm/trunk/test/MC/X86/x86_errors.s Fri Jun 22 13:20:38 2018
@@ -89,3 +89,16 @@ leaq (%rax,%rsp), %rax
 // 32: error: invalid base+index expression
 // 64: error: invalid base+index expression
 leaq (%eax,%esp), %eax
+
+// 32: error: invalid 16-bit base/index register combination
+// 64: error: invalid 16-bit base register
+lea (%si,%bp), %ax
+// 32: error: invalid 16-bit base/index register combination
+// 64: error: invalid 16-bit base register
+lea (%di,%bp), %ax
+// 32: error: invalid 16-bit base/index register combination
+// 64: error: invalid 16-bit base register
+lea (%si,%bx), %ax
+// 32: error: invalid 16-bit base/index register combination
+// 64: error: invalid 16-bit base register
+lea (%di,%bx), %ax




More information about the llvm-commits mailing list