PerfectShuffle.cpp revision 27e98aa07c836276fc7f546da62c791ad63863d1
127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//===-- BuildShuffleTable.cpp - Perfect Shuffle Generator -----------------===//
227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//
327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//                     The LLVM Compiler Infrastructure
427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//
527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// This file was developed by Chris Lattner and is distributed under
627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//
827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//===----------------------------------------------------------------------===//
927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//
1027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// This file computes an optimal sequence of instructions for doing all shuffles
1127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// of two 4-element vectors.  With a release build and when configured to emit
1227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// an altivec instruction table, this takes about 30s to run on a 2.7Ghz
1327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// PowerPC G5.
1427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//
1527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner//===----------------------------------------------------------------------===//
1627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
1727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner#include <iostream>
1827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner#include <vector>
1927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
2027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct Operator;
2127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
2227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// Masks are 4-nibble hex numbers.  Values 0-7 in any nibble means that it takes
2327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// an element from that value of the input vectors.  A value of 8 means the
2427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// entry is undefined.
2527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
2627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// Mask manipulation functions.
2727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic inline unsigned short MakeMask(unsigned V0, unsigned V1,
2827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner                                      unsigned V2, unsigned V3) {
2927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (V0 << (3*4)) | (V1 << (2*4)) | (V2 << (1*4)) | (V3 << (0*4));
3027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
3127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
3227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// getMaskElt - Return element N of the specified mask.
3327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic unsigned getMaskElt(unsigned Mask, unsigned Elt) {
3427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (Mask >> ((3-Elt)*4)) & 0xF;
3527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
3627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
3727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic unsigned setMaskElt(unsigned Mask, unsigned Elt, unsigned NewVal) {
3827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned FieldShift = ((3-Elt)*4);
3927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (Mask & ~(0xF << FieldShift)) | (NewVal << FieldShift);
4027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
4127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
4227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner// Reject elements where the values are 9-15.
4327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic bool isValidMask(unsigned short Mask) {
4427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short UndefBits = Mask & 0x8888;
4527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (Mask & ((UndefBits >> 1)|(UndefBits>>2)|(UndefBits>>3))) == 0;
4627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
4727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
4827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// hasUndefElements - Return true if any of the elements in the mask are undefs
4927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner///
5027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic bool hasUndefElements(unsigned short Mask) {
5127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (Mask & 0x8888) != 0;
5227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
5327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
5427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// isOnlyLHSMask - Return true if this mask only refers to its LHS, not
5527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// including undef values..
5627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic bool isOnlyLHSMask(unsigned short Mask) {
5727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return (Mask & 0x4444) == 0;
5827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
5927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
6027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// getLHSOnlyMask - Given a mask that refers to its LHS and RHS, modify it to
6127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// refer to the LHS only (for when one argument value is passed into the same
6227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// function twice).
6327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic unsigned short getLHSOnlyMask(unsigned short Mask) {
6427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return Mask & 0xBBBB;  // Keep only LHS and Undefs.
6527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
6627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
6727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// getCompressedMask - Turn a 16-bit uncompressed mask (where each elt uses 4
6827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// bits) into a compressed 13-bit mask, where each elt is multiplied by 9.
6927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic unsigned getCompressedMask(unsigned short Mask) {
7027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return getMaskElt(Mask, 0)*9*9*9 + getMaskElt(Mask, 1)*9*9 +
7127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner         getMaskElt(Mask, 2)*9     + getMaskElt(Mask, 3);
7227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
7327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
7427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic void PrintMask(unsigned i, std::ostream &OS) {
7527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  OS << "<" << (char)(getMaskElt(i, 0) == 8 ? 'u' : ('0'+getMaskElt(i, 0)))
7627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner     << "," << (char)(getMaskElt(i, 1) == 8 ? 'u' : ('0'+getMaskElt(i, 1)))
7727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner     << "," << (char)(getMaskElt(i, 2) == 8 ? 'u' : ('0'+getMaskElt(i, 2)))
7827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner     << "," << (char)(getMaskElt(i, 3) == 8 ? 'u' : ('0'+getMaskElt(i, 3)))
7927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner     << ">";
8027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
8127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
8227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// ShuffleVal - This represents a shufflevector operation.
8327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct ShuffleVal {
8427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned Cost;  // Number of instrs used to generate this value.
8527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  Operator *Op;   // The Operation used to generate this value.
8627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short Arg0, Arg1;  // Input operands for this value.
8727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
8827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShuffleVal() : Cost(1000000) {}
8927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner};
9027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
9127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
9227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// ShufTab - This is the actual shuffle table that we are trying to generate.
9327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner///
9427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic ShuffleVal ShufTab[65536];
9527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
9627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// TheOperators - All of the operators that this target supports.
9727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic std::vector<Operator*> TheOperators;
9827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
9927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// Operator - This is a vector operation that is available for use.
10027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct Operator {
10127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short ShuffleMask;
10227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short OpNum;
10327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  const char *Name;
10427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
10527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  Operator(unsigned short shufflemask, const char *name)
10627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    : ShuffleMask(shufflemask), Name(name) {
10727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    OpNum = TheOperators.size();
10827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    TheOperators.push_back(this);
10927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
11027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ~Operator() {
11127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    assert(TheOperators.back() == this);
11227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    TheOperators.pop_back();
11327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
11427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
11527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  bool isOnlyLHSOperator() const {
11627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    return isOnlyLHSMask(ShuffleMask);
11727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
11827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
11927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  const char *getName() const { return Name; }
12027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
12127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short getTransformedMask(unsigned short LHSMask, unsigned RHSMask) {
12227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // Extract the elements from LHSMask and RHSMask, as appropriate.
12327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned Result = 0;
12427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    for (unsigned i = 0; i != 4; ++i) {
12527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      unsigned SrcElt = (ShuffleMask >> (4*i)) & 0xF;
12627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      unsigned ResElt;
12727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (SrcElt < 4)
12827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        ResElt = getMaskElt(LHSMask, SrcElt);
12927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      else if (SrcElt < 8)
13027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        ResElt = getMaskElt(RHSMask, SrcElt-4);
13127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      else {
13227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        assert(SrcElt == 8 && "Bad src elt!");
13327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        ResElt = 8;
13427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
13527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      Result |= ResElt << (4*i);
13627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
13727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    return Result;
13827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
13927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner};
14027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
14127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic const char *getZeroCostOpName(unsigned short Op) {
14227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (ShufTab[Op].Arg0 == 0x0123)
14327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    return "LHS";
14427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  else if (ShufTab[Op].Arg0 == 0x4567)
14527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    return "RHS";
14627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  else {
14727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    assert(0 && "bad zero cost operation");
14827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    abort();
14927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
15027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
15127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
15227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic void PrintOperation(unsigned ValNo, unsigned short Vals[]) {
15327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned short ThisOp = Vals[ValNo];
15427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cerr << "t" << ValNo;
15527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  PrintMask(ThisOp, std::cerr);
15627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cerr << " = " << ShufTab[ThisOp].Op->getName() << "(";
15727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
15827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (ShufTab[ShufTab[ThisOp].Arg0].Cost == 0) {
15927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cerr << getZeroCostOpName(ShufTab[ThisOp].Arg0);
16027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    PrintMask(ShufTab[ThisOp].Arg0, std::cerr);
16127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  } else {
16227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // Figure out what tmp # it is.
16327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    for (unsigned i = 0; ; ++i)
16427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (Vals[i] == ShufTab[ThisOp].Arg0) {
16527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        std::cerr << "t" << i;
16627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        break;
16727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
16827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
16927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
17027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (!ShufTab[Vals[ValNo]].Op->isOnlyLHSOperator()) {
17127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cerr << ", ";
17227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (ShufTab[ShufTab[ThisOp].Arg1].Cost == 0) {
17327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      std::cerr << getZeroCostOpName(ShufTab[ThisOp].Arg1);
17427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      PrintMask(ShufTab[ThisOp].Arg1, std::cerr);
17527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    } else {
17627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      // Figure out what tmp # it is.
17727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      for (unsigned i = 0; ; ++i)
17827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        if (Vals[i] == ShufTab[ThisOp].Arg1) {
17927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          std::cerr << "t" << i;
18027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          break;
18127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        }
18227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
18327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
18427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cerr << ")  ";
18527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
18627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
18727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic unsigned getNumEntered() {
18827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned Count = 0;
18927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  for (unsigned i = 0; i != 65536; ++i)
19027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    Count += ShufTab[i].Cost < 100;
19127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  return Count;
19227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
19327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
19427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstatic void EvaluateOps(unsigned short Elt, unsigned short Vals[],
19527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner                        unsigned &NumVals) {
19627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (ShufTab[Elt].Cost == 0) return;
19727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
19827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // If this value has already been evaluated, it is free.  FIXME: match undefs.
19927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  for (unsigned i = 0, e = NumVals; i != e; ++i)
20027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (Vals[i] == Elt) return;
20127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
20227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // Otherwise, get the operands of the value, then add it.
20327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned Arg0 = ShufTab[Elt].Arg0, Arg1 = ShufTab[Elt].Arg1;
20427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (ShufTab[Arg0].Cost)
20527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    EvaluateOps(Arg0, Vals, NumVals);
20627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (Arg0 != Arg1 && ShufTab[Arg1].Cost)
20727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    EvaluateOps(Arg1, Vals, NumVals);
20827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
20927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  Vals[NumVals++] = Elt;
21027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
21127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
21227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
21327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerint main() {
21427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // Seed the table with accesses to the LHS and RHS.
21527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x0123].Cost = 0;
21627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x0123].Op = 0;
21727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x0123].Arg0 = 0x0123;
21827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x4567].Cost = 0;
21927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x4567].Op = 0;
22027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  ShufTab[0x4567].Arg0 = 0x4567;
22127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
22227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // Seed the first-level of shuffles, shuffles whose inputs are the input to
22327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // the vectorshuffle operation.
22427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  bool MadeChange = true;
22527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned OpCount = 0;
22627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  while (MadeChange) {
22727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    MadeChange = false;
22827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    ++OpCount;
22927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cerr << "Starting iteration #" << OpCount << " with "
23027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner              << getNumEntered() << " entries established.\n";
23127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
23227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // Scan the table for two reasons: First, compute the maximum cost of any
23327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // operation left in the table.  Second, make sure that values with undefs
23427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // have the cheapest alternative that they match.
23527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned MaxCost = ShufTab[0].Cost;
23627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    for (unsigned i = 1; i != 0x8889; ++i) {
23727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (!isValidMask(i)) continue;
23827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (ShufTab[i].Cost > MaxCost)
23927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        MaxCost = ShufTab[i].Cost;
24027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
24127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      // If this value has an undef, make it be computed the cheapest possible
24227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      // way of any of the things that it matches.
24327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (hasUndefElements(i)) {
24427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // This code is a little bit tricky, so here's the idea: consider some
24527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // permutation, like 7u4u.  To compute the lowest cost for 7u4u, we
24627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // need to take the minimum cost of all of 7[0-8]4[0-8], 81 entries.  If
24727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // there are 3 undefs, the number rises to 729 entries we have to scan,
24827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // and for the 4 undef case, we have to scan the whole table.
24927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        //
25027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // Instead of doing this huge amount of scanning, we process the table
25127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // entries *in order*, and use the fact that 'u' is 8, larger than any
25227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // valid index.  Given an entry like 7u4u then, we only need to scan
25327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // 7[0-7]4u - 8 entries.  We can get away with this, because we already
25427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // know that each of 704u, 714u, 724u, etc contain the minimum value of
25527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // all of the 704[0-8], 714[0-8] and 724[0-8] entries respectively.
25627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned UndefIdx;
25727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        if (i & 0x8000)
25827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          UndefIdx = 0;
25927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        else if (i & 0x0800)
26027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          UndefIdx = 1;
26127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        else if (i & 0x0080)
26227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          UndefIdx = 2;
26327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        else if (i & 0x0008)
26427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          UndefIdx = 3;
26527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        else
26627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          abort();
26727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
26827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned MinVal  = i;
26927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned MinCost = ShufTab[i].Cost;
27027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
27127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // Scan the 8 entries.
27227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        for (unsigned j = 0; j != 8; ++j) {
27327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          unsigned NewElt = setMaskElt(i, UndefIdx, j);
27427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (ShufTab[NewElt].Cost < MinCost) {
27527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            MinCost = ShufTab[NewElt].Cost;
27627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            MinVal = NewElt;
27727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          }
27827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        }
27927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
28027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // If we found something cheaper than what was here before, use it.
28127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        if (i != MinVal) {
28227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          MadeChange = true;
28327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          ShufTab[i] = ShufTab[MinVal];
28427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        }
28527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
28627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
28727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
28827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    for (unsigned LHS = 0; LHS != 0x8889; ++LHS) {
28927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (!isValidMask(LHS)) continue;
29027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (ShufTab[LHS].Cost > 1000) continue;
29127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
29227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      // If nothing involving this operand could possibly be cheaper than what
29327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      // we already have, don't consider it.
29427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (ShufTab[LHS].Cost + 1 >= MaxCost)
29527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        continue;
29627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
29727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      for (unsigned opnum = 0, e = TheOperators.size(); opnum != e; ++opnum) {
29827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        Operator *Op = TheOperators[opnum];
29927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned short Mask = Op->ShuffleMask;
30027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
30127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // Evaluate op(LHS,LHS)
30227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned ResultMask = Op->getTransformedMask(LHS, LHS);
30327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
30427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned Cost = ShufTab[LHS].Cost + 1;
30527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        if (Cost < ShufTab[ResultMask].Cost) {
30627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          ShufTab[ResultMask].Cost = Cost;
30727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          ShufTab[ResultMask].Op = Op;
30827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          ShufTab[ResultMask].Arg0 = LHS;
30927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          ShufTab[ResultMask].Arg1 = LHS;
31027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          MadeChange = true;
31127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        }
31227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
31327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // If this is a two input instruction, include the op(x,y) cases.  If
31427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        // this is a one input instruction, skip this.
31527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        if (Op->isOnlyLHSOperator()) continue;
31627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
31727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        for (unsigned RHS = 0; RHS != 0x8889; ++RHS) {
31827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (!isValidMask(RHS)) continue;
31927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (ShufTab[RHS].Cost > 1000) continue;
32027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
32127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          // If nothing involving this operand could possibly be cheaper than
32227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          // what we already have, don't consider it.
32327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (ShufTab[RHS].Cost + 1 >= MaxCost)
32427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            continue;
32527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
32627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
32727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          // Evaluate op(LHS,RHS)
32827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          unsigned ResultMask = Op->getTransformedMask(LHS, RHS);
32927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
33027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (ShufTab[ResultMask].Cost <= OpCount ||
33127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner              ShufTab[ResultMask].Cost <= ShufTab[LHS].Cost ||
33227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner              ShufTab[ResultMask].Cost <= ShufTab[RHS].Cost)
33327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            continue;
33427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
33527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          // Figure out the cost to evaluate this, knowing that CSE's only need
33627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          // to be evaluated once.
33727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          unsigned short Vals[30];
33827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          unsigned NumVals = 0;
33927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          EvaluateOps(LHS, Vals, NumVals);
34027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          EvaluateOps(RHS, Vals, NumVals);
34127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
34227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          unsigned Cost = NumVals + 1;
34327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          if (Cost < ShufTab[ResultMask].Cost) {
34427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            ShufTab[ResultMask].Cost = Cost;
34527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            ShufTab[ResultMask].Op = Op;
34627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            ShufTab[ResultMask].Arg0 = LHS;
34727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            ShufTab[ResultMask].Arg1 = RHS;
34827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            MadeChange = true;
34927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          }
35027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        }
35127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
35227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
35327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
35427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
35527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cerr << "Finished Table has " << getNumEntered()
35627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner            << " entries established.\n";
35727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
35827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  unsigned CostArray[10] = { 0 };
35927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
36027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // Compute a cost histogram.
36127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  for (unsigned i = 0; i != 65536; ++i) {
36227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (!isValidMask(i)) continue;
36327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (ShufTab[i].Cost > 9)
36427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      ++CostArray[9];
36527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    else
36627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      ++CostArray[ShufTab[i].Cost];
36727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
36827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
36927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  for (unsigned i = 0; i != 9; ++i)
37027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (CostArray[i])
37127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      std::cout << "// " << CostArray[i] << " entries have cost " << i << "\n";
37227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (CostArray[9])
37327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << "// " << CostArray[9] << " entries have higher cost!\n";
37427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
37527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
37627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  // Build up the table to emit.
37727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cout << "\n// This table is 6561*4 = 26244 bytes in size.\n";
37827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cout << "static const unsigned InstrTab[6561+1] = {\n";
37927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
38027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  for (unsigned i = 0; i != 0x8889; ++i) {
38127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (!isValidMask(i)) continue;
38227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
38327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // CostSat - The cost of this operation saturated to two bits.
38427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned CostSat = ShufTab[i].Cost;
38527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (CostSat > 3) CostSat = 3;
38627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
38727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned OpNum = ShufTab[i].Op ? ShufTab[i].Op->OpNum : 0;
38827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    assert(OpNum < 16 && "Too few bits to encode operation!");
38927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
39027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned LHS = getCompressedMask(ShufTab[i].Arg0);
39127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned RHS = getCompressedMask(ShufTab[i].Arg1);
39227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
39327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // Encode this as 2 bits of saturated cost, 4 bits of opcodes, 13 bits of
39427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // LHS, and 13 bits of RHS = 32 bits.
39527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    unsigned Val = (CostSat << 30) | (OpNum << 27) | (LHS << 13) | RHS;
39627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
39727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << "  " << Val << "U,\t// ";
39827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    PrintMask(i, std::cout);
39927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << ": Cost " << ShufTab[i].Cost;
40027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << " " << (ShufTab[i].Op ? ShufTab[i].Op->getName() : "copy");
40127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << " ";
40227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (ShufTab[ShufTab[i].Arg0].Cost == 0) {
40327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      std::cout << getZeroCostOpName(ShufTab[i].Arg0);
40427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    } else {
40527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      PrintMask(ShufTab[i].Arg0, std::cout);
40627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
40727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
40827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    if (ShufTab[i].Op && !ShufTab[i].Op->isOnlyLHSOperator()) {
40927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      std::cout << ", ";
41027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (ShufTab[ShufTab[i].Arg1].Cost == 0) {
41127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        std::cout << getZeroCostOpName(ShufTab[i].Arg1);
41227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      } else {
41327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        PrintMask(ShufTab[i].Arg1, std::cout);
41427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
41527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
41627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    std::cout << "\n";
41727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
41827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  std::cout << "  0\n};\n";
41927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
42027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  if (0) {
42127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    // Print out the table.
42227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    for (unsigned i = 0; i != 0x8889; ++i) {
42327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (!isValidMask(i)) continue;
42427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      if (ShufTab[i].Cost < 1000) {
42527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        PrintMask(i, std::cerr);
42627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        std::cerr << " - Cost " << ShufTab[i].Cost << " - ";
42727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
42827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned short Vals[30];
42927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        unsigned NumVals = 0;
43027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        EvaluateOps(i, Vals, NumVals);
43127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
43227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        for (unsigned j = 0, e = NumVals; j != e; ++j)
43327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner          PrintOperation(j, Vals);
43427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner        std::cerr << "\n";
43527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner      }
43627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner    }
43727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
43827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner}
43927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
44027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
44127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
44227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner///===---------------------------------------------------------------------===//
44327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// The altivec instruction definitions.  This is the altivec-specific part of
44427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner/// this file.
44527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner///===---------------------------------------------------------------------===//
44627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
44727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct vmrghw : public Operator {
44827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  vmrghw() : Operator(0x0415, "vmrghw") {}
44927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner} the_vmrghw;
45027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
45127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct vmrglw : public Operator {
45227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  vmrglw() : Operator(0x2637, "vmrglw") {}
45327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner} the_vmrglw;
45427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
45527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnertemplate<unsigned Elt>
45627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct vspltisw : public Operator {
45727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  vspltisw(const char *N) : Operator(MakeMask(Elt, Elt, Elt, Elt), N) {}
45827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner};
45927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
46027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervspltisw<0> the_vspltisw0("vspltisw0");
46127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervspltisw<1> the_vspltisw1("vspltisw1");
46227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervspltisw<2> the_vspltisw2("vspltisw2");
46327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervspltisw<3> the_vspltisw3("vspltisw3");
46427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
46527e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnertemplate<unsigned N>
46627e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnerstruct vsldoi : public Operator {
46727e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  vsldoi(const char *n) : Operator(MakeMask(N&7, (N+1)&7, (N+2)&7, (N+3)&7), n){
46827e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner  }
46927e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner};
47027e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
47127e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervsldoi<1> the_vsldoi1("vsldoi4");
47227e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervsldoi<2> the_vsldoi2("vsldoi8");
47327e98aa07c836276fc7f546da62c791ad63863d1Chris Lattnervsldoi<3> the_vsldoi3("vsldoi12");
47427e98aa07c836276fc7f546da62c791ad63863d1Chris Lattner
475