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 /llvm/lib | |
| 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
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 11 |
1 files changed, 11 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"); |

