1*9880d681SAndroid Build Coastguard Worker//===- NVPTXVector.td - NVPTX Vector Specific Instruction defs -*- tblgen-*-==// 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//----------------------------------- 11*9880d681SAndroid Build Coastguard Worker// Vector Specific 12*9880d681SAndroid Build Coastguard Worker//----------------------------------- 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// 15*9880d681SAndroid Build Coastguard Worker// All vector instructions derive from NVPTXVecInst 16*9880d681SAndroid Build Coastguard Worker// 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerclass NVPTXVecInst<dag outs, dag ins, string asmstr, list<dag> pattern, 19*9880d681SAndroid Build Coastguard Worker NVPTXInst sInst=NOP> 20*9880d681SAndroid Build Coastguard Worker : NVPTXInst<outs, ins, asmstr, pattern> { 21*9880d681SAndroid Build Coastguard Worker NVPTXInst scalarInst=sInst; 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecExtract.Value in { 25*9880d681SAndroid Build Coastguard Worker// Extract v2i16 26*9880d681SAndroid Build Coastguard Workerdef V2i16Extract : NVPTXVecInst<(outs Int16Regs:$dst), 27*9880d681SAndroid Build Coastguard Worker (ins V2I16Regs:$src, i8imm:$c), 28*9880d681SAndroid Build Coastguard Worker "mov.u16 \t$dst, $src${c:vecelem};", 29*9880d681SAndroid Build Coastguard Worker [(set Int16Regs:$dst, (extractelt 30*9880d681SAndroid Build Coastguard Worker (v2i16 V2I16Regs:$src), imm:$c))], 31*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Extract v4i16 34*9880d681SAndroid Build Coastguard Workerdef V4i16Extract : NVPTXVecInst<(outs Int16Regs:$dst), 35*9880d681SAndroid Build Coastguard Worker (ins V4I16Regs:$src, i8imm:$c), 36*9880d681SAndroid Build Coastguard Worker "mov.u16 \t$dst, $src${c:vecelem};", 37*9880d681SAndroid Build Coastguard Worker [(set Int16Regs:$dst, (extractelt 38*9880d681SAndroid Build Coastguard Worker (v4i16 V4I16Regs:$src), imm:$c))], 39*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker// Extract v2i8 42*9880d681SAndroid Build Coastguard Workerdef V2i8Extract : NVPTXVecInst<(outs Int8Regs:$dst), 43*9880d681SAndroid Build Coastguard Worker (ins V2I8Regs:$src, i8imm:$c), 44*9880d681SAndroid Build Coastguard Worker "mov.u16 \t$dst, $src${c:vecelem};", 45*9880d681SAndroid Build Coastguard Worker [(set Int8Regs:$dst, (extractelt 46*9880d681SAndroid Build Coastguard Worker (v2i8 V2I8Regs:$src), imm:$c))], 47*9880d681SAndroid Build Coastguard Worker IMOV8rr>; 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker// Extract v4i8 50*9880d681SAndroid Build Coastguard Workerdef V4i8Extract : NVPTXVecInst<(outs Int8Regs:$dst), 51*9880d681SAndroid Build Coastguard Worker (ins V4I8Regs:$src, i8imm:$c), 52*9880d681SAndroid Build Coastguard Worker "mov.u16 \t$dst, $src${c:vecelem};", 53*9880d681SAndroid Build Coastguard Worker [(set Int8Regs:$dst, (extractelt 54*9880d681SAndroid Build Coastguard Worker (v4i8 V4I8Regs:$src), imm:$c))], 55*9880d681SAndroid Build Coastguard Worker IMOV8rr>; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker// Extract v2i32 58*9880d681SAndroid Build Coastguard Workerdef V2i32Extract : NVPTXVecInst<(outs Int32Regs:$dst), 59*9880d681SAndroid Build Coastguard Worker (ins V2I32Regs:$src, i8imm:$c), 60*9880d681SAndroid Build Coastguard Worker "mov.u32 \t$dst, $src${c:vecelem};", 61*9880d681SAndroid Build Coastguard Worker [(set Int32Regs:$dst, (extractelt 62*9880d681SAndroid Build Coastguard Worker (v2i32 V2I32Regs:$src), imm:$c))], 63*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker// Extract v2f32 66*9880d681SAndroid Build Coastguard Workerdef V2f32Extract : NVPTXVecInst<(outs Float32Regs:$dst), 67*9880d681SAndroid Build Coastguard Worker (ins V2F32Regs:$src, i8imm:$c), 68*9880d681SAndroid Build Coastguard Worker "mov.f32 \t$dst, $src${c:vecelem};", 69*9880d681SAndroid Build Coastguard Worker [(set Float32Regs:$dst, (extractelt 70*9880d681SAndroid Build Coastguard Worker (v2f32 V2F32Regs:$src), imm:$c))], 71*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker// Extract v2i64 74*9880d681SAndroid Build Coastguard Workerdef V2i64Extract : NVPTXVecInst<(outs Int64Regs:$dst), 75*9880d681SAndroid Build Coastguard Worker (ins V2I64Regs:$src, i8imm:$c), 76*9880d681SAndroid Build Coastguard Worker "mov.u64 \t$dst, $src${c:vecelem};", 77*9880d681SAndroid Build Coastguard Worker [(set Int64Regs:$dst, (extractelt 78*9880d681SAndroid Build Coastguard Worker (v2i64 V2I64Regs:$src), imm:$c))], 79*9880d681SAndroid Build Coastguard Worker IMOV64rr>; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker// Extract v2f64 82*9880d681SAndroid Build Coastguard Workerdef V2f64Extract : NVPTXVecInst<(outs Float64Regs:$dst), 83*9880d681SAndroid Build Coastguard Worker (ins V2F64Regs:$src, i8imm:$c), 84*9880d681SAndroid Build Coastguard Worker "mov.f64 \t$dst, $src${c:vecelem};", 85*9880d681SAndroid Build Coastguard Worker [(set Float64Regs:$dst, (extractelt 86*9880d681SAndroid Build Coastguard Worker (v2f64 V2F64Regs:$src), imm:$c))], 87*9880d681SAndroid Build Coastguard Worker FMOV64rr>; 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker// Extract v4i32 90*9880d681SAndroid Build Coastguard Workerdef V4i32Extract : NVPTXVecInst<(outs Int32Regs:$dst), 91*9880d681SAndroid Build Coastguard Worker (ins V4I32Regs:$src, i8imm:$c), 92*9880d681SAndroid Build Coastguard Worker "mov.u32 \t$dst, $src${c:vecelem};", 93*9880d681SAndroid Build Coastguard Worker [(set Int32Regs:$dst, (extractelt 94*9880d681SAndroid Build Coastguard Worker (v4i32 V4I32Regs:$src), imm:$c))], 95*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker// Extract v4f32 98*9880d681SAndroid Build Coastguard Workerdef V4f32Extract : NVPTXVecInst<(outs Float32Regs:$dst), 99*9880d681SAndroid Build Coastguard Worker (ins V4F32Regs:$src, i8imm:$c), 100*9880d681SAndroid Build Coastguard Worker "mov.f32 \t$dst, $src${c:vecelem};", 101*9880d681SAndroid Build Coastguard Worker [(set Float32Regs:$dst, (extractelt 102*9880d681SAndroid Build Coastguard Worker (v4f32 V4F32Regs:$src), imm:$c))], 103*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecInsert.Value in { 107*9880d681SAndroid Build Coastguard Worker// Insert v2i8 108*9880d681SAndroid Build Coastguard Workerdef V2i8Insert : NVPTXVecInst<(outs V2I8Regs:$dst), 109*9880d681SAndroid Build Coastguard Worker (ins V2I8Regs:$src, Int8Regs:$val, i8imm:$c), 110*9880d681SAndroid Build Coastguard Worker "mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};" 111*9880d681SAndroid Build Coastguard Worker "\n\tmov.u16 \t$dst${c:vecelem}, $val;", 112*9880d681SAndroid Build Coastguard Worker [(set V2I8Regs:$dst, 113*9880d681SAndroid Build Coastguard Worker (insertelt V2I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>; 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker// Insert v4i8 116*9880d681SAndroid Build Coastguard Workerdef V4i8Insert : NVPTXVecInst<(outs V4I8Regs:$dst), 117*9880d681SAndroid Build Coastguard Worker (ins V4I8Regs:$src, Int8Regs:$val, i8imm:$c), 118*9880d681SAndroid Build Coastguard Worker "mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};" 119*9880d681SAndroid Build Coastguard Worker "\n\tmov.u16 \t$dst${c:vecelem}, $val;", 120*9880d681SAndroid Build Coastguard Worker [(set V4I8Regs:$dst, 121*9880d681SAndroid Build Coastguard Worker (insertelt V4I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>; 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker// Insert v2i16 124*9880d681SAndroid Build Coastguard Workerdef V2i16Insert : NVPTXVecInst<(outs V2I16Regs:$dst), 125*9880d681SAndroid Build Coastguard Worker (ins V2I16Regs:$src, Int16Regs:$val, i8imm:$c), 126*9880d681SAndroid Build Coastguard Worker "mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};" 127*9880d681SAndroid Build Coastguard Worker "\n\tmov.u16 \t$dst${c:vecelem}, $val;", 128*9880d681SAndroid Build Coastguard Worker [(set V2I16Regs:$dst, 129*9880d681SAndroid Build Coastguard Worker (insertelt V2I16Regs:$src, Int16Regs:$val, imm:$c))], 130*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker// Insert v4i16 133*9880d681SAndroid Build Coastguard Workerdef V4i16Insert : NVPTXVecInst<(outs V4I16Regs:$dst), 134*9880d681SAndroid Build Coastguard Worker (ins V4I16Regs:$src, Int16Regs:$val, i8imm:$c), 135*9880d681SAndroid Build Coastguard Worker "mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};" 136*9880d681SAndroid Build Coastguard Worker "\n\tmov.u16 \t$dst${c:vecelem}, $val;", 137*9880d681SAndroid Build Coastguard Worker [(set V4I16Regs:$dst, 138*9880d681SAndroid Build Coastguard Worker (insertelt V4I16Regs:$src, Int16Regs:$val, imm:$c))], 139*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker// Insert v2i32 142*9880d681SAndroid Build Coastguard Workerdef V2i32Insert : NVPTXVecInst<(outs V2I32Regs:$dst), 143*9880d681SAndroid Build Coastguard Worker (ins V2I32Regs:$src, Int32Regs:$val, i8imm:$c), 144*9880d681SAndroid Build Coastguard Worker "mov.v2.u32 \t${dst:vecfull}, ${src:vecfull};" 145*9880d681SAndroid Build Coastguard Worker "\n\tmov.u32 \t$dst${c:vecelem}, $val;", 146*9880d681SAndroid Build Coastguard Worker [(set V2I32Regs:$dst, 147*9880d681SAndroid Build Coastguard Worker (insertelt V2I32Regs:$src, Int32Regs:$val, imm:$c))], 148*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker// Insert v2f32 151*9880d681SAndroid Build Coastguard Workerdef V2f32Insert : NVPTXVecInst<(outs V2F32Regs:$dst), 152*9880d681SAndroid Build Coastguard Worker (ins V2F32Regs:$src, Float32Regs:$val, i8imm:$c), 153*9880d681SAndroid Build Coastguard Worker "mov.v2.f32 \t${dst:vecfull}, ${src:vecfull};" 154*9880d681SAndroid Build Coastguard Worker "\n\tmov.f32 \t$dst${c:vecelem}, $val;", 155*9880d681SAndroid Build Coastguard Worker [(set V2F32Regs:$dst, 156*9880d681SAndroid Build Coastguard Worker (insertelt V2F32Regs:$src, Float32Regs:$val, imm:$c))], 157*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker// Insert v2i64 160*9880d681SAndroid Build Coastguard Workerdef V2i64Insert : NVPTXVecInst<(outs V2I64Regs:$dst), 161*9880d681SAndroid Build Coastguard Worker (ins V2I64Regs:$src, Int64Regs:$val, i8imm:$c), 162*9880d681SAndroid Build Coastguard Worker "mov.v2.u64 \t${dst:vecfull}, ${src:vecfull};" 163*9880d681SAndroid Build Coastguard Worker "\n\tmov.u64 \t$dst${c:vecelem}, $val;", 164*9880d681SAndroid Build Coastguard Worker [(set V2I64Regs:$dst, 165*9880d681SAndroid Build Coastguard Worker (insertelt V2I64Regs:$src, Int64Regs:$val, imm:$c))], 166*9880d681SAndroid Build Coastguard Worker IMOV64rr>; 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker// Insert v2f64 169*9880d681SAndroid Build Coastguard Workerdef V2f64Insert : NVPTXVecInst<(outs V2F64Regs:$dst), 170*9880d681SAndroid Build Coastguard Worker (ins V2F64Regs:$src, Float64Regs:$val, i8imm:$c), 171*9880d681SAndroid Build Coastguard Worker "mov.v2.f64 \t${dst:vecfull}, ${src:vecfull};" 172*9880d681SAndroid Build Coastguard Worker "\n\tmov.f64 \t$dst${c:vecelem}, $val;", 173*9880d681SAndroid Build Coastguard Worker [(set V2F64Regs:$dst, 174*9880d681SAndroid Build Coastguard Worker (insertelt V2F64Regs:$src, Float64Regs:$val, imm:$c))], 175*9880d681SAndroid Build Coastguard Worker FMOV64rr>; 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker// Insert v4i32 178*9880d681SAndroid Build Coastguard Workerdef V4i32Insert : NVPTXVecInst<(outs V4I32Regs:$dst), 179*9880d681SAndroid Build Coastguard Worker (ins V4I32Regs:$src, Int32Regs:$val, i8imm:$c), 180*9880d681SAndroid Build Coastguard Worker "mov.v4.u32 \t${dst:vecfull}, ${src:vecfull};" 181*9880d681SAndroid Build Coastguard Worker "\n\tmov.u32 \t$dst${c:vecelem}, $val;", 182*9880d681SAndroid Build Coastguard Worker [(set V4I32Regs:$dst, 183*9880d681SAndroid Build Coastguard Worker (insertelt V4I32Regs:$src, Int32Regs:$val, imm:$c))], 184*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker// Insert v4f32 187*9880d681SAndroid Build Coastguard Workerdef V4f32Insert : NVPTXVecInst<(outs V4F32Regs:$dst), 188*9880d681SAndroid Build Coastguard Worker (ins V4F32Regs:$src, Float32Regs:$val, i8imm:$c), 189*9880d681SAndroid Build Coastguard Worker "mov.v4.f32 \t${dst:vecfull}, ${src:vecfull};" 190*9880d681SAndroid Build Coastguard Worker "\n\tmov.f32 \t$dst${c:vecelem}, $val;", 191*9880d681SAndroid Build Coastguard Worker [(set V4F32Regs:$dst, 192*9880d681SAndroid Build Coastguard Worker (insertelt V4F32Regs:$src, Float32Regs:$val, imm:$c))], 193*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerclass BinOpAsmString<string c> { 197*9880d681SAndroid Build Coastguard Worker string s = c; 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerclass V4AsmStr<string opcode> : BinOpAsmString< 201*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat(!strconcat( 202*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 203*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0, ${b}_0;\n\t"), 204*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1, ${b}_1;\n\t"), 205*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_2, ${a}_2, ${b}_2;\n\t"), 206*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_3, ${a}_3, ${b}_3;")>; 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerclass V2AsmStr<string opcode> : BinOpAsmString< 209*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 210*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0, ${b}_0;\n\t"), 211*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1, ${b}_1;")>; 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerclass V4MADStr<string opcode> : BinOpAsmString< 214*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat(!strconcat( 215*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 216*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0, ${b}_0, ${c}_0;\n\t"), 217*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1, ${b}_1, ${c}_1;\n\t"), 218*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_2, ${a}_2, ${b}_2, ${c}_2;\n\t"), 219*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_3, ${a}_3, ${b}_3, ${c}_3;")>; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerclass V2MADStr<string opcode> : BinOpAsmString< 222*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 223*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0, ${b}_0, ${c}_0;\n\t"), 224*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1, ${b}_1, ${c}_1;")>; 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerclass V4UnaryStr<string opcode> : BinOpAsmString< 227*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat(!strconcat( 228*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 229*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0;\n\t"), 230*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1;\n\t"), 231*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_2, ${a}_2;\n\t"), 232*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_3, ${a}_3;")>; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerclass V2UnaryStr<string opcode> : BinOpAsmString< 235*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat(!strconcat( 236*9880d681SAndroid Build Coastguard Worker opcode, " \t${dst}_0, ${a}_0;\n\t"), 237*9880d681SAndroid Build Coastguard Worker opcode), " \t${dst}_1, ${a}_1;")>; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerclass VecBinaryOp<BinOpAsmString asmstr, SDNode OpNode, NVPTXRegClass regclass, 240*9880d681SAndroid Build Coastguard Worker NVPTXInst sInst=NOP> : 241*9880d681SAndroid Build Coastguard Worker NVPTXVecInst<(outs regclass:$dst), (ins regclass:$a, regclass:$b), 242*9880d681SAndroid Build Coastguard Worker asmstr.s, 243*9880d681SAndroid Build Coastguard Worker [(set regclass:$dst, (OpNode regclass:$a, regclass:$b))], 244*9880d681SAndroid Build Coastguard Worker sInst>; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerclass VecShiftOp<BinOpAsmString asmstr, SDNode OpNode, NVPTXRegClass regclass1, 247*9880d681SAndroid Build Coastguard Worker NVPTXRegClass regclass2, NVPTXInst sInst=NOP> : 248*9880d681SAndroid Build Coastguard Worker NVPTXVecInst<(outs regclass1:$dst), (ins regclass1:$a, regclass2:$b), 249*9880d681SAndroid Build Coastguard Worker asmstr.s, 250*9880d681SAndroid Build Coastguard Worker [(set regclass1:$dst, (OpNode regclass1:$a, regclass2:$b))], 251*9880d681SAndroid Build Coastguard Worker sInst>; 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerclass VecUnaryOp<BinOpAsmString asmstr, PatFrag OpNode, NVPTXRegClass regclass, 254*9880d681SAndroid Build Coastguard Worker NVPTXInst sInst=NOP> : 255*9880d681SAndroid Build Coastguard Worker NVPTXVecInst<(outs regclass:$dst), (ins regclass:$a), 256*9880d681SAndroid Build Coastguard Worker asmstr.s, 257*9880d681SAndroid Build Coastguard Worker [(set regclass:$dst, (OpNode regclass:$a))], sInst>; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workermulticlass IntBinVOp<string asmstr, SDNode OpNode, 260*9880d681SAndroid Build Coastguard Worker NVPTXInst i64op=NOP, NVPTXInst i32op=NOP, NVPTXInst 261*9880d681SAndroid Build Coastguard Worker i16op=NOP, NVPTXInst i8op=NOP> { 262*9880d681SAndroid Build Coastguard Worker def V2I64 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "64")>, OpNode, V2I64Regs, 263*9880d681SAndroid Build Coastguard Worker i64op>; 264*9880d681SAndroid Build Coastguard Worker def V4I32 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "32")>, OpNode, V4I32Regs, 265*9880d681SAndroid Build Coastguard Worker i32op>; 266*9880d681SAndroid Build Coastguard Worker def V2I32 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "32")>, OpNode, V2I32Regs, 267*9880d681SAndroid Build Coastguard Worker i32op>; 268*9880d681SAndroid Build Coastguard Worker def V4I16 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "16")>, OpNode, V4I16Regs, 269*9880d681SAndroid Build Coastguard Worker i16op>; 270*9880d681SAndroid Build Coastguard Worker def V2I16 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "16")>, OpNode, V2I16Regs, 271*9880d681SAndroid Build Coastguard Worker i16op>; 272*9880d681SAndroid Build Coastguard Worker def V4I8 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "16")>, OpNode, V4I8Regs, 273*9880d681SAndroid Build Coastguard Worker i8op>; 274*9880d681SAndroid Build Coastguard Worker def V2I8 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "16")>, OpNode, V2I8Regs, 275*9880d681SAndroid Build Coastguard Worker i8op>; 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workermulticlass FloatBinVOp<string asmstr, SDNode OpNode, 279*9880d681SAndroid Build Coastguard Worker NVPTXInst f64=NOP, NVPTXInst f32=NOP, 280*9880d681SAndroid Build Coastguard Worker NVPTXInst f32_ftz=NOP> { 281*9880d681SAndroid Build Coastguard Worker def V2F64 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "f64")>, OpNode, 282*9880d681SAndroid Build Coastguard Worker V2F64Regs, f64>; 283*9880d681SAndroid Build Coastguard Worker def V4F32_ftz : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "ftz.f32")>, OpNode, 284*9880d681SAndroid Build Coastguard Worker V4F32Regs, f32_ftz>, Requires<[doF32FTZ]>; 285*9880d681SAndroid Build Coastguard Worker def V2F32_ftz : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "ftz.f32")>, OpNode, 286*9880d681SAndroid Build Coastguard Worker V2F32Regs, f32_ftz>, Requires<[doF32FTZ]>; 287*9880d681SAndroid Build Coastguard Worker def V4F32 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "f32")>, OpNode, 288*9880d681SAndroid Build Coastguard Worker V4F32Regs, f32>; 289*9880d681SAndroid Build Coastguard Worker def V2F32 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "f32")>, OpNode, 290*9880d681SAndroid Build Coastguard Worker V2F32Regs, f32>; 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workermulticlass IntUnaryVOp<string asmstr, PatFrag OpNode, 294*9880d681SAndroid Build Coastguard Worker NVPTXInst i64op=NOP, NVPTXInst i32op=NOP, 295*9880d681SAndroid Build Coastguard Worker NVPTXInst i16op=NOP, NVPTXInst i8op=NOP> { 296*9880d681SAndroid Build Coastguard Worker def V2I64 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "64")>, OpNode, 297*9880d681SAndroid Build Coastguard Worker V2I64Regs, i64op>; 298*9880d681SAndroid Build Coastguard Worker def V4I32 : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "32")>, OpNode, 299*9880d681SAndroid Build Coastguard Worker V4I32Regs, i32op>; 300*9880d681SAndroid Build Coastguard Worker def V2I32 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "32")>, OpNode, 301*9880d681SAndroid Build Coastguard Worker V2I32Regs, i32op>; 302*9880d681SAndroid Build Coastguard Worker def V4I16 : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "16")>, OpNode, 303*9880d681SAndroid Build Coastguard Worker V4I16Regs, i16op>; 304*9880d681SAndroid Build Coastguard Worker def V2I16 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "16")>, OpNode, 305*9880d681SAndroid Build Coastguard Worker V2I16Regs, i16op>; 306*9880d681SAndroid Build Coastguard Worker def V4I8 : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "16")>, OpNode, 307*9880d681SAndroid Build Coastguard Worker V4I8Regs, i8op>; 308*9880d681SAndroid Build Coastguard Worker def V2I8 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "16")>, OpNode, 309*9880d681SAndroid Build Coastguard Worker V2I8Regs, i8op>; 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker// Integer Arithmetic 314*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 315*9880d681SAndroid Build Coastguard Workerdefm VAdd : IntBinVOp<"add.s", add, ADDi64rr, ADDi32rr, ADDi16rr, ADDi8rr>; 316*9880d681SAndroid Build Coastguard Workerdefm VSub : IntBinVOp<"sub.s", sub, SUBi64rr, SUBi32rr, SUBi16rr, SUBi8rr>; 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerdef AddCCV4I32 : VecBinaryOp<V4AsmStr<"add.cc.s32">, addc, V4I32Regs, 319*9880d681SAndroid Build Coastguard Worker ADDCCi32rr>; 320*9880d681SAndroid Build Coastguard Workerdef AddCCV2I32 : VecBinaryOp<V2AsmStr<"add.cc.s32">, addc, V2I32Regs, 321*9880d681SAndroid Build Coastguard Worker ADDCCi32rr>; 322*9880d681SAndroid Build Coastguard Workerdef SubCCV4I32 : VecBinaryOp<V4AsmStr<"sub.cc.s32">, subc, V4I32Regs, 323*9880d681SAndroid Build Coastguard Worker SUBCCi32rr>; 324*9880d681SAndroid Build Coastguard Workerdef SubCCV2I32 : VecBinaryOp<V2AsmStr<"sub.cc.s32">, subc, V2I32Regs, 325*9880d681SAndroid Build Coastguard Worker SUBCCi32rr>; 326*9880d681SAndroid Build Coastguard Workerdef AddCCCV4I32 : VecBinaryOp<V4AsmStr<"addc.cc.s32">, adde, V4I32Regs, 327*9880d681SAndroid Build Coastguard Worker ADDCCCi32rr>; 328*9880d681SAndroid Build Coastguard Workerdef AddCCCV2I32 : VecBinaryOp<V2AsmStr<"addc.cc.s32">, adde, V2I32Regs, 329*9880d681SAndroid Build Coastguard Worker ADDCCCi32rr>; 330*9880d681SAndroid Build Coastguard Workerdef SubCCCV4I32 : VecBinaryOp<V4AsmStr<"subc.cc.s32">, sube, V4I32Regs, 331*9880d681SAndroid Build Coastguard Worker SUBCCCi32rr>; 332*9880d681SAndroid Build Coastguard Workerdef SubCCCV2I32 : VecBinaryOp<V2AsmStr<"subc.cc.s32">, sube, V2I32Regs, 333*9880d681SAndroid Build Coastguard Worker SUBCCCi32rr>; 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I64 : VecShiftOp<V2AsmStr<"shl.b64">, shl, V2I64Regs, V2I32Regs, 336*9880d681SAndroid Build Coastguard Worker SHLi64rr>; 337*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I32 : VecShiftOp<V2AsmStr<"shl.b32">, shl, V2I32Regs, V2I32Regs, 338*9880d681SAndroid Build Coastguard Worker SHLi32rr>; 339*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I32 : VecShiftOp<V4AsmStr<"shl.b32">, shl, V4I32Regs, V4I32Regs, 340*9880d681SAndroid Build Coastguard Worker SHLi32rr>; 341*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I16 : VecShiftOp<V2AsmStr<"shl.b16">, shl, V2I16Regs, V2I32Regs, 342*9880d681SAndroid Build Coastguard Worker SHLi16rr>; 343*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I16 : VecShiftOp<V4AsmStr<"shl.b16">, shl, V4I16Regs, V4I32Regs, 344*9880d681SAndroid Build Coastguard Worker SHLi16rr>; 345*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I8 : VecShiftOp<V2AsmStr<"shl.b16">, shl, V2I8Regs, V2I32Regs, 346*9880d681SAndroid Build Coastguard Worker SHLi8rr>; 347*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I8 : VecShiftOp<V4AsmStr<"shl.b16">, shl, V4I8Regs, V4I32Regs, 348*9880d681SAndroid Build Coastguard Worker SHLi8rr>; 349*9880d681SAndroid Build Coastguard Worker} 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker// cvt to v*i32, helpers for shift 352*9880d681SAndroid Build Coastguard Workerclass CVTtoVeci32<NVPTXRegClass inclass, NVPTXRegClass outclass, string asmstr, 353*9880d681SAndroid Build Coastguard Worker NVPTXInst sInst=NOP> : 354*9880d681SAndroid Build Coastguard Worker NVPTXVecInst<(outs outclass:$d), (ins inclass:$s), asmstr, [], sInst>; 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Workerclass VecCVTStrHelper<string op, string dest, string src> { 357*9880d681SAndroid Build Coastguard Worker string s=!strconcat(op, !strconcat("\t", 358*9880d681SAndroid Build Coastguard Worker !strconcat(dest, !strconcat(", ", !strconcat(src, ";"))))); 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerclass Vec2CVTStr<string op> { 362*9880d681SAndroid Build Coastguard Worker string s=!strconcat(VecCVTStrHelper<op, "${d}_0", "${s}_0">.s, 363*9880d681SAndroid Build Coastguard Worker !strconcat("\n\t", VecCVTStrHelper<op, "${d}_1", "${s}_1">.s)); 364*9880d681SAndroid Build Coastguard Worker} 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Workerclass Vec4CVTStr<string op> { 367*9880d681SAndroid Build Coastguard Worker string s=!strconcat(VecCVTStrHelper<op, "${d}_0", "${s}_0">.s, 368*9880d681SAndroid Build Coastguard Worker !strconcat("\n\t", 369*9880d681SAndroid Build Coastguard Worker !strconcat(VecCVTStrHelper<op, "${d}_1", "${s}_1">.s, 370*9880d681SAndroid Build Coastguard Worker !strconcat("\n\t", 371*9880d681SAndroid Build Coastguard Worker !strconcat(VecCVTStrHelper<op, "${d}_2", "${s}_2">.s, 372*9880d681SAndroid Build Coastguard Worker !strconcat("\n\t", VecCVTStrHelper<op, "${d}_3", "${s}_3">.s)))))); 373*9880d681SAndroid Build Coastguard Worker} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 376*9880d681SAndroid Build Coastguard Workerdef CVTv2i8tov2i32 : CVTtoVeci32<V2I8Regs, V2I32Regs, 377*9880d681SAndroid Build Coastguard Worker Vec2CVTStr<"cvt.u32.u16">.s, Zint_extendext8to32>; 378*9880d681SAndroid Build Coastguard Workerdef CVTv2i16tov2i32 : CVTtoVeci32<V2I16Regs, V2I32Regs, 379*9880d681SAndroid Build Coastguard Worker Vec2CVTStr<"cvt.u32.u16">.s, Zint_extendext16to32>; 380*9880d681SAndroid Build Coastguard Workerdef CVTv4i8tov4i32 : CVTtoVeci32<V4I8Regs, V4I32Regs, 381*9880d681SAndroid Build Coastguard Worker Vec4CVTStr<"cvt.u32.u16">.s, Zint_extendext8to32>; 382*9880d681SAndroid Build Coastguard Workerdef CVTv4i16tov4i32 : CVTtoVeci32<V4I16Regs, V4I32Regs, 383*9880d681SAndroid Build Coastguard Worker Vec4CVTStr<"cvt.u32.u16">.s, Zint_extendext16to32>; 384*9880d681SAndroid Build Coastguard Workerdef CVTv2i64tov2i32 : CVTtoVeci32<V2I64Regs, V2I32Regs, 385*9880d681SAndroid Build Coastguard Worker Vec2CVTStr<"cvt.u32.u64">.s, TRUNC_64to32>; 386*9880d681SAndroid Build Coastguard Worker} 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I16Regs:$src1, V2I16Regs:$src2), 389*9880d681SAndroid Build Coastguard Worker (ShiftLV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>; 390*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I8Regs:$src1, V2I8Regs:$src2), 391*9880d681SAndroid Build Coastguard Worker (ShiftLV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>; 392*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I64Regs:$src1, V2I64Regs:$src2), 393*9880d681SAndroid Build Coastguard Worker (ShiftLV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>; 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V4I16Regs:$src1, V4I16Regs:$src2), 396*9880d681SAndroid Build Coastguard Worker (ShiftLV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>; 397*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V4I8Regs:$src1, V4I8Regs:$src2), 398*9880d681SAndroid Build Coastguard Worker (ShiftLV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>; 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 401*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I64 : VecShiftOp<V2AsmStr<"shr.s64">, sra, V2I64Regs, V2I32Regs, 402*9880d681SAndroid Build Coastguard Worker SRAi64rr>; 403*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I32 : VecShiftOp<V2AsmStr<"shr.s32">, sra, V2I32Regs, V2I32Regs, 404*9880d681SAndroid Build Coastguard Worker SRAi32rr>; 405*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I32 : VecShiftOp<V4AsmStr<"shr.s32">, sra, V4I32Regs, V4I32Regs, 406*9880d681SAndroid Build Coastguard Worker SRAi32rr>; 407*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I16 : VecShiftOp<V2AsmStr<"shr.s16">, sra, V2I16Regs, V2I32Regs, 408*9880d681SAndroid Build Coastguard Worker SRAi16rr>; 409*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I16 : VecShiftOp<V4AsmStr<"shr.s16">, sra, V4I16Regs, V4I32Regs, 410*9880d681SAndroid Build Coastguard Worker SRAi16rr>; 411*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I8 : VecShiftOp<V2AsmStr<"shr.s16">, sra, V2I8Regs, V2I32Regs, 412*9880d681SAndroid Build Coastguard Worker SRAi8rr>; 413*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I8 : VecShiftOp<V4AsmStr<"shr.s16">, sra, V4I8Regs, V4I32Regs, 414*9880d681SAndroid Build Coastguard Worker SRAi8rr>; 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I64 : VecShiftOp<V2AsmStr<"shr.u64">, srl, V2I64Regs, V2I32Regs, 417*9880d681SAndroid Build Coastguard Worker SRLi64rr>; 418*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I32 : VecShiftOp<V2AsmStr<"shr.u32">, srl, V2I32Regs, V2I32Regs, 419*9880d681SAndroid Build Coastguard Worker SRLi32rr>; 420*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I32 : VecShiftOp<V4AsmStr<"shr.u32">, srl, V4I32Regs, V4I32Regs, 421*9880d681SAndroid Build Coastguard Worker SRLi32rr>; 422*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I16 : VecShiftOp<V2AsmStr<"shr.u16">, srl, V2I16Regs, V2I32Regs, 423*9880d681SAndroid Build Coastguard Worker SRLi16rr>; 424*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I16 : VecShiftOp<V4AsmStr<"shr.u16">, srl, V4I16Regs, V4I32Regs, 425*9880d681SAndroid Build Coastguard Worker SRLi16rr>; 426*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I8 : VecShiftOp<V2AsmStr<"shr.u16">, srl, V2I8Regs, V2I32Regs, 427*9880d681SAndroid Build Coastguard Worker SRLi8rr>; 428*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I8 : VecShiftOp<V4AsmStr<"shr.u16">, srl, V4I8Regs, V4I32Regs, 429*9880d681SAndroid Build Coastguard Worker SRLi8rr>; 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Workerdefm VMult : IntBinVOp<"mul.lo.s", mul, MULTi64rr, MULTi32rr, MULTi16rr, 432*9880d681SAndroid Build Coastguard Worker MULTi8rr>; 433*9880d681SAndroid Build Coastguard Workerdefm VMultHS : IntBinVOp<"mul.hi.s", mulhs, MULTHSi64rr, MULTHSi32rr, 434*9880d681SAndroid Build Coastguard Worker MULTHSi16rr, 435*9880d681SAndroid Build Coastguard Worker MULTHSi8rr>; 436*9880d681SAndroid Build Coastguard Workerdefm VMultHU : IntBinVOp<"mul.hi.u", mulhu, MULTHUi64rr, MULTHUi32rr, 437*9880d681SAndroid Build Coastguard Worker MULTHUi16rr, 438*9880d681SAndroid Build Coastguard Worker MULTHUi8rr>; 439*9880d681SAndroid Build Coastguard Workerdefm VSDiv : IntBinVOp<"div.s", sdiv, SDIVi64rr, SDIVi32rr, SDIVi16rr, 440*9880d681SAndroid Build Coastguard Worker SDIVi8rr>; 441*9880d681SAndroid Build Coastguard Workerdefm VUDiv : IntBinVOp<"div.u", udiv, UDIVi64rr, UDIVi32rr, UDIVi16rr, 442*9880d681SAndroid Build Coastguard Worker UDIVi8rr>; 443*9880d681SAndroid Build Coastguard Workerdefm VSRem : IntBinVOp<"rem.s", srem, SREMi64rr, SREMi32rr, SREMi16rr, 444*9880d681SAndroid Build Coastguard Worker SREMi8rr>; 445*9880d681SAndroid Build Coastguard Workerdefm VURem : IntBinVOp<"rem.u", urem, UREMi64rr, UREMi32rr, UREMi16rr, 446*9880d681SAndroid Build Coastguard Worker UREMi8rr>; 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I16Regs:$src1, V2I16Regs:$src2), 450*9880d681SAndroid Build Coastguard Worker (ShiftRAV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>; 451*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I8Regs:$src1, V2I8Regs:$src2), 452*9880d681SAndroid Build Coastguard Worker (ShiftRAV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>; 453*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I64Regs:$src1, V2I64Regs:$src2), 454*9880d681SAndroid Build Coastguard Worker (ShiftRAV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V4I16Regs:$src1, V4I16Regs:$src2), 457*9880d681SAndroid Build Coastguard Worker (ShiftRAV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>; 458*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V4I8Regs:$src1, V4I8Regs:$src2), 459*9880d681SAndroid Build Coastguard Worker (ShiftRAV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>; 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I16Regs:$src1, V2I16Regs:$src2), 462*9880d681SAndroid Build Coastguard Worker (ShiftRLV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>; 463*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I8Regs:$src1, V2I8Regs:$src2), 464*9880d681SAndroid Build Coastguard Worker (ShiftRLV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>; 465*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I64Regs:$src1, V2I64Regs:$src2), 466*9880d681SAndroid Build Coastguard Worker (ShiftRLV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>; 467*9880d681SAndroid Build Coastguard Worker 468*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V4I16Regs:$src1, V4I16Regs:$src2), 469*9880d681SAndroid Build Coastguard Worker (ShiftRLV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>; 470*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V4I8Regs:$src1, V4I8Regs:$src2), 471*9880d681SAndroid Build Coastguard Worker (ShiftRLV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>; 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Workermulticlass VMAD<string asmstr, NVPTXRegClass regclassv4, 474*9880d681SAndroid Build Coastguard Worker NVPTXRegClass regclassv2, 475*9880d681SAndroid Build Coastguard Worker SDNode an=add, SDNode mn=mul, NVPTXInst sop=NOP, 476*9880d681SAndroid Build Coastguard Worker Predicate Pred> { 477*9880d681SAndroid Build Coastguard Worker def V4 : NVPTXVecInst<(outs regclassv4:$dst), 478*9880d681SAndroid Build Coastguard Worker (ins regclassv4:$a, regclassv4:$b, regclassv4:$c), 479*9880d681SAndroid Build Coastguard Worker V4MADStr<asmstr>.s, 480*9880d681SAndroid Build Coastguard Worker [(set regclassv4:$dst, 481*9880d681SAndroid Build Coastguard Worker (an (mn regclassv4:$a, regclassv4:$b), regclassv4:$c))], 482*9880d681SAndroid Build Coastguard Worker sop>, 483*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 484*9880d681SAndroid Build Coastguard Worker def V2 : NVPTXVecInst<(outs regclassv2:$dst), 485*9880d681SAndroid Build Coastguard Worker (ins regclassv2:$a, regclassv2:$b, regclassv2:$c), 486*9880d681SAndroid Build Coastguard Worker V2MADStr<asmstr>.s, 487*9880d681SAndroid Build Coastguard Worker [(set regclassv2:$dst, 488*9880d681SAndroid Build Coastguard Worker (an (mn regclassv2:$a, regclassv2:$b), regclassv2:$c))], 489*9880d681SAndroid Build Coastguard Worker sop>, 490*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 491*9880d681SAndroid Build Coastguard Worker} 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Workermulticlass VMADV2Only<string asmstr, NVPTXRegClass regclass, NVPTXInst sop=NOP, 494*9880d681SAndroid Build Coastguard Worker Predicate Pred> { 495*9880d681SAndroid Build Coastguard Worker def V2 : NVPTXVecInst<(outs regclass:$dst), 496*9880d681SAndroid Build Coastguard Worker (ins regclass:$a, regclass:$b, regclass:$c), 497*9880d681SAndroid Build Coastguard Worker V2MADStr<asmstr>.s, 498*9880d681SAndroid Build Coastguard Worker [(set regclass:$dst, (add 499*9880d681SAndroid Build Coastguard Worker (mul regclass:$a, regclass:$b), regclass:$c))], sop>, 500*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 501*9880d681SAndroid Build Coastguard Worker} 502*9880d681SAndroid Build Coastguard Workermulticlass VFMADV2Only<string asmstr, NVPTXRegClass regclass, NVPTXInst sop=NOP, 503*9880d681SAndroid Build Coastguard Worker Predicate Pred> { 504*9880d681SAndroid Build Coastguard Worker def V2 : NVPTXVecInst<(outs regclass:$dst), 505*9880d681SAndroid Build Coastguard Worker (ins regclass:$a, regclass:$b, regclass:$c), 506*9880d681SAndroid Build Coastguard Worker V2MADStr<asmstr>.s, 507*9880d681SAndroid Build Coastguard Worker [(set regclass:$dst, (fadd 508*9880d681SAndroid Build Coastguard Worker (fmul regclass:$a, regclass:$b), regclass:$c))], sop>, 509*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 510*9880d681SAndroid Build Coastguard Worker} 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 513*9880d681SAndroid Build Coastguard Workerdefm I8MAD : VMAD<"mad.lo.s16", V4I8Regs, V2I8Regs, add, mul, MAD8rrr, true>; 514*9880d681SAndroid Build Coastguard Workerdefm I16MAD : VMAD<"mad.lo.s16", V4I16Regs, V2I16Regs, add, mul, MAD16rrr, 515*9880d681SAndroid Build Coastguard Worker true>; 516*9880d681SAndroid Build Coastguard Workerdefm I32MAD : VMAD<"mad.lo.s32", V4I32Regs, V2I32Regs, add, mul, MAD32rrr, 517*9880d681SAndroid Build Coastguard Worker true>; 518*9880d681SAndroid Build Coastguard Workerdefm I64MAD : VMADV2Only<"mad.lo.s64", V2I64Regs, MAD64rrr, true>; 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Workerdefm VNeg : IntUnaryVOp<"neg.s", ineg, INEG64, INEG32, INEG16, INEG8>; 521*9880d681SAndroid Build Coastguard Worker 522*9880d681SAndroid Build Coastguard Workerdefm VAddf : FloatBinVOp<"add.", fadd, FADDf64rr, FADDf32rr, FADDf32rr_ftz>; 523*9880d681SAndroid Build Coastguard Workerdefm VSubf : FloatBinVOp<"sub.", fsub, FSUBf64rr, FSUBf32rr, FSUBf32rr_ftz>; 524*9880d681SAndroid Build Coastguard Workerdefm VMulf : FloatBinVOp<"mul.", fmul, FMULf64rr, FMULf32rr, FMULf32rr_ftz>; 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Workerdefm F32MAD_ftz : VMAD<"mad.ftz.f32", V4F32Regs, V2F32Regs, fadd, fmul, 527*9880d681SAndroid Build Coastguard Worker FMAD32_ftzrrr, doFMADF32_ftz>; 528*9880d681SAndroid Build Coastguard Workerdefm F32FMA_ftz : VMAD<"fma.rn.ftz.f32", V4F32Regs, V2F32Regs, fadd, fmul, 529*9880d681SAndroid Build Coastguard Worker FMA32_ftzrrr, doFMAF32_ftz>; 530*9880d681SAndroid Build Coastguard Workerdefm F32MAD : VMAD<"mad.f32", V4F32Regs, V2F32Regs, fadd, fmul, FMAD32rrr, 531*9880d681SAndroid Build Coastguard Worker doFMADF32>; 532*9880d681SAndroid Build Coastguard Workerdefm F32FMA : VMAD<"fma.rn.f32", V4F32Regs, V2F32Regs, fadd, fmul, FMA32rrr, 533*9880d681SAndroid Build Coastguard Worker doFMAF32>; 534*9880d681SAndroid Build Coastguard Workerdefm F64FMA : VFMADV2Only<"fma.rn.f64", V2F64Regs, FMA64rrr, doFMAF64>; 535*9880d681SAndroid Build Coastguard Worker} 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 538*9880d681SAndroid Build Coastguard Workerdef V4F32Div_prec_ftz : VecBinaryOp<V4AsmStr<"div.rn.ftz.f32">, fdiv, V4F32Regs, 539*9880d681SAndroid Build Coastguard Worker FDIV32rr_prec_ftz>, Requires<[doF32FTZ, reqPTX20]>; 540*9880d681SAndroid Build Coastguard Workerdef V2F32Div_prec_ftz : VecBinaryOp<V2AsmStr<"div.rn.ftz.f32">, fdiv, V2F32Regs, 541*9880d681SAndroid Build Coastguard Worker FDIV32rr_prec_ftz>, Requires<[doF32FTZ, reqPTX20]>; 542*9880d681SAndroid Build Coastguard Workerdef V4F32Div_prec : VecBinaryOp<V4AsmStr<"div.rn.f32">, fdiv, V4F32Regs, 543*9880d681SAndroid Build Coastguard Worker FDIV32rr_prec>, Requires<[reqPTX20]>; 544*9880d681SAndroid Build Coastguard Workerdef V2F32Div_prec : VecBinaryOp<V2AsmStr<"div.rn.f32">, fdiv, V2F32Regs, 545*9880d681SAndroid Build Coastguard Worker FDIV32rr_prec>, Requires<[reqPTX20]>; 546*9880d681SAndroid Build Coastguard Workerdef V2F32Div_ftz : VecBinaryOp<V2AsmStr<"div.full.ftz.f32">, fdiv, V2F32Regs, 547*9880d681SAndroid Build Coastguard Worker FDIV32rr_ftz>, Requires<[doF32FTZ]>; 548*9880d681SAndroid Build Coastguard Workerdef V4F32Div_ftz : VecBinaryOp<V4AsmStr<"div.full.ftz.f32">, fdiv, V4F32Regs, 549*9880d681SAndroid Build Coastguard Worker FDIV32rr_ftz>, Requires<[doF32FTZ]>; 550*9880d681SAndroid Build Coastguard Workerdef V2F32Div : VecBinaryOp<V2AsmStr<"div.full.f32">, fdiv, V2F32Regs, FDIV32rr>; 551*9880d681SAndroid Build Coastguard Workerdef V4F32Div : VecBinaryOp<V4AsmStr<"div.full.f32">, fdiv, V4F32Regs, FDIV32rr>; 552*9880d681SAndroid Build Coastguard Workerdef V2F64Div : VecBinaryOp<V2AsmStr<"div.rn.f64">, fdiv, V2F64Regs, FDIV64rr>; 553*9880d681SAndroid Build Coastguard Worker} 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Workerdef fnegpat : PatFrag<(ops node:$in), (fneg node:$in)>; 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 558*9880d681SAndroid Build Coastguard Workerdef VNegv2f32_ftz : VecUnaryOp<V2UnaryStr<"neg.ftz.f32">, fnegpat, V2F32Regs, 559*9880d681SAndroid Build Coastguard Worker FNEGf32_ftz>, Requires<[doF32FTZ]>; 560*9880d681SAndroid Build Coastguard Workerdef VNegv4f32_ftz : VecUnaryOp<V4UnaryStr<"neg.ftz.f32">, fnegpat, V4F32Regs, 561*9880d681SAndroid Build Coastguard Worker FNEGf32_ftz>, Requires<[doF32FTZ]>; 562*9880d681SAndroid Build Coastguard Workerdef VNegv2f32 : VecUnaryOp<V2UnaryStr<"neg.f32">, fnegpat, V2F32Regs, FNEGf32>; 563*9880d681SAndroid Build Coastguard Workerdef VNegv4f32 : VecUnaryOp<V4UnaryStr<"neg.f32">, fnegpat, V4F32Regs, FNEGf32>; 564*9880d681SAndroid Build Coastguard Workerdef VNegv2f64 : VecUnaryOp<V2UnaryStr<"neg.f64">, fnegpat, V2F64Regs, FNEGf64>; 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard Worker// Logical Arithmetic 567*9880d681SAndroid Build Coastguard Workerdefm VAnd : IntBinVOp<"and.b", and, ANDb64rr, ANDb32rr, ANDb16rr, ANDb8rr>; 568*9880d681SAndroid Build Coastguard Workerdefm VOr : IntBinVOp<"or.b", or, ORb64rr, ORb32rr, ORb16rr, ORb8rr>; 569*9880d681SAndroid Build Coastguard Workerdefm VXor : IntBinVOp<"xor.b", xor, XORb64rr, XORb32rr, XORb16rr, XORb8rr>; 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Workerdefm VNot : IntUnaryVOp<"not.b", not, NOT64, NOT32, NOT16, NOT8>; 572*9880d681SAndroid Build Coastguard Worker} 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Workermulticlass V2FPCONTRACT32_SUB_PAT<NVPTXInst Inst, Predicate Pred> { 576*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub V2F32Regs:$a, (fmul V2F32Regs:$b, V2F32Regs:$c)), 577*9880d681SAndroid Build Coastguard Worker (Inst (VNegv2f32 V2F32Regs:$b), V2F32Regs:$c, V2F32Regs:$a)>, 578*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub (fmul V2F32Regs:$a, V2F32Regs:$b), V2F32Regs:$c), 581*9880d681SAndroid Build Coastguard Worker (Inst V2F32Regs:$a, V2F32Regs:$b, (VNegv2f32 V2F32Regs:$c))>, 582*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 583*9880d681SAndroid Build Coastguard Worker} 584*9880d681SAndroid Build Coastguard Worker 585*9880d681SAndroid Build Coastguard Workerdefm V2FMAF32ext_ftz : V2FPCONTRACT32_SUB_PAT<F32FMA_ftzV2, doFMAF32AGG_ftz>; 586*9880d681SAndroid Build Coastguard Workerdefm V2FMADF32ext_ftz : V2FPCONTRACT32_SUB_PAT<F32MAD_ftzV2, doFMADF32_ftz>; 587*9880d681SAndroid Build Coastguard Workerdefm V2FMAF32ext : V2FPCONTRACT32_SUB_PAT<F32FMAV2, doFMAF32AGG>; 588*9880d681SAndroid Build Coastguard Workerdefm V2FMADF32ext : V2FPCONTRACT32_SUB_PAT<F32MADV2, doFMADF32>; 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Workermulticlass V4FPCONTRACT32_SUB_PAT<NVPTXInst Inst, Predicate Pred> { 591*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub V4F32Regs:$a, (fmul V4F32Regs:$b, V4F32Regs:$c)), 592*9880d681SAndroid Build Coastguard Worker (Inst (VNegv4f32 V4F32Regs:$b), V4F32Regs:$c, V4F32Regs:$a)>, 593*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 594*9880d681SAndroid Build Coastguard Worker 595*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub (fmul V4F32Regs:$a, V4F32Regs:$b), V4F32Regs:$c), 596*9880d681SAndroid Build Coastguard Worker (Inst V4F32Regs:$a, V4F32Regs:$b, (VNegv4f32 V4F32Regs:$c))>, 597*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 598*9880d681SAndroid Build Coastguard Worker} 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Workerdefm V4FMAF32ext_ftz : V4FPCONTRACT32_SUB_PAT<F32FMA_ftzV4, doFMAF32AGG_ftz>; 601*9880d681SAndroid Build Coastguard Workerdefm V4FMADF32ext_ftz : V4FPCONTRACT32_SUB_PAT<F32MAD_ftzV4, doFMADF32_ftz>; 602*9880d681SAndroid Build Coastguard Workerdefm V4FMAF32ext : V4FPCONTRACT32_SUB_PAT<F32FMAV4, doFMAF32AGG>; 603*9880d681SAndroid Build Coastguard Workerdefm V4FMADF32ext : V4FPCONTRACT32_SUB_PAT<F32MADV4, doFMADF32>; 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Workermulticlass V2FPCONTRACT64_SUB_PAT<NVPTXInst Inst, Predicate Pred> { 606*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub V2F64Regs:$a, (fmul V2F64Regs:$b, V2F64Regs:$c)), 607*9880d681SAndroid Build Coastguard Worker (Inst (VNegv2f64 V2F64Regs:$b), V2F64Regs:$c, V2F64Regs:$a)>, 608*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker def : Pat<(fsub (fmul V2F64Regs:$a, V2F64Regs:$b), V2F64Regs:$c), 611*9880d681SAndroid Build Coastguard Worker (Inst V2F64Regs:$a, V2F64Regs:$b, (VNegv2f64 V2F64Regs:$c))>, 612*9880d681SAndroid Build Coastguard Worker Requires<[Pred]>; 613*9880d681SAndroid Build Coastguard Worker} 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard Workerdefm V2FMAF64ext : V2FPCONTRACT64_SUB_PAT<F64FMAV2, doFMAF64AGG>; 616*9880d681SAndroid Build Coastguard Worker 617*9880d681SAndroid Build Coastguard Workerclass VecModStr<string vecsize, string elem, string extra, string l=""> 618*9880d681SAndroid Build Coastguard Worker{ 619*9880d681SAndroid Build Coastguard Worker string t1 = !strconcat("${c", elem); 620*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, ":vecv"); 621*9880d681SAndroid Build Coastguard Worker string t3 = !strconcat(t2, vecsize); 622*9880d681SAndroid Build Coastguard Worker string t4 = !strconcat(t3, extra); 623*9880d681SAndroid Build Coastguard Worker string t5 = !strconcat(t4, l); 624*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t5, "}"); 625*9880d681SAndroid Build Coastguard Worker} 626*9880d681SAndroid Build Coastguard Workerclass ShuffleOneLine<string vecsize, string elem, string type> 627*9880d681SAndroid Build Coastguard Worker{ 628*9880d681SAndroid Build Coastguard Worker string t1 = VecModStr<vecsize, elem, "comm", "1">.s; 629*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, "mov."); 630*9880d681SAndroid Build Coastguard Worker string t3 = !strconcat(t2, type); 631*9880d681SAndroid Build Coastguard Worker string t4 = !strconcat(t3, " \t${dst}_"); 632*9880d681SAndroid Build Coastguard Worker string t5 = !strconcat(t4, elem); 633*9880d681SAndroid Build Coastguard Worker string t6 = !strconcat(t5, ", $src1"); 634*9880d681SAndroid Build Coastguard Worker string t7 = !strconcat(t6, VecModStr<vecsize, elem, "pos">.s); 635*9880d681SAndroid Build Coastguard Worker string t8 = !strconcat(t7, ";\n\t"); 636*9880d681SAndroid Build Coastguard Worker string t9 = !strconcat(t8, VecModStr<vecsize, elem, "comm", "2">.s); 637*9880d681SAndroid Build Coastguard Worker string t10 = !strconcat(t9, "mov."); 638*9880d681SAndroid Build Coastguard Worker string t11 = !strconcat(t10, type); 639*9880d681SAndroid Build Coastguard Worker string t12 = !strconcat(t11, " \t${dst}_"); 640*9880d681SAndroid Build Coastguard Worker string t13 = !strconcat(t12, elem); 641*9880d681SAndroid Build Coastguard Worker string t14 = !strconcat(t13, ", $src2"); 642*9880d681SAndroid Build Coastguard Worker string t15 = !strconcat(t14, VecModStr<vecsize, elem, "pos">.s); 643*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t15, ";"); 644*9880d681SAndroid Build Coastguard Worker} 645*9880d681SAndroid Build Coastguard Workerclass ShuffleAsmStr2<string type> 646*9880d681SAndroid Build Coastguard Worker{ 647*9880d681SAndroid Build Coastguard Worker string t1 = ShuffleOneLine<"2", "0", type>.s; 648*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, "\n\t"); 649*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t2, ShuffleOneLine<"2", "1", type>.s); 650*9880d681SAndroid Build Coastguard Worker} 651*9880d681SAndroid Build Coastguard Workerclass ShuffleAsmStr4<string type> 652*9880d681SAndroid Build Coastguard Worker{ 653*9880d681SAndroid Build Coastguard Worker string t1 = ShuffleOneLine<"4", "0", type>.s; 654*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, "\n\t"); 655*9880d681SAndroid Build Coastguard Worker string t3 = !strconcat(t2, ShuffleOneLine<"4", "1", type>.s); 656*9880d681SAndroid Build Coastguard Worker string t4 = !strconcat(t3, "\n\t"); 657*9880d681SAndroid Build Coastguard Worker string t5 = !strconcat(t4, ShuffleOneLine<"4", "2", type>.s); 658*9880d681SAndroid Build Coastguard Worker string t6 = !strconcat(t5, "\n\t"); 659*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t6, ShuffleOneLine<"4", "3", type>.s); 660*9880d681SAndroid Build Coastguard Worker} 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Workerlet hasSideEffects=0, VecInstType=isVecShuffle.Value in { 663*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4f32 : NVPTXVecInst<(outs V4F32Regs:$dst), 664*9880d681SAndroid Build Coastguard Worker (ins V4F32Regs:$src1, V4F32Regs:$src2, 665*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3), 666*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t", 667*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr4<"f32">.s), 668*9880d681SAndroid Build Coastguard Worker [], FMOV32rr>; 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i32 : NVPTXVecInst<(outs V4I32Regs:$dst), 671*9880d681SAndroid Build Coastguard Worker (ins V4I32Regs:$src1, V4I32Regs:$src2, 672*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3), 673*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t", 674*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr4<"u32">.s), 675*9880d681SAndroid Build Coastguard Worker [], IMOV32rr>; 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i16 : NVPTXVecInst<(outs V4I16Regs:$dst), 678*9880d681SAndroid Build Coastguard Worker (ins V4I16Regs:$src1, V4I16Regs:$src2, 679*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3), 680*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t", 681*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr4<"u16">.s), 682*9880d681SAndroid Build Coastguard Worker [], IMOV16rr>; 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i8 : NVPTXVecInst<(outs V4I8Regs:$dst), 685*9880d681SAndroid Build Coastguard Worker (ins V4I8Regs:$src1, V4I8Regs:$src2, 686*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3), 687*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t", 688*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr4<"u16">.s), 689*9880d681SAndroid Build Coastguard Worker [], IMOV8rr>; 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2f32 : NVPTXVecInst<(outs V2F32Regs:$dst), 692*9880d681SAndroid Build Coastguard Worker (ins V2F32Regs:$src1, V2F32Regs:$src2, 693*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 694*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 695*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"f32">.s), 696*9880d681SAndroid Build Coastguard Worker [], FMOV32rr>; 697*9880d681SAndroid Build Coastguard Worker 698*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i32 : NVPTXVecInst<(outs V2I32Regs:$dst), 699*9880d681SAndroid Build Coastguard Worker (ins V2I32Regs:$src1, V2I32Regs:$src2, 700*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 701*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 702*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"u32">.s), 703*9880d681SAndroid Build Coastguard Worker [], IMOV32rr>; 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i8 : NVPTXVecInst<(outs V2I8Regs:$dst), 706*9880d681SAndroid Build Coastguard Worker (ins V2I8Regs:$src1, V2I8Regs:$src2, 707*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 708*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 709*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"u16">.s), 710*9880d681SAndroid Build Coastguard Worker [], IMOV8rr>; 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i16 : NVPTXVecInst<(outs V2I16Regs:$dst), 713*9880d681SAndroid Build Coastguard Worker (ins V2I16Regs:$src1, V2I16Regs:$src2, 714*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 715*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 716*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"u16">.s), 717*9880d681SAndroid Build Coastguard Worker [], IMOV16rr>; 718*9880d681SAndroid Build Coastguard Worker 719*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2f64 : NVPTXVecInst<(outs V2F64Regs:$dst), 720*9880d681SAndroid Build Coastguard Worker (ins V2F64Regs:$src1, V2F64Regs:$src2, 721*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 722*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 723*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"f64">.s), 724*9880d681SAndroid Build Coastguard Worker [], FMOV64rr>; 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i64 : NVPTXVecInst<(outs V2I64Regs:$dst), 727*9880d681SAndroid Build Coastguard Worker (ins V2I64Regs:$src1, V2I64Regs:$src2, 728*9880d681SAndroid Build Coastguard Worker i8imm:$c0, i8imm:$c1), 729*9880d681SAndroid Build Coastguard Worker !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t", 730*9880d681SAndroid Build Coastguard Worker ShuffleAsmStr2<"u64">.s), 731*9880d681SAndroid Build Coastguard Worker [], IMOV64rr>; 732*9880d681SAndroid Build Coastguard Worker} 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Workerdef ShuffleMask0 : SDNodeXForm<vector_shuffle, [{ 735*9880d681SAndroid Build Coastguard Worker ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N); 736*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(SVOp->getMaskElt(0), SDLoc(N), MVT::i32); 737*9880d681SAndroid Build Coastguard Worker}]>; 738*9880d681SAndroid Build Coastguard Workerdef ShuffleMask1 : SDNodeXForm<vector_shuffle, [{ 739*9880d681SAndroid Build Coastguard Worker ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N); 740*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(SVOp->getMaskElt(1), SDLoc(N), MVT::i32); 741*9880d681SAndroid Build Coastguard Worker}]>; 742*9880d681SAndroid Build Coastguard Workerdef ShuffleMask2 : SDNodeXForm<vector_shuffle, [{ 743*9880d681SAndroid Build Coastguard Worker ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N); 744*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(SVOp->getMaskElt(2), SDLoc(N), MVT::i32); 745*9880d681SAndroid Build Coastguard Worker}]>; 746*9880d681SAndroid Build Coastguard Workerdef ShuffleMask3 : SDNodeXForm<vector_shuffle, [{ 747*9880d681SAndroid Build Coastguard Worker ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N); 748*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(SVOp->getMaskElt(3), SDLoc(N), MVT::i32); 749*9880d681SAndroid Build Coastguard Worker}]>; 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Worker// The spurious call is here to silence a compiler warning about N being 752*9880d681SAndroid Build Coastguard Worker// unused. 753*9880d681SAndroid Build Coastguard Workerdef vec_shuf : PatFrag<(ops node:$lhs, node:$rhs), 754*9880d681SAndroid Build Coastguard Worker (vector_shuffle node:$lhs, node:$rhs), 755*9880d681SAndroid Build Coastguard Worker [{ N->getGluedNode(); return true; }]>; 756*9880d681SAndroid Build Coastguard Worker 757*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (vec_shuf:$op V2F64Regs:$src1, V2F64Regs:$src2)), 758*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2f64 V2F64Regs:$src1, V2F64Regs:$src2, 759*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 760*9880d681SAndroid Build Coastguard Worker 761*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (vec_shuf:$op V4F32Regs:$src1, V4F32Regs:$src2)), 762*9880d681SAndroid Build Coastguard Worker (VecShuffle_v4f32 V4F32Regs:$src1, V4F32Regs:$src2, 763*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op), 764*9880d681SAndroid Build Coastguard Worker (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>; 765*9880d681SAndroid Build Coastguard Worker 766*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (vec_shuf:$op V2F32Regs:$src1, V2F32Regs:$src2)), 767*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2f32 V2F32Regs:$src1, V2F32Regs:$src2, 768*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 769*9880d681SAndroid Build Coastguard Worker 770*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (vec_shuf:$op V2I64Regs:$src1, V2I64Regs:$src2)), 771*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2i64 V2I64Regs:$src1, V2I64Regs:$src2, 772*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 773*9880d681SAndroid Build Coastguard Worker 774*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (vec_shuf:$op V4I32Regs:$src1, V4I32Regs:$src2)), 775*9880d681SAndroid Build Coastguard Worker (VecShuffle_v4i32 V4I32Regs:$src1, V4I32Regs:$src2, 776*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op), 777*9880d681SAndroid Build Coastguard Worker (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>; 778*9880d681SAndroid Build Coastguard Worker 779*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (vec_shuf:$op V2I32Regs:$src1, V2I32Regs:$src2)), 780*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2i32 V2I32Regs:$src1, V2I32Regs:$src2, 781*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 782*9880d681SAndroid Build Coastguard Worker 783*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (vec_shuf:$op V4I16Regs:$src1, V4I16Regs:$src2)), 784*9880d681SAndroid Build Coastguard Worker (VecShuffle_v4i16 V4I16Regs:$src1, V4I16Regs:$src2, 785*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op), 786*9880d681SAndroid Build Coastguard Worker (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>; 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (vec_shuf:$op V2I16Regs:$src1, V2I16Regs:$src2)), 789*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2i16 V2I16Regs:$src1, V2I16Regs:$src2, 790*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 791*9880d681SAndroid Build Coastguard Worker 792*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (vec_shuf:$op V4I8Regs:$src1, V4I8Regs:$src2)), 793*9880d681SAndroid Build Coastguard Worker (VecShuffle_v4i8 V4I8Regs:$src1, V4I8Regs:$src2, 794*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op), 795*9880d681SAndroid Build Coastguard Worker (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>; 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (vec_shuf:$op V2I8Regs:$src1, V2I8Regs:$src2)), 798*9880d681SAndroid Build Coastguard Worker (VecShuffle_v2i8 V2I8Regs:$src1, V2I8Regs:$src2, 799*9880d681SAndroid Build Coastguard Worker (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Workerclass Build_Vector2<string asmstr, NVPTXRegClass vclass, NVPTXRegClass sclass, 802*9880d681SAndroid Build Coastguard Worker NVPTXInst si> 803*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs vclass:$dst), 804*9880d681SAndroid Build Coastguard Worker (ins sclass:$a1, sclass:$a2), 805*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t${dst:vecfull}, {{$a1, $a2}};"), 806*9880d681SAndroid Build Coastguard Worker [(set vclass:$dst, (build_vector sclass:$a1, sclass:$a2))], 807*9880d681SAndroid Build Coastguard Worker si>; 808*9880d681SAndroid Build Coastguard Workerclass Build_Vector4<string asmstr, NVPTXRegClass vclass, NVPTXRegClass sclass, 809*9880d681SAndroid Build Coastguard Worker NVPTXInst si> 810*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs vclass:$dst), 811*9880d681SAndroid Build Coastguard Worker (ins sclass:$a1, sclass:$a2, sclass:$a3, sclass:$a4), 812*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t${dst:vecfull}, {{$a1, $a2, $a3, $a4}};"), 813*9880d681SAndroid Build Coastguard Worker [(set vclass:$dst, 814*9880d681SAndroid Build Coastguard Worker (build_vector sclass:$a1, sclass:$a2, 815*9880d681SAndroid Build Coastguard Worker sclass:$a3, sclass:$a4))], si>; 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecBuild.Value in { 818*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_f32 : Build_Vector2<"mov.v2.f32", V2F32Regs, Float32Regs, 819*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 820*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_f64 : Build_Vector2<"mov.v2.f64", V2F64Regs, Float64Regs, 821*9880d681SAndroid Build Coastguard Worker FMOV64rr>; 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i32 : Build_Vector2<"mov.v2.u32", V2I32Regs, Int32Regs, 824*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 825*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i64 : Build_Vector2<"mov.v2.u64", V2I64Regs, Int64Regs, 826*9880d681SAndroid Build Coastguard Worker IMOV64rr>; 827*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i16 : Build_Vector2<"mov.v2.u16", V2I16Regs, Int16Regs, 828*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 829*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i8 : Build_Vector2<"mov.v2.u16", V2I8Regs, Int8Regs, 830*9880d681SAndroid Build Coastguard Worker IMOV8rr>; 831*9880d681SAndroid Build Coastguard Worker 832*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_f32 : Build_Vector4<"mov.v4.f32", V4F32Regs, Float32Regs, 833*9880d681SAndroid Build Coastguard Worker FMOV32rr>; 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i32 : Build_Vector4<"mov.v4.u32", V4I32Regs, Int32Regs, 836*9880d681SAndroid Build Coastguard Worker IMOV32rr>; 837*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i16 : Build_Vector4<"mov.v4.u16", V4I16Regs, Int16Regs, 838*9880d681SAndroid Build Coastguard Worker IMOV16rr>; 839*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i8 : Build_Vector4<"mov.v4.u16", V4I8Regs, Int8Regs, 840*9880d681SAndroid Build Coastguard Worker IMOV8rr>; 841*9880d681SAndroid Build Coastguard Worker} 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard Workerclass Vec_Move<string asmstr, NVPTXRegClass vclass, NVPTXInst sop=NOP> 844*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs vclass:$dst), (ins vclass:$src), 845*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t${dst:vecfull}, ${src:vecfull};"), 846*9880d681SAndroid Build Coastguard Worker [], sop>; 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, hasSideEffects=0, IsSimpleMove=1, 849*9880d681SAndroid Build Coastguard Worker VecInstType=isVecOther.Value in { 850*9880d681SAndroid Build Coastguard Workerdef V4f32Mov : Vec_Move<"mov.v4.f32", V4F32Regs, FMOV32rr>; 851*9880d681SAndroid Build Coastguard Workerdef V2f32Mov : Vec_Move<"mov.v2.f32", V2F32Regs, FMOV32rr>; 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Workerdef V4i32Mov : Vec_Move<"mov.v4.u32", V4I32Regs, IMOV32rr>; 854*9880d681SAndroid Build Coastguard Workerdef V2i32Mov : Vec_Move<"mov.v2.u32", V2I32Regs, IMOV32rr>; 855*9880d681SAndroid Build Coastguard Worker 856*9880d681SAndroid Build Coastguard Workerdef V4i16Mov : Vec_Move<"mov.v4.u16", V4I16Regs, IMOV16rr>; 857*9880d681SAndroid Build Coastguard Workerdef V2i16Mov : Vec_Move<"mov.v2.u16", V2I16Regs, IMOV16rr>; 858*9880d681SAndroid Build Coastguard Worker 859*9880d681SAndroid Build Coastguard Workerdef V4i8Mov : Vec_Move<"mov.v4.u16", V4I8Regs, IMOV8rr>; 860*9880d681SAndroid Build Coastguard Workerdef V2i8Mov : Vec_Move<"mov.v2.u16", V2I8Regs, IMOV8rr>; 861*9880d681SAndroid Build Coastguard Worker 862*9880d681SAndroid Build Coastguard Workerdef V2f64Mov : Vec_Move<"mov.v2.f64", V2F64Regs, FMOV64rr>; 863*9880d681SAndroid Build Coastguard Workerdef V2i64Mov : Vec_Move<"mov.v2.u64", V2I64Regs, IMOV64rr>; 864*9880d681SAndroid Build Coastguard Worker} 865*9880d681SAndroid Build Coastguard Worker 866*9880d681SAndroid Build Coastguard Worker// extract subvector patterns 867*9880d681SAndroid Build Coastguard Workerdef extract_subvec : SDNode<"ISD::EXTRACT_SUBVECTOR", 868*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisPtrTy<2>]>>; 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvec V4F32Regs:$src, 0)), 871*9880d681SAndroid Build Coastguard Worker (Build_Vector2_f32 (V4f32Extract V4F32Regs:$src, 0), 872*9880d681SAndroid Build Coastguard Worker (V4f32Extract V4F32Regs:$src, 1))>; 873*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvec V4F32Regs:$src, 2)), 874*9880d681SAndroid Build Coastguard Worker (Build_Vector2_f32 (V4f32Extract V4F32Regs:$src, 2), 875*9880d681SAndroid Build Coastguard Worker (V4f32Extract V4F32Regs:$src, 3))>; 876*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvec V4I32Regs:$src, 0)), 877*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i32 (V4i32Extract V4I32Regs:$src, 0), 878*9880d681SAndroid Build Coastguard Worker (V4i32Extract V4I32Regs:$src, 1))>; 879*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvec V4I32Regs:$src, 2)), 880*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i32 (V4i32Extract V4I32Regs:$src, 2), 881*9880d681SAndroid Build Coastguard Worker (V4i32Extract V4I32Regs:$src, 3))>; 882*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (extract_subvec V4I16Regs:$src, 0)), 883*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i16 (V4i16Extract V4I16Regs:$src, 0), 884*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$src, 1))>; 885*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (extract_subvec V4I16Regs:$src, 2)), 886*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i16 (V4i16Extract V4I16Regs:$src, 2), 887*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$src, 3))>; 888*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (extract_subvec V4I8Regs:$src, 0)), 889*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i8 (V4i8Extract V4I8Regs:$src, 0), 890*9880d681SAndroid Build Coastguard Worker (V4i8Extract V4I8Regs:$src, 1))>; 891*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (extract_subvec V4I8Regs:$src, 2)), 892*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i8 (V4i8Extract V4I8Regs:$src, 2), 893*9880d681SAndroid Build Coastguard Worker (V4i8Extract V4I8Regs:$src, 3))>; 894*9880d681SAndroid Build Coastguard Worker 895*9880d681SAndroid Build Coastguard Worker// Select instructions 896*9880d681SAndroid Build Coastguard Workerclass Select_OneLine<string type, string pos> { 897*9880d681SAndroid Build Coastguard Worker string t1 = !strconcat("selp.", type); 898*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, " \t${dst}_"); 899*9880d681SAndroid Build Coastguard Worker string t3 = !strconcat(t2, pos); 900*9880d681SAndroid Build Coastguard Worker string t4 = !strconcat(t3, ", ${src1}_"); 901*9880d681SAndroid Build Coastguard Worker string t5 = !strconcat(t4, pos); 902*9880d681SAndroid Build Coastguard Worker string t6 = !strconcat(t5, ", ${src2}_"); 903*9880d681SAndroid Build Coastguard Worker string t7 = !strconcat(t6, pos); 904*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t7, ", $p;"); 905*9880d681SAndroid Build Coastguard Worker} 906*9880d681SAndroid Build Coastguard Worker 907*9880d681SAndroid Build Coastguard Workerclass Select_Str2<string type> { 908*9880d681SAndroid Build Coastguard Worker string t1 = Select_OneLine<type, "0">.s; 909*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, "\n\t"); 910*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t2, Select_OneLine<type, "1">.s); 911*9880d681SAndroid Build Coastguard Worker} 912*9880d681SAndroid Build Coastguard Worker 913*9880d681SAndroid Build Coastguard Workerclass Select_Str4<string type> { 914*9880d681SAndroid Build Coastguard Worker string t1 = Select_OneLine<type, "0">.s; 915*9880d681SAndroid Build Coastguard Worker string t2 = !strconcat(t1, "\n\t"); 916*9880d681SAndroid Build Coastguard Worker string t3 = !strconcat(t2, Select_OneLine<type, "1">.s); 917*9880d681SAndroid Build Coastguard Worker string t4 = !strconcat(t3, "\n\t"); 918*9880d681SAndroid Build Coastguard Worker string t5 = !strconcat(t4, Select_OneLine<type, "2">.s); 919*9880d681SAndroid Build Coastguard Worker string t6 = !strconcat(t5, "\n\t"); 920*9880d681SAndroid Build Coastguard Worker string s = !strconcat(t6, Select_OneLine<type, "3">.s); 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Worker} 923*9880d681SAndroid Build Coastguard Worker 924*9880d681SAndroid Build Coastguard Workerclass Vec_Select<NVPTXRegClass vclass, string asmstr, NVPTXInst sop> 925*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs vclass:$dst), 926*9880d681SAndroid Build Coastguard Worker (ins vclass:$src1, vclass:$src2, Int1Regs:$p), 927*9880d681SAndroid Build Coastguard Worker asmstr, 928*9880d681SAndroid Build Coastguard Worker [(set vclass:$dst, (select Int1Regs:$p, vclass:$src1, 929*9880d681SAndroid Build Coastguard Worker vclass:$src2))], 930*9880d681SAndroid Build Coastguard Worker sop>; 931*9880d681SAndroid Build Coastguard Worker 932*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 933*9880d681SAndroid Build Coastguard Workerdef V2I64_Select : Vec_Select<V2I64Regs, Select_Str2<"b64">.s, SELECTi64rr>; 934*9880d681SAndroid Build Coastguard Workerdef V4I32_Select : Vec_Select<V4I32Regs, Select_Str4<"b32">.s, SELECTi32rr>; 935*9880d681SAndroid Build Coastguard Workerdef V2I32_Select : Vec_Select<V2I32Regs, Select_Str2<"b32">.s, SELECTi32rr>; 936*9880d681SAndroid Build Coastguard Workerdef V4I16_Select : Vec_Select<V4I16Regs, Select_Str4<"b16">.s, SELECTi16rr>; 937*9880d681SAndroid Build Coastguard Workerdef V2I16_Select : Vec_Select<V2I16Regs, Select_Str2<"b16">.s, SELECTi16rr>; 938*9880d681SAndroid Build Coastguard Workerdef V4I8_Select : Vec_Select<V4I8Regs, Select_Str4<"b16">.s, SELECTi8rr>; 939*9880d681SAndroid Build Coastguard Workerdef V2I8_Select : Vec_Select<V2I8Regs, Select_Str2<"b16">.s, SELECTi8rr>; 940*9880d681SAndroid Build Coastguard Worker 941*9880d681SAndroid Build Coastguard Workerdef V2F64_Select : Vec_Select<V2F64Regs, Select_Str2<"f64">.s, SELECTf64rr>; 942*9880d681SAndroid Build Coastguard Workerdef V4F32_Select : Vec_Select<V4F32Regs, Select_Str4<"f32">.s, SELECTf32rr>; 943*9880d681SAndroid Build Coastguard Workerdef V2F32_Select : Vec_Select<V2F32Regs, Select_Str2<"f32">.s, SELECTf32rr>; 944*9880d681SAndroid Build Coastguard Worker} 945*9880d681SAndroid Build Coastguard Worker 946*9880d681SAndroid Build Coastguard Worker// Comparison instructions 947*9880d681SAndroid Build Coastguard Worker 948*9880d681SAndroid Build Coastguard Worker// setcc convenience fragments. 949*9880d681SAndroid Build Coastguard Workerdef vsetoeq : PatFrag<(ops node:$lhs, node:$rhs), 950*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETOEQ)>; 951*9880d681SAndroid Build Coastguard Workerdef vsetogt : PatFrag<(ops node:$lhs, node:$rhs), 952*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETOGT)>; 953*9880d681SAndroid Build Coastguard Workerdef vsetoge : PatFrag<(ops node:$lhs, node:$rhs), 954*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETOGE)>; 955*9880d681SAndroid Build Coastguard Workerdef vsetolt : PatFrag<(ops node:$lhs, node:$rhs), 956*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETOLT)>; 957*9880d681SAndroid Build Coastguard Workerdef vsetole : PatFrag<(ops node:$lhs, node:$rhs), 958*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETOLE)>; 959*9880d681SAndroid Build Coastguard Workerdef vsetone : PatFrag<(ops node:$lhs, node:$rhs), 960*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETONE)>; 961*9880d681SAndroid Build Coastguard Workerdef vseto : PatFrag<(ops node:$lhs, node:$rhs), 962*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETO)>; 963*9880d681SAndroid Build Coastguard Workerdef vsetuo : PatFrag<(ops node:$lhs, node:$rhs), 964*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETUO)>; 965*9880d681SAndroid Build Coastguard Workerdef vsetueq : PatFrag<(ops node:$lhs, node:$rhs), 966*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETUEQ)>; 967*9880d681SAndroid Build Coastguard Workerdef vsetugt : PatFrag<(ops node:$lhs, node:$rhs), 968*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETUGT)>; 969*9880d681SAndroid Build Coastguard Workerdef vsetuge : PatFrag<(ops node:$lhs, node:$rhs), 970*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETUGE)>; 971*9880d681SAndroid Build Coastguard Workerdef vsetult : PatFrag<(ops node:$lhs, node:$rhs), 972*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETULT)>; 973*9880d681SAndroid Build Coastguard Workerdef vsetule : PatFrag<(ops node:$lhs, node:$rhs), 974*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETULE)>; 975*9880d681SAndroid Build Coastguard Workerdef vsetune : PatFrag<(ops node:$lhs, node:$rhs), 976*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETUNE)>; 977*9880d681SAndroid Build Coastguard Workerdef vseteq : PatFrag<(ops node:$lhs, node:$rhs), 978*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETEQ)>; 979*9880d681SAndroid Build Coastguard Workerdef vsetgt : PatFrag<(ops node:$lhs, node:$rhs), 980*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETGT)>; 981*9880d681SAndroid Build Coastguard Workerdef vsetge : PatFrag<(ops node:$lhs, node:$rhs), 982*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETGE)>; 983*9880d681SAndroid Build Coastguard Workerdef vsetlt : PatFrag<(ops node:$lhs, node:$rhs), 984*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETLT)>; 985*9880d681SAndroid Build Coastguard Workerdef vsetle : PatFrag<(ops node:$lhs, node:$rhs), 986*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETLE)>; 987*9880d681SAndroid Build Coastguard Workerdef vsetne : PatFrag<(ops node:$lhs, node:$rhs), 988*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, SETNE)>; 989*9880d681SAndroid Build Coastguard Worker 990*9880d681SAndroid Build Coastguard Workerclass Vec_Compare<PatFrag op, NVPTXRegClass outrclass, NVPTXRegClass inrclass, 991*9880d681SAndroid Build Coastguard Worker NVPTXInst sop> 992*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs outrclass:$dst), 993*9880d681SAndroid Build Coastguard Worker (ins inrclass:$a, inrclass:$b), 994*9880d681SAndroid Build Coastguard Worker "Unsupported", 995*9880d681SAndroid Build Coastguard Worker [(set outrclass:$dst, (op inrclass:$a, inrclass:$b))], 996*9880d681SAndroid Build Coastguard Worker sop>; 997*9880d681SAndroid Build Coastguard Worker 998*9880d681SAndroid Build Coastguard Workermulticlass Vec_Compare_All<PatFrag op, 999*9880d681SAndroid Build Coastguard Worker NVPTXInst inst8, 1000*9880d681SAndroid Build Coastguard Worker NVPTXInst inst16, 1001*9880d681SAndroid Build Coastguard Worker NVPTXInst inst32, 1002*9880d681SAndroid Build Coastguard Worker NVPTXInst inst64> 1003*9880d681SAndroid Build Coastguard Worker{ 1004*9880d681SAndroid Build Coastguard Worker def V2I8 : Vec_Compare<op, V2I8Regs, V2I8Regs, inst8>; 1005*9880d681SAndroid Build Coastguard Worker def V4I8 : Vec_Compare<op, V4I8Regs, V4I8Regs, inst8>; 1006*9880d681SAndroid Build Coastguard Worker def V2I16 : Vec_Compare<op, V2I16Regs, V2I16Regs, inst16>; 1007*9880d681SAndroid Build Coastguard Worker def V4I16 : Vec_Compare<op, V4I16Regs, V4I16Regs, inst16>; 1008*9880d681SAndroid Build Coastguard Worker def V2I32 : Vec_Compare<op, V2I32Regs, V2I32Regs, inst32>; 1009*9880d681SAndroid Build Coastguard Worker def V4I32 : Vec_Compare<op, V4I32Regs, V4I32Regs, inst32>; 1010*9880d681SAndroid Build Coastguard Worker def V2I64 : Vec_Compare<op, V2I64Regs, V2I64Regs, inst64>; 1011*9880d681SAndroid Build Coastguard Worker} 1012*9880d681SAndroid Build Coastguard Worker 1013*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 1014*9880d681SAndroid Build Coastguard Worker defm VecSGT : Vec_Compare_All<vsetgt, ISetSGTi8rr_toi8, ISetSGTi16rr_toi16, 1015*9880d681SAndroid Build Coastguard Worker ISetSGTi32rr_toi32, ISetSGTi64rr_toi64>; 1016*9880d681SAndroid Build Coastguard Worker defm VecUGT : Vec_Compare_All<vsetugt, ISetUGTi8rr_toi8, ISetUGTi16rr_toi16, 1017*9880d681SAndroid Build Coastguard Worker ISetUGTi32rr_toi32, ISetUGTi64rr_toi64>; 1018*9880d681SAndroid Build Coastguard Worker defm VecSLT : Vec_Compare_All<vsetlt, ISetSLTi8rr_toi8, ISetSLTi16rr_toi16, 1019*9880d681SAndroid Build Coastguard Worker ISetSLTi32rr_toi32, ISetSLTi64rr_toi64>; 1020*9880d681SAndroid Build Coastguard Worker defm VecULT : Vec_Compare_All<vsetult, ISetULTi8rr_toi8, ISetULTi16rr_toi16, 1021*9880d681SAndroid Build Coastguard Worker ISetULTi32rr_toi32, ISetULTi64rr_toi64>; 1022*9880d681SAndroid Build Coastguard Worker defm VecSGE : Vec_Compare_All<vsetge, ISetSGEi8rr_toi8, ISetSGEi16rr_toi16, 1023*9880d681SAndroid Build Coastguard Worker ISetSGEi32rr_toi32, ISetSGEi64rr_toi64>; 1024*9880d681SAndroid Build Coastguard Worker defm VecUGE : Vec_Compare_All<vsetuge, ISetUGEi8rr_toi8, ISetUGEi16rr_toi16, 1025*9880d681SAndroid Build Coastguard Worker ISetUGEi32rr_toi32, ISetUGEi64rr_toi64>; 1026*9880d681SAndroid Build Coastguard Worker defm VecSLE : Vec_Compare_All<vsetle, ISetSLEi8rr_toi8, ISetSLEi16rr_toi16, 1027*9880d681SAndroid Build Coastguard Worker ISetSLEi32rr_toi32, ISetSLEi64rr_toi64>; 1028*9880d681SAndroid Build Coastguard Worker defm VecULE : Vec_Compare_All<vsetule, ISetULEi8rr_toi8, ISetULEi16rr_toi16, 1029*9880d681SAndroid Build Coastguard Worker ISetULEi32rr_toi32, ISetULEi64rr_toi64>; 1030*9880d681SAndroid Build Coastguard Worker defm VecSEQ : Vec_Compare_All<vseteq, ISetSEQi8rr_toi8, ISetSEQi16rr_toi16, 1031*9880d681SAndroid Build Coastguard Worker ISetSEQi32rr_toi32, ISetSEQi64rr_toi64>; 1032*9880d681SAndroid Build Coastguard Worker defm VecUEQ : Vec_Compare_All<vsetueq, ISetUEQi8rr_toi8, ISetUEQi16rr_toi16, 1033*9880d681SAndroid Build Coastguard Worker ISetUEQi32rr_toi32, ISetUEQi64rr_toi64>; 1034*9880d681SAndroid Build Coastguard Worker defm VecSNE : Vec_Compare_All<vsetne, ISetSNEi8rr_toi8, ISetSNEi16rr_toi16, 1035*9880d681SAndroid Build Coastguard Worker ISetSNEi32rr_toi32, ISetSNEi64rr_toi64>; 1036*9880d681SAndroid Build Coastguard Worker defm VecUNE : Vec_Compare_All<vsetune, ISetUNEi8rr_toi8, ISetUNEi16rr_toi16, 1037*9880d681SAndroid Build Coastguard Worker ISetUNEi32rr_toi32, ISetUNEi64rr_toi64>; 1038*9880d681SAndroid Build Coastguard Worker} 1039*9880d681SAndroid Build Coastguard Worker 1040*9880d681SAndroid Build Coastguard Workermulticlass FVec_Compare_All<PatFrag op, 1041*9880d681SAndroid Build Coastguard Worker NVPTXInst instf32, 1042*9880d681SAndroid Build Coastguard Worker NVPTXInst instf64> 1043*9880d681SAndroid Build Coastguard Worker{ 1044*9880d681SAndroid Build Coastguard Worker def V2F32 : Vec_Compare<op, V2I32Regs, V2F32Regs, instf32>; 1045*9880d681SAndroid Build Coastguard Worker def V4F32 : Vec_Compare<op, V4I32Regs, V4F32Regs, instf32>; 1046*9880d681SAndroid Build Coastguard Worker def V2F64 : Vec_Compare<op, V2I64Regs, V2F64Regs, instf64>; 1047*9880d681SAndroid Build Coastguard Worker} 1048*9880d681SAndroid Build Coastguard Worker 1049*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in { 1050*9880d681SAndroid Build Coastguard Worker defm FVecGT : FVec_Compare_All<vsetogt, FSetGTf32rr_toi32, 1051*9880d681SAndroid Build Coastguard Worker FSetGTf64rr_toi64>; 1052*9880d681SAndroid Build Coastguard Worker defm FVecLT : FVec_Compare_All<vsetolt, FSetLTf32rr_toi32, 1053*9880d681SAndroid Build Coastguard Worker FSetLTf64rr_toi64>; 1054*9880d681SAndroid Build Coastguard Worker defm FVecGE : FVec_Compare_All<vsetoge, FSetGEf32rr_toi32, 1055*9880d681SAndroid Build Coastguard Worker FSetGEf64rr_toi64>; 1056*9880d681SAndroid Build Coastguard Worker defm FVecLE : FVec_Compare_All<vsetole, FSetLEf32rr_toi32, 1057*9880d681SAndroid Build Coastguard Worker FSetLEf64rr_toi64>; 1058*9880d681SAndroid Build Coastguard Worker defm FVecEQ : FVec_Compare_All<vsetoeq, FSetEQf32rr_toi32, 1059*9880d681SAndroid Build Coastguard Worker FSetEQf64rr_toi64>; 1060*9880d681SAndroid Build Coastguard Worker defm FVecNE : FVec_Compare_All<vsetone, FSetNEf32rr_toi32, 1061*9880d681SAndroid Build Coastguard Worker FSetNEf64rr_toi64>; 1062*9880d681SAndroid Build Coastguard Worker 1063*9880d681SAndroid Build Coastguard Worker defm FVecUGT : FVec_Compare_All<vsetugt, FSetUGTf32rr_toi32, 1064*9880d681SAndroid Build Coastguard Worker FSetUGTf64rr_toi64>; 1065*9880d681SAndroid Build Coastguard Worker defm FVecULT : FVec_Compare_All<vsetult, FSetULTf32rr_toi32, 1066*9880d681SAndroid Build Coastguard Worker FSetULTf64rr_toi64>; 1067*9880d681SAndroid Build Coastguard Worker defm FVecUGE : FVec_Compare_All<vsetuge, FSetUGEf32rr_toi32, 1068*9880d681SAndroid Build Coastguard Worker FSetUGEf64rr_toi64>; 1069*9880d681SAndroid Build Coastguard Worker defm FVecULE : FVec_Compare_All<vsetule, FSetULEf32rr_toi32, 1070*9880d681SAndroid Build Coastguard Worker FSetULEf64rr_toi64>; 1071*9880d681SAndroid Build Coastguard Worker defm FVecUEQ : FVec_Compare_All<vsetueq, FSetUEQf32rr_toi32, 1072*9880d681SAndroid Build Coastguard Worker FSetUEQf64rr_toi64>; 1073*9880d681SAndroid Build Coastguard Worker defm FVecUNE : FVec_Compare_All<vsetune, FSetUNEf32rr_toi32, 1074*9880d681SAndroid Build Coastguard Worker FSetUNEf64rr_toi64>; 1075*9880d681SAndroid Build Coastguard Worker 1076*9880d681SAndroid Build Coastguard Worker defm FVecNUM : FVec_Compare_All<vseto, FSetNUMf32rr_toi32, 1077*9880d681SAndroid Build Coastguard Worker FSetNUMf64rr_toi64>; 1078*9880d681SAndroid Build Coastguard Worker defm FVecNAN : FVec_Compare_All<vsetuo, FSetNANf32rr_toi32, 1079*9880d681SAndroid Build Coastguard Worker FSetNANf64rr_toi64>; 1080*9880d681SAndroid Build Coastguard Worker} 1081*9880d681SAndroid Build Coastguard Worker 1082*9880d681SAndroid Build Coastguard Workerclass LoadParamScalar4Inst<NVPTXRegClass regclass, string opstr> : 1083*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs regclass:$d1, regclass:$d2, regclass:$d3, regclass:$d4), 1084*9880d681SAndroid Build Coastguard Worker (ins i32imm:$a, i32imm:$b), 1085*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("ld.param", opstr), 1086*9880d681SAndroid Build Coastguard Worker "\t{{$d1, $d2, $d3, $d4}}, [retval0+$b];"), []>; 1087*9880d681SAndroid Build Coastguard Worker 1088*9880d681SAndroid Build Coastguard Workerclass LoadParamScalar2Inst<NVPTXRegClass regclass, string opstr> : 1089*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs regclass:$d1, regclass:$d2), 1090*9880d681SAndroid Build Coastguard Worker (ins i32imm:$a, i32imm:$b), 1091*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("ld.param", opstr), 1092*9880d681SAndroid Build Coastguard Worker "\t{{$d1, $d2}}, [retval0+$b];"), []>; 1093*9880d681SAndroid Build Coastguard Worker 1094*9880d681SAndroid Build Coastguard Worker 1095*9880d681SAndroid Build Coastguard Workerclass StoreParamScalar4Inst<NVPTXRegClass regclass, string opstr> : 1096*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs), 1097*9880d681SAndroid Build Coastguard Worker (ins regclass:$s1, regclass:$s2, regclass:$s3, regclass:$s4, 1098*9880d681SAndroid Build Coastguard Worker i32imm:$a, i32imm:$b), 1099*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("st.param", opstr), 1100*9880d681SAndroid Build Coastguard Worker "\t[param$a+$b], {{$s1, $s2, $s3, $s4}};"), []>; 1101*9880d681SAndroid Build Coastguard Worker 1102*9880d681SAndroid Build Coastguard Workerclass StoreParamScalar2Inst<NVPTXRegClass regclass, string opstr> : 1103*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs), 1104*9880d681SAndroid Build Coastguard Worker (ins regclass:$s1, regclass:$s2, i32imm:$a, i32imm:$b), 1105*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("st.param", opstr), 1106*9880d681SAndroid Build Coastguard Worker "\t[param$a+$b], {{$s1, $s2}};"), []>; 1107*9880d681SAndroid Build Coastguard Worker 1108*9880d681SAndroid Build Coastguard Workerclass StoreRetvalScalar4Inst<NVPTXRegClass regclass, string opstr> : 1109*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs), 1110*9880d681SAndroid Build Coastguard Worker (ins regclass:$s1, regclass:$s2, regclass:$s3, regclass:$s4, 1111*9880d681SAndroid Build Coastguard Worker i32imm:$a), 1112*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("st.param", opstr), 1113*9880d681SAndroid Build Coastguard Worker "\t[func_retval+$a], {{$s1, $s2, $s3, $s4}};"), []>; 1114*9880d681SAndroid Build Coastguard Worker 1115*9880d681SAndroid Build Coastguard Workerclass StoreRetvalScalar2Inst<NVPTXRegClass regclass, string opstr> : 1116*9880d681SAndroid Build Coastguard Worker NVPTXInst<(outs), 1117*9880d681SAndroid Build Coastguard Worker (ins regclass:$s1, regclass:$s2, i32imm:$a), 1118*9880d681SAndroid Build Coastguard Worker !strconcat(!strconcat("st.param", opstr), 1119*9880d681SAndroid Build Coastguard Worker "\t[func_retval+$a], {{$s1, $s2}};"), []>; 1120*9880d681SAndroid Build Coastguard Worker 1121*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I32 : LoadParamScalar4Inst<Int32Regs, ".v4.b32">; 1122*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I16 : LoadParamScalar4Inst<Int16Regs, ".v4.b16">; 1123*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I8 : LoadParamScalar4Inst<Int8Regs, ".v4.b8">; 1124*9880d681SAndroid Build Coastguard Worker 1125*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I64 : LoadParamScalar2Inst<Int32Regs, ".v2.b64">; 1126*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I32 : LoadParamScalar2Inst<Int32Regs, ".v2.b32">; 1127*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I16 : LoadParamScalar2Inst<Int32Regs, ".v2.b16">; 1128*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I8 : LoadParamScalar2Inst<Int32Regs, ".v2.b8">; 1129*9880d681SAndroid Build Coastguard Worker 1130*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4F32 : LoadParamScalar4Inst<Float32Regs, ".v4.f32">; 1131*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2F32 : LoadParamScalar2Inst<Float32Regs, ".v2.f32">; 1132*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2F64 : LoadParamScalar2Inst<Float64Regs, ".v2.f64">; 1133*9880d681SAndroid Build Coastguard Worker 1134*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I32 : StoreParamScalar4Inst<Int32Regs, ".v4.b32">; 1135*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I16 : StoreParamScalar4Inst<Int16Regs, ".v4.b16">; 1136*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I8 : StoreParamScalar4Inst<Int8Regs, ".v4.b8">; 1137*9880d681SAndroid Build Coastguard Worker 1138*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I64 : StoreParamScalar2Inst<Int64Regs, ".v2.b64">; 1139*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I32 : StoreParamScalar2Inst<Int32Regs, ".v2.b32">; 1140*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I16 : StoreParamScalar2Inst<Int16Regs, ".v2.b16">; 1141*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I8 : StoreParamScalar2Inst<Int8Regs, ".v2.b8">; 1142*9880d681SAndroid Build Coastguard Worker 1143*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4F32 : StoreParamScalar4Inst<Float32Regs, ".v4.f32">; 1144*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2F32 : StoreParamScalar2Inst<Float32Regs, ".v2.f32">; 1145*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2F64 : StoreParamScalar2Inst<Float64Regs, ".v2.f64">; 1146*9880d681SAndroid Build Coastguard Worker 1147*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I32 : StoreRetvalScalar4Inst<Int32Regs, ".v4.b32">; 1148*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I16 : StoreRetvalScalar4Inst<Int16Regs, ".v4.b16">; 1149*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I8 : StoreRetvalScalar4Inst<Int8Regs, ".v4.b8">; 1150*9880d681SAndroid Build Coastguard Worker 1151*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I64 : StoreRetvalScalar2Inst<Int64Regs, ".v2.b64">; 1152*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I32 : StoreRetvalScalar2Inst<Int32Regs, ".v2.b32">; 1153*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I16 : StoreRetvalScalar2Inst<Int16Regs, ".v2.b16">; 1154*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I8 : StoreRetvalScalar2Inst<Int8Regs, ".v2.b8">; 1155*9880d681SAndroid Build Coastguard Worker 1156*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4F32 : StoreRetvalScalar4Inst<Float32Regs, ".v4.f32">; 1157*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2F32 : StoreRetvalScalar2Inst<Float32Regs, ".v2.f32">; 1158*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2F64 : StoreRetvalScalar2Inst<Float64Regs, ".v2.f64">; 1159*9880d681SAndroid Build Coastguard Worker 1160*9880d681SAndroid Build Coastguard Workerclass LoadParamVecInst<NVPTXRegClass regclass, string opstr, NVPTXInst sop=NOP>: 1161*9880d681SAndroid Build Coastguard Worker NVPTXVecInst<(outs regclass:$dst), (ins i32imm:$a, i32imm:$b), 1162*9880d681SAndroid Build Coastguard Worker "loadparam : $dst <- [$a, $b]", 1163*9880d681SAndroid Build Coastguard Worker [(set regclass:$dst, (LoadParam (i32 imm:$a), (i32 imm:$b)))], 1164*9880d681SAndroid Build Coastguard Worker sop>; 1165*9880d681SAndroid Build Coastguard Worker 1166*9880d681SAndroid Build Coastguard Workerclass StoreParamVecInst<NVPTXRegClass regclass, string opstr, NVPTXInst sop=NOP> 1167*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs), (ins regclass:$val, i32imm:$a, i32imm:$b), 1168*9880d681SAndroid Build Coastguard Worker "storeparam : [$a, $b] <- $val", 1169*9880d681SAndroid Build Coastguard Worker [(StoreParam (i32 imm:$a), (i32 imm:$b), regclass:$val)], sop>; 1170*9880d681SAndroid Build Coastguard Worker 1171*9880d681SAndroid Build Coastguard Workerclass StoreRetvalVecInst<NVPTXRegClass regclass, string opstr, 1172*9880d681SAndroid Build Coastguard Worker NVPTXInst sop=NOP> 1173*9880d681SAndroid Build Coastguard Worker : NVPTXVecInst<(outs), (ins regclass:$val, i32imm:$a), 1174*9880d681SAndroid Build Coastguard Worker "storeretval : retval[$a] <- $val", 1175*9880d681SAndroid Build Coastguard Worker [(StoreRetval (i32 imm:$a), regclass:$val)], sop>; 1176*9880d681SAndroid Build Coastguard Worker 1177*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecLD.Value in { 1178*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I32 : LoadParamVecInst<V4I32Regs, ".v4.b32", 1179*9880d681SAndroid Build Coastguard Worker LoadParamScalar4I32>; 1180*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I16 : LoadParamVecInst<V4I16Regs, ".v4.b16", 1181*9880d681SAndroid Build Coastguard Worker LoadParamScalar4I16>; 1182*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I8 : LoadParamVecInst<V4I8Regs, ".v4.b8", 1183*9880d681SAndroid Build Coastguard Worker LoadParamScalar4I8>; 1184*9880d681SAndroid Build Coastguard Worker 1185*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I64 : LoadParamVecInst<V2I64Regs, ".v2.b64", 1186*9880d681SAndroid Build Coastguard Worker LoadParamScalar2I64>; 1187*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I32 : LoadParamVecInst<V2I32Regs, ".v2.b32", 1188*9880d681SAndroid Build Coastguard Worker LoadParamScalar2I32>; 1189*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I16 : LoadParamVecInst<V2I16Regs, ".v2.b16", 1190*9880d681SAndroid Build Coastguard Worker LoadParamScalar2I16>; 1191*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I8 : LoadParamVecInst<V2I8Regs, ".v2.b8", 1192*9880d681SAndroid Build Coastguard Worker LoadParamScalar2I8>; 1193*9880d681SAndroid Build Coastguard Worker 1194*9880d681SAndroid Build Coastguard Workerdef LoadParamV4F32 : LoadParamVecInst<V4F32Regs, ".v4.f32", 1195*9880d681SAndroid Build Coastguard Worker LoadParamScalar4F32>; 1196*9880d681SAndroid Build Coastguard Workerdef LoadParamV2F32 : LoadParamVecInst<V2F32Regs, ".v2.f32", 1197*9880d681SAndroid Build Coastguard Worker LoadParamScalar2F32>; 1198*9880d681SAndroid Build Coastguard Workerdef LoadParamV2F64 : LoadParamVecInst<V2F64Regs, ".v2.f64", 1199*9880d681SAndroid Build Coastguard Worker LoadParamScalar2F64>; 1200*9880d681SAndroid Build Coastguard Worker} 1201*9880d681SAndroid Build Coastguard Worker 1202*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecST.Value in { 1203*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I32 : StoreParamVecInst<V4I32Regs, ".v4.b32", 1204*9880d681SAndroid Build Coastguard Worker StoreParamScalar4I32>; 1205*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I16 : StoreParamVecInst<V4I16Regs, ".v4.b16", 1206*9880d681SAndroid Build Coastguard Worker StoreParamScalar4I16>; 1207*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I8 : StoreParamVecInst<V4I8Regs, ".v4.b8", 1208*9880d681SAndroid Build Coastguard Worker StoreParamScalar4I8>; 1209*9880d681SAndroid Build Coastguard Worker 1210*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I64 : StoreParamVecInst<V2I64Regs, ".v2.b64", 1211*9880d681SAndroid Build Coastguard Worker StoreParamScalar2I64>; 1212*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I32 : StoreParamVecInst<V2I32Regs, ".v2.b32", 1213*9880d681SAndroid Build Coastguard Worker StoreParamScalar2I32>; 1214*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I16 : StoreParamVecInst<V2I16Regs, ".v2.b16", 1215*9880d681SAndroid Build Coastguard Worker StoreParamScalar2I16>; 1216*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I8 : StoreParamVecInst<V2I8Regs, ".v2.b8", 1217*9880d681SAndroid Build Coastguard Worker StoreParamScalar2I8>; 1218*9880d681SAndroid Build Coastguard Worker 1219*9880d681SAndroid Build Coastguard Workerdef StoreParamV4F32 : StoreParamVecInst<V4F32Regs, ".v4.f32", 1220*9880d681SAndroid Build Coastguard Worker StoreParamScalar4F32>; 1221*9880d681SAndroid Build Coastguard Workerdef StoreParamV2F32 : StoreParamVecInst<V2F32Regs, ".v2.f32", 1222*9880d681SAndroid Build Coastguard Worker StoreParamScalar2F32>; 1223*9880d681SAndroid Build Coastguard Workerdef StoreParamV2F64 : StoreParamVecInst<V2F64Regs, ".v2.f64", 1224*9880d681SAndroid Build Coastguard Worker StoreParamScalar2F64>; 1225*9880d681SAndroid Build Coastguard Worker 1226*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I32 : StoreRetvalVecInst<V4I32Regs, ".v4.b32", 1227*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar4I32>; 1228*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I16 : StoreRetvalVecInst<V4I16Regs, ".v4.b16", 1229*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar4I16>; 1230*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I8 : StoreRetvalVecInst<V4I8Regs, ".v4.b8", 1231*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar4I8>; 1232*9880d681SAndroid Build Coastguard Worker 1233*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I64 : StoreRetvalVecInst<V2I64Regs, ".v2.b64", 1234*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2I64>; 1235*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I32 : StoreRetvalVecInst<V2I32Regs, ".v2.b32", 1236*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2I32>; 1237*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I16 : StoreRetvalVecInst<V2I16Regs, ".v2.b16", 1238*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2I16>; 1239*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I8 : StoreRetvalVecInst<V2I8Regs, ".v2.b8", 1240*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2I8>; 1241*9880d681SAndroid Build Coastguard Worker 1242*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4F32 : StoreRetvalVecInst<V4F32Regs, ".v4.f32", 1243*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar4F32>; 1244*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2F32 : StoreRetvalVecInst<V2F32Regs, ".v2.f32", 1245*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2F32>; 1246*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2F64 : StoreRetvalVecInst<V2F64Regs, ".v2.f64", 1247*9880d681SAndroid Build Coastguard Worker StoreRetvalScalar2F64>; 1248*9880d681SAndroid Build Coastguard Worker 1249*9880d681SAndroid Build Coastguard Worker} 1250*9880d681SAndroid Build Coastguard Worker 1251*9880d681SAndroid Build Coastguard Worker 1252*9880d681SAndroid Build Coastguard Worker// Int vector to int scalar bit convert 1253*9880d681SAndroid Build Coastguard Worker// v4i8 -> i32 1254*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert V4I8Regs:$s)), 1255*9880d681SAndroid Build Coastguard Worker (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1), 1256*9880d681SAndroid Build Coastguard Worker (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3))>; 1257*9880d681SAndroid Build Coastguard Worker// v4i16 -> i64 1258*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V4I16Regs:$s)), 1259*9880d681SAndroid Build Coastguard Worker (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), 1260*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,1), 1261*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,2), 1262*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,3))>; 1263*9880d681SAndroid Build Coastguard Worker// v2i8 -> i16 1264*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (bitconvert V2I8Regs:$s)), 1265*9880d681SAndroid Build Coastguard Worker (V2I8toI16 (V2i8Extract V2I8Regs:$s,0), (V2i8Extract V2I8Regs:$s,1))>; 1266*9880d681SAndroid Build Coastguard Worker// v2i16 -> i32 1267*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert V2I16Regs:$s)), 1268*9880d681SAndroid Build Coastguard Worker (V2I16toI32 (V2i16Extract V2I16Regs:$s,0), 1269*9880d681SAndroid Build Coastguard Worker (V2i16Extract V2I16Regs:$s,1))>; 1270*9880d681SAndroid Build Coastguard Worker// v2i32 -> i64 1271*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V2I32Regs:$s)), 1272*9880d681SAndroid Build Coastguard Worker (V2I32toI64 (V2i32Extract V2I32Regs:$s,0), 1273*9880d681SAndroid Build Coastguard Worker (V2i32Extract V2I32Regs:$s,1))>; 1274*9880d681SAndroid Build Coastguard Worker 1275*9880d681SAndroid Build Coastguard Worker// Int scalar to int vector bit convert 1276*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecDest.Value in { 1277*9880d681SAndroid Build Coastguard Worker// i32 -> v4i8 1278*9880d681SAndroid Build Coastguard Workerdef VecI32toV4I8 : NVPTXVecInst<(outs V4I8Regs:$d), (ins Int32Regs:$s), 1279*9880d681SAndroid Build Coastguard Worker "Error!", 1280*9880d681SAndroid Build Coastguard Worker [(set V4I8Regs:$d, (bitconvert Int32Regs:$s))], 1281*9880d681SAndroid Build Coastguard Worker I32toV4I8>; 1282*9880d681SAndroid Build Coastguard Worker// i64 -> v4i16 1283*9880d681SAndroid Build Coastguard Workerdef VecI64toV4I16 : NVPTXVecInst<(outs V4I16Regs:$d), (ins Int64Regs:$s), 1284*9880d681SAndroid Build Coastguard Worker "Error!", 1285*9880d681SAndroid Build Coastguard Worker [(set V4I16Regs:$d, (bitconvert Int64Regs:$s))], 1286*9880d681SAndroid Build Coastguard Worker I64toV4I16>; 1287*9880d681SAndroid Build Coastguard Worker// i16 -> v2i8 1288*9880d681SAndroid Build Coastguard Workerdef VecI16toV2I8 : NVPTXVecInst<(outs V2I8Regs:$d), (ins Int16Regs:$s), 1289*9880d681SAndroid Build Coastguard Worker "Error!", 1290*9880d681SAndroid Build Coastguard Worker [(set V2I8Regs:$d, (bitconvert Int16Regs:$s))], 1291*9880d681SAndroid Build Coastguard Worker I16toV2I8>; 1292*9880d681SAndroid Build Coastguard Worker// i32 -> v2i16 1293*9880d681SAndroid Build Coastguard Workerdef VecI32toV2I16 : NVPTXVecInst<(outs V2I16Regs:$d), (ins Int32Regs:$s), 1294*9880d681SAndroid Build Coastguard Worker "Error!", 1295*9880d681SAndroid Build Coastguard Worker [(set V2I16Regs:$d, (bitconvert Int32Regs:$s))], 1296*9880d681SAndroid Build Coastguard Worker I32toV2I16>; 1297*9880d681SAndroid Build Coastguard Worker// i64 -> v2i32 1298*9880d681SAndroid Build Coastguard Workerdef VecI64toV2I32 : NVPTXVecInst<(outs V2I32Regs:$d), (ins Int64Regs:$s), 1299*9880d681SAndroid Build Coastguard Worker "Error!", 1300*9880d681SAndroid Build Coastguard Worker [(set V2I32Regs:$d, (bitconvert Int64Regs:$s))], 1301*9880d681SAndroid Build Coastguard Worker I64toV2I32>; 1302*9880d681SAndroid Build Coastguard Worker} 1303*9880d681SAndroid Build Coastguard Worker 1304*9880d681SAndroid Build Coastguard Worker// Int vector to int vector bit convert 1305*9880d681SAndroid Build Coastguard Worker// v4i8 -> v2i16 1306*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (bitconvert V4I8Regs:$s)), 1307*9880d681SAndroid Build Coastguard Worker (VecI32toV2I16 1308*9880d681SAndroid Build Coastguard Worker (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1), 1309*9880d681SAndroid Build Coastguard Worker (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3)))>; 1310*9880d681SAndroid Build Coastguard Worker// v4i16 -> v2i32 1311*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert V4I16Regs:$s)), 1312*9880d681SAndroid Build Coastguard Worker (VecI64toV2I32 1313*9880d681SAndroid Build Coastguard Worker (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), (V4i16Extract V4I16Regs:$s,1), 1314*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,2), (V4i16Extract V4I16Regs:$s,3)))>; 1315*9880d681SAndroid Build Coastguard Worker// v2i16 -> v4i8 1316*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (bitconvert V2I16Regs:$s)), 1317*9880d681SAndroid Build Coastguard Worker (VecI32toV4I8 1318*9880d681SAndroid Build Coastguard Worker (V2I16toI32 (V2i16Extract V2I16Regs:$s,0), (V2i16Extract V2I16Regs:$s,1)))>; 1319*9880d681SAndroid Build Coastguard Worker// v2i32 -> v4i16 1320*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert V2I32Regs:$s)), 1321*9880d681SAndroid Build Coastguard Worker (VecI64toV4I16 1322*9880d681SAndroid Build Coastguard Worker (V2I32toI64 (V2i32Extract V2I32Regs:$s,0), (V2i32Extract V2I32Regs:$s,1)))>; 1323*9880d681SAndroid Build Coastguard Worker// v2i64 -> v4i32 1324*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V2I64Regs:$s)), 1325*9880d681SAndroid Build Coastguard Worker (Build_Vector4_i32 1326*9880d681SAndroid Build Coastguard Worker (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 0)), 0), 1327*9880d681SAndroid Build Coastguard Worker (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 0)), 1), 1328*9880d681SAndroid Build Coastguard Worker (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 1)), 0), 1329*9880d681SAndroid Build Coastguard Worker (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 1)), 1))>; 1330*9880d681SAndroid Build Coastguard Worker// v4i32 -> v2i64 1331*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V4I32Regs:$s)), 1332*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i64 1333*9880d681SAndroid Build Coastguard Worker (V2I32toI64 (V4i32Extract V4I32Regs:$s,0), (V4i32Extract V4I32Regs:$s,1)), 1334*9880d681SAndroid Build Coastguard Worker (V2I32toI64 (V4i32Extract V4I32Regs:$s,2), (V4i32Extract V4I32Regs:$s,3)))>; 1335*9880d681SAndroid Build Coastguard Worker 1336*9880d681SAndroid Build Coastguard Worker// Fp scalar to fp vector convert 1337*9880d681SAndroid Build Coastguard Worker// f64 -> v2f32 1338*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecDest.Value in { 1339*9880d681SAndroid Build Coastguard Workerdef VecF64toV2F32 : NVPTXVecInst<(outs V2F32Regs:$d), (ins Float64Regs:$s), 1340*9880d681SAndroid Build Coastguard Worker "Error!", 1341*9880d681SAndroid Build Coastguard Worker [(set V2F32Regs:$d, (bitconvert Float64Regs:$s))], 1342*9880d681SAndroid Build Coastguard Worker F64toV2F32>; 1343*9880d681SAndroid Build Coastguard Worker} 1344*9880d681SAndroid Build Coastguard Worker 1345*9880d681SAndroid Build Coastguard Worker// Fp vector to fp scalar convert 1346*9880d681SAndroid Build Coastguard Worker// v2f32 -> f64 1347*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V2F32Regs:$s)), 1348*9880d681SAndroid Build Coastguard Worker (V2F32toF64 (V2f32Extract V2F32Regs:$s,0), (V2f32Extract V2F32Regs:$s,1))>; 1349*9880d681SAndroid Build Coastguard Worker 1350*9880d681SAndroid Build Coastguard Worker// Fp scalar to int vector convert 1351*9880d681SAndroid Build Coastguard Worker// f32 -> v4i8 1352*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (bitconvert Float32Regs:$s)), 1353*9880d681SAndroid Build Coastguard Worker (VecI32toV4I8 (BITCONVERT_32_F2I Float32Regs:$s))>; 1354*9880d681SAndroid Build Coastguard Worker// f32 -> v2i16 1355*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (bitconvert Float32Regs:$s)), 1356*9880d681SAndroid Build Coastguard Worker (VecI32toV2I16 (BITCONVERT_32_F2I Float32Regs:$s))>; 1357*9880d681SAndroid Build Coastguard Worker// f64 -> v4i16 1358*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert Float64Regs:$s)), 1359*9880d681SAndroid Build Coastguard Worker (VecI64toV4I16 (BITCONVERT_64_F2I Float64Regs:$s))>; 1360*9880d681SAndroid Build Coastguard Worker// f64 -> v2i32 1361*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert Float64Regs:$s)), 1362*9880d681SAndroid Build Coastguard Worker (VecI64toV2I32 (BITCONVERT_64_F2I Float64Regs:$s))>; 1363*9880d681SAndroid Build Coastguard Worker 1364*9880d681SAndroid Build Coastguard Worker// Int vector to fp scalar convert 1365*9880d681SAndroid Build Coastguard Worker// v4i8 -> f32 1366*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert V4I8Regs:$s)), 1367*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F 1368*9880d681SAndroid Build Coastguard Worker (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1), 1369*9880d681SAndroid Build Coastguard Worker (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3)))>; 1370*9880d681SAndroid Build Coastguard Worker// v4i16 -> f64 1371*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V4I16Regs:$s)), 1372*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F 1373*9880d681SAndroid Build Coastguard Worker (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), (V4i16Extract V4I16Regs:$s,1), 1374*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,2), (V4i16Extract V4I16Regs:$s,3)))>; 1375*9880d681SAndroid Build Coastguard Worker// v2i16 -> f32 1376*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert V2I16Regs:$s)), 1377*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F 1378*9880d681SAndroid Build Coastguard Worker (V2I16toI32 (V2i16Extract V2I16Regs:$s,0), (V2i16Extract V2I16Regs:$s,1)))>; 1379*9880d681SAndroid Build Coastguard Worker// v2i32 -> f64 1380*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V2I32Regs:$s)), 1381*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F 1382*9880d681SAndroid Build Coastguard Worker (V2I32toI64 (V2i32Extract V2I32Regs:$s,0), (V2i32Extract V2I32Regs:$s,1)))>; 1383*9880d681SAndroid Build Coastguard Worker 1384*9880d681SAndroid Build Coastguard Worker// Int scalar to fp vector convert 1385*9880d681SAndroid Build Coastguard Worker// i64 -> v2f32 1386*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert Int64Regs:$s)), 1387*9880d681SAndroid Build Coastguard Worker (VecF64toV2F32 (BITCONVERT_64_I2F Int64Regs:$s))>; 1388*9880d681SAndroid Build Coastguard Worker 1389*9880d681SAndroid Build Coastguard Worker// Fp vector to int scalar convert 1390*9880d681SAndroid Build Coastguard Worker// v2f32 -> i64 1391*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V2F32Regs:$s)), 1392*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_F2I 1393*9880d681SAndroid Build Coastguard Worker (V2F32toF64 (V2f32Extract V2F32Regs:$s,0), (V2f32Extract V2F32Regs:$s,1)))>; 1394*9880d681SAndroid Build Coastguard Worker 1395*9880d681SAndroid Build Coastguard Worker// Int vector to fp vector convert 1396*9880d681SAndroid Build Coastguard Worker// v2i64 -> v4f32 1397*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert V2I64Regs:$s)), 1398*9880d681SAndroid Build Coastguard Worker (Build_Vector4_f32 1399*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32 1400*9880d681SAndroid Build Coastguard Worker (V2i64Extract V2I64Regs:$s, 0)), 0)), 1401*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32 1402*9880d681SAndroid Build Coastguard Worker (V2i64Extract V2I64Regs:$s, 0)), 1)), 1403*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32 1404*9880d681SAndroid Build Coastguard Worker (V2i64Extract V2I64Regs:$s, 1)), 0)), 1405*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32 1406*9880d681SAndroid Build Coastguard Worker (V2i64Extract V2I64Regs:$s, 1)), 1)))>; 1407*9880d681SAndroid Build Coastguard Worker// v2i64 -> v2f64 1408*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert V2I64Regs:$s)), 1409*9880d681SAndroid Build Coastguard Worker (Build_Vector2_f64 1410*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F (V2i64Extract V2I64Regs:$s,0)), 1411*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F (V2i64Extract V2I64Regs:$s,1)))>; 1412*9880d681SAndroid Build Coastguard Worker// v2i32 -> v2f32 1413*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert V2I32Regs:$s)), 1414*9880d681SAndroid Build Coastguard Worker (Build_Vector2_f32 1415*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract V2I32Regs:$s,0)), 1416*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V2i32Extract V2I32Regs:$s,1)))>; 1417*9880d681SAndroid Build Coastguard Worker// v4i32 -> v2f64 1418*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert V4I32Regs:$s)), 1419*9880d681SAndroid Build Coastguard Worker (Build_Vector2_f64 1420*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F (V2I32toI64 (V4i32Extract V4I32Regs:$s,0), 1421*9880d681SAndroid Build Coastguard Worker (V4i32Extract V4I32Regs:$s,1))), 1422*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_I2F (V2I32toI64 (V4i32Extract V4I32Regs:$s,2), 1423*9880d681SAndroid Build Coastguard Worker (V4i32Extract V4I32Regs:$s,3))))>; 1424*9880d681SAndroid Build Coastguard Worker// v4i32 -> v4f32 1425*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert V4I32Regs:$s)), 1426*9880d681SAndroid Build Coastguard Worker (Build_Vector4_f32 1427*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,0)), 1428*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,1)), 1429*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,2)), 1430*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,3)))>; 1431*9880d681SAndroid Build Coastguard Worker// v4i16 -> v2f32 1432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert V4I16Regs:$s)), 1433*9880d681SAndroid Build Coastguard Worker (VecF64toV2F32 (BITCONVERT_64_I2F 1434*9880d681SAndroid Build Coastguard Worker (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), 1435*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,1), 1436*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,2), 1437*9880d681SAndroid Build Coastguard Worker (V4i16Extract V4I16Regs:$s,3))))>; 1438*9880d681SAndroid Build Coastguard Worker 1439*9880d681SAndroid Build Coastguard Worker// Fp vector to int vector convert 1440*9880d681SAndroid Build Coastguard Worker// v2i64 <- v4f32 1441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V4F32Regs:$s)), 1442*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i64 1443*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_F2I (V2F32toF64 (V4f32Extract V4F32Regs:$s,0), 1444*9880d681SAndroid Build Coastguard Worker (V4f32Extract V4F32Regs:$s,1))), 1445*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_F2I (V2F32toF64 (V4f32Extract V4F32Regs:$s,2), 1446*9880d681SAndroid Build Coastguard Worker (V4f32Extract V4F32Regs:$s,3))))>; 1447*9880d681SAndroid Build Coastguard Worker// v2i64 <- v2f64 1448*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V2F64Regs:$s)), 1449*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i64 1450*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_F2I (V2f64Extract V2F64Regs:$s,0)), 1451*9880d681SAndroid Build Coastguard Worker (BITCONVERT_64_F2I (V2f64Extract V2F64Regs:$s,1)))>; 1452*9880d681SAndroid Build Coastguard Worker// v2i32 <- v2f32 1453*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert V2F32Regs:$s)), 1454*9880d681SAndroid Build Coastguard Worker (Build_Vector2_i32 1455*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract V2F32Regs:$s,0)), 1456*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract V2F32Regs:$s,1)))>; 1457*9880d681SAndroid Build Coastguard Worker// v4i32 <- v2f64 1458*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V2F64Regs:$s)), 1459*9880d681SAndroid Build Coastguard Worker (Build_Vector4_i32 1460*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32 1461*9880d681SAndroid Build Coastguard Worker (V2f64Extract V2F64Regs:$s, 0)), 0)), 1462*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32 1463*9880d681SAndroid Build Coastguard Worker (V2f64Extract V2F64Regs:$s, 0)), 1)), 1464*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32 1465*9880d681SAndroid Build Coastguard Worker (V2f64Extract V2F64Regs:$s, 1)), 0)), 1466*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32 1467*9880d681SAndroid Build Coastguard Worker (V2f64Extract V2F64Regs:$s, 1)), 1)))>; 1468*9880d681SAndroid Build Coastguard Worker// v4i32 <- v4f32 1469*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V4F32Regs:$s)), 1470*9880d681SAndroid Build Coastguard Worker (Build_Vector4_i32 1471*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,0)), 1472*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,1)), 1473*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,2)), 1474*9880d681SAndroid Build Coastguard Worker (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,3)))>; 1475*9880d681SAndroid Build Coastguard Worker// v4i16 <- v2f32 1476*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert V2F32Regs:$s)), 1477*9880d681SAndroid Build Coastguard Worker (VecI64toV4I16 (BITCONVERT_64_F2I 1478*9880d681SAndroid Build Coastguard Worker (V2F32toF64 (V2f32Extract V2F32Regs:$s,0), 1479*9880d681SAndroid Build Coastguard Worker (V2f32Extract V2F32Regs:$s,1))))>; 1480