[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
This commit is contained in:
Martin Storsjo 2018-07-31 09:27:07 +00:00
parent af18947f0a
commit 293079f2de
3 changed files with 31 additions and 4 deletions

View File

@ -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;
};

View File

@ -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

View File

@ -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