Skip to content

Commit

Permalink
[ARM] Don't omit non-default predication code
Browse files Browse the repository at this point in the history
This was causing the (invalid) predicated versions of the NEON VRINTX and
VRINTZ instructions to be accepted, with the condition code being ignored.

Also, there is no NEON VRINTR instruction, so that part of the check was not
necessary.

Differential revision: https://reviews.llvm.org/D39193

llvm-svn: 318771
  • Loading branch information
ostannard committed Nov 21, 2017
1 parent 1e73e95 commit 1e6d4b9
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 4 deletions.
7 changes: 4 additions & 3 deletions llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
Expand Up @@ -5804,9 +5804,9 @@ bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic,

bool ARMAsmParser::shouldOmitPredicateOperand(StringRef Mnemonic,
OperandVector &Operands) {
// VRINT{Z, R, X} have a predicate operand in VFP, but not in NEON
// VRINT{Z, X} have a predicate operand in VFP, but not in NEON
unsigned RegIdx = 3;
if ((Mnemonic == "vrintz" || Mnemonic == "vrintx" || Mnemonic == "vrintr") &&
if ((Mnemonic == "vrintz" || Mnemonic == "vrintx") &&
(static_cast<ARMOperand &>(*Operands[2]).getToken() == ".f32" ||
static_cast<ARMOperand &>(*Operands[2]).getToken() == ".f16")) {
if (static_cast<ARMOperand &>(*Operands[3]).isToken() &&
Expand Down Expand Up @@ -6100,7 +6100,8 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
// Some instructions have the same mnemonic, but don't always
// have a predicate. Distinguish them here and delete the
// predicate if needed.
if (shouldOmitPredicateOperand(Mnemonic, Operands))
if (PredicationCode == ARMCC::AL &&
shouldOmitPredicateOperand(Mnemonic, Operands))
Operands.erase(Operands.begin() + 1);

// ARM mode 'blx' need special handling, as the register operand version
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/MC/ARM/invalid-fp-armv8.s
Expand Up @@ -81,7 +81,7 @@ vcvtthi.f16.f64 q0, d3
vrintrlo.f32.f32 d3, q0
@ V8: error: invalid instruction
vrintxcs.f32.f32 d3, d0
@ V8: error: instruction requires: NEON
@ V8: error: invalid instruction

vrinta.f64.f64 s3, q0
@ V8: error: invalid instruction
Expand Down
6 changes: 6 additions & 0 deletions llvm/test/MC/ARM/invalid-neon-v8.s
Expand Up @@ -72,3 +72,9 @@ vmull.p64 s1, d2, d3
@ CHECK: error: operand must be a register in range [q0, q15]
vmullge.p64 q0, d16, d17
@ CHECK: error: instruction 'vmull' is not predicable, but condition code specified

// These instructions are predicable in VFP but not in NEON
vrintzeq.f32 d0, d1
vrintxgt.f32 d0, d1
@ CHECK: error: invalid operand for instruction
@ CHECK: error: invalid operand for instruction

0 comments on commit 1e6d4b9

Please sign in to comment.