mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
ARM diagnostic when 's' suffix on mnemonic that can't set flags.
For example, "mlss r0, r1, r2, r3". The MLS instruction does not have a flag-setting variant. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135203 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2071,20 +2071,22 @@ bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
|
|||||||
bool CanAcceptCarrySet, CanAcceptPredicationCode;
|
bool CanAcceptCarrySet, CanAcceptPredicationCode;
|
||||||
GetMnemonicAcceptInfo(Head, CanAcceptCarrySet, CanAcceptPredicationCode);
|
GetMnemonicAcceptInfo(Head, CanAcceptCarrySet, CanAcceptPredicationCode);
|
||||||
|
|
||||||
|
// If we had a carry-set on an instruction that can't do that, issue an
|
||||||
|
// error.
|
||||||
|
if (!CanAcceptCarrySet && CarrySetting) {
|
||||||
|
Parser.EatToEndOfStatement();
|
||||||
|
return Error(NameLoc, "instruction '" + Head +
|
||||||
|
"' can not set flags, but 's' suffix specified");
|
||||||
|
}
|
||||||
|
|
||||||
// Add the carry setting operand, if necessary.
|
// Add the carry setting operand, if necessary.
|
||||||
//
|
//
|
||||||
// FIXME: It would be awesome if we could somehow invent a location such that
|
// FIXME: It would be awesome if we could somehow invent a location such that
|
||||||
// match errors on this operand would print a nice diagnostic about how the
|
// match errors on this operand would print a nice diagnostic about how the
|
||||||
// 's' character in the mnemonic resulted in a CCOut operand.
|
// 's' character in the mnemonic resulted in a CCOut operand.
|
||||||
if (CanAcceptCarrySet) {
|
if (CanAcceptCarrySet)
|
||||||
Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
|
Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
|
||||||
NameLoc));
|
NameLoc));
|
||||||
} else {
|
|
||||||
// This mnemonic can't ever accept a carry set, but the user wrote one (or
|
|
||||||
// misspelled another mnemonic).
|
|
||||||
|
|
||||||
// FIXME: Issue a nice error.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the predication code operand, if necessary.
|
// Add the predication code operand, if necessary.
|
||||||
if (CanAcceptPredicationCode) {
|
if (CanAcceptPredicationCode) {
|
||||||
|
@@ -3,6 +3,12 @@
|
|||||||
|
|
||||||
@ Check for various assembly diagnostic messages on invalid input.
|
@ Check for various assembly diagnostic messages on invalid input.
|
||||||
|
|
||||||
|
@ 's' bit on an instruction that can't accept it.
|
||||||
|
mlss r1, r2, r3, r4
|
||||||
|
@ CHECK-ERRORS: error: instruction 'mls' can not set flags,
|
||||||
|
@ CHECK-ERRORS: but 's' suffix specified
|
||||||
|
|
||||||
|
|
||||||
@ Out of range shift immediate values.
|
@ Out of range shift immediate values.
|
||||||
adc r1, r2, r3, lsl #invalid
|
adc r1, r2, r3, lsl #invalid
|
||||||
adc r4, r5, r6, lsl #-1
|
adc r4, r5, r6, lsl #-1
|
||||||
|
Reference in New Issue
Block a user