From 78eb041ca71b54bb0f11b0ba7fc277ba02f9d7df Mon Sep 17 00:00:00 2001 From: Coby Tayree Date: Sun, 13 Aug 2017 12:03:00 +0000 Subject: [PATCH] [X86][AsmParser][AVX512] Error appropriately when K0 is tried as a write-mask K0 isn't expected as a write-mask, so provide a detailed error here, instead of the more generic one (invalid op for insn) Conforms with gas Differential Revision: https://reviews.llvm.org/D36570 llvm-svn: 310789 --- lib/Target/X86/AsmParser/X86AsmParser.cpp | 5 ++++- test/MC/X86/avx512-err.s | 5 ++--- test/MC/X86/intel-syntax-avx512-error.s | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index fd083b09366..881d35eb892 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -2088,8 +2088,11 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands, // Parse an op-mask register mark ({%k}), which is now to be // expected unsigned RegNo; - if (!ParseRegister(RegNo, StartLoc, StartLoc) && + SMLoc RegLoc; + if (!ParseRegister(RegNo, RegLoc, StartLoc) && X86MCRegisterClasses[X86::VK1RegClassID].contains(RegNo)) { + if (RegNo == X86::K0) + return Error(RegLoc, "Register k0 can't be used as write mask"); if (!getLexer().is(AsmToken::RCurly)) return Error(getLexer().getLoc(), "Expected } at this point"); Operands.push_back(X86Operand::CreateToken("{", StartLoc)); diff --git a/test/MC/X86/avx512-err.s b/test/MC/X86/avx512-err.s index 302954ebf7f..b9eb3711c05 100644 --- a/test/MC/X86/avx512-err.s +++ b/test/MC/X86/avx512-err.s @@ -1,7 +1,6 @@ -// 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 +// RUN: not llvm-mc %s -triple x86_64-unknown-unknown -mcpu=knl -mattr=+avx512dq -mattr=+avx512f --show-encoding -o /dev/null 2>&1 | FileCheck --check-prefix=ERR %s -// ERR: invalid operand for instruction +// ERR: Register k0 can't be used as write mask vpcmpd $1, %zmm24, %zmm7, %k5{%k0} // ERR: Expected a {z} mark at this point diff --git a/test/MC/X86/intel-syntax-avx512-error.s b/test/MC/X86/intel-syntax-avx512-error.s index c0ca8a644cd..6e9925f4d7a 100644 --- a/test/MC/X86/intel-syntax-avx512-error.s +++ b/test/MC/X86/intel-syntax-avx512-error.s @@ -7,3 +7,6 @@ // 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 + vpcmpltd k5{k0}, zmm7, zmm24 +// CHECK: error: Register k0 can't be used as write mask +