From 293079f2dec1f505fac48b31417ebd734e9d410d Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Tue, 31 Jul 2018 09:27:07 +0000 Subject: [PATCH] [ARM] Allow automatically deducing the thumb instruction size for .inst This matches GAS, that allows unsuffixed .inst for thumb. Differential Revision: https://reviews.llvm.org/D49937 llvm-svn: 338357 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 17 ++++++++++++++--- llvm/test/MC/ARM/inst-thumb-suffixes-auto.s | 16 ++++++++++++++++ llvm/test/MC/ARM/inst-thumb-suffixes.s | 2 +- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 llvm/test/MC/ARM/inst-thumb-suffixes-auto.s diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index ed706ab..a5fbbbf 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -10012,8 +10012,8 @@ bool ARMAsmParser::parseDirectiveInst(SMLoc Loc, char Suffix) { 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 @@ bool ARMAsmParser::parseDirectiveInst(SMLoc Loc, char Suffix) { return Error(Loc, "expected constant expression"); } + char CurSuffix = Suffix; switch (Width) { case 2: if (Value->getValue() > 0xffff) @@ -10039,11 +10040,21 @@ bool ARMAsmParser::parseDirectiveInst(SMLoc Loc, char Suffix) { 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; }; diff --git a/llvm/test/MC/ARM/inst-thumb-suffixes-auto.s b/llvm/test/MC/ARM/inst-thumb-suffixes-auto.s new file mode 100644 index 0000000..53e3b05 --- /dev/null +++ b/llvm/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 diff --git a/llvm/test/MC/ARM/inst-thumb-suffixes.s b/llvm/test/MC/ARM/inst-thumb-suffixes.s index 40def3c..1316147 100644 --- a/llvm/test/MC/ARM/inst-thumb-suffixes.s +++ b/llvm/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 -- 2.7.4