mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
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:
parent
817812f61c
commit
7eacf4e813
@ -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;
|
||||
|
14
test/MC/ARM/gas-compl-copr-reg.s
Normal file
14
test/MC/ARM/gas-compl-copr-reg.s
Normal 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]
|
Loading…
Reference in New Issue
Block a user