[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