svn commit: r275265 - projects/clang350-import/contrib/llvm/lib/Target/ARM/AsmParser

Dimitry Andric dim at FreeBSD.org
Sat Nov 29 20:18:09 UTC 2014


Author: dim
Date: Sat Nov 29 20:18:08 2014
New Revision: 275265
URL: https://svnweb.freebsd.org/changeset/base/275265

Log:
  Pull in r214802 from upstream llvm trunk (by Renato Golin):
  
    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.
  
  This enables assembling certain ARM instructions used in libgcc.

Modified:
  projects/clang350-import/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Modified: projects/clang350-import/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
==============================================================================
--- projects/clang350-import/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp	Sat Nov 29 19:31:23 2014	(r275264)
+++ projects/clang350-import/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp	Sat Nov 29 20:18:08 2014	(r275265)
@@ -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));


More information about the svn-src-projects mailing list