diff options
-rw-r--r-- | lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 12 | ||||
-rw-r--r-- | test/MC/ARM/basic-arm-instructions.s | 2 | ||||
-rw-r--r-- | test/MC/ARM/diagnostics.s | 3 |
3 files changed, 16 insertions, 1 deletions
diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 170d434..647fdb3 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -5266,7 +5266,17 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, doesIgnoreDataTypeSuffix(Mnemonic, ExtraToken)) continue; - if (ExtraToken != ".n") { + // For for ARM mode generate an error if the .n qualifier is used. + if (ExtraToken == ".n" && !isThumb()) { + SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start); + return Error(Loc, "instruction with .n (narrow) qualifier not allowed in " + "arm mode"); + } + + // The .n qualifier is always discarded as that is what the tables + // and matcher expect. In ARM mode the .w qualifier has no effect, + // so discard it to avoid errors that can be caused by the matcher. + if (ExtraToken != ".n" && (isThumb() || ExtraToken != ".w")) { SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start); Operands.push_back(ARMOperand::CreateToken(ExtraToken, Loc)); } diff --git a/test/MC/ARM/basic-arm-instructions.s b/test/MC/ARM/basic-arm-instructions.s index 8aec4b3..8335797 100644 --- a/test/MC/ARM/basic-arm-instructions.s +++ b/test/MC/ARM/basic-arm-instructions.s @@ -1247,9 +1247,11 @@ Lforward: @ NOP @------------------------------------------------------------------------------ nop + nop.w nopgt @ CHECK: nop @ encoding: [0x00,0xf0,0x20,0xe3] +@ CHECK: nop @ encoding: [0x00,0xf0,0x20,0xe3] @ CHECK: nopgt @ encoding: [0x00,0xf0,0x20,0xc3] diff --git a/test/MC/ARM/diagnostics.s b/test/MC/ARM/diagnostics.s index b4b7386..82d6ae3 100644 --- a/test/MC/ARM/diagnostics.s +++ b/test/MC/ARM/diagnostics.s @@ -376,3 +376,6 @@ isb #16 @ CHECK-ERRORS: error: immediate value out of range @ CHECK-ERRORS: error: immediate value out of range + + nop.n +@ CHECK-ERRORS: error: instruction with .n (narrow) qualifier not allowed in arm mode |