[llvm] r335394 - [X86][AsmParser] In Intel syntax make sure we support ESP/RSP being the second register in memory expressions like [EAX+ESP].
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 22 14:57:24 PDT 2018
Author: ctopper
Date: Fri Jun 22 14:57:24 2018
New Revision: 335394
URL: http://llvm.org/viewvc/llvm-project?rev=335394&view=rev
Log:
[X86][AsmParser] In Intel syntax make sure we support ESP/RSP being the second register in memory expressions like [EAX+ESP].
By default, the second register gets assigned to the index register slot. But ESP can't be an index register so we need to swap it with the other register.
There's still a slight bug that we allow [EAX+ESP*1]. The existence of the multiply even though its with 1 should force ESP to the index register and trigger an error, but it doesn't currently.
Modified:
llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
llvm/trunk/test/MC/X86/intel-syntax.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=335394&r1=335393&r2=335394&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Fri Jun 22 14:57:24 2018
@@ -1858,6 +1858,10 @@ std::unique_ptr<X86Operand> X86AsmParser
unsigned IndexReg = SM.getIndexReg();
unsigned Scale = SM.getScale();
+ if (Scale == 1 && BaseReg != X86::ESP && BaseReg != X86::RSP &&
+ (IndexReg == X86::ESP || IndexReg == X86::RSP))
+ std::swap(BaseReg, IndexReg);
+
// 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.
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=335394&r1=335393&r2=335394&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/intel-syntax.s (original)
+++ llvm/trunk/test/MC/X86/intel-syntax.s Fri Jun 22 14:57:24 2018
@@ -889,3 +889,11 @@ sysret
// CHECK: sysretq
sysretq
+// CHECK: leaq (%rsp,%rax), %rax
+lea rax, [rax+rsp]
+// CHECK: leaq (%rsp,%rax), %rax
+lea rax, [rsp+rax]
+// CHECK: leal (%esp,%eax), %eax
+lea eax, [eax+esp]
+// CHECK: leal (%esp,%eax), %eax
+lea eax, [esp+eax]
More information about the llvm-commits
mailing list