Add operators for vmlal{_n,_lane} and vmlsl{_n,_lane}
authorBob Wilson <bob.wilson@apple.com>
Tue, 7 Dec 2010 23:53:37 +0000 (23:53 +0000)
committerBob Wilson <bob.wilson@apple.com>
Tue, 7 Dec 2010 23:53:37 +0000 (23:53 +0000)
so they can be implemented without clang builtins.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121209 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/NeonEmitter.cpp
utils/TableGen/NeonEmitter.h

index 935f7afcdc42f863adbe398b33cba673a2e30211..c7b3ec55a69fe1a95d3f5a8ee4a4b4ab86b476df 100644 (file)
@@ -603,8 +603,7 @@ static std::string GenOpString(OpKind op, const std::string &proto,
     break;
   case OpMullLane:
     s += Extend(proto, typestr, "__a") + " * " +
-      Extend(proto, typestr,
-             SplatLane(nElts, "__b", "__c")) + ";";
+      Extend(proto, typestr, SplatLane(nElts, "__b", "__c")) + ";";
     break;
   case OpMull:
     s += Extend(proto, typestr, "__a") + " * " +
@@ -619,6 +618,18 @@ static std::string GenOpString(OpKind op, const std::string &proto,
   case OpMla:
     s += "__a + (__b * __c);";
     break;
+  case OpMlalN:
+    s += "__a + (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, Duplicate(nElts, typestr, "__c")) + ");";
+    break;
+  case OpMlalLane:
+    s += "__a + (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, SplatLane(nElts, "__c", "__d")) + ");";
+    break;
+  case OpMlal:
+    s += "__a + (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, "__c") + ");";
+    break;
   case OpMlsN:
     s += "__a - (__b * " + Duplicate(nElts, typestr, "__c") + ");";
     break;
@@ -628,6 +639,18 @@ static std::string GenOpString(OpKind op, const std::string &proto,
   case OpMls:
     s += "__a - (__b * __c);";
     break;
+  case OpMlslN:
+    s += "__a - (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, Duplicate(nElts, typestr, "__c")) + ");";
+    break;
+  case OpMlslLane:
+    s += "__a - (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, SplatLane(nElts, "__c", "__d")) + ");";
+    break;
+  case OpMlsl:
+    s += "__a - (" + Extend(proto, typestr, "__b") + " * " +
+      Extend(proto, typestr, "__c") + ");";
+    break;
   case OpEq:
     s += "(" + ts + ")(__a == __b);";
     break;
index 39877e7f5da818b7b55bda562a8c9cefd02ed7fe..4c5889388ba673836c2fa0ec1590ddcaf2726fa0 100644 (file)
@@ -28,15 +28,21 @@ enum OpKind {
   OpMul,
   OpMull,
   OpMla,
+  OpMlal,
   OpMls,
+  OpMlsl,
   OpMulN,
   OpMullN,
   OpMlaN,
   OpMlsN,
+  OpMlalN,
+  OpMlslN,
   OpMulLane,
   OpMullLane,
   OpMlaLane,
   OpMlsLane,
+  OpMlalLane,
+  OpMlslLane,
   OpEq,
   OpGe,
   OpLe,
@@ -85,15 +91,21 @@ namespace llvm {
       OpMap["OP_MUL"]   = OpMul;
       OpMap["OP_MULL"]  = OpMull;
       OpMap["OP_MLA"]   = OpMla;
+      OpMap["OP_MLAL"]  = OpMlal;
       OpMap["OP_MLS"]   = OpMls;
+      OpMap["OP_MLSL"]  = OpMlsl;
       OpMap["OP_MUL_N"] = OpMulN;
       OpMap["OP_MULL_N"]= OpMullN;
       OpMap["OP_MLA_N"] = OpMlaN;
       OpMap["OP_MLS_N"] = OpMlsN;
+      OpMap["OP_MLAL_N"] = OpMlalN;
+      OpMap["OP_MLSL_N"] = OpMlslN;
       OpMap["OP_MUL_LN"]= OpMulLane;
       OpMap["OP_MULL_LN"] = OpMullLane;
       OpMap["OP_MLA_LN"]= OpMlaLane;
       OpMap["OP_MLS_LN"]= OpMlsLane;
+      OpMap["OP_MLAL_LN"] = OpMlalLane;
+      OpMap["OP_MLSL_LN"] = OpMlslLane;
       OpMap["OP_EQ"]    = OpEq;
       OpMap["OP_GE"]    = OpGe;
       OpMap["OP_LE"]    = OpLe;