Added parsing co-processor names starting with "cr"

Additional compliant GAS names for coprocessor register name
are enabled for all instruction with parameter MCK_CoprocReg:
LDC,LDC2,STC,STC2,CDP,CDP2,MCR,MCR2,MCRR,MCRR2,MRC,MRC2,MRRC,MRRC2

Patch by Andrey Kuharev.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211776 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Renato Golin 2014-06-26 13:10:53 +00:00
parent 817812f61c
commit 7eacf4e813
2 changed files with 31 additions and 9 deletions

View File

@ -3082,17 +3082,25 @@ bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
} }
/// MatchCoprocessorOperandName - Try to parse an coprocessor related /// MatchCoprocessorOperandName - Try to parse an coprocessor related
/// instruction with a symbolic operand name. Example: "p1", "p7", "c3", /// instruction with a symbolic operand name.
/// "c5", ... /// We accept "crN" syntax for GAS compatibility.
/// <operand-name> ::= <prefix><number>
/// If CoprocOp is 'c', then:
/// <prefix> ::= c | cr
/// If CoprocOp is 'p', then :
/// <prefix> ::= p
/// <number> ::= integer in range [0, 15]
static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) { static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
// Use the same layout as the tablegen'erated register name matcher. Ugly, // Use the same layout as the tablegen'erated register name matcher. Ugly,
// but efficient. // but efficient.
if (Name.size() < 2 || Name[0] != CoprocOp)
return -1;
Name = (Name[1] == 'r') ? Name.drop_front(2) : Name.drop_front();
switch (Name.size()) { switch (Name.size()) {
default: return -1; default: return -1;
case 2: case 1:
if (Name[0] != CoprocOp) switch (Name[0]) {
return -1;
switch (Name[1]) {
default: return -1; default: return -1;
case '0': return 0; case '0': return 0;
case '1': return 1; case '1': return 1;
@ -3105,10 +3113,10 @@ static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
case '8': return 8; case '8': return 8;
case '9': return 9; case '9': return 9;
} }
case 3: case 2:
if (Name[0] != CoprocOp || Name[1] != '1') if (Name[0] != '1')
return -1; return -1;
switch (Name[2]) { switch (Name[1]) {
default: return -1; default: return -1;
// p10 and p11 are invalid for coproc instructions (reserved for FP/NEON) // p10 and p11 are invalid for coproc instructions (reserved for FP/NEON)
case '0': return CoprocOp == 'p'? -1: 10; case '0': return CoprocOp == 'p'? -1: 10;

View File

@ -0,0 +1,14 @@
@ RUN: llvm-mc -triple=armv7-linux-gnueabi -show-encoding < %s | FileCheck %s
@ CHECK: ldc p12, c4, [r0, #4] @ encoding: [0x01,0x4c,0x90,0xed]
@ CHECK: stc p14, c6, [r2, #-224] @ encoding: [0x38,0x6e,0x02,0xed]
ldc p12, cr4, [r0, #4]
stc p14, cr6, [r2, #-224]
@ RUN: llvm-mc -triple=armv7-linux-gnueabi -show-encoding < %s | FileCheck %s
@ CHECK: ldc p12, c4, [r0, #4] @ encoding: [0x01,0x4c,0x90,0xed]
@ CHECK: stc p14, c6, [r2, #-224] @ encoding: [0x38,0x6e,0x02,0xed]
ldc p12, cr4, [r0, #4]
stc p14, cr6, [r2, #-224]