Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -3083,15 +3083,19 @@ /// MatchCoprocessorOperandName - Try to parse an coprocessor related /// instruction with a symbolic operand name. Example: "p1", "p7", "c3", -/// "c5", ... +/// "c5", cr0, cr5 ... 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; + + if (Name.startswith("cr")) // For gas compatibility + Name = Name.drop_front(); + switch (Name.size()) { default: return -1; case 2: - if (Name[0] != CoprocOp) - return -1; switch (Name[1]) { default: return -1; case '0': return 0; @@ -3106,7 +3110,7 @@ case '9': return 9; } case 3: - if (Name[0] != CoprocOp || Name[1] != '1') + if (Name[1] != '1') return -1; switch (Name[2]) { default: return -1; Index: test/MC/ARM/gas-compl-copr-reg.s =================================================================== --- test/MC/ARM/gas-compl-copr-reg.s +++ test/MC/ARM/gas-compl-copr-reg.s @@ -0,0 +1,7 @@ +@ 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]