<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:799957587;
        mso-list-type:hybrid;
        mso-list-template-ids:-1214880770 44585902 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Do you want to review the whole patch at once or step-by-step? Assuming that the patch fits in the current design.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span style="font-family:"Calibri","sans-serif";color:#31849B"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span dir="LTR"></span><b><i><span style="color:#31849B"> Elena<o:p></o:p></span></i></b></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Chandler Carruth [mailto:chandlerc@google.com]
<br>
<b>Sent:</b> Tuesday, June 23, 2015 11:19<br>
<b>To:</b> Demikhovsky, Elena; llvm-commits@cs.uiuc.edu<br>
<b>Subject:</b> Re: [llvm] r240258 - Reverted AVX-512 vector shuffle<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Elena, you sent this for precommit review, for which I thank you.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">But then after only a couple of business days, you have committed it without waiting for that precommit review to conclude.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">While I explicitly asked for this change, and I think this change is good, I cannot stress enough that I am *extremely bothered* by your disregard for the process of code review and a lack of even an attempt to follow up with your code
 reviewers before moving forward.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Please, take a moment, and try to slow down and try to communicate more effectively with the community. I want to see the ongoing development of AVX-512 in LLVM, and generally am supportive of your work on that front, but you need to respect
 and abide by both the letter and spirit of the code review process.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Mon, Jun 22, 2015 at 2:11 AM Elena Demikhovsky <<a href="mailto:elena.demikhovsky@intel.com">elena.demikhovsky@intel.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">Author: delena<br>
Date: Mon Jun 22 04:01:15 2015<br>
New Revision: 240258<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D240258-26view-3Drev&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=igH9Pk7tsft8B9lsgn7AK_xTfCJtY2aGcaIJeSN57_0&s=3W9cnKZon5Bhy-i0IDvXE8jr38wBjB-KdmBoTYdGrNo&e=" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=240258&view=rev</a><br>
Log:<br>
Reverted AVX-512 vector shuffle<br>
<br>
Removed:<br>
    llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/trunk/test/CodeGen/X86/avx512-build-vector.ll<br>
    llvm/trunk/test/CodeGen/X86/vector-shuffle-512-v8.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86ISelLowering.cpp-3Frev-3D240258-26r1-3D240257-26r2-3D240258-26view-3Ddiff&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=igH9Pk7tsft8B9lsgn7AK_xTfCJtY2aGcaIJeSN57_0&s=9BIoN2tXMixvnkiACdU8BS4MTB5uv5FUKFdQrjSqU7Y&e=" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=240258&r1=240257&r2=240258&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jun 22 04:01:15 2015<br>
@@ -6259,42 +6259,6 @@ is128BitLaneRepeatedShuffleMask(MVT VT,<br>
   return true;<br>
 }<br>
<br>
-/// \brief Test whether a shuffle mask is equivalent within each 256-bit lane.<br>
-///<br>
-/// This checks a shuffle mask to see if it is performing the same<br>
-/// 256-bit lane-relative shuffle in each 256-bit lane. This trivially implies<br>
-/// that it is also not lane-crossing. It may however involve a blend from the<br>
-/// same lane of a second vector.<br>
-///<br>
-/// The specific repeated shuffle mask is populated in \p RepeatedMask, as it is<br>
-/// non-trivial to compute in the face of undef lanes. The representation is<br>
-/// *not* suitable for use with existing 256-bit shuffles as it will contain<br>
-/// entries from both V1 and V2 inputs to the wider mask.<br>
-static bool<br>
-is256BitLaneRepeatedShuffleMask(MVT VT, ArrayRef<int> Mask,<br>
-                                SmallVectorImpl<int> &RepeatedMask) {<br>
-  int LaneSize = 256 / VT.getScalarSizeInBits();<br>
-  RepeatedMask.resize(LaneSize, -1);<br>
-  int Size = Mask.size();<br>
-  for (int i = 0; i < Size; ++i) {<br>
-    if (Mask[i] < 0)<br>
-      continue;<br>
-    if ((Mask[i] % Size) / LaneSize != i / LaneSize)<br>
-      // This entry crosses lanes, so there is no way to model this shuffle.<br>
-      return false;<br>
-<br>
-    // Ok, handle the in-lane shuffles by detecting if and when they repeat.<br>
-    if (RepeatedMask[i % LaneSize] == -1)<br>
-      // This is the first non-undef entry in this slot of a 256-bit lane.<br>
-      RepeatedMask[i % LaneSize] =<br>
-          Mask[i] < Size ? Mask[i] % LaneSize : Mask[i] % LaneSize + Size;<br>
-    else if (RepeatedMask[i % LaneSize] + (i / LaneSize) * LaneSize != Mask[i])<br>
-      // Found a mismatch with the repeated mask.<br>
-      return false;<br>
-  }<br>
-  return true;<br>
-}<br>
-<br>
 /// \brief Checks whether a shuffle mask is equivalent to an explicit list of<br>
 /// arguments.<br>
 ///<br>
@@ -6354,22 +6318,6 @@ static SDValue getV4X86ShuffleImm8ForMas<br>
   return DAG.getConstant(Imm, DL, MVT::i8);<br>
 }<br>
<br>
-/// \brief Get a 8-bit shuffle, 1 bit per lane, immediate for a mask.<br>
-///<br>
-/// This helper function produces an 8-bit shuffle immediate corresponding to<br>
-/// the ubiquitous shuffle encoding scheme used in x86 instructions for<br>
-/// shuffling 8 lanes.<br>
-static SDValue get1bitLaneShuffleImm8ForMask(ArrayRef<int> Mask, SDLoc DL,<br>
-                                             SelectionDAG &DAG) {<br>
-  assert(Mask.size() <= 8 &&<br>
-         "Up to 8 elts may be in Imm8 1-bit lane shuffle mask");<br>
-  unsigned Imm = 0;<br>
-  for (unsigned i = 0; i < Mask.size(); ++i)<br>
-    if (Mask[i] >= 0)<br>
-      Imm |= (Mask[i] % 2) << i;<br>
-  return DAG.getConstant(Imm, DL, MVT::i8);<br>
-}<br>
-<br>
 /// \brief Try to emit a blend instruction for a shuffle using bit math.<br>
 ///<br>
 /// This is used as a fallback approach when first class blend instructions are<br>
@@ -9385,30 +9333,6 @@ static SDValue lowerV2X128VectorShuffle(<br>
                      DAG.getConstant(PermMask, DL, MVT::i8));<br>
 }<br>
<br>
-/// \brief Handle lowering 4-lane 128-bit shuffles.<br>
-static SDValue lowerV4X128VectorShuffle(SDLoc DL, MVT VT, SDValue V1,<br>
-                                        SDValue V2, ArrayRef<int> WidenedMask,<br>
-                                        SelectionDAG &DAG) {<br>
-<br>
-  assert(WidenedMask.size() == 4 && "Unexpected mask size for 128bit shuffle!");<br>
-  // form a 128-bit permutation.<br>
-  // convert the 64-bit shuffle mask selection values into 128-bit selection<br>
-  // bits defined by a vshuf64x2 instruction's immediate control byte.<br>
-  unsigned PermMask = 0, Imm = 0;<br>
-<br>
-  for (int i = 0, Size = WidenedMask.size(); i < Size; ++i) {<br>
-    if(WidenedMask[i] == SM_SentinelZero)<br>
-      return SDValue();<br>
-<br>
-    // use first element in place of undef musk<br>
-    Imm = (WidenedMask[i] == SM_SentinelUndef) ? 0 : WidenedMask[i];<br>
-    PermMask |= (Imm % 4) << (i * 2);<br>
-  }<br>
-<br>
-  return DAG.getNode(X86ISD::SHUF128, DL, VT, V1, V2,<br>
-                     DAG.getConstant(PermMask, DL, MVT::i8));<br>
-}<br>
-<br>
 /// \brief Lower a vector shuffle by first fixing the 128-bit lanes and then<br>
 /// shuffling each lane.<br>
 ///<br>
