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