Add new built-in operations for vmull and vmull_n
so they can be implemented without requiring clang builtins.
Radar 8446238.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121173 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp
index 3752db0..7fdc1ca 100644
--- a/utils/TableGen/NeonEmitter.cpp
+++ b/utils/TableGen/NeonEmitter.cpp
@@ -508,6 +508,15 @@
   return s;
 }
 
+// Use the vmovl builtin to sign-extend or zero-extend a vector.
+static std::string Extend(const std::string &proto, StringRef typestr,
+                          const std::string &a) {
+  std::string s;
+  s = MangleName("vmovl", typestr, ClassS);
+  s += "(" + a + ")";
+  return s;
+}
+
 static std::string Duplicate(unsigned nElts, StringRef typestr,
                              const std::string &a) {
   std::string s;
@@ -587,6 +596,15 @@
   case OpMul:
     s += "__a * __b;";
     break;
+  case OpMullN:
+    s += Extend(proto, typestr, "__a") + " * " +
+      Extend(proto, typestr,
+             Duplicate(nElts << (int)quad, typestr, "__b")) + ";";
+    break;
+  case OpMull:
+    s += Extend(proto, typestr, "__a") + " * " +
+      Extend(proto, typestr, "__b") + ";";
+    break;
   case OpMlaN:
     s += "__a + (__b * " + Duplicate(nElts, typestr, "__c") + ");";
     break;