@@ -10144,105 +10068,86 @@ static SDValue lower256BitVectorShuffle(<br>
   }<br>
 }<br>
<br>
-static SDValue lowerVectorShuffleWithVALIGN(SDLoc DL, MVT VT,<br>
-                                            ArrayRef<int> Mask, SDValue V1,<br>
-                                            SDValue V2, SelectionDAG &DAG) {<br>
+/// \brief Handle lowering of 8-lane 64-bit floating point shuffles.<br>
+static SDValue lowerV8F64VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
+                                       const X86Subtarget *Subtarget,<br>
+                                       SelectionDAG &DAG) {<br>
+  SDLoc DL(Op);<br>
+  assert(V1.getSimpleValueType() == MVT::v8f64 && "Bad operand type!");<br>
+  assert(V2.getSimpleValueType() == MVT::v8f64 && "Bad operand type!");<br>
+  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);<br>
+  ArrayRef<int> Mask = SVOp->getMask();<br>
+  assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!");<br>
<br>
-  assert(VT.getScalarSizeInBits() >= 32 && "Unexpected data type for VALIGN");<br>
-  // VALIGN pattern 2, 3, 4, 5, .. (sequential, shifted right)<br>
-  int AlignVal = -1;<br>
-  for (int i = 0; i < (signed)VT.getVectorNumElements(); ++i) {<br>
-    if (Mask[i] < 0)<br>
-      continue;<br>
-    if (Mask[i] < i)<br>
-      return SDValue();<br>
-    if (AlignVal == -1)<br>
-      AlignVal = Mask[i] - i;<br>
-    else if (Mask[i] - i != AlignVal)<br>
-      return SDValue();<br>
-  }<br>
-  // Vector source operands should be swapped<br>
-  return DAG.getNode(X86ISD::VALIGN, DL, VT, V2, V1,<br>
-                     DAG.getConstant(AlignVal, DL, MVT::i8));<br>
-}<br>
-<br>
-static SDValue lowerVectorShuffleWithPERMV(SDLoc DL, MVT VT,<br>
-                                           ArrayRef<int> Mask, SDValue V1,<br>
-                                           SDValue V2, SelectionDAG &DAG) {<br>
-<br>
-  assert(VT.getScalarSizeInBits() >= 16 && "Unexpected data type for PERMV");<br>
-<br>
-  MVT MaskEltVT = MVT::getIntegerVT(VT.getScalarSizeInBits());<br>
-  MVT MaskVecVT = MVT::getVectorVT(MaskEltVT, VT.getVectorNumElements());<br>
-<br>
-  SmallVector<SDValue, 32>  VPermMask;<br>
-  for (unsigned i = 0; i < VT.getVectorNumElements(); ++i)<br>
-    VPermMask.push_back(Mask[i] < 0 ? DAG.getUNDEF(MaskEltVT) :<br>
-                        DAG.getConstant(Mask[i], DL,MaskEltVT));<br>
-  SDValue MaskNode = DAG.getNode(ISD::BUILD_VECTOR, DL, MaskVecVT,<br>
-                                 VPermMask);<br>
-  if (isSingleInputShuffleMask(Mask))<br>
-    return DAG.getNode(X86ISD::VPERMV, DL, VT, MaskNode, V1);<br>
+  // X86 has dedicated unpack instructions that can handle specific blend<br>
+  // operations: UNPCKH and UNPCKL.<br>
+  if (isShuffleEquivalent(V1, V2, Mask, {0, 8, 2, 10, 4, 12, 6, 14}))<br>
+    return DAG.getNode(X86ISD::UNPCKL, DL, MVT::v8f64, V1, V2);<br>
+  if (isShuffleEquivalent(V1, V2, Mask, {1, 9, 3, 11, 5, 13, 7, 15}))<br>
+    return DAG.getNode(X86ISD::UNPCKH, DL, MVT::v8f64, V1, V2);<br>
<br>
-  return DAG.getNode(X86ISD::VPERMV3, DL, VT, MaskNode, V1, V2);<br>
+  // FIXME: Implement direct support for this type!<br>
+  return splitAndLowerVectorShuffle(DL, MVT::v8f64, V1, V2, Mask, DAG);<br>
 }<br>
<br>
+/// \brief Handle lowering of 16-lane 32-bit floating point shuffles.<br>
+static SDValue lowerV16F32VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
+                                       const X86Subtarget *Subtarget,<br>
+                                       SelectionDAG &DAG) {<br>
+  SDLoc DL(Op);<br>
+  assert(V1.getSimpleValueType() == MVT::v16f32 && "Bad operand type!");<br>
+  assert(V2.getSimpleValueType() == MVT::v16f32 && "Bad operand type!");<br>
+  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);<br>
+  ArrayRef<int> Mask = SVOp->getMask();<br>
+  assert(Mask.size() == 16 && "Unexpected mask size for v16 shuffle!");<br>
<br>
-/// \brief Handle lowering of 8-lane 64-bit floating point shuffles.<br>
-static SDValue lowerV8X64VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
+  // Use dedicated unpack instructions for masks that match their pattern.<br>
+  if (isShuffleEquivalent(V1, V2, Mask,<br>
+                          {// First 128-bit lane.<br>
+                           0, 16, 1, 17, 4, 20, 5, 21,<br>
+                           // Second 128-bit lane.<br>
+                           8, 24, 9, 25, 12, 28, 13, 29}))<br>
+    return DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16f32, V1, V2);<br>
+  if (isShuffleEquivalent(V1, V2, Mask,<br>
+                          {// First 128-bit lane.<br>
+                           2, 18, 3, 19, 6, 22, 7, 23,<br>
+                           // Second 128-bit lane.<br>
+                           10, 26, 11, 27, 14, 30, 15, 31}))<br>
+    return DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16f32, V1, V2);<br>
+<br>
+  // FIXME: Implement direct support for this type!<br>
+  return splitAndLowerVectorShuffle(DL, MVT::v16f32, V1, V2, Mask, DAG);<br>
+}<br>
+<br>
+/// \brief Handle lowering of 8-lane 64-bit integer shuffles.<br>
+static SDValue lowerV8I64VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
                                        const X86Subtarget *Subtarget,<br>
                                        SelectionDAG &DAG) {<br>
   SDLoc DL(Op);<br>
-  MVT VT = Op.getSimpleValueType();<br>
-  assert((V1.getSimpleValueType() == MVT::v8f64 ||<br>
-          V1.getSimpleValueType() == MVT::v8i64) && "Bad operand type!");<br>
-  assert((V2.getSimpleValueType() == MVT::v8f64 ||<br>
-          V2.getSimpleValueType() == MVT::v8i64) && "Bad operand type!");<br>
+  assert(V1.getSimpleValueType() == MVT::v8i64 && "Bad operand type!");<br>
+  assert(V2.getSimpleValueType() == MVT::v8i64 && "Bad operand type!");<br>
   ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);<br>
   ArrayRef<int> Mask = SVOp->getMask();<br>
   assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!");<br>
