Add an operator for vaba so it can be implemented using vabd.
authorBob Wilson <bob.wilson@apple.com>
Wed, 8 Dec 2010 20:09:10 +0000 (20:09 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 8 Dec 2010 20:09:10 +0000 (20:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121276 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 7a623583f3af046a0736d4ee9656259dddac7ff9..cb8cdb80915ec4a1cd687ee8c39a002c39fde3dd 100644 (file)
@@ -752,6 +752,9 @@ static std::string GenOpString(OpKind op, const std::string &proto,
     s += ");";
     break;
   }
+  case OpAba:
+    s += "__a + " + MangleName("vabd", typestr, ClassS) + "(__b, __c);";
+    break;
   default:
     throw "unknown OpKind!";
     break;
@@ -1077,13 +1080,15 @@ void NeonEmitter::run(raw_ostream &OS) {
 
   std::vector<Record*> RV = Records.getAllDerivedDefinitions("Inst");
 
-  // Emit vmovl intrinsics first so they can be used by other intrinsics.
+  // Emit vmovl and vabd intrinsics first so they can be used by other
+  // intrinsics.
   emitIntrinsic(OS, Records.getDef("VMOVL"));
+  emitIntrinsic(OS, Records.getDef("VABD"));
 
   // Unique the return+pattern types, and assign them.
   for (unsigned i = 0, e = RV.size(); i != e; ++i) {
     Record *R = RV[i];
-    if (R->getName() != "VMOVL")
+    if (R->getName() != "VMOVL" && R->getName() != "VABD")
       emitIntrinsic(OS, R);
   }
 
index 6c0937b3579d8a3c96c7f7e6c6146736971215d8..23b9f9c4e09badb58bb0b49098f5b26f35eb16ef 100644 (file)
@@ -69,7 +69,8 @@ enum OpKind {
   OpRev16,
   OpRev32,
   OpRev64,
-  OpReinterpret
+  OpReinterpret,
+  OpAba
 };
 
 enum ClassKind {
@@ -137,6 +138,7 @@ namespace llvm {
       OpMap["OP_REV32"] = OpRev32;
       OpMap["OP_REV64"] = OpRev64;
       OpMap["OP_REINT"] = OpReinterpret;
+      OpMap["OP_ABA"]   = OpAba;
 
       Record *SI = R.getClass("SInst");
       Record *II = R.getClass("IInst");