Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -10012,8 +10012,8 @@ case 'w': break; default: - return Error(Loc, "cannot determine Thumb instruction size, " - "use inst.n/inst.w instead"); + Width = 0; + break; } } else { if (Suffix) @@ -10029,6 +10029,7 @@ return Error(Loc, "expected constant expression"); } + char CurSuffix = Suffix; switch (Width) { case 2: if (Value->getValue() > 0xffff) @@ -10039,11 +10040,21 @@ return Error(Loc, StringRef(Suffix ? "inst.w" : "inst") + " operand is too big"); break; + case 0: + // Thumb mode, no width indicated. Guess from the opcode, if possible. + if (Value->getValue() < 0xe800) + CurSuffix = 'n'; + else if (Value->getValue() >= 0xe8000000) + CurSuffix = 'w'; + else + return Error(Loc, "cannot determine Thumb instruction size, " + "use inst.n/inst.w instead"); + break; default: llvm_unreachable("only supported widths are 2 and 4"); } - getTargetStreamer().emitInst(Value->getValue(), Suffix); + getTargetStreamer().emitInst(Value->getValue(), CurSuffix); return false; }; Index: test/MC/ARM/inst-thumb-suffixes-auto.s =================================================================== --- /dev/null +++ test/MC/ARM/inst-thumb-suffixes-auto.s @@ -0,0 +1,16 @@ +@ RUN: llvm-mc %s -triple armv7-linux-gnueabi -filetype asm -o - \ +@ RUN: | FileCheck %s +@ RUN: llvm-mc %s -triple armebv7-linux-gnueabi -filetype asm -o - \ +@ RUN: | FileCheck %s + + .syntax unified + .thumb + + .align 2 + .global inst_n + .type inst_n,%function +inst_n: + @ bx lr, mov.w r0, #42 + .inst 0x4770, 0xf04f002a +@ CHECK: .inst.n 0x4770 +@ CHECK: .inst.w 0xf04f002a Index: test/MC/ARM/inst-thumb-suffixes.s =================================================================== --- test/MC/ARM/inst-thumb-suffixes.s +++ test/MC/ARM/inst-thumb-suffixes.s @@ -8,6 +8,6 @@ .global suffixes_required_in_thumb .type suffixes_required_in_thumb,%function suffixes_required_in_thumb: - .inst 0x0000 + .inst 0xff00 @ CHECK-ERROR: cannot determine Thumb instruction size, use inst.n/inst.w instead