<br>
-  SmallVector<int, 4> WidenedMask;<br>
-  if (canWidenShuffleElements(Mask, WidenedMask))<br>
-    if(SDValue Op = lowerV4X128VectorShuffle(DL, VT, V1, V2, WidenedMask, DAG))<br>
-      return Op;<br>
   // X86 has dedicated unpack instructions that can handle specific blend<br>
   // operations: UNPCKH and UNPCKL.<br>
   if (isShuffleEquivalent(V1, V2, Mask, {0, 8, 2, 10, 4, 12, 6, 14}))<br>
-    return DAG.getNode(X86ISD::UNPCKL, DL, VT, V1, V2);<br>
+    return DAG.getNode(X86ISD::UNPCKL, DL, MVT::v8i64, V1, V2);<br>
   if (isShuffleEquivalent(V1, V2, Mask, {1, 9, 3, 11, 5, 13, 7, 15}))<br>
-    return DAG.getNode(X86ISD::UNPCKH, DL, VT, V1, V2);<br>
-<br>
-  if (SDValue Op = lowerVectorShuffleWithVALIGN(DL, VT, Mask, V1, V2, DAG))<br>
-    return Op;<br>
-<br>
-  if (SDValue Op = lowerVectorShuffleWithSHUFPD(DL, VT, Mask, V1, V2, DAG))<br>
-    return Op;<br>
+    return DAG.getNode(X86ISD::UNPCKH, DL, MVT::v8i64, V1, V2);<br>
<br>
-  // PERMILPD instruction - mask 0/1, 0/1, 2/3, 2/3, 4/5, 4/5, 6/7, 6/7<br>
-  if (isSingleInputShuffleMask(Mask)) {<br>
-    if (!is128BitLaneCrossingShuffleMask(VT, Mask))<br>
-      return DAG.getNode(X86ISD::VPERMILPI, DL, VT, V1,<br>
-                         get1bitLaneShuffleImm8ForMask(Mask, DL, DAG));<br>
-<br>
-    SmallVector<int, 4> RepeatedMask;<br>
-    if (is256BitLaneRepeatedShuffleMask(VT, Mask, RepeatedMask))<br>
-      return DAG.getNode(X86ISD::VPERMI, DL, VT, V1,<br>
-                         getV4X86ShuffleImm8ForMask(RepeatedMask, DL, DAG));<br>
-  }<br>
-  return lowerVectorShuffleWithPERMV(DL, VT, Mask, V1, V2, DAG);<br>
+  // FIXME: Implement direct support for this type!<br>
+  return splitAndLowerVectorShuffle(DL, MVT::v8i64, V1, V2, Mask, DAG);<br>
 }<br>
<br>
 /// \brief Handle lowering of 16-lane 32-bit integer shuffles.<br>
-static SDValue lowerV16X32VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
+static SDValue lowerV16I32VectorShuffle(SDValue Op, SDValue V1, SDValue V2,<br>
                                        const X86Subtarget *Subtarget,<br>
                                        SelectionDAG &DAG) {<br>
-  MVT VT = Op.getSimpleValueType();<br>
   SDLoc DL(Op);<br>
-  assert((V1.getSimpleValueType() == MVT::v16i32 ||<br>
-          V1.getSimpleValueType() == MVT::v16f32) && "Bad operand type!");<br>
-  assert((V2.getSimpleValueType() == MVT::v16i32 ||<br>
-          V2.getSimpleValueType() == MVT::v16f32) && "Bad operand type!");<br>
+  assert(V1.getSimpleValueType() == MVT::v16i32 && "Bad operand type!");<br>
+  assert(V2.getSimpleValueType() == MVT::v16i32 && "Bad operand type!");<br>
   ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);<br>
   ArrayRef<int> Mask = SVOp->getMask();<br>
   assert(Mask.size() == 16 && "Unexpected mask size for v16 shuffle!");<br>
@@ -10253,39 +10158,16 @@ static SDValue lowerV16X32VectorShuffle(<br>
                            0, 16, 1, 17, 4, 20, 5, 21,<br>
                            // Second 128-bit lane.<br>
                            8, 24, 9, 25, 12, 28, 13, 29}))<br>
-    return DAG.getNode(X86ISD::UNPCKL, DL, VT, V1, V2);<br>
+    return DAG.getNode(X86ISD::UNPCKL, DL, MVT::v16i32, V1, V2);<br>
   if (isShuffleEquivalent(V1, V2, Mask,<br>
                           {// First 128-bit lane.<br>
                            2, 18, 3, 19, 6, 22, 7, 23,<br>
                            // Second 128-bit lane.<br>
                            10, 26, 11, 27, 14, 30, 15, 31}))<br>
-    return DAG.getNode(X86ISD::UNPCKH, DL, VT, V1, V2);<br>
-<br>
-  if (isShuffleEquivalent(V1, V2, Mask, {0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10,<br>
-                                         12, 12, 14, 14}))<br>
-    return DAG.getNode(X86ISD::MOVSLDUP, DL, VT, V1);<br>
-  if (isShuffleEquivalent(V1, V2, Mask, {1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11,<br>
-                                         13, 13, 15, 15}))<br>
-    return DAG.getNode(X86ISD::MOVSHDUP, DL, VT, V1);<br>
-<br>
-  SmallVector<int, 4> RepeatedMask;<br>
-  if (is128BitLaneRepeatedShuffleMask(VT, Mask, RepeatedMask)) {<br>
-    if (isSingleInputShuffleMask(Mask)) {<br>
-      unsigned Opc = VT.isInteger() ? X86ISD::PSHUFD : X86ISD::VPERMILPI;<br>
-      return DAG.getNode(Opc, DL, VT, V1,<br>
-                         getV4X86ShuffleImm8ForMask(RepeatedMask, DL, DAG));<br>
-    }<br>
-<br>
-    for (int i = 0; i < 4; ++i)<br>
-      if (RepeatedMask[i] >= 16)<br>
-        RepeatedMask[i] -= 12;<br>
-     return lowerVectorShuffleWithSHUFPS(DL, VT, RepeatedMask, V1, V2, DAG);<br>
-  }<br>
-<br>
-  if (SDValue Op = lowerVectorShuffleWithVALIGN(DL, VT, Mask, V1, V2, DAG))<br>
-    return Op;<br>
+    return DAG.getNode(X86ISD::UNPCKH, DL, MVT::v16i32, V1, V2);<br>
<br>
-  return lowerVectorShuffleWithPERMV(DL, VT, Mask, V1, V2, DAG);<br>
+  // FIXME: Implement direct support for this type!<br>
+  return splitAndLowerVectorShuffle(DL, MVT::v16i32, V1, V2, Mask, DAG);<br>
 }<br>
<br>
 /// \brief Handle lowering of 32-lane 16-bit integer shuffles.<br>
