From f5d3b411f28caad57e516100d107fd3e9000285f Mon Sep 17 00:00:00 2001 From: Coby Tayree Date: Wed, 9 Aug 2017 12:32:05 +0000 Subject: [PATCH] [AsmParser][AVX512]Enhance OpMask/Zero/Merge syntax check rubostness Adopt a more strict approach regarding what marks should/can appear after a destination register, when operating upon an AVX512 platform. Differential Revision: https://reviews.llvm.org/D35785 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310467 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/AsmParser/X86AsmParser.cpp | 12 ++++++++---- test/MC/X86/avx512-err.s | 7 ++++++- test/MC/X86/intel-syntax-avx512-error.s | 9 +++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 test/MC/X86/intel-syntax-avx512-error.s diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index ea081fd546e..27dcb8a4883 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -2089,14 +2089,17 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands, // no errors. // Query for the need of further parsing for a {%k} mark if (!Z || getLexer().is(AsmToken::LCurly)) { - const SMLoc StartLoc = Z ? consumeToken() : consumedToken; + SMLoc StartLoc = Z ? consumeToken() : consumedToken; // Parse an op-mask register mark ({%k}), which is now to be // expected - if (std::unique_ptr Op = ParseOperand()) { + unsigned RegNo; + if (!ParseRegister(RegNo, StartLoc, StartLoc) && + X86MCRegisterClasses[X86::VK1RegClassID].contains(RegNo)) { if (!getLexer().is(AsmToken::RCurly)) return Error(getLexer().getLoc(), "Expected } at this point"); Operands.push_back(X86Operand::CreateToken("{", StartLoc)); - Operands.push_back(std::move(Op)); + Operands.push_back(std::move(X86Operand::CreateReg(RegNo, StartLoc, + StartLoc))); Operands.push_back(X86Operand::CreateToken("}", consumeToken())); } else return Error(getLexer().getLoc(), @@ -2106,7 +2109,8 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands, // Have we've found a parsing error, or found no (expected) {z} mark // - report an error if (ParseZ(Z, consumeToken()) || !Z) - return true; + return Error(getLexer().getLoc(), + "Expected a {z} mark at this point"); } // '{z}' on its own is meaningless, hence should be ignored. diff --git a/test/MC/X86/avx512-err.s b/test/MC/X86/avx512-err.s index bfe6e39ee31..302954ebf7f 100644 --- a/test/MC/X86/avx512-err.s +++ b/test/MC/X86/avx512-err.s @@ -1,6 +1,11 @@ -// RUN: not llvm-mc -triple x86_64-unknown-unknown -mcpu=knl -mattr=+avx512dq --show-encoding %s 2> %t.err +// RUN: not llvm-mc -triple x86_64-unknown-unknown -mcpu=knl -mattr=+avx512dq -mattr=+avx512f --show-encoding %s 2> %t.err // RUN: FileCheck --check-prefix=ERR < %t.err %s // ERR: invalid operand for instruction vpcmpd $1, %zmm24, %zmm7, %k5{%k0} +// ERR: Expected a {z} mark at this point +vfmsub213ps %zmm8, %zmm8, %zmm8{%k2} {rn-sae} + +// ERR: Expected an op-mask register at this point +vfmsub213ps %zmm8, %zmm8, %zmm8 {rn-sae} diff --git a/test/MC/X86/intel-syntax-avx512-error.s b/test/MC/X86/intel-syntax-avx512-error.s new file mode 100644 index 00000000000..c0ca8a644cd --- /dev/null +++ b/test/MC/X86/intel-syntax-avx512-error.s @@ -0,0 +1,9 @@ +// RUN: not llvm-mc %s -triple x86_64-unknown-unknown -mcpu=knl -mattr=+avx512f -x86-asm-syntax=intel -output-asm-variant=1 -o /dev/null 2>&1 | FileCheck %s + +// Validate that only OpMask/Zero mark may immediately follow destination + vfmsub213ps zmm8{rn-sae} {k2}, zmm8, zmm8 +// CHECK: error: Expected an op-mask register at this point + vfmsub213ps zmm8{k2} {rn-sae}, zmm8, zmm8 +// CHECK: error: Expected a {z} mark at this point + vfmsub213ps zmm8{rn-sae}, zmm8, zmm8 +// CHECK: error: Expected an op-mask register at this point -- 2.50.1