mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-03 16:13:44 +00:00
[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:
parent
af18947f0a
commit
293079f2de
@ -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;
|
||||
};
|
||||
|
||||
|
16
llvm/test/MC/ARM/inst-thumb-suffixes-auto.s
Normal file
16
llvm/test/MC/ARM/inst-thumb-suffixes-auto.s
Normal 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
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user