@@ -10345,11 +10227,13 @@ static SDValue lower512BitVectorShuffle(<br>
   // the requisite ISA extensions for that element type are available.<br>
   switch (VT.SimpleTy) {<br>
   case MVT::v8f64:<br>
-  case MVT::v8i64:<br>
-    return lowerV8X64VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
+    return lowerV8F64VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
   case MVT::v16f32:<br>
+    return lowerV16F32VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
+  case MVT::v8i64:<br>
+    return lowerV8I64VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
   case MVT::v16i32:<br>
-    return lowerV16X32VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
+    return lowerV16I32VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
   case MVT::v32i16:<br>
     if (Subtarget->hasBWI())<br>
       return lowerV32I16VectorShuffle(Op, V1, V2, Subtarget, DAG);<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/avx512-build-vector.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_avx512-2Dbuild-2Dvector.ll-3Frev-3D240258-26r1-3D240257-26r2-3D240258-26view-3Ddiff&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=igH9Pk7tsft8B9lsgn7AK_xTfCJtY2aGcaIJeSN57_0&s=Oj0rAP-nkMtz7sboOYVkJKxbgvtKbT_qbMUKkQaEJYc&e=" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-build-vector.ll?rev=240258&r1=240257&r2=240258&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/avx512-build-vector.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/avx512-build-vector.ll Mon Jun 22 04:01:15 2015<br>
@@ -1,15 +1,5 @@<br>
 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s<br>
<br>
-define <16 x i32> @test1(i32* %x) {<br>
-; CHECK-LABEL: test1:<br>
-; CHECK:    vmovd (%rdi), %xmm<br>
-; CHECK:    vmovdqa32<br>
-; CHECK:    vpermt2d %zmm<br>
-   %y = load i32, i32* %x, align 4<br>
-   %res = insertelement <16 x i32>zeroinitializer, i32 %y, i32 4<br>
-   ret <16 x i32>%res<br>
-}<br>
-<br>
 define <16 x i32> @test2(<16 x i32> %x) {<br>
 ; CHECK-LABEL: test2:<br>
 ; CHECK:       ## BB#0:<br>
<br>
Removed: llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_avx512-2Dshuffle.ll-3Frev-3D240257-26view-3Dauto&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=igH9Pk7tsft8B9lsgn7AK_xTfCJtY2aGcaIJeSN57_0&s=nQ2IbgaPbTDaScajwiAT3VvZai81n-5mPBQMWMV9TUo&e=" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll?rev=240257&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll (removed)<br>
@@ -1,392 +0,0 @@<br>
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s<br>
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=CHECK-SKX<br>
-<br>
-; CHECK-LABEL: test1:<br>
-; CHECK: vpermps<br>
-; CHECK: ret<br>
-define <16 x float> @test1(<16 x float> %a) nounwind {<br>
-  %c = shufflevector <16 x float> %a, <16 x float> undef, <16 x i32> <i32 2, i32 5, i32 undef, i32 undef, i32 7, i32 undef, i32 10, i32 1,  i32 0, i32 5, i32 undef, i32 4, i32 7, i32 undef, i32 10, i32 1><br>
-  ret <16 x float> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test2:<br>
-; CHECK: vpermd<br>
-; CHECK: ret<br>
-define <16 x i32> @test2(<16 x i32> %a) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> <i32 2, i32 5, i32 undef, i32 undef, i32 7, i32 undef, i32 10, i32 1,  i32 0, i32 5, i32 undef, i32 4, i32 7, i32 undef, i32 10, i32 1><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test3:<br>
-; CHECK: vpermq<br>
-; CHECK: ret<br>
-define <8 x i64> @test3(<8 x i64> %a) nounwind {<br>
-  %c = shufflevector <8 x i64> %a, <8 x i64> undef, <8 x i32> <i32 2, i32 5, i32 1, i32 undef, i32 7, i32 undef, i32 3, i32 1><br>
-  ret <8 x i64> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test4:<br>
-; CHECK: vpermpd<br>
-; CHECK: ret<br>
-define <8 x double> @test4(<8 x double> %a) nounwind {<br>
-  %c = shufflevector <8 x double> %a, <8 x double> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test5:<br>
-; CHECK: vpermt2pd<br>
-; CHECK: ret<br>
-define <8 x double> @test5(<8 x double> %a, <8 x double> %b) nounwind {<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 8, i32 0, i32 1, i32 6, i32 10, i32 4, i32 5><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test6:<br>
-; CHECK: vpermq $30<br>
-; CHECK: ret<br>
-define <8 x i64> @test6(<8 x i64> %a) nounwind {<br>
-  %c = shufflevector <8 x i64> %a, <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 1, i32 0, i32 6, i32 7, i32 5, i32 4><br>
-  ret <8 x i64> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test7:<br>
-; CHECK: vpermt2q<br>
-; CHECK: ret<br>
-define <8 x i64> @test7(<8 x i64> %a, <8 x i64> %b) nounwind {<br>
-  %c = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 2, i32 8, i32 0, i32 1, i32 6, i32 10, i32 4, i32 5><br>
-  ret <8 x i64> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test8:<br>
-; CHECK: vpermt2d<br>
-; CHECK: ret<br>
-define <16 x i32> @test8(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 15, i32 31, i32 14, i32 22, i32 13, i32 29, i32 4, i32 28, i32 11, i32 27, i32 10, i32 26, i32 9, i32 25, i32 8, i32 24><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test9:<br>
-; CHECK: vpermt2ps<br>
-; CHECK: ret<br>
-define <16 x float> @test9(<16 x float> %a, <16 x float> %b) nounwind {<br>
-  %c = shufflevector <16 x float> %a, <16 x float> %b, <16 x i32> <i32 15, i32 31, i32 14, i32 22, i32 13, i32 29, i32 4, i32 28, i32 11, i32 27, i32 10, i32 26, i32 9, i32 25, i32 8, i32 24><br>
-  ret <16 x float> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test10:<br>
-; CHECK: vpermt2ps (<br>
-; CHECK: ret<br>
-define <16 x float> @test10(<16 x float> %a, <16 x float>* %b) nounwind {<br>
-  %c = load <16 x float>, <16 x float>* %b<br>
-  %d = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32> <i32 15, i32 31, i32 14, i32 22, i32 13, i32 29, i32 4, i32 28, i32 11, i32 27, i32 10, i32 26, i32 9, i32 25, i32 8, i32 24><br>
-  ret <16 x float> %d<br>
-}<br>
-<br>
-; CHECK-LABEL: test11:<br>
-; CHECK: vpermt2d<br>
-; CHECK: ret<br>
-define <16 x i32> @test11(<16 x i32> %a, <16 x i32>* %b) nounwind {<br>
-  %c = load <16 x i32>, <16 x i32>* %b<br>
-  %d = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32> <i32 15, i32 31, i32 14, i32 22, i32 13, i32 29, i32 4, i32 28, i32 11, i32 27, i32 10, i32 26, i32 9, i32 25, i32 8, i32 24><br>
-  ret <16 x i32> %d<br>
-}<br>
-<br>
-; CHECK-LABEL: test13<br>
-; CHECK: vpermilps $177, %zmm<br>
-; CHECK: ret<br>
-define <16 x float> @test13(<16 x float> %a) {<br>
- %b = shufflevector <16 x float> %a, <16 x float> undef, <16 x i32><i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14><br>
- ret <16 x float> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test14<br>
-; CHECK: vpermilpd $203, %zmm<br>
-; CHECK: ret<br>
-define <8 x double> @test14(<8 x double> %a) {<br>
- %b = shufflevector <8 x double> %a, <8 x double> undef, <8 x i32><i32 1, i32 1, i32 2, i32 3, i32 4, i32 4, i32 7, i32 7><br>
- ret <8 x double> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test15<br>
-; CHECK: vpshufd $177, %zmm<br>
-; CHECK: ret<br>
-define <16 x i32> @test15(<16 x i32> %a) {<br>
-; mask 1-0-3-2 = 10110001 = 0xb1 = 177<br>
- %b = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32><i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14><br>
- ret <16 x i32> %b<br>
-}<br>
-; CHECK-LABEL: test16<br>
-; CHECK: valignq $3, %zmm0, %zmm1<br>
-; CHECK: ret<br>
-define <8 x double> @test16(<8 x double> %a, <8 x double> %b) nounwind {<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test17<br>
-; CHECK: vshufpd $19, %zmm1, %zmm0<br>
-; CHECK: ret<br>
-define <8 x double> @test17(<8 x double> %a, <8 x double> %b) nounwind {<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 9, i32 2, i32 10, i32 5, i32 undef, i32 undef, i32 undef><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test18<br>
-; CHECK: vpunpckhdq %zmm<br>
-; CHECK: ret<br>
-define <16 x i32> @test18(<16 x i32> %a, <16 x i32> %c) {<br>
- %b = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32><i32 2, i32 18, i32 3, i32 19, i32 6, i32 22, i32 7, i32 23, i32 10, i32 26, i32 11, i32 27, i32 14, i32 30, i32 15, i32 31><br>
- ret <16 x i32> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test19<br>
-; CHECK: vpunpckldq %zmm<br>
-; CHECK: ret<br>
-define <16 x i32> @test19(<16 x i32> %a, <16 x i32> %c) {<br>
- %b = shufflevector <16 x i32> %a, <16 x i32> %c, <16 x i32><i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 8, i32 24, i32 9, i32 25, i32 12, i32 28, i32 13, i32 29><br>
- ret <16 x i32> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test20<br>
-; CHECK: vpunpckhqdq  %zmm<br>
-; CHECK: ret<br>
-define <8 x i64> @test20(<8 x i64> %a, <8 x i64> %c) {<br>
- %b = shufflevector <8 x i64> %a, <8 x i64> %c, <8 x i32><i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15><br>
- ret <8 x i64> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test21<br>
-; CHECK: vbroadcastsd  %xmm0, %zmm<br>
-; CHECK: ret<br>
-define <8 x double> @test21(<8 x double> %a, <8 x double> %b) {<br>
-  %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0><br>
-  ret <8 x double> %shuffle<br>
-}<br>
-<br>
-; CHECK-LABEL: test22<br>
-; CHECK: vpbroadcastq  %xmm0, %zmm<br>
-; CHECK: ret<br>
-define <8 x i64> @test22(<8 x i64> %a, <8 x i64> %b) {<br>
-  %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0><br>
-  ret <8 x i64> %shuffle<br>
-}<br>
-<br>
-; CHECK-LABEL: @test23<br>
-; CHECK: vshufps<br>
-; CHECK: vshufps<br>
-; CHECK: ret<br>
-define <16 x i32> @test23(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: @test24<br>
-; CHECK: vpermt2d<br>
-; CHECK: ret<br>
-define <16 x i32> @test24(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 25, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: @test25<br>
-; CHECK: vshufps  $52<br>
-; CHECK: ret<br>
-define <16 x i32> @test25(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-; mask - 0-1-3-0 00110100 = 0x34 = 52<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 0, i32 1, i32 19, i32 16, i32 4, i32 5, i32 23, i32 undef, i32 8, i32 9, i32 27, i32 undef, i32 12, i32 13, i32 undef, i32 undef><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: @test26<br>
-; CHECK: vmovshdup<br>
-; CHECK: ret<br>
-define <16 x i32> @test26(<16 x i32> %a) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> undef, <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 undef, i32 9, i32 9, i32 undef, i32 11, i32 13, i32 undef, i32 undef, i32 undef><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: @test27<br>
-; CHECK: ret<br>
-define <16 x i32> @test27(<4 x i32>%a) {<br>
- %res = shufflevector <4 x i32> %a, <4 x i32> undef, <16 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef><br>
- ret <16 x i32> %res<br>
-}<br>
-<br>
-; CHECK-LABEL: test28<br>
-; CHECK: vpshufhw $177, %ymm<br>
-; CHECK: ret<br>
-define <16 x i16> @test28(<16 x i16> %a) {<br>
- %b = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32><i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 7, i32 6, i32 8, i32 9, i32 10, i32 11, i32 13, i32 12, i32 15, i32 14><br>
- ret <16 x i16> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test29<br>
-; CHECK: vunpcklps %zmm<br>
-; CHECK: ret<br>
-define <16 x float> @test29(<16 x float> %a, <16 x float> %c) {<br>
- %b = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32><i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 8, i32 24, i32 9, i32 25, i32 12, i32 28, i32 13, i32 29><br>
- ret <16 x float> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: @test30<br>
-; CHECK: vshufps $144, %zmm<br>
-; CHECK: ret<br>
-define <16 x float> @test30(<16 x float> %a, <16 x float> %c) {<br>
- %b = shufflevector <16 x float> %a, <16 x float> %c, <16 x i32><i32 0, i32 0, i32 17, i32 18, i32 4, i32 4, i32 21, i32 22, i32 8, i32 8, i32 25, i32 26, i32 12, i32 12, i32 29, i32 30><br>
- ret <16 x float> %b<br>
-}<br>
-<br>
-; CHECK-LABEL: test31<br>
-; CHECK: valignd $3, %zmm0, %zmm1<br>
-; CHECK: ret<br>
-define <16 x i32> @test31(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 3, i32 4, i32 5, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-; CHECK-LABEL: test32<br>
-; CHECK: vshufpd $99, %zmm0, %zmm1<br>
-; CHECK: ret<br>
-define <8 x double> @test32(<8 x double> %a, <8 x double> %b) nounwind {<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 1, i32 10, i32 2, i32 undef, i32 5, i32 15, i32 undef><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s<br>
-define <8 x double> @test_vshuff64x2_512(<8 x double> %x, <8 x double> %x1) nounwind {<br>
-; CHECK-LABEL: test_vshuff64x2_512:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vshuff64x2 $136, %zmm0, %zmm0, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %res = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 0, i32 1,  i32 4, i32 5><br>
-  ret <8 x double> %res<br>
-}<br>
-<br>
-define <8 x double> @test_vshuff64x2_512_mask(<8 x double> %x, <8 x double> %x1, <8 x i1> %mask) nounwind {<br>
-; CHECK-LABEL: test_vshuff64x2_512_mask:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vpmovsxwq %xmm2, %zmm1<br>
-; CHECK-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm1, %zmm1<br>
-; CHECK-NEXT:    vptestmq %zmm1, %zmm1, %k1<br>
-; CHECK-NEXT:    vshuff64x2 $136, %zmm0, %zmm0, %zmm0 {%k1} {z}<br>
-; CHECK-NEXT:    retq<br>
-  %y = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 0, i32 1,  i32 4, i32 5><br>
-  %res = select <8 x i1> %mask, <8 x double> %y, <8 x double> zeroinitializer<br>
-  ret <8 x double> %res<br>
-}<br>
-<br>
-define <8 x i64> @test_vshufi64x2_512_mask(<8 x i64> %x, <8 x i64> %x1, <8 x i1> %mask) nounwind {<br>
-; CHECK-LABEL: test_vshufi64x2_512_mask:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vpmovsxwq %xmm2, %zmm1<br>
-; CHECK-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm1, %zmm1<br>
-; CHECK-NEXT:    vptestmq %zmm1, %zmm1, %k1<br>
-; CHECK-NEXT:    vshufi64x2 $168, %zmm0, %zmm0, %zmm0 {%k1}<br>
-; CHECK-NEXT:    retq<br>
-  %y = shufflevector <8 x i64> %x, <8 x i64> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 4, i32 5,  i32 4, i32 5><br>
-  %res = select <8 x i1> %mask, <8 x i64> %y, <8 x i64> %x<br>
-  ret <8 x i64> %res<br>
-}<br>
-<br>
-define <8 x double> @test_vshuff64x2_512_mem(<8 x double> %x, <8 x double> *%ptr) nounwind {<br>
-; CHECK-LABEL: test_vshuff64x2_512_mem:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vshuff64x2 $40, %zmm0, %zmm0, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %x1   = load <8 x double>,<8 x double> *%ptr,align 1<br>
-  %res = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 4, i32 5,  i32 0, i32 1><br>
-  ret <8 x double> %res<br>
-}<br>
-<br>
-define <16 x float> @test_vshuff32x4_512_mem(<16 x float> %x, <16 x float> *%ptr) nounwind {<br>
-; CHECK-LABEL: test_vshuff32x4_512_mem:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vshuff64x2 $20, %zmm0, %zmm0, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %x1   = load <16 x float>,<16 x float> *%ptr,align 1<br>
-  %res = shufflevector <16 x float> %x, <16 x float> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3><br>
-  ret <16 x float> %res<br>
-}<br>
-<br>
-define <16 x i32> @test_align_v16i32_rr(<16 x i32> %a, <16 x i32> %b) nounwind {<br>
-; CHECK-LABEL: test_align_v16i32_rr:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    valignd $3, %zmm0, %zmm1, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 3, i32 4, i32 5, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-define <16 x i32> @test_align_v16i32_rm(<16 x i32>* %a.ptr, <16 x i32> %b) nounwind {<br>
-; CHECK-LABEL: test_align_v16i32_rm:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    valignd $3, (%rdi), %zmm0, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %a = load <16 x i32>, <16 x i32>* %a.ptr<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 3, i32 4, i32 5, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18><br>
-  ret <16 x i32> %c<br>
-}<br>
-<br>
-define <16 x i32> @test_align_v16i32_rm_mask(<16 x i32>* %a.ptr, <16 x i32> %b, <16 x i1> %mask) nounwind {<br>
-; CHECK-LABEL: test_align_v16i32_rm_mask:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vpmovsxbd %xmm1, %zmm1<br>
-; CHECK-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm1, %zmm1<br>
-; CHECK-NEXT:    vptestmd %zmm1, %zmm1, %k1<br>
-; CHECK-NEXT:    vmovdqa32 (%rdi), %zmm1<br>
-; CHECK-NEXT:    valignd $3, %zmm1, %zmm0, %zmm1 {%k1}<br>
-; CHECK-NEXT:    vmovaps %zmm1, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-;<br>
-; CHECK-SKX-LABEL: test_align_v16i32_rm_mask:<br>
-; CHECK-SKX:       ## BB#0:<br>
-; CHECK-SKX-NEXT:    vpmovb2m %xmm1, %k1<br>
-; CHECK-SKX-NEXT:    vmovdqa32 (%rdi), %zmm1<br>
-; CHECK-SKX-NEXT:    valignd $3, %zmm1, %zmm0, %zmm1 {%k1}<br>
-; CHECK-SKX-NEXT:    vmovaps %zmm1, %zmm0<br>
-; CHECK-SKX-NEXT:    retq<br>
-  %a = load <16 x i32>, <16 x i32>* %a.ptr<br>
-  %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 3, i32 4, i32 5, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18><br>
-  %res = select <16 x i1> %mask,<16 x i32> %c, <16 x i32> %a<br>
-  ret <16 x i32> %res<br>
-}<br>
-<br>
-define <8 x double> @test_align_v8f64_rr(<8 x double> %a, <8 x double> %b) nounwind {<br>
-; CHECK-LABEL: test_align_v8f64_rr:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    valignq $3, %zmm0, %zmm1, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-define <8 x double> @test_align_v18f64_rm(<8 x double>* %a.ptr, <8 x double> %b) nounwind {<br>
-; CHECK-LABEL: test_align_v18f64_rm:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    valignq $3, (%rdi), %zmm0, %zmm0<br>
-; CHECK-NEXT:    retq<br>
-  %a = load <8 x double>, <8 x double>* %a.ptr<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
-  ret <8 x double> %c<br>
-}<br>
-<br>
-define <8 x double> @test_align_v18f64_rm_mask(<8 x double>* %a.ptr, <8 x double> %b, <8 x i1> %mask) nounwind {<br>
-; CHECK-LABEL: test_align_v18f64_rm_mask:<br>
-; CHECK:       ## BB#0:<br>
-; CHECK-NEXT:    vpmovsxwq %xmm1, %zmm1<br>
-; CHECK-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm1, %zmm1<br>
-; CHECK-NEXT:    vptestmq %zmm1, %zmm1, %k1<br>
-; CHECK-NEXT:    valignq $3, (%rdi), %zmm0, %zmm0 {%k1} {z}<br>
-; CHECK-NEXT:    retq<br>
-;<br>
-; CHECK-SKX-LABEL: test_align_v18f64_rm_mask:<br>
-; CHECK-SKX:       ## BB#0:<br>
-; CHECK-SKX-NEXT:    vpmovw2m %xmm1, %k1<br>
-; CHECK-SKX-NEXT:    valignq $3, (%rdi), %zmm0, %zmm0 {%k1} {z}<br>
-; CHECK-SKX-NEXT:    retq<br>
-  %a = load <8 x double>, <8 x double>* %a.ptr<br>
-  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
-  %res = select <8 x i1> %mask,<8 x double> %c, <8 x double> zeroinitializer<br>
-  ret <8 x double> %res<br>
-}<br>
-<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/vector-shuffle-512-v8.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_vector-2Dshuffle-2D512-2Dv8.ll-3Frev-3D240258-26r1-3D240257-26r2-3D240258-26view-3Ddiff&d=AwMGaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=igH9Pk7tsft8B9lsgn7AK_xTfCJtY2aGcaIJeSN57_0&s=J7Cf3SP-Che6NGQsdpmrgiGjOTaCByFiSDsqnaaIODc&e=" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vector-shuffle-512-v8.ll?rev=240258&r1=240257&r2=240258&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/vector-shuffle-512-v8.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/vector-shuffle-512-v8.ll Mon Jun 22 04:01:15 2015<br>
@@ -15,8 +15,9 @@ define <8 x double> @shuffle_v8f64_00000<br>
 define <8 x double> @shuffle_v8f64_00000010(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00000010:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -25,8 +26,9 @@ define <8 x double> @shuffle_v8f64_00000<br>
 define <8 x double> @shuffle_v8f64_00000200(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00000200:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -35,8 +37,9 @@ define <8 x double> @shuffle_v8f64_00000<br>
 define <8 x double> @shuffle_v8f64_00003000(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00003000:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,0,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 3, i32 0, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -45,8 +48,11 @@ define <8 x double> @shuffle_v8f64_00003<br>
 define <8 x double> @shuffle_v8f64_00040000(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00040000:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0,1,2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 4, i32 0, i32 0, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -55,8 +61,11 @@ define <8 x double> @shuffle_v8f64_00040<br>
 define <8 x double> @shuffle_v8f64_00500000(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00500000:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,1,0]<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -65,8 +74,11 @@ define <8 x double> @shuffle_v8f64_00500<br>
 define <8 x double> @shuffle_v8f64_06000000(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_06000000:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,0,0]<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -75,11 +87,11 @@ define <8 x double> @shuffle_v8f64_06000<br>
 define <8 x double> @shuffle_v8f64_70000000(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_70000000:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1<br>
-; ALL-NEXT:    movl $7, %eax<br>
-; ALL-NEXT:    vpinsrq $0, %rax, %xmm1, %xmm2<br>
-; ALL-NEXT:    vinserti32x4 $0, %xmm2, %zmm1, %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0,1,2],ymm1[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[3,0,0,0]<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0><br>
   ret <8 x double> %shuffle<br>
@@ -88,7 +100,10 @@ define <8 x double> @shuffle_v8f64_70000<br>
 define <8 x double> @shuffle_v8f64_01014545(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_01014545:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vshuff64x2 $160, %zmm0, %zmm0, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5><br>
   ret <8 x double> %shuffle<br>
@@ -97,8 +112,9 @@ define <8 x double> @shuffle_v8f64_01014<br>
 define <8 x double> @shuffle_v8f64_00112233(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00112233:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,1,1]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,3,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3><br>
   ret <8 x double> %shuffle<br>
@@ -107,8 +123,9 @@ define <8 x double> @shuffle_v8f64_00112<br>
 define <8 x double> @shuffle_v8f64_00001111(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00001111:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,1,1]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1><br>
   ret <8 x double> %shuffle<br>
@@ -117,7 +134,11 @@ define <8 x double> @shuffle_v8f64_00001<br>
 define <8 x double> @shuffle_v8f64_81a3c5e7(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_81a3c5e7:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vshufpd $170, %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -126,9 +147,10 @@ define <8 x double> @shuffle_v8f64_81a3c<br>
 define <8 x double> @shuffle_v8f64_08080808(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_08080808:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 0, i32 8, i32 0, i32 8><br>
   ret <8 x double> %shuffle<br>
@@ -137,9 +159,15 @@ define <8 x double> @shuffle_v8f64_08080<br>
 define <8 x double> @shuffle_v8f64_08084c4c(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_08084c4c:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3<br>
+; ALL-NEXT:    vbroadcastsd %xmm3, %ymm3<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3]<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 4, i32 12, i32 4, i32 12><br>
   ret <8 x double> %shuffle<br>
@@ -148,9 +176,13 @@ define <8 x double> @shuffle_v8f64_08084<br>
 define <8 x double> @shuffle_v8f64_8823cc67(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_8823cc67:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3<br>
+; ALL-NEXT:    vbroadcastsd %xmm3, %ymm3<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3]<br>
+; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 8, i32 8, i32 2, i32 3, i32 12, i32 12, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -159,9 +191,13 @@ define <8 x double> @shuffle_v8f64_8823c<br>
 define <8 x double> @shuffle_v8f64_9832dc76(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_9832dc76:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm1[0,1],ymm0[2,3]<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm2[1,0,3,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm1<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3]<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 8, i32 3, i32 2, i32 13, i32 12, i32 7, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -170,9 +206,13 @@ define <8 x double> @shuffle_v8f64_9832d<br>
 define <8 x double> @shuffle_v8f64_9810dc54(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_9810dc54:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm2<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm2[1,0,3,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm1<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 8, i32 1, i32 0, i32 13, i32 12, i32 5, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -181,9 +221,15 @@ define <8 x double> @shuffle_v8f64_9810d<br>
 define <8 x double> @shuffle_v8f64_08194c5d(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_08194c5d:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[0,0,2,1]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm3<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[0,1,1,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13><br>
   ret <8 x double> %shuffle<br>
@@ -192,9 +238,15 @@ define <8 x double> @shuffle_v8f64_08194<br>
 define <8 x double> @shuffle_v8f64_2a3b6e7f(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_2a3b6e7f:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[0,2,2,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm3<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[2,1,3,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,3,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15><br>
   ret <8 x double> %shuffle<br>
@@ -203,9 +255,13 @@ define <8 x double> @shuffle_v8f64_2a3b6<br>
 define <8 x double> @shuffle_v8f64_08192a3b(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_08192a3b:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm1[0,2,2,3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[2,1,3,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11><br>
   ret <8 x double> %shuffle<br>
@@ -214,9 +270,11 @@ define <8 x double> @shuffle_v8f64_08192<br>
 define <8 x double> @shuffle_v8f64_08991abb(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_08991abb:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm1[0,0,1,1]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm0[0],ymm2[1,2,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,2,3,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 9, i32 9, i32 1, i32 10, i32 11, i32 11><br>
   ret <8 x double> %shuffle<br>
@@ -225,9 +283,12 @@ define <8 x double> @shuffle_v8f64_08991<br>
 define <8 x double> @shuffle_v8f64_091b2d3f(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_091b2d3f:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[2,1,3,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15><br>
   ret <8 x double> %shuffle<br>
@@ -236,9 +297,11 @@ define <8 x double> @shuffle_v8f64_091b2<br>
 define <8 x double> @shuffle_v8f64_09ab1def(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_09ab1def:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm3 = ymm0[1,0,2,2]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1,2,3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15><br>
   ret <8 x double> %shuffle<br>
@@ -247,7 +310,10 @@ define <8 x double> @shuffle_v8f64_09ab1<br>
 define <8 x double> @shuffle_v8f64_00014445(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00014445:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $64, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,0,1]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,0,1]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 4, i32 4, i32 4, i32 5><br>
   ret <8 x double> %shuffle<br>
@@ -256,7 +322,10 @@ define <8 x double> @shuffle_v8f64_00014<br>
 define <8 x double> @shuffle_v8f64_00204464(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00204464:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $32, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,2,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 4, i32 6, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -265,7 +334,10 @@ define <8 x double> @shuffle_v8f64_00204<br>
 define <8 x double> @shuffle_v8f64_03004744(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_03004744:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $12, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,3,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 7, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -274,7 +346,10 @@ define <8 x double> @shuffle_v8f64_03004<br>
 define <8 x double> @shuffle_v8f64_10005444(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10005444:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $1, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[1,0,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 5, i32 4, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -283,7 +358,10 @@ define <8 x double> @shuffle_v8f64_10005<br>
 define <8 x double> @shuffle_v8f64_22006644(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_22006644:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $10, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[2,2,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 6, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -292,7 +370,10 @@ define <8 x double> @shuffle_v8f64_22006<br>
 define <8 x double> @shuffle_v8f64_33307774(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_33307774:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $63, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,3,3,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,3,3,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 7, i32 7, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -301,7 +382,10 @@ define <8 x double> @shuffle_v8f64_33307<br>
 define <8 x double> @shuffle_v8f64_32107654(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_32107654:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermpd $27, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,2,1,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,2,1,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -310,7 +394,10 @@ define <8 x double> @shuffle_v8f64_32107<br>
 define <8 x double> @shuffle_v8f64_00234467(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00234467:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $136, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 4, i32 4, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -319,7 +406,10 @@ define <8 x double> @shuffle_v8f64_00234<br>
 define <8 x double> @shuffle_v8f64_00224466(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00224466:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $0, %zmm0, %zmm0<br>
+; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm0[0,0,2,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -328,7 +418,10 @@ define <8 x double> @shuffle_v8f64_00224<br>
 define <8 x double> @shuffle_v8f64_10325476(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10325476:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $85, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -337,7 +430,10 @@ define <8 x double> @shuffle_v8f64_10325<br>
 define <8 x double> @shuffle_v8f64_11335577(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_11335577:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $255, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -346,7 +442,10 @@ define <8 x double> @shuffle_v8f64_11335<br>
 define <8 x double> @shuffle_v8f64_10235467(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10235467:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $153, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,2,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -355,7 +454,10 @@ define <8 x double> @shuffle_v8f64_10235<br>
 define <8 x double> @shuffle_v8f64_10225466(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10225466:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $17, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,2,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 2, i32 5, i32 4, i32 6, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -364,8 +466,10 @@ define <8 x double> @shuffle_v8f64_10225<br>
 define <8 x double> @shuffle_v8f64_00015444(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00015444:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,0,1]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 5, i32 4, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -374,8 +478,10 @@ define <8 x double> @shuffle_v8f64_00015<br>
 define <8 x double> @shuffle_v8f64_00204644(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00204644:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,2,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 6, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -384,8 +490,10 @@ define <8 x double> @shuffle_v8f64_00204<br>
 define <8 x double> @shuffle_v8f64_03004474(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_03004474:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,3,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,3,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 4, i32 7, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -394,8 +502,10 @@ define <8 x double> @shuffle_v8f64_03004<br>
 define <8 x double> @shuffle_v8f64_10004444(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10004444:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[1,0,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -404,8 +514,10 @@ define <8 x double> @shuffle_v8f64_10004<br>
 define <8 x double> @shuffle_v8f64_22006446(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_22006446:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[2,2,0,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,0,0,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 4, i32 4, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -414,8 +526,10 @@ define <8 x double> @shuffle_v8f64_22006<br>
 define <8 x double> @shuffle_v8f64_33307474(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_33307474:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,3,3,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,0,3,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 4, i32 7, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -424,8 +538,9 @@ define <8 x double> @shuffle_v8f64_33307<br>
 define <8 x double> @shuffle_v8f64_32104567(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_32104567:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,2,1,0]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -434,8 +549,10 @@ define <8 x double> @shuffle_v8f64_32104<br>
 define <8 x double> @shuffle_v8f64_00236744(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00236744:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 6, i32 7, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -444,8 +561,10 @@ define <8 x double> @shuffle_v8f64_00236<br>
 define <8 x double> @shuffle_v8f64_00226644(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00226644:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm0[0,0,2,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 6, i32 6, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -454,7 +573,9 @@ define <8 x double> @shuffle_v8f64_00226<br>
 define <8 x double> @shuffle_v8f64_10324567(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_10324567:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $165, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -463,7 +584,9 @@ define <8 x double> @shuffle_v8f64_10324<br>
 define <8 x double> @shuffle_v8f64_11334567(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_11334567:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $175, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -472,7 +595,9 @@ define <8 x double> @shuffle_v8f64_11334<br>
 define <8 x double> @shuffle_v8f64_01235467(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_01235467:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $154, %zmm0, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -481,7 +606,9 @@ define <8 x double> @shuffle_v8f64_01235<br>
 define <8 x double> @shuffle_v8f64_01235466(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_01235466:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $26, %zmm0, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -490,8 +617,10 @@ define <8 x double> @shuffle_v8f64_01235<br>
 define <8 x double> @shuffle_v8f64_002u6u44(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_002u6u44:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm0[0,0,2,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,0,0]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 4, i32 4><br>
   ret <8 x double> %shuffle<br>
@@ -500,8 +629,10 @@ define <8 x double> @shuffle_v8f64_002u6<br>
 define <8 x double> @shuffle_v8f64_00uu66uu(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_00uu66uu:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm1<br>
-; ALL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,2,3]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 undef, i32 undef, i32 6, i32 6, i32 undef, i32 undef><br>
   ret <8 x double> %shuffle<br>
@@ -510,7 +641,9 @@ define <8 x double> @shuffle_v8f64_00uu6<br>
 define <8 x double> @shuffle_v8f64_103245uu(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_103245uu:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $37, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 undef, i32 undef><br>
   ret <8 x double> %shuffle<br>
@@ -519,7 +652,9 @@ define <8 x double> @shuffle_v8f64_10324<br>
 define <8 x double> @shuffle_v8f64_1133uu67(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_1133uu67:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $143, %zmm0, %zmm0<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 undef, i32 undef, i32 6, i32 7><br>
   ret <8 x double> %shuffle<br>
@@ -528,7 +663,9 @@ define <8 x double> @shuffle_v8f64_1133u<br>
 define <8 x double> @shuffle_v8f64_0uu354uu(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_0uu354uu:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $24, %zmm0, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 5, i32 4, i32 undef, i32 undef><br>
   ret <8 x double> %shuffle<br>
@@ -537,7 +674,9 @@ define <8 x double> @shuffle_v8f64_0uu35<br>
 define <8 x double> @shuffle_v8f64_uuu3uu66(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_uuu3uu66:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vpermilpd $8, %zmm0, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1<br>
+; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]<br>
+; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0<br>
 ; ALL-NEXT:    retq<br>
   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 6><br>
   ret <8 x double> %shuffle<br>
@@ -546,9 +685,16 @@ define <8 x double> @shuffle_v8f64_uuu3u<br>
 define <8 x double> @shuffle_v8f64_c348cda0(<8 x double> %a, <8 x double> %b) {<br>
 ; ALL-LABEL: shuffle_v8f64_c348cda0:<br>
 ; ALL:       # BB#0:<br>
-; ALL-NEXT:    vmovdqa64 {{.*}}(%rip), %zmm2<br>
-; ALL-NEXT:    vpermt2pd %zmm0, %zmm1, %zmm2<br>
-; ALL-NEXT:    vmovaps %zmm2, %zmm0<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2<br>
+; ALL-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm2[0,1]<br>
+; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3<br>
+; ALL-NEXT:    vbroadcastsd %xmm1, %ymm4<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm4 = ymm3[0,1,2],ymm4[3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm4[0],ymm2[1,2],ymm4[3]<br>
+; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm3[0,1],ymm1[2],ymm3[3]<br>
+; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0<br>
+; ALL-NEXT:    vblendpd <o:p></o:p></p>
</blockquote>
</div>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>