add nocapture attribute to llvm.mem* intrinsics and have tblgen
[oota-llvm.git] / utils / TableGen / IntrinsicEmitter.cpp
index 9247a85d22eede73f687081f6d063c74f7dd8082..86e83e591116a3b46727ac21d47ea8980d383a4e 100644 (file)
@@ -152,10 +152,12 @@ static void EmitTypeGenerate(std::ostream &OS,
   OS << "StructType::get(";
 
   for (std::vector<Record*>::const_iterator
-         I = ArgTypes.begin(), E = ArgTypes.end(); I != E; ++I)
+         I = ArgTypes.begin(), E = ArgTypes.end(); I != E; ++I) {
     EmitTypeGenerate(OS, *I, ArgNo);
+    OS << ", ";
+  }
 
-  OS << ", NULL)";
+  OS << " NULL)";
 }
 
 static void EmitTypeGenerate(std::ostream &OS, const Record *ArgType,
@@ -165,7 +167,14 @@ static void EmitTypeGenerate(std::ostream &OS, const Record *ArgType,
   if (ArgType->isSubClassOf("LLVMMatchType")) {
     unsigned Number = ArgType->getValueAsInt("Number");
     assert(Number < ArgNo && "Invalid matching number!");
-    OS << "Tys[" << Number << "]";
+    if (ArgType->isSubClassOf("LLVMExtendedElementVectorType"))
+      OS << "VectorType::getExtendedElementVectorType"
+         << "(dyn_cast<VectorType>(Tys[" << Number << "]))";
+    else if (ArgType->isSubClassOf("LLVMTruncatedElementVectorType"))
+      OS << "VectorType::getTruncatedElementVectorType"
+         << "(dyn_cast<VectorType>(Tys[" << Number << "]))";
+    else
+      OS << "Tys[" << Number << "]";
   } else if (VT == MVT::iAny || VT == MVT::fAny) {
     // NOTE: The ArgNo variable here is not the absolute argument number, it is
     // the index of the "arbitrary" type in the Tys array passed to the
@@ -220,7 +229,7 @@ namespace {
           return (*LHSVec)[i]->getName() < (*RHSVec)[i]->getName();
       } while (++i != LHSSize);
 
-      if (i != RHSSize) return false;
+      if (i != RHSSize) return true;
 
       i = 0;
       LHSVec = &LHS.second;
@@ -279,7 +288,12 @@ void IntrinsicEmitter::EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
       if (ArgType->isSubClassOf("LLVMMatchType")) {
         unsigned Number = ArgType->getValueAsInt("Number");
         assert(Number < j && "Invalid matching number!");
-        OS << "~" << Number;
+        if (ArgType->isSubClassOf("LLVMExtendedElementVectorType"))
+          OS << "~(ExtendedElementVectorType | " << Number << ")";
+        else if (ArgType->isSubClassOf("LLVMTruncatedElementVectorType"))
+          OS << "~(TruncatedElementVectorType | " << Number << ")";
+        else
+          OS << "~" << Number;
       } else {
         MVT::SimpleValueType VT = getValueType(ArgType->getValueAsDef("VT"));
         OS << getEnumName(VT);
@@ -297,7 +311,12 @@ void IntrinsicEmitter::EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
       if (ArgType->isSubClassOf("LLVMMatchType")) {
         unsigned Number = ArgType->getValueAsInt("Number");
         assert(Number < j + RetTys.size() && "Invalid matching number!");
-        OS << "~" << Number;
+        if (ArgType->isSubClassOf("LLVMExtendedElementVectorType"))
+          OS << "~(ExtendedElementVectorType | " << Number << ")";
+        else if (ArgType->isSubClassOf("LLVMTruncatedElementVectorType"))
+          OS << "~(TruncatedElementVectorType | " << Number << ")";
+        else
+          OS << "~" << Number;
       } else {
         MVT::SimpleValueType VT = getValueType(ArgType->getValueAsDef("VT"));
         OS << getEnumName(VT);