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.

llvm-svn: 211776
This commit is contained in:
Renato Golin 2014-06-26 13:10:53 +00:00
parent 6d3dae07ca
commit ac561c3ac7
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
/// instruction with a symbolic operand name. Example: "p1", "p7", "c3",
/// "c5", ...
/// instruction with a symbolic operand name.
/// 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) {
// Use the same layout as the tablegen'erated register name matcher. Ugly,
// 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()) {
default: return -1;
case 2:
if (Name[0] != CoprocOp)
return -1;
switch (Name[1]) {
case 1:
switch (Name[0]) {
default: return -1;
case '0': return 0;
case '1': return 1;
@ -3105,10 +3113,10 @@ static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
case '8': return 8;
case '9': return 9;
}
case 3:
if (Name[0] != CoprocOp || Name[1] != '1')
case 2:
if (Name[0] != '1')
return -1;
switch (Name[2]) {
switch (Name[1]) {
default: return -1;
// p10 and p11 are invalid for coproc instructions (reserved for FP/NEON)
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]