[X86][SSE] movddup shuffle mask decodes
[oota-llvm.git] / lib / Target / X86 / Utils / X86ShuffleDecode.cpp
index e4c58d42c5dcc0c23eca0403f1c14abfff3375bf..399d5834188afd49b93d70c97eb1982c5d608d8d 100644 (file)
@@ -76,12 +76,26 @@ void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl<int> &ShuffleMask) {
   for (int i = 0, e = NumElts / 2; i < e; ++i) {
     ShuffleMask.push_back(2 * i + 1);
     ShuffleMask.push_back(2 * i + 1);
-  }
-}
-
-void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask) {
-  unsigned VectorSizeInBits = VT.getSizeInBits();
-  unsigned NumElts = VectorSizeInBits / 8;
+  }\r
+}\r
+\r
+void DecodeMOVDDUPMask(MVT VT, SmallVectorImpl<int> &ShuffleMask) {\r
+  unsigned VectorSizeInBits = VT.getSizeInBits();\r
+  unsigned ScalarSizeInBits = VT.getScalarSizeInBits();\r
+  unsigned NumElts = VT.getVectorNumElements();\r
+  unsigned NumLanes = VectorSizeInBits / 128;\r
+  unsigned NumLaneElts = NumElts / NumLanes;\r
+  unsigned NumLaneSubElts = 64 / ScalarSizeInBits;\r
+\r
+  for (unsigned l = 0; l < NumElts; l += NumLaneElts)\r
+    for (unsigned i = 0; i < NumLaneElts; i += NumLaneSubElts)\r
+      for (unsigned s = 0; s != NumLaneSubElts; s++)\r
+        ShuffleMask.push_back(l + s);\r
+}\r
+\r
+void DecodePSLLDQMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask) {\r
+  unsigned VectorSizeInBits = VT.getSizeInBits();\r
+  unsigned NumElts = VectorSizeInBits / 8;\r
   unsigned NumLanes = VectorSizeInBits / 128;
   unsigned NumLaneElts = NumElts / NumLanes;