[llvm] r214802 - Allow CP10/CP11 operations on ARMv5/v6

Duncan P. N. Exon Smith dexonsmith at apple.com
Tue Aug 5 12:36:07 PDT 2014


testcase?

> On 2014-Aug-04, at 16:21, Renato Golin <renato.golin at linaro.org> wrote:
> 
> Author: rengolin
> Date: Mon Aug  4 18:21:56 2014
> New Revision: 214802
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=214802&view=rev
> Log:
> Allow CP10/CP11 operations on ARMv5/v6
> 
> Those registers are VFP/NEON and vector instructions should be used instead,
> but old cores rely on those co-processors to enable VFP unwinding. This change
> was prompted by the libc++abi's unwinding routine and is also present in many
> legacy low-level bare-metal code that we ought to compile/assemble.
> 
> Fixing bug PR20025 and allowing PR20529 to proceed with a fix in libc++abi.
> 
> Modified:
>    llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> 
> Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=214802&r1=214801&r2=214802&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Aug  4 18:21:56 2014
> @@ -3118,9 +3118,10 @@ static int MatchCoprocessorOperandName(S
>       return -1;
>     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;
> -    case '1': return CoprocOp == 'p'? -1: 11;
> +    // CP10 and CP11 are VFP/NEON and so vector instructions should be used.
> +    // However, old cores (v5/v6) did use them in that way.
> +    case '0': return 10;
> +    case '1': return 11;
>     case '2': return 12;
>     case '3': return 13;
>     case '4': return 14;
> @@ -3177,6 +3178,9 @@ ARMAsmParser::parseCoprocNumOperand(Oper
>   int Num = MatchCoprocessorOperandName(Tok.getString(), 'p');
>   if (Num == -1)
>     return MatchOperand_NoMatch;
> +  // ARMv7 and v8 don't allow cp10/cp11 due to VFP/NEON specific instructions
> +  if ((hasV7Ops() || hasV8Ops()) && (Num == 10 || Num == 11))
> +    return MatchOperand_NoMatch;
> 
>   Parser.Lex(); // Eat identifier token.
>   Operands.push_back(ARMOperand::CreateCoprocNum(Num, S));
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list