1*9880d681SAndroid Build Coastguard Worker//===- HexagonInstrInfoVector.td - Hexagon Vector Patterns -*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the Hexagon Vector instructions in TableGen format. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdef V2I1: PatLeaf<(v2i1 PredRegs:$R)>; 15*9880d681SAndroid Build Coastguard Workerdef V4I1: PatLeaf<(v4i1 PredRegs:$R)>; 16*9880d681SAndroid Build Coastguard Workerdef V8I1: PatLeaf<(v8i1 PredRegs:$R)>; 17*9880d681SAndroid Build Coastguard Workerdef V4I8: PatLeaf<(v4i8 IntRegs:$R)>; 18*9880d681SAndroid Build Coastguard Workerdef V2I16: PatLeaf<(v2i16 IntRegs:$R)>; 19*9880d681SAndroid Build Coastguard Workerdef V8I8: PatLeaf<(v8i8 DoubleRegs:$R)>; 20*9880d681SAndroid Build Coastguard Workerdef V4I16: PatLeaf<(v4i16 DoubleRegs:$R)>; 21*9880d681SAndroid Build Coastguard Workerdef V2I32: PatLeaf<(v2i32 DoubleRegs:$R)>; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workermulticlass bitconvert_32<ValueType a, ValueType b> { 25*9880d681SAndroid Build Coastguard Worker def : Pat <(b (bitconvert (a IntRegs:$src))), 26*9880d681SAndroid Build Coastguard Worker (b IntRegs:$src)>; 27*9880d681SAndroid Build Coastguard Worker def : Pat <(a (bitconvert (b IntRegs:$src))), 28*9880d681SAndroid Build Coastguard Worker (a IntRegs:$src)>; 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workermulticlass bitconvert_64<ValueType a, ValueType b> { 32*9880d681SAndroid Build Coastguard Worker def : Pat <(b (bitconvert (a DoubleRegs:$src))), 33*9880d681SAndroid Build Coastguard Worker (b DoubleRegs:$src)>; 34*9880d681SAndroid Build Coastguard Worker def : Pat <(a (bitconvert (b DoubleRegs:$src))), 35*9880d681SAndroid Build Coastguard Worker (a DoubleRegs:$src)>; 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker// Bit convert vector types to integers. 39*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_32<v4i8, i32>; 40*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_32<v2i16, i32>; 41*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v8i8, i64>; 42*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v4i16, i64>; 43*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v2i32, i64>; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker// Vector shift support. Vector shifting in Hexagon is rather different 46*9880d681SAndroid Build Coastguard Worker// from internal representation of LLVM. 47*9880d681SAndroid Build Coastguard Worker// LLVM assumes all shifts (in vector case) will have the form 48*9880d681SAndroid Build Coastguard Worker// <VT> = SHL/SRA/SRL <VT> by <VT> 49*9880d681SAndroid Build Coastguard Worker// while Hexagon has the following format: 50*9880d681SAndroid Build Coastguard Worker// <VT> = SHL/SRA/SRL <VT> by <IT/i32> 51*9880d681SAndroid Build Coastguard Worker// As a result, special care is needed to guarantee correctness and 52*9880d681SAndroid Build Coastguard Worker// performance. 53*9880d681SAndroid Build Coastguard Workerclass vshift_v4i16<SDNode Op, string Str, bits<3>MajOp, bits<3>MinOp> 54*9880d681SAndroid Build Coastguard Worker : S_2OpInstImm<Str, MajOp, MinOp, u4Imm, 55*9880d681SAndroid Build Coastguard Worker [(set (v4i16 DoubleRegs:$dst), 56*9880d681SAndroid Build Coastguard Worker (Op (v4i16 DoubleRegs:$src1), u4ImmPred:$src2))]> { 57*9880d681SAndroid Build Coastguard Worker bits<4> src2; 58*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = src2; 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerclass vshift_v2i32<SDNode Op, string Str, bits<3>MajOp, bits<3>MinOp> 62*9880d681SAndroid Build Coastguard Worker : S_2OpInstImm<Str, MajOp, MinOp, u5Imm, 63*9880d681SAndroid Build Coastguard Worker [(set (v2i32 DoubleRegs:$dst), 64*9880d681SAndroid Build Coastguard Worker (Op (v2i32 DoubleRegs:$src1), u5ImmPred:$src2))]> { 65*9880d681SAndroid Build Coastguard Worker bits<5> src2; 66*9880d681SAndroid Build Coastguard Worker let Inst{12-8} = src2; 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (add (v2i16 IntRegs:$src1), (v2i16 IntRegs:$src2))), 70*9880d681SAndroid Build Coastguard Worker (A2_svaddh IntRegs:$src1, IntRegs:$src2)>; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (sub (v2i16 IntRegs:$src1), (v2i16 IntRegs:$src2))), 73*9880d681SAndroid Build Coastguard Worker (A2_svsubh IntRegs:$src1, IntRegs:$src2)>; 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_vw : vshift_v2i32<sra, "vasrw", 0b010, 0b000>; 76*9880d681SAndroid Build Coastguard Workerdef S2_lsr_i_vw : vshift_v2i32<srl, "vlsrw", 0b010, 0b001>; 77*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_vw : vshift_v2i32<shl, "vaslw", 0b010, 0b010>; 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_vh : vshift_v4i16<sra, "vasrh", 0b100, 0b000>; 80*9880d681SAndroid Build Coastguard Workerdef S2_lsr_i_vh : vshift_v4i16<srl, "vlsrh", 0b100, 0b001>; 81*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_vh : vshift_v4i16<shl, "vaslh", 0b100, 0b010>; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdef HexagonVSPLATB: SDNode<"HexagonISD::VSPLATB", SDTUnaryOp>; 85*9880d681SAndroid Build Coastguard Workerdef HexagonVSPLATH: SDNode<"HexagonISD::VSPLATH", SDTUnaryOp>; 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker// Replicate the low 8-bits from 32-bits input register into each of the 88*9880d681SAndroid Build Coastguard Worker// four bytes of 32-bits destination register. 89*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (HexagonVSPLATB I32:$Rs)), (S2_vsplatrb I32:$Rs)>; 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker// Replicate the low 16-bits from 32-bits input register into each of the 92*9880d681SAndroid Build Coastguard Worker// four halfwords of 64-bits destination register. 93*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSPLATH I32:$Rs)), (S2_vsplatrh I32:$Rs)>; 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerclass VArith_pat <InstHexagon MI, SDNode Op, PatFrag Type> 97*9880d681SAndroid Build Coastguard Worker : Pat <(Op Type:$Rss, Type:$Rtt), 98*9880d681SAndroid Build Coastguard Worker (MI Type:$Rss, Type:$Rtt)>; 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddub, add, V8I8>; 101*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddh, add, V4I16>; 102*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddw, add, V2I32>; 103*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubub, sub, V8I8>; 104*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubh, sub, V4I16>; 105*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubw, sub, V2I32>; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_and, and, V2I16>; 108*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xor, xor, V2I16>; 109*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_or, or, V2I16>; 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp, and, V8I8>; 112*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp, and, V4I16>; 113*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp, and, V2I32>; 114*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp, or, V8I8>; 115*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp, or, V4I16>; 116*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp, or, V2I32>; 117*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp, xor, V8I8>; 118*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp, xor, V4I16>; 119*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp, xor, V2I32>; 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sra V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c), 122*9880d681SAndroid Build Coastguard Worker (i32 u5ImmPred:$c))))), 123*9880d681SAndroid Build Coastguard Worker (S2_asr_i_vw V2I32:$b, imm:$c)>; 124*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (srl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c), 125*9880d681SAndroid Build Coastguard Worker (i32 u5ImmPred:$c))))), 126*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_vw V2I32:$b, imm:$c)>; 127*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (shl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c), 128*9880d681SAndroid Build Coastguard Worker (i32 u5ImmPred:$c))))), 129*9880d681SAndroid Build Coastguard Worker (S2_asl_i_vw V2I32:$b, imm:$c)>; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (sra V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))), 132*9880d681SAndroid Build Coastguard Worker (S2_asr_i_vh V4I16:$b, imm:$c)>; 133*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (srl V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))), 134*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_vh V4I16:$b, imm:$c)>; 135*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (shl V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))), 136*9880d681SAndroid Build Coastguard Worker (S2_asl_i_vh V4I16:$b, imm:$c)>; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdef SDTHexagon_v2i32_v2i32_i32 : SDTypeProfile<1, 2, 140*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisVT<0, v2i32>, SDTCisInt<2>]>; 141*9880d681SAndroid Build Coastguard Workerdef SDTHexagon_v4i16_v4i16_i32 : SDTypeProfile<1, 2, 142*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisVT<0, v4i16>, SDTCisInt<2>]>; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdef HexagonVSRAW: SDNode<"HexagonISD::VSRAW", SDTHexagon_v2i32_v2i32_i32>; 145*9880d681SAndroid Build Coastguard Workerdef HexagonVSRAH: SDNode<"HexagonISD::VSRAH", SDTHexagon_v4i16_v4i16_i32>; 146*9880d681SAndroid Build Coastguard Workerdef HexagonVSRLW: SDNode<"HexagonISD::VSRLW", SDTHexagon_v2i32_v2i32_i32>; 147*9880d681SAndroid Build Coastguard Workerdef HexagonVSRLH: SDNode<"HexagonISD::VSRLH", SDTHexagon_v4i16_v4i16_i32>; 148*9880d681SAndroid Build Coastguard Workerdef HexagonVSHLW: SDNode<"HexagonISD::VSHLW", SDTHexagon_v2i32_v2i32_i32>; 149*9880d681SAndroid Build Coastguard Workerdef HexagonVSHLH: SDNode<"HexagonISD::VSHLH", SDTHexagon_v4i16_v4i16_i32>; 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSRAW V2I32:$Rs, u5ImmPred:$u5)), 152*9880d681SAndroid Build Coastguard Worker (S2_asr_i_vw V2I32:$Rs, imm:$u5)>; 153*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSRAH V4I16:$Rs, u4ImmPred:$u4)), 154*9880d681SAndroid Build Coastguard Worker (S2_asr_i_vh V4I16:$Rs, imm:$u4)>; 155*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSRLW V2I32:$Rs, u5ImmPred:$u5)), 156*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_vw V2I32:$Rs, imm:$u5)>; 157*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSRLH V4I16:$Rs, u4ImmPred:$u4)), 158*9880d681SAndroid Build Coastguard Worker (S2_lsr_i_vh V4I16:$Rs, imm:$u4)>; 159*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSHLW V2I32:$Rs, u5ImmPred:$u5)), 160*9880d681SAndroid Build Coastguard Worker (S2_asl_i_vw V2I32:$Rs, imm:$u5)>; 161*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSHLH V4I16:$Rs, u4ImmPred:$u4)), 162*9880d681SAndroid Build Coastguard Worker (S2_asl_i_vh V4I16:$Rs, imm:$u4)>; 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker// Vector shift words by register 165*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_vw : T_S3op_shiftVect < "vasrw", 0b00, 0b00>; 166*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_vw : T_S3op_shiftVect < "vlsrw", 0b00, 0b01>; 167*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_vw : T_S3op_shiftVect < "vaslw", 0b00, 0b10>; 168*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_vw : T_S3op_shiftVect < "vlslw", 0b00, 0b11>; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker// Vector shift halfwords by register 171*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_vh : T_S3op_shiftVect < "vasrh", 0b01, 0b00>; 172*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_vh : T_S3op_shiftVect < "vlsrh", 0b01, 0b01>; 173*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_vh : T_S3op_shiftVect < "vaslh", 0b01, 0b10>; 174*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_vh : T_S3op_shiftVect < "vlslh", 0b01, 0b11>; 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerclass vshift_rr_pat<InstHexagon MI, SDNode Op, PatFrag Value> 177*9880d681SAndroid Build Coastguard Worker : Pat <(Op Value:$Rs, I32:$Rt), 178*9880d681SAndroid Build Coastguard Worker (MI Value:$Rs, I32:$Rt)>; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asr_r_vw, HexagonVSRAW, V2I32>; 181*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asr_r_vh, HexagonVSRAH, V4I16>; 182*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_lsr_r_vw, HexagonVSRLW, V2I32>; 183*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_lsr_r_vh, HexagonVSRLH, V4I16>; 184*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asl_r_vw, HexagonVSHLW, V2I32>; 185*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asl_r_vh, HexagonVSHLH, V4I16>; 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v8i8 : SDTypeProfile<1, 2, 189*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v8i8>]>; 190*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v4i16 : SDTypeProfile<1, 2, 191*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v4i16>]>; 192*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v2i32 : SDTypeProfile<1, 2, 193*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v2i32>]>; 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBEQ: SDNode<"HexagonISD::VCMPBEQ", SDTHexagonVecCompare_v8i8>; 196*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBGT: SDNode<"HexagonISD::VCMPBGT", SDTHexagonVecCompare_v8i8>; 197*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBGTU: SDNode<"HexagonISD::VCMPBGTU", SDTHexagonVecCompare_v8i8>; 198*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHEQ: SDNode<"HexagonISD::VCMPHEQ", SDTHexagonVecCompare_v4i16>; 199*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHGT: SDNode<"HexagonISD::VCMPHGT", SDTHexagonVecCompare_v4i16>; 200*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHGTU: SDNode<"HexagonISD::VCMPHGTU", SDTHexagonVecCompare_v4i16>; 201*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWEQ: SDNode<"HexagonISD::VCMPWEQ", SDTHexagonVecCompare_v2i32>; 202*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWGT: SDNode<"HexagonISD::VCMPWGT", SDTHexagonVecCompare_v2i32>; 203*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWGTU: SDNode<"HexagonISD::VCMPWGTU", SDTHexagonVecCompare_v2i32>; 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerclass vcmp_i1_pat<InstHexagon MI, SDNode Op, PatFrag Value> 207*9880d681SAndroid Build Coastguard Worker : Pat <(i1 (Op Value:$Rs, Value:$Rt)), 208*9880d681SAndroid Build Coastguard Worker (MI Value:$Rs, Value:$Rt)>; 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpbeq, HexagonVCMPBEQ, V8I8>; 211*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A4_vcmpbgt, HexagonVCMPBGT, V8I8>; 212*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpbgtu, HexagonVCMPBGTU, V8I8>; 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpheq, HexagonVCMPHEQ, V4I16>; 215*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmphgt, HexagonVCMPHGT, V4I16>; 216*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmphgtu, HexagonVCMPHGTU, V4I16>; 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpweq, HexagonVCMPWEQ, V2I32>; 219*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpwgt, HexagonVCMPWGT, V2I32>; 220*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpwgtu, HexagonVCMPWGTU, V2I32>; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerclass vcmp_vi1_pat<InstHexagon MI, PatFrag Op, PatFrag InVal, ValueType OutTy> 224*9880d681SAndroid Build Coastguard Worker : Pat <(OutTy (Op InVal:$Rs, InVal:$Rt)), 225*9880d681SAndroid Build Coastguard Worker (MI InVal:$Rs, InVal:$Rt)>; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpweq, seteq, V2I32, v2i1>; 228*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpwgt, setgt, V2I32, v2i1>; 229*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpwgtu, setugt, V2I32, v2i1>; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpheq, seteq, V4I16, v4i1>; 232*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmphgt, setgt, V4I16, v4i1>; 233*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmphgtu, setugt, V4I16, v4i1>; 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker// Hexagon doesn't have a vector multiply with C semantics. 237*9880d681SAndroid Build Coastguard Worker// Instead, generate a pseudo instruction that gets expaneded into two 238*9880d681SAndroid Build Coastguard Worker// scalar MPYI instructions. 239*9880d681SAndroid Build Coastguard Worker// This is expanded by ExpandPostRAPseudos. 240*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in 241*9880d681SAndroid Build Coastguard Workerdef VMULW : PseudoM<(outs DoubleRegs:$Rd), 242*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rs, DoubleRegs:$Rt), 243*9880d681SAndroid Build Coastguard Worker ".error \"Should never try to emit VMULW\"", 244*9880d681SAndroid Build Coastguard Worker [(set V2I32:$Rd, (mul V2I32:$Rs, V2I32:$Rt))]>; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in 247*9880d681SAndroid Build Coastguard Workerdef VMULW_ACC : PseudoM<(outs DoubleRegs:$Rd), 248*9880d681SAndroid Build Coastguard Worker (ins DoubleRegs:$Rx, DoubleRegs:$Rs, DoubleRegs:$Rt), 249*9880d681SAndroid Build Coastguard Worker ".error \"Should never try to emit VMULW_ACC\"", 250*9880d681SAndroid Build Coastguard Worker [(set V2I32:$Rd, (add V2I32:$Rx, (mul V2I32:$Rs, V2I32:$Rt)))], 251*9880d681SAndroid Build Coastguard Worker "$Rd = $Rx">; 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker// Adds two v4i8: Hexagon does not have an insn for this one, so we 254*9880d681SAndroid Build Coastguard Worker// use the double add v8i8, and use only the low part of the result. 255*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (add (v4i8 IntRegs:$Rs), (v4i8 IntRegs:$Rt))), 256*9880d681SAndroid Build Coastguard Worker (LoReg (A2_vaddub (Zext64 $Rs), (Zext64 $Rt)))>; 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker// Subtract two v4i8: Hexagon does not have an insn for this one, so we 259*9880d681SAndroid Build Coastguard Worker// use the double sub v8i8, and use only the low part of the result. 260*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (sub (v4i8 IntRegs:$Rs), (v4i8 IntRegs:$Rt))), 261*9880d681SAndroid Build Coastguard Worker (LoReg (A2_vsubub (Zext64 $Rs), (Zext64 $Rt)))>; 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker// 264*9880d681SAndroid Build Coastguard Worker// No 32 bit vector mux. 265*9880d681SAndroid Build Coastguard Worker// 266*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (select I1:$Pu, V4I8:$Rs, V4I8:$Rt)), 267*9880d681SAndroid Build Coastguard Worker (LoReg (C2_vmux I1:$Pu, (Zext64 $Rs), (Zext64 $Rt)))>; 268*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (select I1:$Pu, V2I16:$Rs, V2I16:$Rt)), 269*9880d681SAndroid Build Coastguard Worker (LoReg (C2_vmux I1:$Pu, (Zext64 $Rs), (Zext64 $Rt)))>; 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker// 272*9880d681SAndroid Build Coastguard Worker// 64-bit vector mux. 273*9880d681SAndroid Build Coastguard Worker// 274*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (vselect V8I1:$Pu, V8I8:$Rs, V8I8:$Rt)), 275*9880d681SAndroid Build Coastguard Worker (C2_vmux V8I1:$Pu, V8I8:$Rs, V8I8:$Rt)>; 276*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (vselect V4I1:$Pu, V4I16:$Rs, V4I16:$Rt)), 277*9880d681SAndroid Build Coastguard Worker (C2_vmux V4I1:$Pu, V4I16:$Rs, V4I16:$Rt)>; 278*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (vselect V2I1:$Pu, V2I32:$Rs, V2I32:$Rt)), 279*9880d681SAndroid Build Coastguard Worker (C2_vmux V2I1:$Pu, V2I32:$Rs, V2I32:$Rt)>; 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker// 282*9880d681SAndroid Build Coastguard Worker// No 32 bit vector compare. 283*9880d681SAndroid Build Coastguard Worker// 284*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (seteq V4I8:$Rs, V4I8:$Rt)), 285*9880d681SAndroid Build Coastguard Worker (A2_vcmpbeq (Zext64 $Rs), (Zext64 $Rt))>; 286*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setgt V4I8:$Rs, V4I8:$Rt)), 287*9880d681SAndroid Build Coastguard Worker (A4_vcmpbgt (Zext64 $Rs), (Zext64 $Rt))>; 288*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setugt V4I8:$Rs, V4I8:$Rt)), 289*9880d681SAndroid Build Coastguard Worker (A2_vcmpbgtu (Zext64 $Rs), (Zext64 $Rt))>; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (seteq V2I16:$Rs, V2I16:$Rt)), 292*9880d681SAndroid Build Coastguard Worker (A2_vcmpheq (Zext64 $Rs), (Zext64 $Rt))>; 293*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setgt V2I16:$Rs, V2I16:$Rt)), 294*9880d681SAndroid Build Coastguard Worker (A2_vcmphgt (Zext64 $Rs), (Zext64 $Rt))>; 295*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setugt V2I16:$Rs, V2I16:$Rt)), 296*9880d681SAndroid Build Coastguard Worker (A2_vcmphgtu (Zext64 $Rs), (Zext64 $Rt))>; 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerclass InvertCmp_pat<InstHexagon InvMI, PatFrag CmpOp, PatFrag Value, 300*9880d681SAndroid Build Coastguard Worker ValueType CmpTy> 301*9880d681SAndroid Build Coastguard Worker : Pat<(CmpTy (CmpOp Value:$Rs, Value:$Rt)), 302*9880d681SAndroid Build Coastguard Worker (InvMI Value:$Rt, Value:$Rs)>; 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker// Map from a compare operation to the corresponding instruction with the 305*9880d681SAndroid Build Coastguard Worker// order of operands reversed, e.g. x > y --> cmp.lt(y,x). 306*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A4_vcmpbgt, setlt, V8I8, i1>; 307*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A4_vcmpbgt, setlt, V8I8, v8i1>; 308*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgt, setlt, V4I16, i1>; 309*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgt, setlt, V4I16, v4i1>; 310*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgt, setlt, V2I32, i1>; 311*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgt, setlt, V2I32, v2i1>; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpbgtu, setult, V8I8, i1>; 314*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpbgtu, setult, V8I8, v8i1>; 315*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgtu, setult, V4I16, i1>; 316*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgtu, setult, V4I16, v4i1>; 317*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgtu, setult, V2I32, i1>; 318*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgtu, setult, V2I32, v2i1>; 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker// Map from vcmpne(Rss) -> !vcmpew(Rss). 321*9880d681SAndroid Build Coastguard Worker// rs != rt -> !(rs == rt). 322*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i1 (setne V2I32:$Rs, V2I32:$Rt)), 323*9880d681SAndroid Build Coastguard Worker (C2_not (v2i1 (A2_vcmpbeq V2I32:$Rs, V2I32:$Rt)))>; 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Worker// Truncate: from vector B copy all 'E'ven 'B'yte elements: 327*9880d681SAndroid Build Coastguard Worker// A[0] = B[0]; A[1] = B[2]; A[2] = B[4]; A[3] = B[6]; 328*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (trunc V4I16:$Rs)), 329*9880d681SAndroid Build Coastguard Worker (S2_vtrunehb V4I16:$Rs)>; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker// Truncate: from vector B copy all 'O'dd 'B'yte elements: 332*9880d681SAndroid Build Coastguard Worker// A[0] = B[1]; A[1] = B[3]; A[2] = B[5]; A[3] = B[7]; 333*9880d681SAndroid Build Coastguard Worker// S2_vtrunohb 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker// Truncate: from vectors B and C copy all 'E'ven 'H'alf-word elements: 336*9880d681SAndroid Build Coastguard Worker// A[0] = B[0]; A[1] = B[2]; A[2] = C[0]; A[3] = C[2]; 337*9880d681SAndroid Build Coastguard Worker// S2_vtruneh 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (trunc V2I32:$Rs)), 340*9880d681SAndroid Build Coastguard Worker (LoReg (S2_packhl (HiReg $Rs), (LoReg $Rs)))>; 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Workerdef HexagonVSXTBH : SDNode<"HexagonISD::VSXTBH", SDTUnaryOp>; 344*9880d681SAndroid Build Coastguard Workerdef HexagonVSXTBW : SDNode<"HexagonISD::VSXTBW", SDTUnaryOp>; 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (HexagonVSXTBH I32:$Rs)), (S2_vsxtbh I32:$Rs)>; 347*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (HexagonVSXTBW I32:$Rs)), (S2_vsxthw I32:$Rs)>; 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (zext V4I8:$Rs)), (S2_vzxtbh V4I8:$Rs)>; 350*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (zext V2I16:$Rs)), (S2_vzxthw V2I16:$Rs)>; 351*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (anyext V4I8:$Rs)), (S2_vzxtbh V4I8:$Rs)>; 352*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (anyext V2I16:$Rs)), (S2_vzxthw V2I16:$Rs)>; 353*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (sext V4I8:$Rs)), (S2_vsxtbh V4I8:$Rs)>; 354*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext V2I16:$Rs)), (S2_vsxthw V2I16:$Rs)>; 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker// Sign extends a v2i8 into a v2i32. 357*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext_inreg V2I32:$Rs, v2i8)), 358*9880d681SAndroid Build Coastguard Worker (A2_combinew (A2_sxtb (HiReg $Rs)), (A2_sxtb (LoReg $Rs)))>; 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker// Sign extends a v2i16 into a v2i32. 361*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext_inreg V2I32:$Rs, v2i16)), 362*9880d681SAndroid Build Coastguard Worker (A2_combinew (A2_sxth (HiReg $Rs)), (A2_sxth (LoReg $Rs)))>; 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker// Multiplies two v2i16 and returns a v2i32. We are using here the 366*9880d681SAndroid Build Coastguard Worker// saturating multiply, as hexagon does not provide a non saturating 367*9880d681SAndroid Build Coastguard Worker// vector multiply, and saturation does not impact the result that is 368*9880d681SAndroid Build Coastguard Worker// in double precision of the operands. 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker// Multiplies two v2i16 vectors: as Hexagon does not have a multiply 371*9880d681SAndroid Build Coastguard Worker// with the C semantics for this one, this pattern uses the half word 372*9880d681SAndroid Build Coastguard Worker// multiply vmpyh that takes two v2i16 and returns a v2i32. This is 373*9880d681SAndroid Build Coastguard Worker// then truncated to fit this back into a v2i16 and to simulate the 374*9880d681SAndroid Build Coastguard Worker// wrap around semantics for unsigned in C. 375*9880d681SAndroid Build Coastguard Workerdef vmpyh: OutPatFrag<(ops node:$Rs, node:$Rt), 376*9880d681SAndroid Build Coastguard Worker (M2_vmpy2s_s0 (i32 $Rs), (i32 $Rt))>; 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (mul V2I16:$Rs, V2I16:$Rt)), 379*9880d681SAndroid Build Coastguard Worker (LoReg (S2_vtrunewh (v2i32 (A2_combineii 0, 0)), 380*9880d681SAndroid Build Coastguard Worker (v2i32 (vmpyh V2I16:$Rs, V2I16:$Rt))))>; 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker// Multiplies two v4i16 vectors. 383*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (mul V4I16:$Rs, V4I16:$Rt)), 384*9880d681SAndroid Build Coastguard Worker (S2_vtrunewh (vmpyh (HiReg $Rs), (HiReg $Rt)), 385*9880d681SAndroid Build Coastguard Worker (vmpyh (LoReg $Rs), (LoReg $Rt)))>; 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerdef VMPYB_no_V5: OutPatFrag<(ops node:$Rs, node:$Rt), 388*9880d681SAndroid Build Coastguard Worker (S2_vtrunewh (vmpyh (HiReg (S2_vsxtbh $Rs)), (HiReg (S2_vsxtbh $Rt))), 389*9880d681SAndroid Build Coastguard Worker (vmpyh (LoReg (S2_vsxtbh $Rs)), (LoReg (S2_vsxtbh $Rt))))>; 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Worker// Multiplies two v4i8 vectors. 392*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (mul V4I8:$Rs, V4I8:$Rt)), 393*9880d681SAndroid Build Coastguard Worker (S2_vtrunehb (M5_vmpybsu V4I8:$Rs, V4I8:$Rt))>, 394*9880d681SAndroid Build Coastguard Worker Requires<[HasV5T]>; 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (mul V4I8:$Rs, V4I8:$Rt)), 397*9880d681SAndroid Build Coastguard Worker (S2_vtrunehb (VMPYB_no_V5 V4I8:$Rs, V4I8:$Rt))>; 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker// Multiplies two v8i8 vectors. 400*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (mul V8I8:$Rs, V8I8:$Rt)), 401*9880d681SAndroid Build Coastguard Worker (A2_combinew (S2_vtrunehb (M5_vmpybsu (HiReg $Rs), (HiReg $Rt))), 402*9880d681SAndroid Build Coastguard Worker (S2_vtrunehb (M5_vmpybsu (LoReg $Rs), (LoReg $Rt))))>, 403*9880d681SAndroid Build Coastguard Worker Requires<[HasV5T]>; 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (mul V8I8:$Rs, V8I8:$Rt)), 406*9880d681SAndroid Build Coastguard Worker (A2_combinew (S2_vtrunehb (VMPYB_no_V5 (HiReg $Rs), (HiReg $Rt))), 407*9880d681SAndroid Build Coastguard Worker (S2_vtrunehb (VMPYB_no_V5 (LoReg $Rs), (LoReg $Rt))))>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Workerclass shuffler<SDNode Op, string Str> 411*9880d681SAndroid Build Coastguard Worker : SInst<(outs DoubleRegs:$a), (ins DoubleRegs:$b, DoubleRegs:$c), 412*9880d681SAndroid Build Coastguard Worker "$a = " # Str # "($b, $c)", 413*9880d681SAndroid Build Coastguard Worker [(set (i64 DoubleRegs:$a), 414*9880d681SAndroid Build Coastguard Worker (i64 (Op (i64 DoubleRegs:$b), (i64 DoubleRegs:$c))))], 415*9880d681SAndroid Build Coastguard Worker "", S_3op_tc_1_SLOT23>; 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Workerdef SDTHexagonBinOp64 : SDTypeProfile<1, 2, 418*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVT<0, i64>]>; 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFEB: SDNode<"HexagonISD::SHUFFEB", SDTHexagonBinOp64>; 421*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFEH: SDNode<"HexagonISD::SHUFFEH", SDTHexagonBinOp64>; 422*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFOB: SDNode<"HexagonISD::SHUFFOB", SDTHexagonBinOp64>; 423*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFOH: SDNode<"HexagonISD::SHUFFOH", SDTHexagonBinOp64>; 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Workerclass ShufflePat<InstHexagon MI, SDNode Op> 426*9880d681SAndroid Build Coastguard Worker : Pat<(i64 (Op DoubleRegs:$src1, DoubleRegs:$src2)), 427*9880d681SAndroid Build Coastguard Worker (i64 (MI DoubleRegs:$src1, DoubleRegs:$src2))>; 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker// Shuffles even bytes for i=0..3: A[2*i].b = C[2*i].b; A[2*i+1].b = B[2*i].b 430*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffeb, HexagonSHUFFEB>; 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker// Shuffles odd bytes for i=0..3: A[2*i].b = C[2*i+1].b; A[2*i+1].b = B[2*i+1].b 433*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffob, HexagonSHUFFOB>; 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Worker// Shuffles even half for i=0,1: A[2*i].h = C[2*i].h; A[2*i+1].h = B[2*i].h 436*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffeh, HexagonSHUFFEH>; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Worker// Shuffles odd half for i=0,1: A[2*i].h = C[2*i+1].h; A[2*i+1].h = B[2*i+1].h 439*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffoh, HexagonSHUFFOH>; 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker 442*9880d681SAndroid Build Coastguard Worker// Truncated store from v4i16 to v4i8. 443*9880d681SAndroid Build Coastguard Workerdef truncstorev4i8: PatFrag<(ops node:$val, node:$ptr), 444*9880d681SAndroid Build Coastguard Worker (truncstore node:$val, node:$ptr), 445*9880d681SAndroid Build Coastguard Worker [{ return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4i8; }]>; 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker// Truncated store from v2i32 to v2i16. 448*9880d681SAndroid Build Coastguard Workerdef truncstorev2i16: PatFrag<(ops node:$val, node:$ptr), 449*9880d681SAndroid Build Coastguard Worker (truncstore node:$val, node:$ptr), 450*9880d681SAndroid Build Coastguard Worker [{ return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v2i16; }]>; 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Workerdef: Pat<(truncstorev2i16 V2I32:$Rs, I32:$Rt), 453*9880d681SAndroid Build Coastguard Worker (S2_storeri_io I32:$Rt, 0, (LoReg (S2_packhl (HiReg $Rs), 454*9880d681SAndroid Build Coastguard Worker (LoReg $Rs))))>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerdef: Pat<(truncstorev4i8 V4I16:$Rs, I32:$Rt), 457*9880d681SAndroid Build Coastguard Worker (S2_storeri_io I32:$Rt, 0, (S2_vtrunehb V4I16:$Rs))>; 458*9880d681SAndroid Build Coastguard Worker 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Worker// Zero and sign extended load from v2i8 into v2i16. 461*9880d681SAndroid Build Coastguard Workerdef zextloadv2i8: PatFrag<(ops node:$ptr), (zextload node:$ptr), 462*9880d681SAndroid Build Coastguard Worker [{ return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v2i8; }]>; 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Workerdef sextloadv2i8: PatFrag<(ops node:$ptr), (sextload node:$ptr), 465*9880d681SAndroid Build Coastguard Worker [{ return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v2i8; }]>; 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (zextloadv2i8 I32:$Rs)), 468*9880d681SAndroid Build Coastguard Worker (LoReg (v4i16 (S2_vzxtbh (L2_loadruh_io I32:$Rs, 0))))>; 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (sextloadv2i8 I32:$Rs)), 471*9880d681SAndroid Build Coastguard Worker (LoReg (v4i16 (S2_vsxtbh (L2_loadrh_io I32:$Rs, 0))))>; 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (zextloadv2i8 I32:$Rs)), 474*9880d681SAndroid Build Coastguard Worker (S2_vzxthw (LoReg (v4i16 (S2_vzxtbh (L2_loadruh_io I32:$Rs, 0)))))>; 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sextloadv2i8 I32:$Rs)), 477*9880d681SAndroid Build Coastguard Worker (S2_vsxthw (LoReg (v4i16 (S2_vsxtbh (L2_loadrh_io I32:$Rs, 0)))))>; 478