diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-06-25 17:26:51 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-06-25 17:26:51 +0000 |
| commit | b9cb88a4b045f17e93bd33cd091acb4ded962479 (patch) | |
| tree | f0fffc3dc1b400925732f4795d9ddfed6ef5da5e | |
| parent | 74282efee11f1dd93c970da4c57fdd6b306a9b76 (diff) | |
| download | bcm5719-llvm-b9cb88a4b045f17e93bd33cd091acb4ded962479.tar.gz bcm5719-llvm-b9cb88a4b045f17e93bd33cd091acb4ded962479.zip | |
[X86] Allow base and index for gather instructions to appear in other order for Intel syntax.
llvm-svn: 335500
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/MC/X86/intel-syntax.s | 5 |
2 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index ac322263130..a7dbdee5243 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -1883,6 +1883,17 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperand() { (IndexReg == X86::ESP || IndexReg == X86::RSP)) std::swap(BaseReg, IndexReg); + // If BaseReg is a vector register and IndexReg is not, swap them unless + // Scale was specified in which case it would be an error. + if (Scale == 0 && + !(X86MCRegisterClasses[X86::VR128XRegClassID].contains(IndexReg) || + X86MCRegisterClasses[X86::VR256XRegClassID].contains(IndexReg) || + X86MCRegisterClasses[X86::VR512RegClassID].contains(IndexReg)) && + (X86MCRegisterClasses[X86::VR128XRegClassID].contains(BaseReg) || + X86MCRegisterClasses[X86::VR256XRegClassID].contains(BaseReg) || + X86MCRegisterClasses[X86::VR512RegClassID].contains(BaseReg))) + std::swap(BaseReg, IndexReg); + if (Scale != 0 && X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg)) return ErrorOperand(Start, "16-bit addresses cannot have a scale"); diff --git a/llvm/test/MC/X86/intel-syntax.s b/llvm/test/MC/X86/intel-syntax.s index 72f18def389..428a7e4ec41 100644 --- a/llvm/test/MC/X86/intel-syntax.s +++ b/llvm/test/MC/X86/intel-syntax.s @@ -897,3 +897,8 @@ lea rax, [rsp+rax] lea eax, [eax+esp] // CHECK: leal (%esp,%eax), %eax lea eax, [esp+eax] + +// CHECK: vpgatherdq %ymm2, (%rdi,%xmm1), %ymm0 +vpgatherdq ymm0, [rdi+xmm1], ymm2 +// CHECK: vpgatherdq %ymm2, (%rdi,%xmm1), %ymm0 +vpgatherdq ymm0, [xmm1+rdi], ymm2 |

