1*9880d681SAndroid Build Coastguard Worker//===-- PPCInstrAltivec.td - The PowerPC Altivec Extension -*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the Altivec extension to the PowerPC instruction set. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// *********************************** NOTE *********************************** 15*9880d681SAndroid Build Coastguard Worker// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing ** 16*9880d681SAndroid Build Coastguard Worker// ** which VMX and VSX instructions are lane-sensitive and which are not. ** 17*9880d681SAndroid Build Coastguard Worker// ** A lane-sensitive instruction relies, implicitly or explicitly, on ** 18*9880d681SAndroid Build Coastguard Worker// ** whether lanes are numbered from left to right. An instruction like ** 19*9880d681SAndroid Build Coastguard Worker// ** VADDFP is not lane-sensitive, because each lane of the result vector ** 20*9880d681SAndroid Build Coastguard Worker// ** relies only on the corresponding lane of the source vectors. However, ** 21*9880d681SAndroid Build Coastguard Worker// ** an instruction like VMULESB is lane-sensitive, because "even" and ** 22*9880d681SAndroid Build Coastguard Worker// ** "odd" lanes are different for big-endian and little-endian numbering. ** 23*9880d681SAndroid Build Coastguard Worker// ** ** 24*9880d681SAndroid Build Coastguard Worker// ** When adding new VMX and VSX instructions, please consider whether they ** 25*9880d681SAndroid Build Coastguard Worker// ** are lane-sensitive. If so, they must be added to a switch statement ** 26*9880d681SAndroid Build Coastguard Worker// ** in PPCVSXSwapRemoval::gatherVectorInstructions(). ** 27*9880d681SAndroid Build Coastguard Worker// **************************************************************************** 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 30*9880d681SAndroid Build Coastguard Worker// Altivec transformation functions and pattern fragments. 31*9880d681SAndroid Build Coastguard Worker// 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Since we canonicalize buildvectors to v16i8, all vnots "-1" operands will be 34*9880d681SAndroid Build Coastguard Worker// of that type. 35*9880d681SAndroid Build Coastguard Workerdef vnot_ppc : PatFrag<(ops node:$in), 36*9880d681SAndroid Build Coastguard Worker (xor node:$in, (bitconvert (v16i8 immAllOnesV)))>; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdef vpkuhum_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 39*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 40*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUHUMShuffleMask(cast<ShuffleVectorSDNode>(N), 0, *CurDAG); 41*9880d681SAndroid Build Coastguard Worker}]>; 42*9880d681SAndroid Build Coastguard Workerdef vpkuwum_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 43*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 44*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUWUMShuffleMask(cast<ShuffleVectorSDNode>(N), 0, *CurDAG); 45*9880d681SAndroid Build Coastguard Worker}]>; 46*9880d681SAndroid Build Coastguard Workerdef vpkudum_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 47*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 48*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUDUMShuffleMask(cast<ShuffleVectorSDNode>(N), 0, *CurDAG); 49*9880d681SAndroid Build Coastguard Worker}]>; 50*9880d681SAndroid Build Coastguard Workerdef vpkuhum_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 51*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 52*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUHUMShuffleMask(cast<ShuffleVectorSDNode>(N), 1, *CurDAG); 53*9880d681SAndroid Build Coastguard Worker}]>; 54*9880d681SAndroid Build Coastguard Workerdef vpkuwum_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 55*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 56*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUWUMShuffleMask(cast<ShuffleVectorSDNode>(N), 1, *CurDAG); 57*9880d681SAndroid Build Coastguard Worker}]>; 58*9880d681SAndroid Build Coastguard Workerdef vpkudum_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 59*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 60*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUDUMShuffleMask(cast<ShuffleVectorSDNode>(N), 1, *CurDAG); 61*9880d681SAndroid Build Coastguard Worker}]>; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker// These fragments are provided for little-endian, where the inputs must be 64*9880d681SAndroid Build Coastguard Worker// swapped for correct semantics. 65*9880d681SAndroid Build Coastguard Workerdef vpkuhum_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 66*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 67*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUHUMShuffleMask(cast<ShuffleVectorSDNode>(N), 2, *CurDAG); 68*9880d681SAndroid Build Coastguard Worker}]>; 69*9880d681SAndroid Build Coastguard Workerdef vpkuwum_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 70*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 71*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUWUMShuffleMask(cast<ShuffleVectorSDNode>(N), 2, *CurDAG); 72*9880d681SAndroid Build Coastguard Worker}]>; 73*9880d681SAndroid Build Coastguard Workerdef vpkudum_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 74*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 75*9880d681SAndroid Build Coastguard Worker return PPC::isVPKUDUMShuffleMask(cast<ShuffleVectorSDNode>(N), 2, *CurDAG); 76*9880d681SAndroid Build Coastguard Worker}]>; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdef vmrglb_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 79*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 80*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 0, *CurDAG); 81*9880d681SAndroid Build Coastguard Worker}]>; 82*9880d681SAndroid Build Coastguard Workerdef vmrglh_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 83*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 84*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 0, *CurDAG); 85*9880d681SAndroid Build Coastguard Worker}]>; 86*9880d681SAndroid Build Coastguard Workerdef vmrglw_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 87*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 88*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 0, *CurDAG); 89*9880d681SAndroid Build Coastguard Worker}]>; 90*9880d681SAndroid Build Coastguard Workerdef vmrghb_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 91*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 92*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 0, *CurDAG); 93*9880d681SAndroid Build Coastguard Worker}]>; 94*9880d681SAndroid Build Coastguard Workerdef vmrghh_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 95*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 96*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 0, *CurDAG); 97*9880d681SAndroid Build Coastguard Worker}]>; 98*9880d681SAndroid Build Coastguard Workerdef vmrghw_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 99*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 100*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 0, *CurDAG); 101*9880d681SAndroid Build Coastguard Worker}]>; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdef vmrglb_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 105*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 106*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 1, *CurDAG); 107*9880d681SAndroid Build Coastguard Worker}]>; 108*9880d681SAndroid Build Coastguard Workerdef vmrglh_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 109*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 110*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 1, *CurDAG); 111*9880d681SAndroid Build Coastguard Worker}]>; 112*9880d681SAndroid Build Coastguard Workerdef vmrglw_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 113*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 114*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 1, *CurDAG); 115*9880d681SAndroid Build Coastguard Worker}]>; 116*9880d681SAndroid Build Coastguard Workerdef vmrghb_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 117*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 118*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 1, *CurDAG); 119*9880d681SAndroid Build Coastguard Worker}]>; 120*9880d681SAndroid Build Coastguard Workerdef vmrghh_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 121*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 122*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 1, *CurDAG); 123*9880d681SAndroid Build Coastguard Worker}]>; 124*9880d681SAndroid Build Coastguard Workerdef vmrghw_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 125*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 126*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 1, *CurDAG); 127*9880d681SAndroid Build Coastguard Worker}]>; 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker// These fragments are provided for little-endian, where the inputs must be 131*9880d681SAndroid Build Coastguard Worker// swapped for correct semantics. 132*9880d681SAndroid Build Coastguard Workerdef vmrglb_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 133*9880d681SAndroid Build Coastguard Worker (vector_shuffle (v16i8 node:$lhs), node:$rhs), [{ 134*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 2, *CurDAG); 135*9880d681SAndroid Build Coastguard Worker}]>; 136*9880d681SAndroid Build Coastguard Workerdef vmrglh_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 137*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 138*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 2, *CurDAG); 139*9880d681SAndroid Build Coastguard Worker}]>; 140*9880d681SAndroid Build Coastguard Workerdef vmrglw_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 141*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 142*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGLShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 2, *CurDAG); 143*9880d681SAndroid Build Coastguard Worker}]>; 144*9880d681SAndroid Build Coastguard Workerdef vmrghb_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 145*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 146*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 1, 2, *CurDAG); 147*9880d681SAndroid Build Coastguard Worker}]>; 148*9880d681SAndroid Build Coastguard Workerdef vmrghh_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 149*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 150*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 2, 2, *CurDAG); 151*9880d681SAndroid Build Coastguard Worker}]>; 152*9880d681SAndroid Build Coastguard Workerdef vmrghw_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 153*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 154*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGHShuffleMask(cast<ShuffleVectorSDNode>(N), 4, 2, *CurDAG); 155*9880d681SAndroid Build Coastguard Worker}]>; 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdef vmrgew_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 159*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 160*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), true, 0, *CurDAG); 161*9880d681SAndroid Build Coastguard Worker}]>; 162*9880d681SAndroid Build Coastguard Workerdef vmrgow_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 163*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 164*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), false, 0, *CurDAG); 165*9880d681SAndroid Build Coastguard Worker}]>; 166*9880d681SAndroid Build Coastguard Workerdef vmrgew_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 167*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 168*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), true, 1, *CurDAG); 169*9880d681SAndroid Build Coastguard Worker}]>; 170*9880d681SAndroid Build Coastguard Workerdef vmrgow_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 171*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 172*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), false, 1, *CurDAG); 173*9880d681SAndroid Build Coastguard Worker}]>; 174*9880d681SAndroid Build Coastguard Workerdef vmrgew_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 175*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 176*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), true, 2, *CurDAG); 177*9880d681SAndroid Build Coastguard Worker}]>; 178*9880d681SAndroid Build Coastguard Workerdef vmrgow_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 179*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 180*9880d681SAndroid Build Coastguard Worker return PPC::isVMRGEOShuffleMask(cast<ShuffleVectorSDNode>(N), false, 2, *CurDAG); 181*9880d681SAndroid Build Coastguard Worker}]>; 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdef VSLDOI_get_imm : SDNodeXForm<vector_shuffle, [{ 186*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::isVSLDOIShuffleMask(N, 0, *CurDAG), SDLoc(N)); 187*9880d681SAndroid Build Coastguard Worker}]>; 188*9880d681SAndroid Build Coastguard Workerdef vsldoi_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 189*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 190*9880d681SAndroid Build Coastguard Worker return PPC::isVSLDOIShuffleMask(N, 0, *CurDAG) != -1; 191*9880d681SAndroid Build Coastguard Worker}], VSLDOI_get_imm>; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker/// VSLDOI_unary* - These are used to match vsldoi(X,X), which is turned into 195*9880d681SAndroid Build Coastguard Worker/// vector_shuffle(X,undef,mask) by the dag combiner. 196*9880d681SAndroid Build Coastguard Workerdef VSLDOI_unary_get_imm : SDNodeXForm<vector_shuffle, [{ 197*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::isVSLDOIShuffleMask(N, 1, *CurDAG), SDLoc(N)); 198*9880d681SAndroid Build Coastguard Worker}]>; 199*9880d681SAndroid Build Coastguard Workerdef vsldoi_unary_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 200*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 201*9880d681SAndroid Build Coastguard Worker return PPC::isVSLDOIShuffleMask(N, 1, *CurDAG) != -1; 202*9880d681SAndroid Build Coastguard Worker}], VSLDOI_unary_get_imm>; 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker/// VSLDOI_swapped* - These fragments are provided for little-endian, where 206*9880d681SAndroid Build Coastguard Worker/// the inputs must be swapped for correct semantics. 207*9880d681SAndroid Build Coastguard Workerdef VSLDOI_swapped_get_imm : SDNodeXForm<vector_shuffle, [{ 208*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::isVSLDOIShuffleMask(N, 2, *CurDAG), SDLoc(N)); 209*9880d681SAndroid Build Coastguard Worker}]>; 210*9880d681SAndroid Build Coastguard Workerdef vsldoi_swapped_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 211*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 212*9880d681SAndroid Build Coastguard Worker return PPC::isVSLDOIShuffleMask(N, 2, *CurDAG) != -1; 213*9880d681SAndroid Build Coastguard Worker}], VSLDOI_get_imm>; 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker// VSPLT*_get_imm xform function: convert vector_shuffle mask to VSPLT* imm. 217*9880d681SAndroid Build Coastguard Workerdef VSPLTB_get_imm : SDNodeXForm<vector_shuffle, [{ 218*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::getVSPLTImmediate(N, 1, *CurDAG), SDLoc(N)); 219*9880d681SAndroid Build Coastguard Worker}]>; 220*9880d681SAndroid Build Coastguard Workerdef vspltb_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 221*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 222*9880d681SAndroid Build Coastguard Worker return PPC::isSplatShuffleMask(cast<ShuffleVectorSDNode>(N), 1); 223*9880d681SAndroid Build Coastguard Worker}], VSPLTB_get_imm>; 224*9880d681SAndroid Build Coastguard Workerdef VSPLTH_get_imm : SDNodeXForm<vector_shuffle, [{ 225*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::getVSPLTImmediate(N, 2, *CurDAG), SDLoc(N)); 226*9880d681SAndroid Build Coastguard Worker}]>; 227*9880d681SAndroid Build Coastguard Workerdef vsplth_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 228*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 229*9880d681SAndroid Build Coastguard Worker return PPC::isSplatShuffleMask(cast<ShuffleVectorSDNode>(N), 2); 230*9880d681SAndroid Build Coastguard Worker}], VSPLTH_get_imm>; 231*9880d681SAndroid Build Coastguard Workerdef VSPLTW_get_imm : SDNodeXForm<vector_shuffle, [{ 232*9880d681SAndroid Build Coastguard Worker return getI32Imm(PPC::getVSPLTImmediate(N, 4, *CurDAG), SDLoc(N)); 233*9880d681SAndroid Build Coastguard Worker}]>; 234*9880d681SAndroid Build Coastguard Workerdef vspltw_shuffle : PatFrag<(ops node:$lhs, node:$rhs), 235*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), [{ 236*9880d681SAndroid Build Coastguard Worker return PPC::isSplatShuffleMask(cast<ShuffleVectorSDNode>(N), 4); 237*9880d681SAndroid Build Coastguard Worker}], VSPLTW_get_imm>; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker// VSPLTISB_get_imm xform function: convert build_vector to VSPLTISB imm. 241*9880d681SAndroid Build Coastguard Workerdef VSPLTISB_get_imm : SDNodeXForm<build_vector, [{ 242*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 1, *CurDAG); 243*9880d681SAndroid Build Coastguard Worker}]>; 244*9880d681SAndroid Build Coastguard Workerdef vecspltisb : PatLeaf<(build_vector), [{ 245*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 1, *CurDAG).getNode() != 0; 246*9880d681SAndroid Build Coastguard Worker}], VSPLTISB_get_imm>; 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker// VSPLTISH_get_imm xform function: convert build_vector to VSPLTISH imm. 249*9880d681SAndroid Build Coastguard Workerdef VSPLTISH_get_imm : SDNodeXForm<build_vector, [{ 250*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 2, *CurDAG); 251*9880d681SAndroid Build Coastguard Worker}]>; 252*9880d681SAndroid Build Coastguard Workerdef vecspltish : PatLeaf<(build_vector), [{ 253*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 2, *CurDAG).getNode() != 0; 254*9880d681SAndroid Build Coastguard Worker}], VSPLTISH_get_imm>; 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// VSPLTISW_get_imm xform function: convert build_vector to VSPLTISW imm. 257*9880d681SAndroid Build Coastguard Workerdef VSPLTISW_get_imm : SDNodeXForm<build_vector, [{ 258*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 4, *CurDAG); 259*9880d681SAndroid Build Coastguard Worker}]>; 260*9880d681SAndroid Build Coastguard Workerdef vecspltisw : PatLeaf<(build_vector), [{ 261*9880d681SAndroid Build Coastguard Worker return PPC::get_VSPLTI_elt(N, 4, *CurDAG).getNode() != 0; 262*9880d681SAndroid Build Coastguard Worker}], VSPLTISW_get_imm>; 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 265*9880d681SAndroid Build Coastguard Worker// Helpers for defining instructions that directly correspond to intrinsics. 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker// VA1a_Int_Ty - A VAForm_1a intrinsic definition of specific type. 268*9880d681SAndroid Build Coastguard Workerclass VA1a_Int_Ty<bits<6> xo, string opc, Intrinsic IntID, ValueType Ty> 269*9880d681SAndroid Build Coastguard Worker : VAForm_1a<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 270*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB, $vC"), IIC_VecFP, 271*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (IntID Ty:$vA, Ty:$vB, Ty:$vC))]>; 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker// VA1a_Int_Ty2 - A VAForm_1a intrinsic definition where the type of the 274*9880d681SAndroid Build Coastguard Worker// inputs doesn't match the type of the output. 275*9880d681SAndroid Build Coastguard Workerclass VA1a_Int_Ty2<bits<6> xo, string opc, Intrinsic IntID, ValueType OutTy, 276*9880d681SAndroid Build Coastguard Worker ValueType InTy> 277*9880d681SAndroid Build Coastguard Worker : VAForm_1a<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 278*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB, $vC"), IIC_VecFP, 279*9880d681SAndroid Build Coastguard Worker [(set OutTy:$vD, (IntID InTy:$vA, InTy:$vB, InTy:$vC))]>; 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker// VA1a_Int_Ty3 - A VAForm_1a intrinsic definition where there are two 282*9880d681SAndroid Build Coastguard Worker// input types and an output type. 283*9880d681SAndroid Build Coastguard Workerclass VA1a_Int_Ty3<bits<6> xo, string opc, Intrinsic IntID, ValueType OutTy, 284*9880d681SAndroid Build Coastguard Worker ValueType In1Ty, ValueType In2Ty> 285*9880d681SAndroid Build Coastguard Worker : VAForm_1a<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 286*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB, $vC"), IIC_VecFP, 287*9880d681SAndroid Build Coastguard Worker [(set OutTy:$vD, 288*9880d681SAndroid Build Coastguard Worker (IntID In1Ty:$vA, In1Ty:$vB, In2Ty:$vC))]>; 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker// VX1_Int_Ty - A VXForm_1 intrinsic definition of specific type. 291*9880d681SAndroid Build Coastguard Workerclass VX1_Int_Ty<bits<11> xo, string opc, Intrinsic IntID, ValueType Ty> 292*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 293*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, 294*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (IntID Ty:$vA, Ty:$vB))]>; 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker// VX1_Int_Ty2 - A VXForm_1 intrinsic definition where the type of the 297*9880d681SAndroid Build Coastguard Worker// inputs doesn't match the type of the output. 298*9880d681SAndroid Build Coastguard Workerclass VX1_Int_Ty2<bits<11> xo, string opc, Intrinsic IntID, ValueType OutTy, 299*9880d681SAndroid Build Coastguard Worker ValueType InTy> 300*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 301*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, 302*9880d681SAndroid Build Coastguard Worker [(set OutTy:$vD, (IntID InTy:$vA, InTy:$vB))]>; 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker// VX1_Int_Ty3 - A VXForm_1 intrinsic definition where there are two 305*9880d681SAndroid Build Coastguard Worker// input types and an output type. 306*9880d681SAndroid Build Coastguard Workerclass VX1_Int_Ty3<bits<11> xo, string opc, Intrinsic IntID, ValueType OutTy, 307*9880d681SAndroid Build Coastguard Worker ValueType In1Ty, ValueType In2Ty> 308*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 309*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, 310*9880d681SAndroid Build Coastguard Worker [(set OutTy:$vD, (IntID In1Ty:$vA, In2Ty:$vB))]>; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker// VX2_Int_SP - A VXForm_2 intrinsic definition of vector single-precision type. 313*9880d681SAndroid Build Coastguard Workerclass VX2_Int_SP<bits<11> xo, string opc, Intrinsic IntID> 314*9880d681SAndroid Build Coastguard Worker : VXForm_2<xo, (outs vrrc:$vD), (ins vrrc:$vB), 315*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB"), IIC_VecFP, 316*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, (IntID v4f32:$vB))]>; 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker// VX2_Int_Ty2 - A VXForm_2 intrinsic definition where the type of the 319*9880d681SAndroid Build Coastguard Worker// inputs doesn't match the type of the output. 320*9880d681SAndroid Build Coastguard Workerclass VX2_Int_Ty2<bits<11> xo, string opc, Intrinsic IntID, ValueType OutTy, 321*9880d681SAndroid Build Coastguard Worker ValueType InTy> 322*9880d681SAndroid Build Coastguard Worker : VXForm_2<xo, (outs vrrc:$vD), (ins vrrc:$vB), 323*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB"), IIC_VecFP, 324*9880d681SAndroid Build Coastguard Worker [(set OutTy:$vD, (IntID InTy:$vB))]>; 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerclass VXBX_Int_Ty<bits<11> xo, string opc, Intrinsic IntID, ValueType Ty> 327*9880d681SAndroid Build Coastguard Worker : VXForm_BX<xo, (outs vrrc:$vD), (ins vrrc:$vA), 328*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA"), IIC_VecFP, 329*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (IntID Ty:$vA))]>; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Workerclass VXCR_Int_Ty<bits<11> xo, string opc, Intrinsic IntID, ValueType Ty> 332*9880d681SAndroid Build Coastguard Worker : VXForm_CR<xo, (outs vrrc:$vD), (ins vrrc:$vA, u1imm:$ST, u4imm:$SIX), 333*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $ST, $SIX"), IIC_VecFP, 334*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (IntID Ty:$vA, imm:$ST, imm:$SIX))]>; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 337*9880d681SAndroid Build Coastguard Worker// Instruction Definitions. 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerdef HasAltivec : Predicate<"PPCSubTarget->hasAltivec()">; 340*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasAltivec] in { 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerdef DSS : DSS_Form<0, 822, (outs), (ins u5imm:$STRM), 343*9880d681SAndroid Build Coastguard Worker "dss $STRM", IIC_LdStLoad /*FIXME*/, [(int_ppc_altivec_dss imm:$STRM)]>, 344*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST> { 345*9880d681SAndroid Build Coastguard Worker let A = 0; 346*9880d681SAndroid Build Coastguard Worker let B = 0; 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerdef DSSALL : DSS_Form<1, 822, (outs), (ins), 350*9880d681SAndroid Build Coastguard Worker "dssall", IIC_LdStLoad /*FIXME*/, [(int_ppc_altivec_dssall)]>, 351*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST> { 352*9880d681SAndroid Build Coastguard Worker let STRM = 0; 353*9880d681SAndroid Build Coastguard Worker let A = 0; 354*9880d681SAndroid Build Coastguard Worker let B = 0; 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerdef DST : DSS_Form<0, 342, (outs), (ins u5imm:$STRM, gprc:$rA, gprc:$rB), 358*9880d681SAndroid Build Coastguard Worker "dst $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 359*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dst i32:$rA, i32:$rB, imm:$STRM)]>, 360*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdef DSTT : DSS_Form<1, 342, (outs), (ins u5imm:$STRM, gprc:$rA, gprc:$rB), 363*9880d681SAndroid Build Coastguard Worker "dstt $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 364*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dstt i32:$rA, i32:$rB, imm:$STRM)]>, 365*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Workerdef DSTST : DSS_Form<0, 374, (outs), (ins u5imm:$STRM, gprc:$rA, gprc:$rB), 368*9880d681SAndroid Build Coastguard Worker "dstst $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 369*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dstst i32:$rA, i32:$rB, imm:$STRM)]>, 370*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdef DSTSTT : DSS_Form<1, 374, (outs), (ins u5imm:$STRM, gprc:$rA, gprc:$rB), 373*9880d681SAndroid Build Coastguard Worker "dststt $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 374*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dststt i32:$rA, i32:$rB, imm:$STRM)]>, 375*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 378*9880d681SAndroid Build Coastguard Worker // The very same instructions as above, but formally matching 64bit registers. 379*9880d681SAndroid Build Coastguard Worker def DST64 : DSS_Form<0, 342, (outs), (ins u5imm:$STRM, g8rc:$rA, gprc:$rB), 380*9880d681SAndroid Build Coastguard Worker "dst $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 381*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dst i64:$rA, i32:$rB, imm:$STRM)]>, 382*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker def DSTT64 : DSS_Form<1, 342, (outs), (ins u5imm:$STRM, g8rc:$rA, gprc:$rB), 385*9880d681SAndroid Build Coastguard Worker "dstt $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 386*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dstt i64:$rA, i32:$rB, imm:$STRM)]>, 387*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Worker def DSTST64 : DSS_Form<0, 374, (outs), (ins u5imm:$STRM, g8rc:$rA, gprc:$rB), 390*9880d681SAndroid Build Coastguard Worker "dstst $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 391*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dstst i64:$rA, i32:$rB, 392*9880d681SAndroid Build Coastguard Worker imm:$STRM)]>, 393*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker def DSTSTT64 : DSS_Form<1, 374, (outs), (ins u5imm:$STRM, g8rc:$rA, gprc:$rB), 396*9880d681SAndroid Build Coastguard Worker "dststt $rA, $rB, $STRM", IIC_LdStLoad /*FIXME*/, 397*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_dststt i64:$rA, i32:$rB, 398*9880d681SAndroid Build Coastguard Worker imm:$STRM)]>, 399*9880d681SAndroid Build Coastguard Worker Deprecated<DeprecatedDST>; 400*9880d681SAndroid Build Coastguard Worker} 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Workerdef MFVSCR : VXForm_4<1540, (outs vrrc:$vD), (ins), 403*9880d681SAndroid Build Coastguard Worker "mfvscr $vD", IIC_LdStStore, 404*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (int_ppc_altivec_mfvscr))]>; 405*9880d681SAndroid Build Coastguard Workerdef MTVSCR : VXForm_5<1604, (outs), (ins vrrc:$vB), 406*9880d681SAndroid Build Coastguard Worker "mtvscr $vB", IIC_LdStLoad, 407*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_mtvscr v4i32:$vB)]>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in { // Loads. 410*9880d681SAndroid Build Coastguard Workerdef LVEBX: XForm_1<31, 7, (outs vrrc:$vD), (ins memrr:$src), 411*9880d681SAndroid Build Coastguard Worker "lvebx $vD, $src", IIC_LdStLoad, 412*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (int_ppc_altivec_lvebx xoaddr:$src))]>; 413*9880d681SAndroid Build Coastguard Workerdef LVEHX: XForm_1<31, 39, (outs vrrc:$vD), (ins memrr:$src), 414*9880d681SAndroid Build Coastguard Worker "lvehx $vD, $src", IIC_LdStLoad, 415*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (int_ppc_altivec_lvehx xoaddr:$src))]>; 416*9880d681SAndroid Build Coastguard Workerdef LVEWX: XForm_1<31, 71, (outs vrrc:$vD), (ins memrr:$src), 417*9880d681SAndroid Build Coastguard Worker "lvewx $vD, $src", IIC_LdStLoad, 418*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (int_ppc_altivec_lvewx xoaddr:$src))]>; 419*9880d681SAndroid Build Coastguard Workerdef LVX : XForm_1<31, 103, (outs vrrc:$vD), (ins memrr:$src), 420*9880d681SAndroid Build Coastguard Worker "lvx $vD, $src", IIC_LdStLoad, 421*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (int_ppc_altivec_lvx xoaddr:$src))]>; 422*9880d681SAndroid Build Coastguard Workerdef LVXL : XForm_1<31, 359, (outs vrrc:$vD), (ins memrr:$src), 423*9880d681SAndroid Build Coastguard Worker "lvxl $vD, $src", IIC_LdStLoad, 424*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (int_ppc_altivec_lvxl xoaddr:$src))]>; 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Workerdef LVSL : XForm_1<31, 6, (outs vrrc:$vD), (ins memrr:$src), 428*9880d681SAndroid Build Coastguard Worker "lvsl $vD, $src", IIC_LdStLoad, 429*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (int_ppc_altivec_lvsl xoaddr:$src))]>, 430*9880d681SAndroid Build Coastguard Worker PPC970_Unit_LSU; 431*9880d681SAndroid Build Coastguard Workerdef LVSR : XForm_1<31, 38, (outs vrrc:$vD), (ins memrr:$src), 432*9880d681SAndroid Build Coastguard Worker "lvsr $vD, $src", IIC_LdStLoad, 433*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (int_ppc_altivec_lvsr xoaddr:$src))]>, 434*9880d681SAndroid Build Coastguard Worker PPC970_Unit_LSU; 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in { // Stores. 437*9880d681SAndroid Build Coastguard Workerdef STVEBX: XForm_8<31, 135, (outs), (ins vrrc:$rS, memrr:$dst), 438*9880d681SAndroid Build Coastguard Worker "stvebx $rS, $dst", IIC_LdStStore, 439*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_stvebx v16i8:$rS, xoaddr:$dst)]>; 440*9880d681SAndroid Build Coastguard Workerdef STVEHX: XForm_8<31, 167, (outs), (ins vrrc:$rS, memrr:$dst), 441*9880d681SAndroid Build Coastguard Worker "stvehx $rS, $dst", IIC_LdStStore, 442*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_stvehx v8i16:$rS, xoaddr:$dst)]>; 443*9880d681SAndroid Build Coastguard Workerdef STVEWX: XForm_8<31, 199, (outs), (ins vrrc:$rS, memrr:$dst), 444*9880d681SAndroid Build Coastguard Worker "stvewx $rS, $dst", IIC_LdStStore, 445*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_stvewx v4i32:$rS, xoaddr:$dst)]>; 446*9880d681SAndroid Build Coastguard Workerdef STVX : XForm_8<31, 231, (outs), (ins vrrc:$rS, memrr:$dst), 447*9880d681SAndroid Build Coastguard Worker "stvx $rS, $dst", IIC_LdStStore, 448*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_stvx v4i32:$rS, xoaddr:$dst)]>; 449*9880d681SAndroid Build Coastguard Workerdef STVXL : XForm_8<31, 487, (outs), (ins vrrc:$rS, memrr:$dst), 450*9880d681SAndroid Build Coastguard Worker "stvxl $rS, $dst", IIC_LdStStore, 451*9880d681SAndroid Build Coastguard Worker [(int_ppc_altivec_stvxl v4i32:$rS, xoaddr:$dst)]>; 452*9880d681SAndroid Build Coastguard Worker} 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 5 in { // VALU Operations. 455*9880d681SAndroid Build Coastguard Worker// VA-Form instructions. 3-input AltiVec ops. 456*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 457*9880d681SAndroid Build Coastguard Workerdef VMADDFP : VAForm_1<46, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vC, vrrc:$vB), 458*9880d681SAndroid Build Coastguard Worker "vmaddfp $vD, $vA, $vC, $vB", IIC_VecFP, 459*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, 460*9880d681SAndroid Build Coastguard Worker (fma v4f32:$vA, v4f32:$vC, v4f32:$vB))]>; 461*9880d681SAndroid Build Coastguard Worker 462*9880d681SAndroid Build Coastguard Worker// FIXME: The fma+fneg pattern won't match because fneg is not legal. 463*9880d681SAndroid Build Coastguard Workerdef VNMSUBFP: VAForm_1<47, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vC, vrrc:$vB), 464*9880d681SAndroid Build Coastguard Worker "vnmsubfp $vD, $vA, $vC, $vB", IIC_VecFP, 465*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, (fneg (fma v4f32:$vA, v4f32:$vC, 466*9880d681SAndroid Build Coastguard Worker (fneg v4f32:$vB))))]>; 467*9880d681SAndroid Build Coastguard Worker 468*9880d681SAndroid Build Coastguard Workerdef VMHADDSHS : VA1a_Int_Ty<32, "vmhaddshs", int_ppc_altivec_vmhaddshs, v8i16>; 469*9880d681SAndroid Build Coastguard Workerdef VMHRADDSHS : VA1a_Int_Ty<33, "vmhraddshs", int_ppc_altivec_vmhraddshs, 470*9880d681SAndroid Build Coastguard Worker v8i16>; 471*9880d681SAndroid Build Coastguard Workerdef VMLADDUHM : VA1a_Int_Ty<34, "vmladduhm", int_ppc_altivec_vmladduhm, v8i16>; 472*9880d681SAndroid Build Coastguard Worker} // isCommutable 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Workerdef VPERM : VA1a_Int_Ty3<43, "vperm", int_ppc_altivec_vperm, 475*9880d681SAndroid Build Coastguard Worker v4i32, v4i32, v16i8>; 476*9880d681SAndroid Build Coastguard Workerdef VSEL : VA1a_Int_Ty<42, "vsel", int_ppc_altivec_vsel, v4i32>; 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker// Shuffles. 479*9880d681SAndroid Build Coastguard Workerdef VSLDOI : VAForm_2<44, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, u5imm:$SH), 480*9880d681SAndroid Build Coastguard Worker "vsldoi $vD, $vA, $vB, $SH", IIC_VecFP, 481*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 482*9880d681SAndroid Build Coastguard Worker (vsldoi_shuffle:$SH v16i8:$vA, v16i8:$vB))]>; 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker// VX-Form instructions. AltiVec arithmetic ops. 485*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 486*9880d681SAndroid Build Coastguard Workerdef VADDFP : VXForm_1<10, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 487*9880d681SAndroid Build Coastguard Worker "vaddfp $vD, $vA, $vB", IIC_VecFP, 488*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, (fadd v4f32:$vA, v4f32:$vB))]>; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Workerdef VADDUBM : VXForm_1<0, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 491*9880d681SAndroid Build Coastguard Worker "vaddubm $vD, $vA, $vB", IIC_VecGeneral, 492*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (add v16i8:$vA, v16i8:$vB))]>; 493*9880d681SAndroid Build Coastguard Workerdef VADDUHM : VXForm_1<64, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 494*9880d681SAndroid Build Coastguard Worker "vadduhm $vD, $vA, $vB", IIC_VecGeneral, 495*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (add v8i16:$vA, v8i16:$vB))]>; 496*9880d681SAndroid Build Coastguard Workerdef VADDUWM : VXForm_1<128, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 497*9880d681SAndroid Build Coastguard Worker "vadduwm $vD, $vA, $vB", IIC_VecGeneral, 498*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (add v4i32:$vA, v4i32:$vB))]>; 499*9880d681SAndroid Build Coastguard Worker 500*9880d681SAndroid Build Coastguard Workerdef VADDCUW : VX1_Int_Ty<384, "vaddcuw", int_ppc_altivec_vaddcuw, v4i32>; 501*9880d681SAndroid Build Coastguard Workerdef VADDSBS : VX1_Int_Ty<768, "vaddsbs", int_ppc_altivec_vaddsbs, v16i8>; 502*9880d681SAndroid Build Coastguard Workerdef VADDSHS : VX1_Int_Ty<832, "vaddshs", int_ppc_altivec_vaddshs, v8i16>; 503*9880d681SAndroid Build Coastguard Workerdef VADDSWS : VX1_Int_Ty<896, "vaddsws", int_ppc_altivec_vaddsws, v4i32>; 504*9880d681SAndroid Build Coastguard Workerdef VADDUBS : VX1_Int_Ty<512, "vaddubs", int_ppc_altivec_vaddubs, v16i8>; 505*9880d681SAndroid Build Coastguard Workerdef VADDUHS : VX1_Int_Ty<576, "vadduhs", int_ppc_altivec_vadduhs, v8i16>; 506*9880d681SAndroid Build Coastguard Workerdef VADDUWS : VX1_Int_Ty<640, "vadduws", int_ppc_altivec_vadduws, v4i32>; 507*9880d681SAndroid Build Coastguard Worker} // isCommutable 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in 510*9880d681SAndroid Build Coastguard Workerdef VAND : VXForm_1<1028, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 511*9880d681SAndroid Build Coastguard Worker "vand $vD, $vA, $vB", IIC_VecFP, 512*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (and v4i32:$vA, v4i32:$vB))]>; 513*9880d681SAndroid Build Coastguard Workerdef VANDC : VXForm_1<1092, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 514*9880d681SAndroid Build Coastguard Worker "vandc $vD, $vA, $vB", IIC_VecFP, 515*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (and v4i32:$vA, 516*9880d681SAndroid Build Coastguard Worker (vnot_ppc v4i32:$vB)))]>; 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Workerdef VCFSX : VXForm_1<842, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 519*9880d681SAndroid Build Coastguard Worker "vcfsx $vD, $vB, $UIMM", IIC_VecFP, 520*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, 521*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vcfsx v4i32:$vB, imm:$UIMM))]>; 522*9880d681SAndroid Build Coastguard Workerdef VCFUX : VXForm_1<778, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 523*9880d681SAndroid Build Coastguard Worker "vcfux $vD, $vB, $UIMM", IIC_VecFP, 524*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, 525*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vcfux v4i32:$vB, imm:$UIMM))]>; 526*9880d681SAndroid Build Coastguard Workerdef VCTSXS : VXForm_1<970, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 527*9880d681SAndroid Build Coastguard Worker "vctsxs $vD, $vB, $UIMM", IIC_VecFP, 528*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, 529*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vctsxs v4f32:$vB, imm:$UIMM))]>; 530*9880d681SAndroid Build Coastguard Workerdef VCTUXS : VXForm_1<906, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 531*9880d681SAndroid Build Coastguard Worker "vctuxs $vD, $vB, $UIMM", IIC_VecFP, 532*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, 533*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vctuxs v4f32:$vB, imm:$UIMM))]>; 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker// Defines with the UIM field set to 0 for floating-point 536*9880d681SAndroid Build Coastguard Worker// to integer (fp_to_sint/fp_to_uint) conversions and integer 537*9880d681SAndroid Build Coastguard Worker// to floating-point (sint_to_fp/uint_to_fp) conversions. 538*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, VA = 0 in { 539*9880d681SAndroid Build Coastguard Workerdef VCFSX_0 : VXForm_1<842, (outs vrrc:$vD), (ins vrrc:$vB), 540*9880d681SAndroid Build Coastguard Worker "vcfsx $vD, $vB, 0", IIC_VecFP, 541*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, 542*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vcfsx v4i32:$vB, 0))]>; 543*9880d681SAndroid Build Coastguard Workerdef VCTUXS_0 : VXForm_1<906, (outs vrrc:$vD), (ins vrrc:$vB), 544*9880d681SAndroid Build Coastguard Worker "vctuxs $vD, $vB, 0", IIC_VecFP, 545*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, 546*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vctuxs v4f32:$vB, 0))]>; 547*9880d681SAndroid Build Coastguard Workerdef VCFUX_0 : VXForm_1<778, (outs vrrc:$vD), (ins vrrc:$vB), 548*9880d681SAndroid Build Coastguard Worker "vcfux $vD, $vB, 0", IIC_VecFP, 549*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, 550*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vcfux v4i32:$vB, 0))]>; 551*9880d681SAndroid Build Coastguard Workerdef VCTSXS_0 : VXForm_1<970, (outs vrrc:$vD), (ins vrrc:$vB), 552*9880d681SAndroid Build Coastguard Worker "vctsxs $vD, $vB, 0", IIC_VecFP, 553*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, 554*9880d681SAndroid Build Coastguard Worker (int_ppc_altivec_vctsxs v4f32:$vB, 0))]>; 555*9880d681SAndroid Build Coastguard Worker} 556*9880d681SAndroid Build Coastguard Workerdef VEXPTEFP : VX2_Int_SP<394, "vexptefp", int_ppc_altivec_vexptefp>; 557*9880d681SAndroid Build Coastguard Workerdef VLOGEFP : VX2_Int_SP<458, "vlogefp", int_ppc_altivec_vlogefp>; 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 560*9880d681SAndroid Build Coastguard Workerdef VAVGSB : VX1_Int_Ty<1282, "vavgsb", int_ppc_altivec_vavgsb, v16i8>; 561*9880d681SAndroid Build Coastguard Workerdef VAVGSH : VX1_Int_Ty<1346, "vavgsh", int_ppc_altivec_vavgsh, v8i16>; 562*9880d681SAndroid Build Coastguard Workerdef VAVGSW : VX1_Int_Ty<1410, "vavgsw", int_ppc_altivec_vavgsw, v4i32>; 563*9880d681SAndroid Build Coastguard Workerdef VAVGUB : VX1_Int_Ty<1026, "vavgub", int_ppc_altivec_vavgub, v16i8>; 564*9880d681SAndroid Build Coastguard Workerdef VAVGUH : VX1_Int_Ty<1090, "vavguh", int_ppc_altivec_vavguh, v8i16>; 565*9880d681SAndroid Build Coastguard Workerdef VAVGUW : VX1_Int_Ty<1154, "vavguw", int_ppc_altivec_vavguw, v4i32>; 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Workerdef VMAXFP : VX1_Int_Ty<1034, "vmaxfp", int_ppc_altivec_vmaxfp, v4f32>; 568*9880d681SAndroid Build Coastguard Workerdef VMAXSB : VX1_Int_Ty< 258, "vmaxsb", int_ppc_altivec_vmaxsb, v16i8>; 569*9880d681SAndroid Build Coastguard Workerdef VMAXSH : VX1_Int_Ty< 322, "vmaxsh", int_ppc_altivec_vmaxsh, v8i16>; 570*9880d681SAndroid Build Coastguard Workerdef VMAXSW : VX1_Int_Ty< 386, "vmaxsw", int_ppc_altivec_vmaxsw, v4i32>; 571*9880d681SAndroid Build Coastguard Workerdef VMAXUB : VX1_Int_Ty< 2, "vmaxub", int_ppc_altivec_vmaxub, v16i8>; 572*9880d681SAndroid Build Coastguard Workerdef VMAXUH : VX1_Int_Ty< 66, "vmaxuh", int_ppc_altivec_vmaxuh, v8i16>; 573*9880d681SAndroid Build Coastguard Workerdef VMAXUW : VX1_Int_Ty< 130, "vmaxuw", int_ppc_altivec_vmaxuw, v4i32>; 574*9880d681SAndroid Build Coastguard Workerdef VMINFP : VX1_Int_Ty<1098, "vminfp", int_ppc_altivec_vminfp, v4f32>; 575*9880d681SAndroid Build Coastguard Workerdef VMINSB : VX1_Int_Ty< 770, "vminsb", int_ppc_altivec_vminsb, v16i8>; 576*9880d681SAndroid Build Coastguard Workerdef VMINSH : VX1_Int_Ty< 834, "vminsh", int_ppc_altivec_vminsh, v8i16>; 577*9880d681SAndroid Build Coastguard Workerdef VMINSW : VX1_Int_Ty< 898, "vminsw", int_ppc_altivec_vminsw, v4i32>; 578*9880d681SAndroid Build Coastguard Workerdef VMINUB : VX1_Int_Ty< 514, "vminub", int_ppc_altivec_vminub, v16i8>; 579*9880d681SAndroid Build Coastguard Workerdef VMINUH : VX1_Int_Ty< 578, "vminuh", int_ppc_altivec_vminuh, v8i16>; 580*9880d681SAndroid Build Coastguard Workerdef VMINUW : VX1_Int_Ty< 642, "vminuw", int_ppc_altivec_vminuw, v4i32>; 581*9880d681SAndroid Build Coastguard Worker} // isCommutable 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Workerdef VMRGHB : VXForm_1< 12, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 584*9880d681SAndroid Build Coastguard Worker "vmrghb $vD, $vA, $vB", IIC_VecFP, 585*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrghb_shuffle v16i8:$vA, v16i8:$vB))]>; 586*9880d681SAndroid Build Coastguard Workerdef VMRGHH : VXForm_1< 76, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 587*9880d681SAndroid Build Coastguard Worker "vmrghh $vD, $vA, $vB", IIC_VecFP, 588*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrghh_shuffle v16i8:$vA, v16i8:$vB))]>; 589*9880d681SAndroid Build Coastguard Workerdef VMRGHW : VXForm_1<140, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 590*9880d681SAndroid Build Coastguard Worker "vmrghw $vD, $vA, $vB", IIC_VecFP, 591*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrghw_shuffle v16i8:$vA, v16i8:$vB))]>; 592*9880d681SAndroid Build Coastguard Workerdef VMRGLB : VXForm_1<268, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 593*9880d681SAndroid Build Coastguard Worker "vmrglb $vD, $vA, $vB", IIC_VecFP, 594*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrglb_shuffle v16i8:$vA, v16i8:$vB))]>; 595*9880d681SAndroid Build Coastguard Workerdef VMRGLH : VXForm_1<332, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 596*9880d681SAndroid Build Coastguard Worker "vmrglh $vD, $vA, $vB", IIC_VecFP, 597*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrglh_shuffle v16i8:$vA, v16i8:$vB))]>; 598*9880d681SAndroid Build Coastguard Workerdef VMRGLW : VXForm_1<396, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 599*9880d681SAndroid Build Coastguard Worker "vmrglw $vD, $vA, $vB", IIC_VecFP, 600*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrglw_shuffle v16i8:$vA, v16i8:$vB))]>; 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Workerdef VMSUMMBM : VA1a_Int_Ty3<37, "vmsummbm", int_ppc_altivec_vmsummbm, 603*9880d681SAndroid Build Coastguard Worker v4i32, v16i8, v4i32>; 604*9880d681SAndroid Build Coastguard Workerdef VMSUMSHM : VA1a_Int_Ty3<40, "vmsumshm", int_ppc_altivec_vmsumshm, 605*9880d681SAndroid Build Coastguard Worker v4i32, v8i16, v4i32>; 606*9880d681SAndroid Build Coastguard Workerdef VMSUMSHS : VA1a_Int_Ty3<41, "vmsumshs", int_ppc_altivec_vmsumshs, 607*9880d681SAndroid Build Coastguard Worker v4i32, v8i16, v4i32>; 608*9880d681SAndroid Build Coastguard Workerdef VMSUMUBM : VA1a_Int_Ty3<36, "vmsumubm", int_ppc_altivec_vmsumubm, 609*9880d681SAndroid Build Coastguard Worker v4i32, v16i8, v4i32>; 610*9880d681SAndroid Build Coastguard Workerdef VMSUMUHM : VA1a_Int_Ty3<38, "vmsumuhm", int_ppc_altivec_vmsumuhm, 611*9880d681SAndroid Build Coastguard Worker v4i32, v8i16, v4i32>; 612*9880d681SAndroid Build Coastguard Workerdef VMSUMUHS : VA1a_Int_Ty3<39, "vmsumuhs", int_ppc_altivec_vmsumuhs, 613*9880d681SAndroid Build Coastguard Worker v4i32, v8i16, v4i32>; 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 616*9880d681SAndroid Build Coastguard Workerdef VMULESB : VX1_Int_Ty2<776, "vmulesb", int_ppc_altivec_vmulesb, 617*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 618*9880d681SAndroid Build Coastguard Workerdef VMULESH : VX1_Int_Ty2<840, "vmulesh", int_ppc_altivec_vmulesh, 619*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 620*9880d681SAndroid Build Coastguard Workerdef VMULEUB : VX1_Int_Ty2<520, "vmuleub", int_ppc_altivec_vmuleub, 621*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 622*9880d681SAndroid Build Coastguard Workerdef VMULEUH : VX1_Int_Ty2<584, "vmuleuh", int_ppc_altivec_vmuleuh, 623*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 624*9880d681SAndroid Build Coastguard Workerdef VMULOSB : VX1_Int_Ty2<264, "vmulosb", int_ppc_altivec_vmulosb, 625*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 626*9880d681SAndroid Build Coastguard Workerdef VMULOSH : VX1_Int_Ty2<328, "vmulosh", int_ppc_altivec_vmulosh, 627*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 628*9880d681SAndroid Build Coastguard Workerdef VMULOUB : VX1_Int_Ty2< 8, "vmuloub", int_ppc_altivec_vmuloub, 629*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 630*9880d681SAndroid Build Coastguard Workerdef VMULOUH : VX1_Int_Ty2< 72, "vmulouh", int_ppc_altivec_vmulouh, 631*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 632*9880d681SAndroid Build Coastguard Worker} // isCommutable 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Workerdef VREFP : VX2_Int_SP<266, "vrefp", int_ppc_altivec_vrefp>; 635*9880d681SAndroid Build Coastguard Workerdef VRFIM : VX2_Int_SP<714, "vrfim", int_ppc_altivec_vrfim>; 636*9880d681SAndroid Build Coastguard Workerdef VRFIN : VX2_Int_SP<522, "vrfin", int_ppc_altivec_vrfin>; 637*9880d681SAndroid Build Coastguard Workerdef VRFIP : VX2_Int_SP<650, "vrfip", int_ppc_altivec_vrfip>; 638*9880d681SAndroid Build Coastguard Workerdef VRFIZ : VX2_Int_SP<586, "vrfiz", int_ppc_altivec_vrfiz>; 639*9880d681SAndroid Build Coastguard Workerdef VRSQRTEFP : VX2_Int_SP<330, "vrsqrtefp", int_ppc_altivec_vrsqrtefp>; 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Workerdef VSUBCUW : VX1_Int_Ty<1408, "vsubcuw", int_ppc_altivec_vsubcuw, v4i32>; 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Workerdef VSUBFP : VXForm_1<74, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 644*9880d681SAndroid Build Coastguard Worker "vsubfp $vD, $vA, $vB", IIC_VecGeneral, 645*9880d681SAndroid Build Coastguard Worker [(set v4f32:$vD, (fsub v4f32:$vA, v4f32:$vB))]>; 646*9880d681SAndroid Build Coastguard Workerdef VSUBUBM : VXForm_1<1024, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 647*9880d681SAndroid Build Coastguard Worker "vsububm $vD, $vA, $vB", IIC_VecGeneral, 648*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (sub v16i8:$vA, v16i8:$vB))]>; 649*9880d681SAndroid Build Coastguard Workerdef VSUBUHM : VXForm_1<1088, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 650*9880d681SAndroid Build Coastguard Worker "vsubuhm $vD, $vA, $vB", IIC_VecGeneral, 651*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (sub v8i16:$vA, v8i16:$vB))]>; 652*9880d681SAndroid Build Coastguard Workerdef VSUBUWM : VXForm_1<1152, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 653*9880d681SAndroid Build Coastguard Worker "vsubuwm $vD, $vA, $vB", IIC_VecGeneral, 654*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (sub v4i32:$vA, v4i32:$vB))]>; 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Workerdef VSUBSBS : VX1_Int_Ty<1792, "vsubsbs" , int_ppc_altivec_vsubsbs, v16i8>; 657*9880d681SAndroid Build Coastguard Workerdef VSUBSHS : VX1_Int_Ty<1856, "vsubshs" , int_ppc_altivec_vsubshs, v8i16>; 658*9880d681SAndroid Build Coastguard Workerdef VSUBSWS : VX1_Int_Ty<1920, "vsubsws" , int_ppc_altivec_vsubsws, v4i32>; 659*9880d681SAndroid Build Coastguard Workerdef VSUBUBS : VX1_Int_Ty<1536, "vsububs" , int_ppc_altivec_vsububs, v16i8>; 660*9880d681SAndroid Build Coastguard Workerdef VSUBUHS : VX1_Int_Ty<1600, "vsubuhs" , int_ppc_altivec_vsubuhs, v8i16>; 661*9880d681SAndroid Build Coastguard Workerdef VSUBUWS : VX1_Int_Ty<1664, "vsubuws" , int_ppc_altivec_vsubuws, v4i32>; 662*9880d681SAndroid Build Coastguard Worker 663*9880d681SAndroid Build Coastguard Workerdef VSUMSWS : VX1_Int_Ty<1928, "vsumsws" , int_ppc_altivec_vsumsws, v4i32>; 664*9880d681SAndroid Build Coastguard Workerdef VSUM2SWS: VX1_Int_Ty<1672, "vsum2sws", int_ppc_altivec_vsum2sws, v4i32>; 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Workerdef VSUM4SBS: VX1_Int_Ty3<1800, "vsum4sbs", int_ppc_altivec_vsum4sbs, 667*9880d681SAndroid Build Coastguard Worker v4i32, v16i8, v4i32>; 668*9880d681SAndroid Build Coastguard Workerdef VSUM4SHS: VX1_Int_Ty3<1608, "vsum4shs", int_ppc_altivec_vsum4shs, 669*9880d681SAndroid Build Coastguard Worker v4i32, v8i16, v4i32>; 670*9880d681SAndroid Build Coastguard Workerdef VSUM4UBS: VX1_Int_Ty3<1544, "vsum4ubs", int_ppc_altivec_vsum4ubs, 671*9880d681SAndroid Build Coastguard Worker v4i32, v16i8, v4i32>; 672*9880d681SAndroid Build Coastguard Worker 673*9880d681SAndroid Build Coastguard Workerdef VNOR : VXForm_1<1284, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 674*9880d681SAndroid Build Coastguard Worker "vnor $vD, $vA, $vB", IIC_VecFP, 675*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (vnot_ppc (or v4i32:$vA, 676*9880d681SAndroid Build Coastguard Worker v4i32:$vB)))]>; 677*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 678*9880d681SAndroid Build Coastguard Workerdef VOR : VXForm_1<1156, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 679*9880d681SAndroid Build Coastguard Worker "vor $vD, $vA, $vB", IIC_VecFP, 680*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (or v4i32:$vA, v4i32:$vB))]>; 681*9880d681SAndroid Build Coastguard Workerdef VXOR : VXForm_1<1220, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 682*9880d681SAndroid Build Coastguard Worker "vxor $vD, $vA, $vB", IIC_VecFP, 683*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (xor v4i32:$vA, v4i32:$vB))]>; 684*9880d681SAndroid Build Coastguard Worker} // isCommutable 685*9880d681SAndroid Build Coastguard Worker 686*9880d681SAndroid Build Coastguard Workerdef VRLB : VX1_Int_Ty< 4, "vrlb", int_ppc_altivec_vrlb, v16i8>; 687*9880d681SAndroid Build Coastguard Workerdef VRLH : VX1_Int_Ty< 68, "vrlh", int_ppc_altivec_vrlh, v8i16>; 688*9880d681SAndroid Build Coastguard Workerdef VRLW : VX1_Int_Ty< 132, "vrlw", int_ppc_altivec_vrlw, v4i32>; 689*9880d681SAndroid Build Coastguard Worker 690*9880d681SAndroid Build Coastguard Workerdef VSL : VX1_Int_Ty< 452, "vsl" , int_ppc_altivec_vsl, v4i32 >; 691*9880d681SAndroid Build Coastguard Workerdef VSLO : VX1_Int_Ty<1036, "vslo", int_ppc_altivec_vslo, v4i32>; 692*9880d681SAndroid Build Coastguard Worker 693*9880d681SAndroid Build Coastguard Workerdef VSLB : VX1_Int_Ty< 260, "vslb", int_ppc_altivec_vslb, v16i8>; 694*9880d681SAndroid Build Coastguard Workerdef VSLH : VX1_Int_Ty< 324, "vslh", int_ppc_altivec_vslh, v8i16>; 695*9880d681SAndroid Build Coastguard Workerdef VSLW : VX1_Int_Ty< 388, "vslw", int_ppc_altivec_vslw, v4i32>; 696*9880d681SAndroid Build Coastguard Worker 697*9880d681SAndroid Build Coastguard Workerdef VSPLTB : VXForm_1<524, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 698*9880d681SAndroid Build Coastguard Worker "vspltb $vD, $vB, $UIMM", IIC_VecPerm, 699*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 700*9880d681SAndroid Build Coastguard Worker (vspltb_shuffle:$UIMM v16i8:$vB, (undef)))]>; 701*9880d681SAndroid Build Coastguard Workerdef VSPLTH : VXForm_1<588, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 702*9880d681SAndroid Build Coastguard Worker "vsplth $vD, $vB, $UIMM", IIC_VecPerm, 703*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 704*9880d681SAndroid Build Coastguard Worker (vsplth_shuffle:$UIMM v16i8:$vB, (undef)))]>; 705*9880d681SAndroid Build Coastguard Workerdef VSPLTW : VXForm_1<652, (outs vrrc:$vD), (ins u5imm:$UIMM, vrrc:$vB), 706*9880d681SAndroid Build Coastguard Worker "vspltw $vD, $vB, $UIMM", IIC_VecPerm, 707*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 708*9880d681SAndroid Build Coastguard Worker (vspltw_shuffle:$UIMM v16i8:$vB, (undef)))]>; 709*9880d681SAndroid Build Coastguard Worker 710*9880d681SAndroid Build Coastguard Workerdef VSR : VX1_Int_Ty< 708, "vsr" , int_ppc_altivec_vsr, v4i32>; 711*9880d681SAndroid Build Coastguard Workerdef VSRO : VX1_Int_Ty<1100, "vsro" , int_ppc_altivec_vsro, v4i32>; 712*9880d681SAndroid Build Coastguard Worker 713*9880d681SAndroid Build Coastguard Workerdef VSRAB : VX1_Int_Ty< 772, "vsrab", int_ppc_altivec_vsrab, v16i8>; 714*9880d681SAndroid Build Coastguard Workerdef VSRAH : VX1_Int_Ty< 836, "vsrah", int_ppc_altivec_vsrah, v8i16>; 715*9880d681SAndroid Build Coastguard Workerdef VSRAW : VX1_Int_Ty< 900, "vsraw", int_ppc_altivec_vsraw, v4i32>; 716*9880d681SAndroid Build Coastguard Workerdef VSRB : VX1_Int_Ty< 516, "vsrb" , int_ppc_altivec_vsrb , v16i8>; 717*9880d681SAndroid Build Coastguard Workerdef VSRH : VX1_Int_Ty< 580, "vsrh" , int_ppc_altivec_vsrh , v8i16>; 718*9880d681SAndroid Build Coastguard Workerdef VSRW : VX1_Int_Ty< 644, "vsrw" , int_ppc_altivec_vsrw , v4i32>; 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Worker 721*9880d681SAndroid Build Coastguard Workerdef VSPLTISB : VXForm_3<780, (outs vrrc:$vD), (ins s5imm:$SIMM), 722*9880d681SAndroid Build Coastguard Worker "vspltisb $vD, $SIMM", IIC_VecPerm, 723*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (v16i8 vecspltisb:$SIMM))]>; 724*9880d681SAndroid Build Coastguard Workerdef VSPLTISH : VXForm_3<844, (outs vrrc:$vD), (ins s5imm:$SIMM), 725*9880d681SAndroid Build Coastguard Worker "vspltish $vD, $SIMM", IIC_VecPerm, 726*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (v8i16 vecspltish:$SIMM))]>; 727*9880d681SAndroid Build Coastguard Workerdef VSPLTISW : VXForm_3<908, (outs vrrc:$vD), (ins s5imm:$SIMM), 728*9880d681SAndroid Build Coastguard Worker "vspltisw $vD, $SIMM", IIC_VecPerm, 729*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (v4i32 vecspltisw:$SIMM))]>; 730*9880d681SAndroid Build Coastguard Worker 731*9880d681SAndroid Build Coastguard Worker// Vector Pack. 732*9880d681SAndroid Build Coastguard Workerdef VPKPX : VX1_Int_Ty2<782, "vpkpx", int_ppc_altivec_vpkpx, 733*9880d681SAndroid Build Coastguard Worker v8i16, v4i32>; 734*9880d681SAndroid Build Coastguard Workerdef VPKSHSS : VX1_Int_Ty2<398, "vpkshss", int_ppc_altivec_vpkshss, 735*9880d681SAndroid Build Coastguard Worker v16i8, v8i16>; 736*9880d681SAndroid Build Coastguard Workerdef VPKSHUS : VX1_Int_Ty2<270, "vpkshus", int_ppc_altivec_vpkshus, 737*9880d681SAndroid Build Coastguard Worker v16i8, v8i16>; 738*9880d681SAndroid Build Coastguard Workerdef VPKSWSS : VX1_Int_Ty2<462, "vpkswss", int_ppc_altivec_vpkswss, 739*9880d681SAndroid Build Coastguard Worker v8i16, v4i32>; 740*9880d681SAndroid Build Coastguard Workerdef VPKSWUS : VX1_Int_Ty2<334, "vpkswus", int_ppc_altivec_vpkswus, 741*9880d681SAndroid Build Coastguard Worker v8i16, v4i32>; 742*9880d681SAndroid Build Coastguard Workerdef VPKUHUM : VXForm_1<14, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 743*9880d681SAndroid Build Coastguard Worker "vpkuhum $vD, $vA, $vB", IIC_VecFP, 744*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 745*9880d681SAndroid Build Coastguard Worker (vpkuhum_shuffle v16i8:$vA, v16i8:$vB))]>; 746*9880d681SAndroid Build Coastguard Workerdef VPKUHUS : VX1_Int_Ty2<142, "vpkuhus", int_ppc_altivec_vpkuhus, 747*9880d681SAndroid Build Coastguard Worker v16i8, v8i16>; 748*9880d681SAndroid Build Coastguard Workerdef VPKUWUM : VXForm_1<78, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 749*9880d681SAndroid Build Coastguard Worker "vpkuwum $vD, $vA, $vB", IIC_VecFP, 750*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 751*9880d681SAndroid Build Coastguard Worker (vpkuwum_shuffle v16i8:$vA, v16i8:$vB))]>; 752*9880d681SAndroid Build Coastguard Workerdef VPKUWUS : VX1_Int_Ty2<206, "vpkuwus", int_ppc_altivec_vpkuwus, 753*9880d681SAndroid Build Coastguard Worker v8i16, v4i32>; 754*9880d681SAndroid Build Coastguard Worker 755*9880d681SAndroid Build Coastguard Worker// Vector Unpack. 756*9880d681SAndroid Build Coastguard Workerdef VUPKHPX : VX2_Int_Ty2<846, "vupkhpx", int_ppc_altivec_vupkhpx, 757*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 758*9880d681SAndroid Build Coastguard Workerdef VUPKHSB : VX2_Int_Ty2<526, "vupkhsb", int_ppc_altivec_vupkhsb, 759*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 760*9880d681SAndroid Build Coastguard Workerdef VUPKHSH : VX2_Int_Ty2<590, "vupkhsh", int_ppc_altivec_vupkhsh, 761*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 762*9880d681SAndroid Build Coastguard Workerdef VUPKLPX : VX2_Int_Ty2<974, "vupklpx", int_ppc_altivec_vupklpx, 763*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 764*9880d681SAndroid Build Coastguard Workerdef VUPKLSB : VX2_Int_Ty2<654, "vupklsb", int_ppc_altivec_vupklsb, 765*9880d681SAndroid Build Coastguard Worker v8i16, v16i8>; 766*9880d681SAndroid Build Coastguard Workerdef VUPKLSH : VX2_Int_Ty2<718, "vupklsh", int_ppc_altivec_vupklsh, 767*9880d681SAndroid Build Coastguard Worker v4i32, v8i16>; 768*9880d681SAndroid Build Coastguard Worker 769*9880d681SAndroid Build Coastguard Worker 770*9880d681SAndroid Build Coastguard Worker// Altivec Comparisons. 771*9880d681SAndroid Build Coastguard Worker 772*9880d681SAndroid Build Coastguard Workerclass VCMP<bits<10> xo, string asmstr, ValueType Ty> 773*9880d681SAndroid Build Coastguard Worker : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, 774*9880d681SAndroid Build Coastguard Worker IIC_VecFPCompare, 775*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (Ty (PPCvcmp Ty:$vA, Ty:$vB, xo)))]>; 776*9880d681SAndroid Build Coastguard Workerclass VCMPo<bits<10> xo, string asmstr, ValueType Ty> 777*9880d681SAndroid Build Coastguard Worker : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, 778*9880d681SAndroid Build Coastguard Worker IIC_VecFPCompare, 779*9880d681SAndroid Build Coastguard Worker [(set Ty:$vD, (Ty (PPCvcmp_o Ty:$vA, Ty:$vB, xo)))]> { 780*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 781*9880d681SAndroid Build Coastguard Worker let RC = 1; 782*9880d681SAndroid Build Coastguard Worker} 783*9880d681SAndroid Build Coastguard Worker 784*9880d681SAndroid Build Coastguard Worker// f32 element comparisons.0 785*9880d681SAndroid Build Coastguard Workerdef VCMPBFP : VCMP <966, "vcmpbfp $vD, $vA, $vB" , v4f32>; 786*9880d681SAndroid Build Coastguard Workerdef VCMPBFPo : VCMPo<966, "vcmpbfp. $vD, $vA, $vB" , v4f32>; 787*9880d681SAndroid Build Coastguard Workerdef VCMPEQFP : VCMP <198, "vcmpeqfp $vD, $vA, $vB" , v4f32>; 788*9880d681SAndroid Build Coastguard Workerdef VCMPEQFPo : VCMPo<198, "vcmpeqfp. $vD, $vA, $vB", v4f32>; 789*9880d681SAndroid Build Coastguard Workerdef VCMPGEFP : VCMP <454, "vcmpgefp $vD, $vA, $vB" , v4f32>; 790*9880d681SAndroid Build Coastguard Workerdef VCMPGEFPo : VCMPo<454, "vcmpgefp. $vD, $vA, $vB", v4f32>; 791*9880d681SAndroid Build Coastguard Workerdef VCMPGTFP : VCMP <710, "vcmpgtfp $vD, $vA, $vB" , v4f32>; 792*9880d681SAndroid Build Coastguard Workerdef VCMPGTFPo : VCMPo<710, "vcmpgtfp. $vD, $vA, $vB", v4f32>; 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Worker// i8 element comparisons. 795*9880d681SAndroid Build Coastguard Workerdef VCMPEQUB : VCMP < 6, "vcmpequb $vD, $vA, $vB" , v16i8>; 796*9880d681SAndroid Build Coastguard Workerdef VCMPEQUBo : VCMPo< 6, "vcmpequb. $vD, $vA, $vB", v16i8>; 797*9880d681SAndroid Build Coastguard Workerdef VCMPGTSB : VCMP <774, "vcmpgtsb $vD, $vA, $vB" , v16i8>; 798*9880d681SAndroid Build Coastguard Workerdef VCMPGTSBo : VCMPo<774, "vcmpgtsb. $vD, $vA, $vB", v16i8>; 799*9880d681SAndroid Build Coastguard Workerdef VCMPGTUB : VCMP <518, "vcmpgtub $vD, $vA, $vB" , v16i8>; 800*9880d681SAndroid Build Coastguard Workerdef VCMPGTUBo : VCMPo<518, "vcmpgtub. $vD, $vA, $vB", v16i8>; 801*9880d681SAndroid Build Coastguard Worker 802*9880d681SAndroid Build Coastguard Worker// i16 element comparisons. 803*9880d681SAndroid Build Coastguard Workerdef VCMPEQUH : VCMP < 70, "vcmpequh $vD, $vA, $vB" , v8i16>; 804*9880d681SAndroid Build Coastguard Workerdef VCMPEQUHo : VCMPo< 70, "vcmpequh. $vD, $vA, $vB", v8i16>; 805*9880d681SAndroid Build Coastguard Workerdef VCMPGTSH : VCMP <838, "vcmpgtsh $vD, $vA, $vB" , v8i16>; 806*9880d681SAndroid Build Coastguard Workerdef VCMPGTSHo : VCMPo<838, "vcmpgtsh. $vD, $vA, $vB", v8i16>; 807*9880d681SAndroid Build Coastguard Workerdef VCMPGTUH : VCMP <582, "vcmpgtuh $vD, $vA, $vB" , v8i16>; 808*9880d681SAndroid Build Coastguard Workerdef VCMPGTUHo : VCMPo<582, "vcmpgtuh. $vD, $vA, $vB", v8i16>; 809*9880d681SAndroid Build Coastguard Worker 810*9880d681SAndroid Build Coastguard Worker// i32 element comparisons. 811*9880d681SAndroid Build Coastguard Workerdef VCMPEQUW : VCMP <134, "vcmpequw $vD, $vA, $vB" , v4i32>; 812*9880d681SAndroid Build Coastguard Workerdef VCMPEQUWo : VCMPo<134, "vcmpequw. $vD, $vA, $vB", v4i32>; 813*9880d681SAndroid Build Coastguard Workerdef VCMPGTSW : VCMP <902, "vcmpgtsw $vD, $vA, $vB" , v4i32>; 814*9880d681SAndroid Build Coastguard Workerdef VCMPGTSWo : VCMPo<902, "vcmpgtsw. $vD, $vA, $vB", v4i32>; 815*9880d681SAndroid Build Coastguard Workerdef VCMPGTUW : VCMP <646, "vcmpgtuw $vD, $vA, $vB" , v4i32>; 816*9880d681SAndroid Build Coastguard Workerdef VCMPGTUWo : VCMPo<646, "vcmpgtuw. $vD, $vA, $vB", v4i32>; 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 819*9880d681SAndroid Build Coastguard Workerdef V_SET0B : VXForm_setzero<1220, (outs vrrc:$vD), (ins), 820*9880d681SAndroid Build Coastguard Worker "vxor $vD, $vD, $vD", IIC_VecFP, 821*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (v16i8 immAllZerosV))]>; 822*9880d681SAndroid Build Coastguard Workerdef V_SET0H : VXForm_setzero<1220, (outs vrrc:$vD), (ins), 823*9880d681SAndroid Build Coastguard Worker "vxor $vD, $vD, $vD", IIC_VecFP, 824*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (v8i16 immAllZerosV))]>; 825*9880d681SAndroid Build Coastguard Workerdef V_SET0 : VXForm_setzero<1220, (outs vrrc:$vD), (ins), 826*9880d681SAndroid Build Coastguard Worker "vxor $vD, $vD, $vD", IIC_VecFP, 827*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (v4i32 immAllZerosV))]>; 828*9880d681SAndroid Build Coastguard Worker 829*9880d681SAndroid Build Coastguard Workerlet IMM=-1 in { 830*9880d681SAndroid Build Coastguard Workerdef V_SETALLONESB : VXForm_3<908, (outs vrrc:$vD), (ins), 831*9880d681SAndroid Build Coastguard Worker "vspltisw $vD, -1", IIC_VecFP, 832*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (v16i8 immAllOnesV))]>; 833*9880d681SAndroid Build Coastguard Workerdef V_SETALLONESH : VXForm_3<908, (outs vrrc:$vD), (ins), 834*9880d681SAndroid Build Coastguard Worker "vspltisw $vD, -1", IIC_VecFP, 835*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (v8i16 immAllOnesV))]>; 836*9880d681SAndroid Build Coastguard Workerdef V_SETALLONES : VXForm_3<908, (outs vrrc:$vD), (ins), 837*9880d681SAndroid Build Coastguard Worker "vspltisw $vD, -1", IIC_VecFP, 838*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (v4i32 immAllOnesV))]>; 839*9880d681SAndroid Build Coastguard Worker} 840*9880d681SAndroid Build Coastguard Worker} 841*9880d681SAndroid Build Coastguard Worker} // VALU Operations. 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 844*9880d681SAndroid Build Coastguard Worker// Additional Altivec Patterns 845*9880d681SAndroid Build Coastguard Worker// 846*9880d681SAndroid Build Coastguard Worker 847*9880d681SAndroid Build Coastguard Worker// Loads. 848*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (load xoaddr:$src)), (LVX xoaddr:$src)>; 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Worker// Stores. 851*9880d681SAndroid Build Coastguard Workerdef : Pat<(store v4i32:$rS, xoaddr:$dst), 852*9880d681SAndroid Build Coastguard Worker (STVX $rS, xoaddr:$dst)>; 853*9880d681SAndroid Build Coastguard Worker 854*9880d681SAndroid Build Coastguard Worker// Bit conversions. 855*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8i16 VRRC:$src))), (v16i8 VRRC:$src)>; 856*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4i32 VRRC:$src))), (v16i8 VRRC:$src)>; 857*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4f32 VRRC:$src))), (v16i8 VRRC:$src)>; 858*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2i64 VRRC:$src))), (v16i8 VRRC:$src)>; 859*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v1i128 VRRC:$src))), (v16i8 VRRC:$src)>; 860*9880d681SAndroid Build Coastguard Worker 861*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v16i8 VRRC:$src))), (v8i16 VRRC:$src)>; 862*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4i32 VRRC:$src))), (v8i16 VRRC:$src)>; 863*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4f32 VRRC:$src))), (v8i16 VRRC:$src)>; 864*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2i64 VRRC:$src))), (v8i16 VRRC:$src)>; 865*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v1i128 VRRC:$src))), (v8i16 VRRC:$src)>; 866*9880d681SAndroid Build Coastguard Worker 867*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v16i8 VRRC:$src))), (v4i32 VRRC:$src)>; 868*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8i16 VRRC:$src))), (v4i32 VRRC:$src)>; 869*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v4f32 VRRC:$src))), (v4i32 VRRC:$src)>; 870*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2i64 VRRC:$src))), (v4i32 VRRC:$src)>; 871*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v1i128 VRRC:$src))), (v4i32 VRRC:$src)>; 872*9880d681SAndroid Build Coastguard Worker 873*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v16i8 VRRC:$src))), (v4f32 VRRC:$src)>; 874*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8i16 VRRC:$src))), (v4f32 VRRC:$src)>; 875*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v4i32 VRRC:$src))), (v4f32 VRRC:$src)>; 876*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2i64 VRRC:$src))), (v4f32 VRRC:$src)>; 877*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v1i128 VRRC:$src))), (v4f32 VRRC:$src)>; 878*9880d681SAndroid Build Coastguard Worker 879*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v16i8 VRRC:$src))), (v2i64 VRRC:$src)>; 880*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8i16 VRRC:$src))), (v2i64 VRRC:$src)>; 881*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4i32 VRRC:$src))), (v2i64 VRRC:$src)>; 882*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4f32 VRRC:$src))), (v2i64 VRRC:$src)>; 883*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v1i128 VRRC:$src))), (v2i64 VRRC:$src)>; 884*9880d681SAndroid Build Coastguard Worker 885*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert (v16i8 VRRC:$src))), (v1i128 VRRC:$src)>; 886*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert (v8i16 VRRC:$src))), (v1i128 VRRC:$src)>; 887*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert (v4i32 VRRC:$src))), (v1i128 VRRC:$src)>; 888*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert (v4f32 VRRC:$src))), (v1i128 VRRC:$src)>; 889*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert (v2i64 VRRC:$src))), (v1i128 VRRC:$src)>; 890*9880d681SAndroid Build Coastguard Worker 891*9880d681SAndroid Build Coastguard Worker// Shuffles. 892*9880d681SAndroid Build Coastguard Worker 893*9880d681SAndroid Build Coastguard Worker// Match vsldoi(x,x), vpkuwum(x,x), vpkuhum(x,x) 894*9880d681SAndroid Build Coastguard Workerdef:Pat<(vsldoi_unary_shuffle:$in v16i8:$vA, undef), 895*9880d681SAndroid Build Coastguard Worker (VSLDOI $vA, $vA, (VSLDOI_unary_get_imm $in))>; 896*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkuwum_unary_shuffle v16i8:$vA, undef), 897*9880d681SAndroid Build Coastguard Worker (VPKUWUM $vA, $vA)>; 898*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkuhum_unary_shuffle v16i8:$vA, undef), 899*9880d681SAndroid Build Coastguard Worker (VPKUHUM $vA, $vA)>; 900*9880d681SAndroid Build Coastguard Worker 901*9880d681SAndroid Build Coastguard Worker// Match vsldoi(y,x), vpkuwum(y,x), vpkuhum(y,x), i.e., swapped operands. 902*9880d681SAndroid Build Coastguard Worker// These fragments are matched for little-endian, where the inputs must 903*9880d681SAndroid Build Coastguard Worker// be swapped for correct semantics. 904*9880d681SAndroid Build Coastguard Workerdef:Pat<(vsldoi_swapped_shuffle:$in v16i8:$vA, v16i8:$vB), 905*9880d681SAndroid Build Coastguard Worker (VSLDOI $vB, $vA, (VSLDOI_swapped_get_imm $in))>; 906*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkuwum_swapped_shuffle v16i8:$vA, v16i8:$vB), 907*9880d681SAndroid Build Coastguard Worker (VPKUWUM $vB, $vA)>; 908*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkuhum_swapped_shuffle v16i8:$vA, v16i8:$vB), 909*9880d681SAndroid Build Coastguard Worker (VPKUHUM $vB, $vA)>; 910*9880d681SAndroid Build Coastguard Worker 911*9880d681SAndroid Build Coastguard Worker// Match vmrg*(x,x) 912*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglb_unary_shuffle v16i8:$vA, undef), 913*9880d681SAndroid Build Coastguard Worker (VMRGLB $vA, $vA)>; 914*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglh_unary_shuffle v16i8:$vA, undef), 915*9880d681SAndroid Build Coastguard Worker (VMRGLH $vA, $vA)>; 916*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglw_unary_shuffle v16i8:$vA, undef), 917*9880d681SAndroid Build Coastguard Worker (VMRGLW $vA, $vA)>; 918*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghb_unary_shuffle v16i8:$vA, undef), 919*9880d681SAndroid Build Coastguard Worker (VMRGHB $vA, $vA)>; 920*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghh_unary_shuffle v16i8:$vA, undef), 921*9880d681SAndroid Build Coastguard Worker (VMRGHH $vA, $vA)>; 922*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghw_unary_shuffle v16i8:$vA, undef), 923*9880d681SAndroid Build Coastguard Worker (VMRGHW $vA, $vA)>; 924*9880d681SAndroid Build Coastguard Worker 925*9880d681SAndroid Build Coastguard Worker// Match vmrg*(y,x), i.e., swapped operands. These fragments 926*9880d681SAndroid Build Coastguard Worker// are matched for little-endian, where the inputs must be 927*9880d681SAndroid Build Coastguard Worker// swapped for correct semantics. 928*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglb_swapped_shuffle v16i8:$vA, v16i8:$vB), 929*9880d681SAndroid Build Coastguard Worker (VMRGLB $vB, $vA)>; 930*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglh_swapped_shuffle v16i8:$vA, v16i8:$vB), 931*9880d681SAndroid Build Coastguard Worker (VMRGLH $vB, $vA)>; 932*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrglw_swapped_shuffle v16i8:$vA, v16i8:$vB), 933*9880d681SAndroid Build Coastguard Worker (VMRGLW $vB, $vA)>; 934*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghb_swapped_shuffle v16i8:$vA, v16i8:$vB), 935*9880d681SAndroid Build Coastguard Worker (VMRGHB $vB, $vA)>; 936*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghh_swapped_shuffle v16i8:$vA, v16i8:$vB), 937*9880d681SAndroid Build Coastguard Worker (VMRGHH $vB, $vA)>; 938*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrghw_swapped_shuffle v16i8:$vA, v16i8:$vB), 939*9880d681SAndroid Build Coastguard Worker (VMRGHW $vB, $vA)>; 940*9880d681SAndroid Build Coastguard Worker 941*9880d681SAndroid Build Coastguard Worker// Logical Operations 942*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot_ppc v4i32:$vA), (VNOR $vA, $vA)>; 943*9880d681SAndroid Build Coastguard Worker 944*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot_ppc (or v4i32:$A, v4i32:$B)), 945*9880d681SAndroid Build Coastguard Worker (VNOR $A, $B)>; 946*9880d681SAndroid Build Coastguard Workerdef : Pat<(and v4i32:$A, (vnot_ppc v4i32:$B)), 947*9880d681SAndroid Build Coastguard Worker (VANDC $A, $B)>; 948*9880d681SAndroid Build Coastguard Worker 949*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmul v4f32:$vA, v4f32:$vB), 950*9880d681SAndroid Build Coastguard Worker (VMADDFP $vA, $vB, 951*9880d681SAndroid Build Coastguard Worker (v4i32 (VSLW (V_SETALLONES), (V_SETALLONES))))>; 952*9880d681SAndroid Build Coastguard Worker 953*9880d681SAndroid Build Coastguard Worker// Fused multiply add and multiply sub for packed float. These are represented 954*9880d681SAndroid Build Coastguard Worker// separately from the real instructions above, for operations that must have 955*9880d681SAndroid Build Coastguard Worker// the additional precision, such as Newton-Rhapson (used by divide, sqrt) 956*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCvmaddfp v4f32:$A, v4f32:$B, v4f32:$C), 957*9880d681SAndroid Build Coastguard Worker (VMADDFP $A, $B, $C)>; 958*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCvnmsubfp v4f32:$A, v4f32:$B, v4f32:$C), 959*9880d681SAndroid Build Coastguard Worker (VNMSUBFP $A, $B, $C)>; 960*9880d681SAndroid Build Coastguard Worker 961*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_altivec_vmaddfp v4f32:$A, v4f32:$B, v4f32:$C), 962*9880d681SAndroid Build Coastguard Worker (VMADDFP $A, $B, $C)>; 963*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_altivec_vnmsubfp v4f32:$A, v4f32:$B, v4f32:$C), 964*9880d681SAndroid Build Coastguard Worker (VNMSUBFP $A, $B, $C)>; 965*9880d681SAndroid Build Coastguard Worker 966*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCvperm v16i8:$vA, v16i8:$vB, v16i8:$vC), 967*9880d681SAndroid Build Coastguard Worker (VPERM $vA, $vB, $vC)>; 968*9880d681SAndroid Build Coastguard Worker 969*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCfre v4f32:$A), (VREFP $A)>; 970*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCfrsqrte v4f32:$A), (VRSQRTEFP $A)>; 971*9880d681SAndroid Build Coastguard Worker 972*9880d681SAndroid Build Coastguard Worker// Vector shifts 973*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (shl v16i8:$vA, v16i8:$vB)), 974*9880d681SAndroid Build Coastguard Worker (v16i8 (VSLB $vA, $vB))>; 975*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (shl v8i16:$vA, v8i16:$vB)), 976*9880d681SAndroid Build Coastguard Worker (v8i16 (VSLH $vA, $vB))>; 977*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (shl v4i32:$vA, v4i32:$vB)), 978*9880d681SAndroid Build Coastguard Worker (v4i32 (VSLW $vA, $vB))>; 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (srl v16i8:$vA, v16i8:$vB)), 981*9880d681SAndroid Build Coastguard Worker (v16i8 (VSRB $vA, $vB))>; 982*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (srl v8i16:$vA, v8i16:$vB)), 983*9880d681SAndroid Build Coastguard Worker (v8i16 (VSRH $vA, $vB))>; 984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (srl v4i32:$vA, v4i32:$vB)), 985*9880d681SAndroid Build Coastguard Worker (v4i32 (VSRW $vA, $vB))>; 986*9880d681SAndroid Build Coastguard Worker 987*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (sra v16i8:$vA, v16i8:$vB)), 988*9880d681SAndroid Build Coastguard Worker (v16i8 (VSRAB $vA, $vB))>; 989*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (sra v8i16:$vA, v8i16:$vB)), 990*9880d681SAndroid Build Coastguard Worker (v8i16 (VSRAH $vA, $vB))>; 991*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (sra v4i32:$vA, v4i32:$vB)), 992*9880d681SAndroid Build Coastguard Worker (v4i32 (VSRAW $vA, $vB))>; 993*9880d681SAndroid Build Coastguard Worker 994*9880d681SAndroid Build Coastguard Worker// Float to integer and integer to float conversions 995*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (fp_to_sint v4f32:$vA)), 996*9880d681SAndroid Build Coastguard Worker (VCTSXS_0 $vA)>; 997*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (fp_to_uint v4f32:$vA)), 998*9880d681SAndroid Build Coastguard Worker (VCTUXS_0 $vA)>; 999*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (sint_to_fp v4i32:$vA)), 1000*9880d681SAndroid Build Coastguard Worker (VCFSX_0 $vA)>; 1001*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (uint_to_fp v4i32:$vA)), 1002*9880d681SAndroid Build Coastguard Worker (VCFUX_0 $vA)>; 1003*9880d681SAndroid Build Coastguard Worker 1004*9880d681SAndroid Build Coastguard Worker// Floating-point rounding 1005*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (ffloor v4f32:$vA)), 1006*9880d681SAndroid Build Coastguard Worker (VRFIM $vA)>; 1007*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fceil v4f32:$vA)), 1008*9880d681SAndroid Build Coastguard Worker (VRFIP $vA)>; 1009*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (ftrunc v4f32:$vA)), 1010*9880d681SAndroid Build Coastguard Worker (VRFIZ $vA)>; 1011*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fnearbyint v4f32:$vA)), 1012*9880d681SAndroid Build Coastguard Worker (VRFIN $vA)>; 1013*9880d681SAndroid Build Coastguard Worker 1014*9880d681SAndroid Build Coastguard Worker} // end HasAltivec 1015*9880d681SAndroid Build Coastguard Worker 1016*9880d681SAndroid Build Coastguard Workerdef HasP8Altivec : Predicate<"PPCSubTarget->hasP8Altivec()">; 1017*9880d681SAndroid Build Coastguard Workerdef HasP8Crypto : Predicate<"PPCSubTarget->hasP8Crypto()">; 1018*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasP8Altivec] in { 1019*9880d681SAndroid Build Coastguard Worker 1020*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 1021*9880d681SAndroid Build Coastguard Workerdef VMULESW : VX1_Int_Ty2<904, "vmulesw", int_ppc_altivec_vmulesw, 1022*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1023*9880d681SAndroid Build Coastguard Workerdef VMULEUW : VX1_Int_Ty2<648, "vmuleuw", int_ppc_altivec_vmuleuw, 1024*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1025*9880d681SAndroid Build Coastguard Workerdef VMULOSW : VX1_Int_Ty2<392, "vmulosw", int_ppc_altivec_vmulosw, 1026*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1027*9880d681SAndroid Build Coastguard Workerdef VMULOUW : VX1_Int_Ty2<136, "vmulouw", int_ppc_altivec_vmulouw, 1028*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1029*9880d681SAndroid Build Coastguard Workerdef VMULUWM : VXForm_1<137, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1030*9880d681SAndroid Build Coastguard Worker "vmuluwm $vD, $vA, $vB", IIC_VecGeneral, 1031*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (mul v4i32:$vA, v4i32:$vB))]>; 1032*9880d681SAndroid Build Coastguard Workerdef VMAXSD : VX1_Int_Ty<450, "vmaxsd", int_ppc_altivec_vmaxsd, v2i64>; 1033*9880d681SAndroid Build Coastguard Workerdef VMAXUD : VX1_Int_Ty<194, "vmaxud", int_ppc_altivec_vmaxud, v2i64>; 1034*9880d681SAndroid Build Coastguard Workerdef VMINSD : VX1_Int_Ty<962, "vminsd", int_ppc_altivec_vminsd, v2i64>; 1035*9880d681SAndroid Build Coastguard Workerdef VMINUD : VX1_Int_Ty<706, "vminud", int_ppc_altivec_vminud, v2i64>; 1036*9880d681SAndroid Build Coastguard Worker} // isCommutable 1037*9880d681SAndroid Build Coastguard Worker 1038*9880d681SAndroid Build Coastguard Worker// Vector merge 1039*9880d681SAndroid Build Coastguard Workerdef VMRGEW : VXForm_1<1932, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1040*9880d681SAndroid Build Coastguard Worker "vmrgew $vD, $vA, $vB", IIC_VecFP, 1041*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrgew_shuffle v16i8:$vA, v16i8:$vB))]>; 1042*9880d681SAndroid Build Coastguard Workerdef VMRGOW : VXForm_1<1676, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1043*9880d681SAndroid Build Coastguard Worker "vmrgow $vD, $vA, $vB", IIC_VecFP, 1044*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (vmrgow_shuffle v16i8:$vA, v16i8:$vB))]>; 1045*9880d681SAndroid Build Coastguard Worker 1046*9880d681SAndroid Build Coastguard Worker// Match vmrgew(x,x) and vmrgow(x,x) 1047*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrgew_unary_shuffle v16i8:$vA, undef), 1048*9880d681SAndroid Build Coastguard Worker (VMRGEW $vA, $vA)>; 1049*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrgow_unary_shuffle v16i8:$vA, undef), 1050*9880d681SAndroid Build Coastguard Worker (VMRGOW $vA, $vA)>; 1051*9880d681SAndroid Build Coastguard Worker 1052*9880d681SAndroid Build Coastguard Worker// Match vmrgew(y,x) and vmrgow(y,x), i.e., swapped operands. These fragments 1053*9880d681SAndroid Build Coastguard Worker// are matched for little-endian, where the inputs must be swapped for correct 1054*9880d681SAndroid Build Coastguard Worker// semantics.w 1055*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrgew_swapped_shuffle v16i8:$vA, v16i8:$vB), 1056*9880d681SAndroid Build Coastguard Worker (VMRGEW $vB, $vA)>; 1057*9880d681SAndroid Build Coastguard Workerdef:Pat<(vmrgow_swapped_shuffle v16i8:$vA, v16i8:$vB), 1058*9880d681SAndroid Build Coastguard Worker (VMRGOW $vB, $vA)>; 1059*9880d681SAndroid Build Coastguard Worker 1060*9880d681SAndroid Build Coastguard Worker 1061*9880d681SAndroid Build Coastguard Worker// Vector shifts 1062*9880d681SAndroid Build Coastguard Workerdef VRLD : VX1_Int_Ty<196, "vrld", int_ppc_altivec_vrld, v2i64>; 1063*9880d681SAndroid Build Coastguard Workerdef VSLD : VXForm_1<1476, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1064*9880d681SAndroid Build Coastguard Worker "vsld $vD, $vA, $vB", IIC_VecGeneral, 1065*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (shl v2i64:$vA, v2i64:$vB))]>; 1066*9880d681SAndroid Build Coastguard Workerdef VSRD : VXForm_1<1732, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1067*9880d681SAndroid Build Coastguard Worker "vsrd $vD, $vA, $vB", IIC_VecGeneral, 1068*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (srl v2i64:$vA, v2i64:$vB))]>; 1069*9880d681SAndroid Build Coastguard Workerdef VSRAD : VXForm_1<964, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1070*9880d681SAndroid Build Coastguard Worker "vsrad $vD, $vA, $vB", IIC_VecGeneral, 1071*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (sra v2i64:$vA, v2i64:$vB))]>; 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Worker// Vector Integer Arithmetic Instructions 1074*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 1075*9880d681SAndroid Build Coastguard Workerdef VADDUDM : VXForm_1<192, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1076*9880d681SAndroid Build Coastguard Worker "vaddudm $vD, $vA, $vB", IIC_VecGeneral, 1077*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (add v2i64:$vA, v2i64:$vB))]>; 1078*9880d681SAndroid Build Coastguard Workerdef VADDUQM : VXForm_1<256, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1079*9880d681SAndroid Build Coastguard Worker "vadduqm $vD, $vA, $vB", IIC_VecGeneral, 1080*9880d681SAndroid Build Coastguard Worker [(set v1i128:$vD, (add v1i128:$vA, v1i128:$vB))]>; 1081*9880d681SAndroid Build Coastguard Worker} // isCommutable 1082*9880d681SAndroid Build Coastguard Worker 1083*9880d681SAndroid Build Coastguard Worker// Vector Quadword Add 1084*9880d681SAndroid Build Coastguard Workerdef VADDEUQM : VA1a_Int_Ty<60, "vaddeuqm", int_ppc_altivec_vaddeuqm, v1i128>; 1085*9880d681SAndroid Build Coastguard Workerdef VADDCUQ : VX1_Int_Ty<320, "vaddcuq", int_ppc_altivec_vaddcuq, v1i128>; 1086*9880d681SAndroid Build Coastguard Workerdef VADDECUQ : VA1a_Int_Ty<61, "vaddecuq", int_ppc_altivec_vaddecuq, v1i128>; 1087*9880d681SAndroid Build Coastguard Worker 1088*9880d681SAndroid Build Coastguard Worker// Vector Doubleword Subtract 1089*9880d681SAndroid Build Coastguard Workerdef VSUBUDM : VXForm_1<1216, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1090*9880d681SAndroid Build Coastguard Worker "vsubudm $vD, $vA, $vB", IIC_VecGeneral, 1091*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (sub v2i64:$vA, v2i64:$vB))]>; 1092*9880d681SAndroid Build Coastguard Worker 1093*9880d681SAndroid Build Coastguard Worker// Vector Quadword Subtract 1094*9880d681SAndroid Build Coastguard Workerdef VSUBUQM : VXForm_1<1280, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1095*9880d681SAndroid Build Coastguard Worker "vsubuqm $vD, $vA, $vB", IIC_VecGeneral, 1096*9880d681SAndroid Build Coastguard Worker [(set v1i128:$vD, (sub v1i128:$vA, v1i128:$vB))]>; 1097*9880d681SAndroid Build Coastguard Workerdef VSUBEUQM : VA1a_Int_Ty<62, "vsubeuqm", int_ppc_altivec_vsubeuqm, v1i128>; 1098*9880d681SAndroid Build Coastguard Workerdef VSUBCUQ : VX1_Int_Ty<1344, "vsubcuq", int_ppc_altivec_vsubcuq, v1i128>; 1099*9880d681SAndroid Build Coastguard Workerdef VSUBECUQ : VA1a_Int_Ty<63, "vsubecuq", int_ppc_altivec_vsubecuq, v1i128>; 1100*9880d681SAndroid Build Coastguard Worker 1101*9880d681SAndroid Build Coastguard Worker// Count Leading Zeros 1102*9880d681SAndroid Build Coastguard Workerdef VCLZB : VXForm_2<1794, (outs vrrc:$vD), (ins vrrc:$vB), 1103*9880d681SAndroid Build Coastguard Worker "vclzb $vD, $vB", IIC_VecGeneral, 1104*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (ctlz v16i8:$vB))]>; 1105*9880d681SAndroid Build Coastguard Workerdef VCLZH : VXForm_2<1858, (outs vrrc:$vD), (ins vrrc:$vB), 1106*9880d681SAndroid Build Coastguard Worker "vclzh $vD, $vB", IIC_VecGeneral, 1107*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (ctlz v8i16:$vB))]>; 1108*9880d681SAndroid Build Coastguard Workerdef VCLZW : VXForm_2<1922, (outs vrrc:$vD), (ins vrrc:$vB), 1109*9880d681SAndroid Build Coastguard Worker "vclzw $vD, $vB", IIC_VecGeneral, 1110*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (ctlz v4i32:$vB))]>; 1111*9880d681SAndroid Build Coastguard Workerdef VCLZD : VXForm_2<1986, (outs vrrc:$vD), (ins vrrc:$vB), 1112*9880d681SAndroid Build Coastguard Worker "vclzd $vD, $vB", IIC_VecGeneral, 1113*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (ctlz v2i64:$vB))]>; 1114*9880d681SAndroid Build Coastguard Worker 1115*9880d681SAndroid Build Coastguard Worker// Population Count 1116*9880d681SAndroid Build Coastguard Workerdef VPOPCNTB : VXForm_2<1795, (outs vrrc:$vD), (ins vrrc:$vB), 1117*9880d681SAndroid Build Coastguard Worker "vpopcntb $vD, $vB", IIC_VecGeneral, 1118*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, (ctpop v16i8:$vB))]>; 1119*9880d681SAndroid Build Coastguard Workerdef VPOPCNTH : VXForm_2<1859, (outs vrrc:$vD), (ins vrrc:$vB), 1120*9880d681SAndroid Build Coastguard Worker "vpopcnth $vD, $vB", IIC_VecGeneral, 1121*9880d681SAndroid Build Coastguard Worker [(set v8i16:$vD, (ctpop v8i16:$vB))]>; 1122*9880d681SAndroid Build Coastguard Workerdef VPOPCNTW : VXForm_2<1923, (outs vrrc:$vD), (ins vrrc:$vB), 1123*9880d681SAndroid Build Coastguard Worker "vpopcntw $vD, $vB", IIC_VecGeneral, 1124*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (ctpop v4i32:$vB))]>; 1125*9880d681SAndroid Build Coastguard Workerdef VPOPCNTD : VXForm_2<1987, (outs vrrc:$vD), (ins vrrc:$vB), 1126*9880d681SAndroid Build Coastguard Worker "vpopcntd $vD, $vB", IIC_VecGeneral, 1127*9880d681SAndroid Build Coastguard Worker [(set v2i64:$vD, (ctpop v2i64:$vB))]>; 1128*9880d681SAndroid Build Coastguard Worker 1129*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in { 1130*9880d681SAndroid Build Coastguard Worker// FIXME: Use AddedComplexity > 400 to ensure these patterns match before the 1131*9880d681SAndroid Build Coastguard Worker// VSX equivalents. We need to fix this up at some point. Two possible 1132*9880d681SAndroid Build Coastguard Worker// solutions for this problem: 1133*9880d681SAndroid Build Coastguard Worker// 1. Disable Altivec patterns that compete with VSX patterns using the 1134*9880d681SAndroid Build Coastguard Worker// !HasVSX predicate. This essentially favours VSX over Altivec, in 1135*9880d681SAndroid Build Coastguard Worker// hopes of reducing register pressure (larger register set using VSX 1136*9880d681SAndroid Build Coastguard Worker// instructions than VMX instructions) 1137*9880d681SAndroid Build Coastguard Worker// 2. Employ a more disciplined use of AddedComplexity, which would provide 1138*9880d681SAndroid Build Coastguard Worker// more fine-grained control than option 1. This would be beneficial 1139*9880d681SAndroid Build Coastguard Worker// if we find situations where Altivec is really preferred over VSX. 1140*9880d681SAndroid Build Coastguard Workerdef VEQV : VXForm_1<1668, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1141*9880d681SAndroid Build Coastguard Worker "veqv $vD, $vA, $vB", IIC_VecGeneral, 1142*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (vnot_ppc (xor v4i32:$vA, v4i32:$vB)))]>; 1143*9880d681SAndroid Build Coastguard Workerdef VNAND : VXForm_1<1412, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1144*9880d681SAndroid Build Coastguard Worker "vnand $vD, $vA, $vB", IIC_VecGeneral, 1145*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (vnot_ppc (and v4i32:$vA, v4i32:$vB)))]>; 1146*9880d681SAndroid Build Coastguard Worker} // isCommutable 1147*9880d681SAndroid Build Coastguard Worker 1148*9880d681SAndroid Build Coastguard Workerdef VORC : VXForm_1<1348, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1149*9880d681SAndroid Build Coastguard Worker "vorc $vD, $vA, $vB", IIC_VecGeneral, 1150*9880d681SAndroid Build Coastguard Worker [(set v4i32:$vD, (or v4i32:$vA, 1151*9880d681SAndroid Build Coastguard Worker (vnot_ppc v4i32:$vB)))]>; 1152*9880d681SAndroid Build Coastguard Worker 1153*9880d681SAndroid Build Coastguard Worker// i64 element comparisons. 1154*9880d681SAndroid Build Coastguard Workerdef VCMPEQUD : VCMP <199, "vcmpequd $vD, $vA, $vB" , v2i64>; 1155*9880d681SAndroid Build Coastguard Workerdef VCMPEQUDo : VCMPo<199, "vcmpequd. $vD, $vA, $vB", v2i64>; 1156*9880d681SAndroid Build Coastguard Workerdef VCMPGTSD : VCMP <967, "vcmpgtsd $vD, $vA, $vB" , v2i64>; 1157*9880d681SAndroid Build Coastguard Workerdef VCMPGTSDo : VCMPo<967, "vcmpgtsd. $vD, $vA, $vB", v2i64>; 1158*9880d681SAndroid Build Coastguard Workerdef VCMPGTUD : VCMP <711, "vcmpgtud $vD, $vA, $vB" , v2i64>; 1159*9880d681SAndroid Build Coastguard Workerdef VCMPGTUDo : VCMPo<711, "vcmpgtud. $vD, $vA, $vB", v2i64>; 1160*9880d681SAndroid Build Coastguard Worker 1161*9880d681SAndroid Build Coastguard Worker// The cryptography instructions that do not require Category:Vector.Crypto 1162*9880d681SAndroid Build Coastguard Workerdef VPMSUMB : VX1_Int_Ty<1032, "vpmsumb", 1163*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vpmsumb, v16i8>; 1164*9880d681SAndroid Build Coastguard Workerdef VPMSUMH : VX1_Int_Ty<1096, "vpmsumh", 1165*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vpmsumh, v8i16>; 1166*9880d681SAndroid Build Coastguard Workerdef VPMSUMW : VX1_Int_Ty<1160, "vpmsumw", 1167*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vpmsumw, v4i32>; 1168*9880d681SAndroid Build Coastguard Workerdef VPMSUMD : VX1_Int_Ty<1224, "vpmsumd", 1169*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vpmsumd, v2i64>; 1170*9880d681SAndroid Build Coastguard Workerdef VPERMXOR : VA1a_Int_Ty<45, "vpermxor", 1171*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vpermxor, v16i8>; 1172*9880d681SAndroid Build Coastguard Worker 1173*9880d681SAndroid Build Coastguard Worker// Vector doubleword integer pack and unpack. 1174*9880d681SAndroid Build Coastguard Workerdef VPKSDSS : VX1_Int_Ty2<1486, "vpksdss", int_ppc_altivec_vpksdss, 1175*9880d681SAndroid Build Coastguard Worker v4i32, v2i64>; 1176*9880d681SAndroid Build Coastguard Workerdef VPKSDUS : VX1_Int_Ty2<1358, "vpksdus", int_ppc_altivec_vpksdus, 1177*9880d681SAndroid Build Coastguard Worker v4i32, v2i64>; 1178*9880d681SAndroid Build Coastguard Workerdef VPKUDUM : VXForm_1<1102, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1179*9880d681SAndroid Build Coastguard Worker "vpkudum $vD, $vA, $vB", IIC_VecFP, 1180*9880d681SAndroid Build Coastguard Worker [(set v16i8:$vD, 1181*9880d681SAndroid Build Coastguard Worker (vpkudum_shuffle v16i8:$vA, v16i8:$vB))]>; 1182*9880d681SAndroid Build Coastguard Workerdef VPKUDUS : VX1_Int_Ty2<1230, "vpkudus", int_ppc_altivec_vpkudus, 1183*9880d681SAndroid Build Coastguard Worker v4i32, v2i64>; 1184*9880d681SAndroid Build Coastguard Workerdef VUPKHSW : VX2_Int_Ty2<1614, "vupkhsw", int_ppc_altivec_vupkhsw, 1185*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1186*9880d681SAndroid Build Coastguard Workerdef VUPKLSW : VX2_Int_Ty2<1742, "vupklsw", int_ppc_altivec_vupklsw, 1187*9880d681SAndroid Build Coastguard Worker v2i64, v4i32>; 1188*9880d681SAndroid Build Coastguard Worker 1189*9880d681SAndroid Build Coastguard Worker// Shuffle patterns for unary and swapped (LE) vector pack modulo. 1190*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkudum_unary_shuffle v16i8:$vA, undef), 1191*9880d681SAndroid Build Coastguard Worker (VPKUDUM $vA, $vA)>; 1192*9880d681SAndroid Build Coastguard Workerdef:Pat<(vpkudum_swapped_shuffle v16i8:$vA, v16i8:$vB), 1193*9880d681SAndroid Build Coastguard Worker (VPKUDUM $vB, $vA)>; 1194*9880d681SAndroid Build Coastguard Worker 1195*9880d681SAndroid Build Coastguard Workerdef VGBBD : VX2_Int_Ty2<1292, "vgbbd", int_ppc_altivec_vgbbd, v16i8, v16i8>; 1196*9880d681SAndroid Build Coastguard Workerdef VBPERMQ : VX1_Int_Ty2<1356, "vbpermq", int_ppc_altivec_vbpermq, 1197*9880d681SAndroid Build Coastguard Worker v2i64, v16i8>; 1198*9880d681SAndroid Build Coastguard Worker} // end HasP8Altivec 1199*9880d681SAndroid Build Coastguard Worker 1200*9880d681SAndroid Build Coastguard Worker// Crypto instructions (from builtins) 1201*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasP8Crypto] in { 1202*9880d681SAndroid Build Coastguard Workerdef VSHASIGMAW : VXCR_Int_Ty<1666, "vshasigmaw", 1203*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vshasigmaw, v4i32>; 1204*9880d681SAndroid Build Coastguard Workerdef VSHASIGMAD : VXCR_Int_Ty<1730, "vshasigmad", 1205*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vshasigmad, v2i64>; 1206*9880d681SAndroid Build Coastguard Workerdef VCIPHER : VX1_Int_Ty<1288, "vcipher", int_ppc_altivec_crypto_vcipher, 1207*9880d681SAndroid Build Coastguard Worker v2i64>; 1208*9880d681SAndroid Build Coastguard Workerdef VCIPHERLAST : VX1_Int_Ty<1289, "vcipherlast", 1209*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vcipherlast, v2i64>; 1210*9880d681SAndroid Build Coastguard Workerdef VNCIPHER : VX1_Int_Ty<1352, "vncipher", 1211*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vncipher, v2i64>; 1212*9880d681SAndroid Build Coastguard Workerdef VNCIPHERLAST : VX1_Int_Ty<1353, "vncipherlast", 1213*9880d681SAndroid Build Coastguard Worker int_ppc_altivec_crypto_vncipherlast, v2i64>; 1214*9880d681SAndroid Build Coastguard Workerdef VSBOX : VXBX_Int_Ty<1480, "vsbox", int_ppc_altivec_crypto_vsbox, v2i64>; 1215*9880d681SAndroid Build Coastguard Worker} // HasP8Crypto 1216*9880d681SAndroid Build Coastguard Worker 1217*9880d681SAndroid Build Coastguard Worker// The following altivec instructions were introduced in Power ISA 3.0 1218*9880d681SAndroid Build Coastguard Workerdef HasP9Altivec : Predicate<"PPCSubTarget->hasP9Altivec()">; 1219*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasP9Altivec] in { 1220*9880d681SAndroid Build Coastguard Worker 1221*9880d681SAndroid Build Coastguard Worker// Vector Compare Not Equal (Zero) 1222*9880d681SAndroid Build Coastguard Workerclass P9VCMP<bits<10> xo, string asmstr, ValueType Ty> 1223*9880d681SAndroid Build Coastguard Worker : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, 1224*9880d681SAndroid Build Coastguard Worker IIC_VecFPCompare, []>; 1225*9880d681SAndroid Build Coastguard Workerclass P9VCMPo<bits<10> xo, string asmstr, ValueType Ty> 1226*9880d681SAndroid Build Coastguard Worker : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, 1227*9880d681SAndroid Build Coastguard Worker IIC_VecFPCompare, []> { 1228*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 1229*9880d681SAndroid Build Coastguard Worker let RC = 1; 1230*9880d681SAndroid Build Coastguard Worker} 1231*9880d681SAndroid Build Coastguard Worker 1232*9880d681SAndroid Build Coastguard Worker// i8 element comparisons. 1233*9880d681SAndroid Build Coastguard Workerdef VCMPNEB : P9VCMP < 7, "vcmpneb $vD, $vA, $vB" , v16i8>; 1234*9880d681SAndroid Build Coastguard Workerdef VCMPNEBo : P9VCMPo< 7, "vcmpneb. $vD, $vA, $vB" , v16i8>; 1235*9880d681SAndroid Build Coastguard Workerdef VCMPNEZB : P9VCMP <263, "vcmpnezb $vD, $vA, $vB" , v16i8>; 1236*9880d681SAndroid Build Coastguard Workerdef VCMPNEZBo : P9VCMPo<263, "vcmpnezb. $vD, $vA, $vB", v16i8>; 1237*9880d681SAndroid Build Coastguard Worker 1238*9880d681SAndroid Build Coastguard Worker// i16 element comparisons. 1239*9880d681SAndroid Build Coastguard Workerdef VCMPNEH : P9VCMP < 71, "vcmpneh $vD, $vA, $vB" , v8i16>; 1240*9880d681SAndroid Build Coastguard Workerdef VCMPNEHo : P9VCMPo< 71, "vcmpneh. $vD, $vA, $vB" , v8i16>; 1241*9880d681SAndroid Build Coastguard Workerdef VCMPNEZH : P9VCMP <327, "vcmpnezh $vD, $vA, $vB" , v8i16>; 1242*9880d681SAndroid Build Coastguard Workerdef VCMPNEZHo : P9VCMPo<327, "vcmpnezh. $vD, $vA, $vB", v8i16>; 1243*9880d681SAndroid Build Coastguard Worker 1244*9880d681SAndroid Build Coastguard Worker// i32 element comparisons. 1245*9880d681SAndroid Build Coastguard Workerdef VCMPNEW : P9VCMP <135, "vcmpnew $vD, $vA, $vB" , v4i32>; 1246*9880d681SAndroid Build Coastguard Workerdef VCMPNEWo : P9VCMPo<135, "vcmpnew. $vD, $vA, $vB" , v4i32>; 1247*9880d681SAndroid Build Coastguard Workerdef VCMPNEZW : P9VCMP <391, "vcmpnezw $vD, $vA, $vB" , v4i32>; 1248*9880d681SAndroid Build Coastguard Workerdef VCMPNEZWo : P9VCMPo<391, "vcmpnezw. $vD, $vA, $vB", v4i32>; 1249*9880d681SAndroid Build Coastguard Worker 1250*9880d681SAndroid Build Coastguard Worker// VX-Form: [PO VRT / UIM VRB XO]. 1251*9880d681SAndroid Build Coastguard Worker// We use VXForm_1 to implement it, that is, we use "VRA" (5 bit) to represent 1252*9880d681SAndroid Build Coastguard Worker// "/ UIM" (1 + 4 bit) 1253*9880d681SAndroid Build Coastguard Workerclass VX1_VT5_UIM5_VB5<bits<11> xo, string opc, list<dag> pattern> 1254*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs vrrc:$vD), (ins u4imm:$UIMM, vrrc:$vB), 1255*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB, $UIMM"), IIC_VecGeneral, pattern>; 1256*9880d681SAndroid Build Coastguard Worker 1257*9880d681SAndroid Build Coastguard Workerclass VX1_RT5_RA5_VB5<bits<11> xo, string opc, list<dag> pattern> 1258*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs g8rc:$rD), (ins g8rc:$rA, vrrc:$vB), 1259*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $rD, $rA, $vB"), IIC_VecGeneral, pattern>; 1260*9880d681SAndroid Build Coastguard Worker 1261*9880d681SAndroid Build Coastguard Worker// Vector Extract Unsigned 1262*9880d681SAndroid Build Coastguard Workerdef VEXTRACTUB : VX1_VT5_UIM5_VB5<525, "vextractub", []>; 1263*9880d681SAndroid Build Coastguard Workerdef VEXTRACTUH : VX1_VT5_UIM5_VB5<589, "vextractuh", []>; 1264*9880d681SAndroid Build Coastguard Workerdef VEXTRACTUW : VX1_VT5_UIM5_VB5<653, "vextractuw", []>; 1265*9880d681SAndroid Build Coastguard Workerdef VEXTRACTD : VX1_VT5_UIM5_VB5<717, "vextractd" , []>; 1266*9880d681SAndroid Build Coastguard Worker 1267*9880d681SAndroid Build Coastguard Worker// Vector Extract Unsigned Byte/Halfword/Word Left/Right-Indexed 1268*9880d681SAndroid Build Coastguard Workerdef VEXTUBLX : VX1_RT5_RA5_VB5<1549, "vextublx", []>; 1269*9880d681SAndroid Build Coastguard Workerdef VEXTUBRX : VX1_RT5_RA5_VB5<1805, "vextubrx", []>; 1270*9880d681SAndroid Build Coastguard Workerdef VEXTUHLX : VX1_RT5_RA5_VB5<1613, "vextuhlx", []>; 1271*9880d681SAndroid Build Coastguard Workerdef VEXTUHRX : VX1_RT5_RA5_VB5<1869, "vextuhrx", []>; 1272*9880d681SAndroid Build Coastguard Workerdef VEXTUWLX : VX1_RT5_RA5_VB5<1677, "vextuwlx", []>; 1273*9880d681SAndroid Build Coastguard Workerdef VEXTUWRX : VX1_RT5_RA5_VB5<1933, "vextuwrx", []>; 1274*9880d681SAndroid Build Coastguard Worker 1275*9880d681SAndroid Build Coastguard Worker// Vector Insert Element Instructions 1276*9880d681SAndroid Build Coastguard Workerdef VINSERTB : VX1_VT5_UIM5_VB5<781, "vinsertb", []>; 1277*9880d681SAndroid Build Coastguard Workerdef VINSERTH : VX1_VT5_UIM5_VB5<845, "vinserth", []>; 1278*9880d681SAndroid Build Coastguard Workerdef VINSERTW : VX1_VT5_UIM5_VB5<909, "vinsertw", []>; 1279*9880d681SAndroid Build Coastguard Workerdef VINSERTD : VX1_VT5_UIM5_VB5<973, "vinsertd", []>; 1280*9880d681SAndroid Build Coastguard Worker 1281*9880d681SAndroid Build Coastguard Workerclass VX_VT5_EO5_VB5<bits<11> xo, bits<5> eo, string opc, list<dag> pattern> 1282*9880d681SAndroid Build Coastguard Worker : VXForm_RD5_XO5_RS5<xo, eo, (outs vrrc:$vD), (ins vrrc:$vB), 1283*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB"), IIC_VecGeneral, pattern>; 1284*9880d681SAndroid Build Coastguard Worker 1285*9880d681SAndroid Build Coastguard Worker// Vector Count Leading/Trailing Zero LSB. Result is placed into GPR[rD] 1286*9880d681SAndroid Build Coastguard Workerdef VCLZLSBB : VXForm_RD5_XO5_RS5<1538, 0, (outs g8rc:$rD), (ins vrrc:$vB), 1287*9880d681SAndroid Build Coastguard Worker "vclzlsbb $rD, $vB", IIC_VecGeneral, []>; 1288*9880d681SAndroid Build Coastguard Workerdef VCTZLSBB : VXForm_RD5_XO5_RS5<1538, 1, (outs g8rc:$rD), (ins vrrc:$vB), 1289*9880d681SAndroid Build Coastguard Worker "vctzlsbb $rD, $vB", IIC_VecGeneral, []>; 1290*9880d681SAndroid Build Coastguard Worker// Vector Count Trailing Zeros 1291*9880d681SAndroid Build Coastguard Workerdef VCTZB : VX_VT5_EO5_VB5<1538, 28, "vctzb", []>; 1292*9880d681SAndroid Build Coastguard Workerdef VCTZH : VX_VT5_EO5_VB5<1538, 29, "vctzh", []>; 1293*9880d681SAndroid Build Coastguard Workerdef VCTZW : VX_VT5_EO5_VB5<1538, 30, "vctzw", []>; 1294*9880d681SAndroid Build Coastguard Workerdef VCTZD : VX_VT5_EO5_VB5<1538, 31, "vctzd", []>; 1295*9880d681SAndroid Build Coastguard Worker 1296*9880d681SAndroid Build Coastguard Worker// Vector Extend Sign 1297*9880d681SAndroid Build Coastguard Workerdef VEXTSB2W : VX_VT5_EO5_VB5<1538, 16, "vextsb2w", []>; 1298*9880d681SAndroid Build Coastguard Workerdef VEXTSH2W : VX_VT5_EO5_VB5<1538, 17, "vextsh2w", []>; 1299*9880d681SAndroid Build Coastguard Workerdef VEXTSB2D : VX_VT5_EO5_VB5<1538, 24, "vextsb2d", []>; 1300*9880d681SAndroid Build Coastguard Workerdef VEXTSH2D : VX_VT5_EO5_VB5<1538, 25, "vextsh2d", []>; 1301*9880d681SAndroid Build Coastguard Workerdef VEXTSW2D : VX_VT5_EO5_VB5<1538, 26, "vextsw2d", []>; 1302*9880d681SAndroid Build Coastguard Worker 1303*9880d681SAndroid Build Coastguard Worker// Vector Integer Negate 1304*9880d681SAndroid Build Coastguard Workerdef VNEGW : VX_VT5_EO5_VB5<1538, 6, "vnegw", []>; 1305*9880d681SAndroid Build Coastguard Workerdef VNEGD : VX_VT5_EO5_VB5<1538, 7, "vnegd", []>; 1306*9880d681SAndroid Build Coastguard Worker 1307*9880d681SAndroid Build Coastguard Worker// Vector Parity Byte 1308*9880d681SAndroid Build Coastguard Workerdef VPRTYBW : VX_VT5_EO5_VB5<1538, 8, "vprtybw", []>; 1309*9880d681SAndroid Build Coastguard Workerdef VPRTYBD : VX_VT5_EO5_VB5<1538, 9, "vprtybd", []>; 1310*9880d681SAndroid Build Coastguard Workerdef VPRTYBQ : VX_VT5_EO5_VB5<1538, 10, "vprtybq", []>; 1311*9880d681SAndroid Build Coastguard Worker 1312*9880d681SAndroid Build Coastguard Worker// Vector (Bit) Permute (Right-indexed) 1313*9880d681SAndroid Build Coastguard Workerdef VBPERMD : VXForm_1<1484, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1314*9880d681SAndroid Build Coastguard Worker "vbpermd $vD, $vA, $vB", IIC_VecFP, []>; 1315*9880d681SAndroid Build Coastguard Workerdef VPERMR : VAForm_1a<59, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 1316*9880d681SAndroid Build Coastguard Worker "vpermr $vD, $vA, $vB, $vC", IIC_VecFP, []>; 1317*9880d681SAndroid Build Coastguard Worker 1318*9880d681SAndroid Build Coastguard Workerclass VX1_VT5_VA5_VB5<bits<11> xo, string opc, list<dag> pattern> 1319*9880d681SAndroid Build Coastguard Worker : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1320*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, pattern>; 1321*9880d681SAndroid Build Coastguard Worker 1322*9880d681SAndroid Build Coastguard Worker// Vector Rotate Left Mask/Mask-Insert 1323*9880d681SAndroid Build Coastguard Workerdef VRLWNM : VX1_VT5_VA5_VB5<389, "vrlwnm", []>; 1324*9880d681SAndroid Build Coastguard Workerdef VRLWMI : VX1_VT5_VA5_VB5<133, "vrlwmi", []>; 1325*9880d681SAndroid Build Coastguard Workerdef VRLDNM : VX1_VT5_VA5_VB5<453, "vrldnm", []>; 1326*9880d681SAndroid Build Coastguard Workerdef VRLDMI : VX1_VT5_VA5_VB5<197, "vrldmi", []>; 1327*9880d681SAndroid Build Coastguard Worker 1328*9880d681SAndroid Build Coastguard Worker// Vector Shift Left/Right 1329*9880d681SAndroid Build Coastguard Workerdef VSLV : VX1_VT5_VA5_VB5<1860, "vslv", []>; 1330*9880d681SAndroid Build Coastguard Workerdef VSRV : VX1_VT5_VA5_VB5<1796, "vsrv", []>; 1331*9880d681SAndroid Build Coastguard Worker 1332*9880d681SAndroid Build Coastguard Worker// Vector Multiply-by-10 (& Write Carry) Unsigned Quadword 1333*9880d681SAndroid Build Coastguard Workerdef VMUL10UQ : VXForm_BX<513, (outs vrrc:$vD), (ins vrrc:$vA), 1334*9880d681SAndroid Build Coastguard Worker "vmul10uq $vD, $vA", IIC_VecFP, []>; 1335*9880d681SAndroid Build Coastguard Workerdef VMUL10CUQ : VXForm_BX< 1, (outs vrrc:$vD), (ins vrrc:$vA), 1336*9880d681SAndroid Build Coastguard Worker "vmul10cuq $vD, $vA", IIC_VecFP, []>; 1337*9880d681SAndroid Build Coastguard Worker 1338*9880d681SAndroid Build Coastguard Worker// Vector Multiply-by-10 Extended (& Write Carry) Unsigned Quadword 1339*9880d681SAndroid Build Coastguard Workerdef VMUL10EUQ : VX1_VT5_VA5_VB5<577, "vmul10euq" , []>; 1340*9880d681SAndroid Build Coastguard Workerdef VMUL10ECUQ : VX1_VT5_VA5_VB5< 65, "vmul10ecuq", []>; 1341*9880d681SAndroid Build Coastguard Worker 1342*9880d681SAndroid Build Coastguard Worker// Decimal Integer Format Conversion Instructions 1343*9880d681SAndroid Build Coastguard Worker 1344*9880d681SAndroid Build Coastguard Worker// [PO VRT EO VRB 1 PS XO], "_o" means CR6 is set. 1345*9880d681SAndroid Build Coastguard Workerclass VX_VT5_EO5_VB5_PS1_XO9_o<bits<5> eo, bits<9> xo, string opc, 1346*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1347*9880d681SAndroid Build Coastguard Worker : VX_RD5_EO5_RS5_PS1_XO9<eo, xo, (outs vrrc:$vD), (ins vrrc:$vB, u1imm:$PS), 1348*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB, $PS"), IIC_VecFP, pattern> { 1349*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 1350*9880d681SAndroid Build Coastguard Worker} 1351*9880d681SAndroid Build Coastguard Worker 1352*9880d681SAndroid Build Coastguard Worker// [PO VRT EO VRB 1 / XO] 1353*9880d681SAndroid Build Coastguard Workerclass VX_VT5_EO5_VB5_XO9_o<bits<5> eo, bits<9> xo, string opc, 1354*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1355*9880d681SAndroid Build Coastguard Worker : VX_RD5_EO5_RS5_PS1_XO9<eo, xo, (outs vrrc:$vD), (ins vrrc:$vB), 1356*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vB"), IIC_VecFP, pattern> { 1357*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 1358*9880d681SAndroid Build Coastguard Worker let PS = 0; 1359*9880d681SAndroid Build Coastguard Worker} 1360*9880d681SAndroid Build Coastguard Worker 1361*9880d681SAndroid Build Coastguard Worker// Decimal Convert From/to National/Zoned/Signed-QWord 1362*9880d681SAndroid Build Coastguard Workerdef BCDCFNo : VX_VT5_EO5_VB5_PS1_XO9_o<7, 385, "bcdcfn." , []>; 1363*9880d681SAndroid Build Coastguard Workerdef BCDCFZo : VX_VT5_EO5_VB5_PS1_XO9_o<6, 385, "bcdcfz." , []>; 1364*9880d681SAndroid Build Coastguard Workerdef BCDCTNo : VX_VT5_EO5_VB5_XO9_o <5, 385, "bcdctn." , []>; 1365*9880d681SAndroid Build Coastguard Workerdef BCDCTZo : VX_VT5_EO5_VB5_PS1_XO9_o<4, 385, "bcdctz." , []>; 1366*9880d681SAndroid Build Coastguard Workerdef BCDCFSQo : VX_VT5_EO5_VB5_PS1_XO9_o<2, 385, "bcdcfsq.", []>; 1367*9880d681SAndroid Build Coastguard Workerdef BCDCTSQo : VX_VT5_EO5_VB5_XO9_o <0, 385, "bcdctsq.", []>; 1368*9880d681SAndroid Build Coastguard Worker 1369*9880d681SAndroid Build Coastguard Worker// Decimal Copy-Sign/Set-Sign 1370*9880d681SAndroid Build Coastguard Workerlet Defs = [CR6] in 1371*9880d681SAndroid Build Coastguard Workerdef BCDCPSGNo : VX1_VT5_VA5_VB5<833, "bcdcpsgn.", []>; 1372*9880d681SAndroid Build Coastguard Worker 1373*9880d681SAndroid Build Coastguard Workerdef BCDSETSGNo : VX_VT5_EO5_VB5_PS1_XO9_o<31, 385, "bcdsetsgn.", []>; 1374*9880d681SAndroid Build Coastguard Worker 1375*9880d681SAndroid Build Coastguard Worker// [PO VRT VRA VRB 1 PS XO], "_o" means CR6 is set. 1376*9880d681SAndroid Build Coastguard Workerclass VX_VT5_VA5_VB5_PS1_XO9_o<bits<9> xo, string opc, list<dag> pattern> 1377*9880d681SAndroid Build Coastguard Worker : VX_RD5_RSp5_PS1_XO9<xo, 1378*9880d681SAndroid Build Coastguard Worker (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, u1imm:$PS), 1379*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB, $PS"), IIC_VecFP, pattern> { 1380*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 1381*9880d681SAndroid Build Coastguard Worker} 1382*9880d681SAndroid Build Coastguard Worker 1383*9880d681SAndroid Build Coastguard Worker// [PO VRT VRA VRB 1 / XO] 1384*9880d681SAndroid Build Coastguard Workerclass VX_VT5_VA5_VB5_XO9_o<bits<9> xo, string opc, list<dag> pattern> 1385*9880d681SAndroid Build Coastguard Worker : VX_RD5_RSp5_PS1_XO9<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1386*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, pattern> { 1387*9880d681SAndroid Build Coastguard Worker let Defs = [CR6]; 1388*9880d681SAndroid Build Coastguard Worker let PS = 0; 1389*9880d681SAndroid Build Coastguard Worker} 1390*9880d681SAndroid Build Coastguard Worker 1391*9880d681SAndroid Build Coastguard Worker// Decimal Shift/Unsigned-Shift/Shift-and-Round 1392*9880d681SAndroid Build Coastguard Workerdef BCDSo : VX_VT5_VA5_VB5_PS1_XO9_o<193, "bcds." , []>; 1393*9880d681SAndroid Build Coastguard Workerdef BCDUSo : VX_VT5_VA5_VB5_XO9_o <129, "bcdus.", []>; 1394*9880d681SAndroid Build Coastguard Workerdef BCDSRo : VX_VT5_VA5_VB5_PS1_XO9_o<449, "bcdsr.", []>; 1395*9880d681SAndroid Build Coastguard Worker 1396*9880d681SAndroid Build Coastguard Worker// Decimal (Unsigned) Truncate 1397*9880d681SAndroid Build Coastguard Workerdef BCDTRUNCo : VX_VT5_VA5_VB5_PS1_XO9_o<257, "bcdtrunc." , []>; 1398*9880d681SAndroid Build Coastguard Workerdef BCDUTRUNCo : VX_VT5_VA5_VB5_XO9_o <321, "bcdutrunc.", []>; 1399*9880d681SAndroid Build Coastguard Worker} // end HasP9Altivec 1400