Add operators for vabdl and vabal so they can be implemented without builtins.
authorBob Wilson <bob.wilson@apple.com>
Wed, 8 Dec 2010 21:39:04 +0000 (21:39 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 8 Dec 2010 21:39:04 +0000 (21:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121287 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 03f4fd3472b80ecee779f97b18b8b66ff58220ea..355a9646de2439574e4d23523ec3af1b4580f742 100644 (file)
@@ -747,9 +747,36 @@ static std::string GenOpString(OpKind op, const std::string &proto,
     s += ");";
     break;
   }
+  case OpAbdl: {
+    std::string abd = MangleName("vabd", typestr, ClassS) + "(__a, __b)";
+    if (typestr[0] != 'U') {
+      // vabd results are always unsigned and must be zero-extended.
+      std::string utype = "U" + typestr.str();
+      s += "(" + TypeString(proto[0], typestr) + ")";
+      abd = "(" + TypeString('d', utype) + ")" + abd;
+      s += Extend(utype, abd) + ";";
+    } else {
+      s += Extend(typestr, abd) + ";";
+    }
+    break;
+  }
   case OpAba:
     s += "__a + " + MangleName("vabd", typestr, ClassS) + "(__b, __c);";
     break;
+  case OpAbal: {
+    s += "__a + ";
+    std::string abd = MangleName("vabd", typestr, ClassS) + "(__b, __c)";
+    if (typestr[0] != 'U') {
+      // vabd results are always unsigned and must be zero-extended.
+      std::string utype = "U" + typestr.str();
+      s += "(" + TypeString(proto[0], typestr) + ")";
+      abd = "(" + TypeString('d', utype) + ")" + abd;
+      s += Extend(utype, abd) + ";";
+    } else {
+      s += Extend(typestr, abd) + ";";
+    }
+    break;
+  }
   default:
     throw "unknown OpKind!";
     break;
index 23b9f9c4e09badb58bb0b49098f5b26f35eb16ef..69b39e9e4f7e29f1841857353e260d3f501722e2 100644 (file)
@@ -70,7 +70,9 @@ enum OpKind {
   OpRev32,
   OpRev64,
   OpReinterpret,
-  OpAba
+  OpAbdl,
+  OpAba,
+  OpAbal
 };
 
 enum ClassKind {
@@ -138,7 +140,9 @@ namespace llvm {
       OpMap["OP_REV32"] = OpRev32;
       OpMap["OP_REV64"] = OpRev64;
       OpMap["OP_REINT"] = OpReinterpret;
+      OpMap["OP_ABDL"]  = OpAbdl;
       OpMap["OP_ABA"]   = OpAba;
+      OpMap["OP_ABAL"]  = OpAbal;
 
       Record *SI = R.getClass("SInst");
       Record *II = R.getClass("IInst");