Delete the allocated vector.
[oota-llvm.git] / lib / Target / X86 / X86ShuffleDecode.h
index 818f7ca74b67908b1dd668495db9debeafb3b94a..df040520bc8f53d33d83a90dc29563e0a85b66cd 100644 (file)
@@ -26,6 +26,30 @@ enum {
   SM_SentinelZero = ~0U
 };
 
+static inline
+void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<unsigned> &ShuffleMask) {
+  // Defaults the copying the dest value.
+  ShuffleMask.push_back(0);
+  ShuffleMask.push_back(1);
+  ShuffleMask.push_back(2);
+  ShuffleMask.push_back(3);
+
+  // Decode the immediate.
+  unsigned ZMask = Imm & 15;
+  unsigned CountD = (Imm >> 4) & 3;
+  unsigned CountS = (Imm >> 6) & 3;
+
+  // CountS selects which input element to use.
+  unsigned InVal = 4+CountS;
+  // CountD specifies which element of destination to update.
+  ShuffleMask[CountD] = InVal;
+  // ZMask zaps values, potentially overriding the CountD elt.
+  if (ZMask & 1) ShuffleMask[0] = SM_SentinelZero;
+  if (ZMask & 2) ShuffleMask[1] = SM_SentinelZero;
+  if (ZMask & 4) ShuffleMask[2] = SM_SentinelZero;
+  if (ZMask & 8) ShuffleMask[3] = SM_SentinelZero;
+}
+
 // <3,1> or <6,7,2,3>
 static void DecodeMOVHLPSMask(unsigned NElts,
                               SmallVectorImpl<unsigned> &ShuffleMask) {