10b57cec5SDimitry Andricdef SDTVecBinOp: 20b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, SDTCisSameAs<1,2>]>; 30b57cec5SDimitry Andric 40b57cec5SDimitry Andricdef SDTHexagonVEXTRACTW: SDTypeProfile<1, 2, 50b57cec5SDimitry Andric [SDTCisVT<0, i32>, SDTCisVec<1>, SDTCisVT<2, i32>]>; 60b57cec5SDimitry Andricdef HexagonVEXTRACTW : SDNode<"HexagonISD::VEXTRACTW", SDTHexagonVEXTRACTW>; 70b57cec5SDimitry Andric 80b57cec5SDimitry Andricdef SDTHexagonVINSERTW0: SDTypeProfile<1, 2, 90b57cec5SDimitry Andric [SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisVT<2, i32>]>; 100b57cec5SDimitry Andricdef HexagonVINSERTW0: SDNode<"HexagonISD::VINSERTW0", SDTHexagonVINSERTW0>; 110b57cec5SDimitry Andric 120b57cec5SDimitry Andricdef SDTHexagonVSPLATW: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>; 130b57cec5SDimitry Andricdef HexagonVSPLATW: SDNode<"HexagonISD::VSPLATW", SDTHexagonVSPLATW>; 140b57cec5SDimitry Andric 150b57cec5SDimitry Andricdef HwLen2: SDNodeXForm<imm, [{ 160b57cec5SDimitry Andric const auto &ST = static_cast<const HexagonSubtarget&>(CurDAG->getSubtarget()); 170b57cec5SDimitry Andric return CurDAG->getTargetConstant(ST.getVectorLength()/2, SDLoc(N), MVT::i32); 180b57cec5SDimitry Andric}]>; 190b57cec5SDimitry Andric 200b57cec5SDimitry Andricdef Q2V: OutPatFrag<(ops node:$Qs), (V6_vandqrt $Qs, (A2_tfrsi -1))>; 210b57cec5SDimitry Andric 220b57cec5SDimitry Andricdef Combinev: OutPatFrag<(ops node:$Vs, node:$Vt), 230b57cec5SDimitry Andric (REG_SEQUENCE HvxWR, $Vs, vsub_hi, $Vt, vsub_lo)>; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andricdef Combineq: OutPatFrag<(ops node:$Qs, node:$Qt), 260b57cec5SDimitry Andric (V6_vandvrt 270b57cec5SDimitry Andric (V6_vor 280b57cec5SDimitry Andric (V6_vror (V6_vpackeb (V6_vd0), (Q2V $Qs)), 290b57cec5SDimitry Andric (A2_tfrsi (HwLen2 (i32 0)))), // Half the vector length 300b57cec5SDimitry Andric (V6_vpackeb (V6_vd0), (Q2V $Qt))), 310b57cec5SDimitry Andric (A2_tfrsi -1))>; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andricdef LoVec: OutPatFrag<(ops node:$Vs), (EXTRACT_SUBREG $Vs, vsub_lo)>; 340b57cec5SDimitry Andricdef HiVec: OutPatFrag<(ops node:$Vs), (EXTRACT_SUBREG $Vs, vsub_hi)>; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andricdef HexagonVZERO: SDNode<"HexagonISD::VZERO", SDTVecLeaf>; 370b57cec5SDimitry Andricdef HexagonQCAT: SDNode<"HexagonISD::QCAT", SDTVecBinOp>; 380b57cec5SDimitry Andricdef HexagonQTRUE: SDNode<"HexagonISD::QTRUE", SDTVecLeaf>; 390b57cec5SDimitry Andricdef HexagonQFALSE: SDNode<"HexagonISD::QFALSE", SDTVecLeaf>; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andricdef vzero: PatFrag<(ops), (HexagonVZERO)>; 420b57cec5SDimitry Andricdef qtrue: PatFrag<(ops), (HexagonQTRUE)>; 430b57cec5SDimitry Andricdef qfalse: PatFrag<(ops), (HexagonQFALSE)>; 440b57cec5SDimitry Andricdef qcat: PatFrag<(ops node:$Qs, node:$Qt), 450b57cec5SDimitry Andric (HexagonQCAT node:$Qs, node:$Qt)>; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andricdef qnot: PatFrag<(ops node:$Qs), (xor node:$Qs, qtrue)>; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andricdef VSxtb: OutPatFrag<(ops node:$Vs), (V6_vunpackb $Vs)>; 500b57cec5SDimitry Andricdef VSxth: OutPatFrag<(ops node:$Vs), (V6_vunpackh $Vs)>; 510b57cec5SDimitry Andricdef VZxtb: OutPatFrag<(ops node:$Vs), (V6_vunpackub $Vs)>; 520b57cec5SDimitry Andricdef VZxth: OutPatFrag<(ops node:$Vs), (V6_vunpackuh $Vs)>; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andricdef SplatB: SDNodeXForm<imm, [{ 550b57cec5SDimitry Andric uint32_t V = N->getZExtValue(); 560b57cec5SDimitry Andric assert(isUInt<8>(V)); 570b57cec5SDimitry Andric uint32_t S = V << 24 | V << 16 | V << 8 | V; 580b57cec5SDimitry Andric return CurDAG->getTargetConstant(S, SDLoc(N), MVT::i32); 590b57cec5SDimitry Andric}]>; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andricdef SplatH: SDNodeXForm<imm, [{ 620b57cec5SDimitry Andric uint32_t V = N->getZExtValue(); 630b57cec5SDimitry Andric assert(isUInt<16>(V)); 640b57cec5SDimitry Andric return CurDAG->getTargetConstant(V << 16 | V, SDLoc(N), MVT::i32); 650b57cec5SDimitry Andric}]>; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andricdef IsVecOff : PatLeaf<(i32 imm), [{ 680b57cec5SDimitry Andric int32_t V = N->getSExtValue(); 690b57cec5SDimitry Andric int32_t VecSize = HRI->getSpillSize(Hexagon::HvxVRRegClass); 700b57cec5SDimitry Andric assert(isPowerOf2_32(VecSize)); 710b57cec5SDimitry Andric if ((uint32_t(V) & (uint32_t(VecSize)-1)) != 0) 720b57cec5SDimitry Andric return false; 730b57cec5SDimitry Andric int32_t L = Log2_32(VecSize); 740b57cec5SDimitry Andric return isInt<4>(V >> L); 750b57cec5SDimitry Andric}]>; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric 780b57cec5SDimitry Andricdef alignedload: PatFrag<(ops node:$a), (load $a), [{ 790b57cec5SDimitry Andric return isAlignedMemNode(dyn_cast<MemSDNode>(N)); 800b57cec5SDimitry Andric}]>; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andricdef unalignedload: PatFrag<(ops node:$a), (load $a), [{ 830b57cec5SDimitry Andric return !isAlignedMemNode(dyn_cast<MemSDNode>(N)); 840b57cec5SDimitry Andric}]>; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andricdef alignedstore: PatFrag<(ops node:$v, node:$a), (store $v, $a), [{ 870b57cec5SDimitry Andric return isAlignedMemNode(dyn_cast<MemSDNode>(N)); 880b57cec5SDimitry Andric}]>; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andricdef unalignedstore: PatFrag<(ops node:$v, node:$a), (store $v, $a), [{ 910b57cec5SDimitry Andric return !isAlignedMemNode(dyn_cast<MemSDNode>(N)); 920b57cec5SDimitry Andric}]>; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric// HVX loads 960b57cec5SDimitry Andric 970b57cec5SDimitry Andricmulticlass HvxLd_pat<InstHexagon MI, PatFrag Load, ValueType ResType, 980b57cec5SDimitry Andric PatFrag ImmPred> { 990b57cec5SDimitry Andric def: Pat<(ResType (Load I32:$Rt)), 1000b57cec5SDimitry Andric (MI I32:$Rt, 0)>; 1010b57cec5SDimitry Andric def: Pat<(ResType (Load (add I32:$Rt, ImmPred:$s))), 1020b57cec5SDimitry Andric (MI I32:$Rt, imm:$s)>; 1030b57cec5SDimitry Andric // The HVX selection code for shuffles can generate vector constants. 1040b57cec5SDimitry Andric // Calling "Select" on the resulting loads from CP fails without these 1050b57cec5SDimitry Andric // patterns. 1060b57cec5SDimitry Andric def: Pat<(ResType (Load (HexagonCP tconstpool:$A))), 1070b57cec5SDimitry Andric (MI (A2_tfrsi imm:$A), 0)>; 1080b57cec5SDimitry Andric def: Pat<(ResType (Load (HexagonAtPcrel tconstpool:$A))), 1090b57cec5SDimitry Andric (MI (C4_addipc imm:$A), 0)>; 1100b57cec5SDimitry Andric} 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andricmulticlass HvxLda_pat<InstHexagon MI, PatFrag Load, ValueType ResType, 1130b57cec5SDimitry Andric PatFrag ImmPred> { 1140b57cec5SDimitry Andric let AddedComplexity = 50 in { 1150b57cec5SDimitry Andric def: Pat<(ResType (Load (valignaddr I32:$Rt))), 1160b57cec5SDimitry Andric (MI I32:$Rt, 0)>; 1170b57cec5SDimitry Andric def: Pat<(ResType (Load (add (valignaddr I32:$Rt), ImmPred:$Off))), 1180b57cec5SDimitry Andric (MI I32:$Rt, imm:$Off)>; 1190b57cec5SDimitry Andric } 1200b57cec5SDimitry Andric defm: HvxLd_pat<MI, Load, ResType, ImmPred>; 1210b57cec5SDimitry Andric} 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 1240b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_nt_ai, alignednontemporalload, VecI8, IsVecOff>; 1250b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_nt_ai, alignednontemporalload, VecI16, IsVecOff>; 1260b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_nt_ai, alignednontemporalload, VecI32, IsVecOff>; 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_ai, alignedload, VecI8, IsVecOff>; 1290b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_ai, alignedload, VecI16, IsVecOff>; 1300b57cec5SDimitry Andric defm: HvxLda_pat<V6_vL32b_ai, alignedload, VecI32, IsVecOff>; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric defm: HvxLd_pat<V6_vL32Ub_ai, unalignedload, VecI8, IsVecOff>; 1330b57cec5SDimitry Andric defm: HvxLd_pat<V6_vL32Ub_ai, unalignedload, VecI16, IsVecOff>; 1340b57cec5SDimitry Andric defm: HvxLd_pat<V6_vL32Ub_ai, unalignedload, VecI32, IsVecOff>; 1350b57cec5SDimitry Andric} 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric// HVX stores 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andricmulticlass HvxSt_pat<InstHexagon MI, PatFrag Store, PatFrag ImmPred, 1400b57cec5SDimitry Andric PatFrag Value> { 1410b57cec5SDimitry Andric def: Pat<(Store Value:$Vs, I32:$Rt), 1420b57cec5SDimitry Andric (MI I32:$Rt, 0, Value:$Vs)>; 1430b57cec5SDimitry Andric def: Pat<(Store Value:$Vs, (add I32:$Rt, ImmPred:$s)), 1440b57cec5SDimitry Andric (MI I32:$Rt, imm:$s, Value:$Vs)>; 1450b57cec5SDimitry Andric} 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 1480b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_nt_ai, alignednontemporalstore, IsVecOff, HVI8>; 1490b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_nt_ai, alignednontemporalstore, IsVecOff, HVI16>; 1500b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_nt_ai, alignednontemporalstore, IsVecOff, HVI32>; 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_ai, alignedstore, IsVecOff, HVI8>; 1530b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_ai, alignedstore, IsVecOff, HVI16>; 1540b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32b_ai, alignedstore, IsVecOff, HVI32>; 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32Ub_ai, unalignedstore, IsVecOff, HVI8>; 1570b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32Ub_ai, unalignedstore, IsVecOff, HVI16>; 1580b57cec5SDimitry Andric defm: HvxSt_pat<V6_vS32Ub_ai, unalignedstore, IsVecOff, HVI32>; 1590b57cec5SDimitry Andric} 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric// Bitcasts between same-size vector types are no-ops, except for the 1620b57cec5SDimitry Andric// actual type change. 1630b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 164*8bcb0991SDimitry Andric defm: NopCast_pat<VecI8, VecI16, HvxVR>; 165*8bcb0991SDimitry Andric defm: NopCast_pat<VecI8, VecI32, HvxVR>; 166*8bcb0991SDimitry Andric defm: NopCast_pat<VecI16, VecI32, HvxVR>; 1670b57cec5SDimitry Andric 168*8bcb0991SDimitry Andric defm: NopCast_pat<VecPI8, VecPI16, HvxWR>; 169*8bcb0991SDimitry Andric defm: NopCast_pat<VecPI8, VecPI32, HvxWR>; 170*8bcb0991SDimitry Andric defm: NopCast_pat<VecPI16, VecPI32, HvxWR>; 1710b57cec5SDimitry Andric} 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 1740b57cec5SDimitry Andric def: Pat<(VecI8 vzero), (V6_vd0)>; 1750b57cec5SDimitry Andric def: Pat<(VecI16 vzero), (V6_vd0)>; 1760b57cec5SDimitry Andric def: Pat<(VecI32 vzero), (V6_vd0)>; 1770b57cec5SDimitry Andric def: Pat<(VecPI8 vzero), (PS_vdd0)>; 1780b57cec5SDimitry Andric def: Pat<(VecPI16 vzero), (PS_vdd0)>; 1790b57cec5SDimitry Andric def: Pat<(VecPI32 vzero), (PS_vdd0)>; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric def: Pat<(concat_vectors (VecI8 vzero), (VecI8 vzero)), (PS_vdd0)>; 1820b57cec5SDimitry Andric def: Pat<(concat_vectors (VecI16 vzero), (VecI16 vzero)), (PS_vdd0)>; 1830b57cec5SDimitry Andric def: Pat<(concat_vectors (VecI32 vzero), (VecI32 vzero)), (PS_vdd0)>; 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric def: Pat<(VecPI8 (concat_vectors HVI8:$Vs, HVI8:$Vt)), 1860b57cec5SDimitry Andric (Combinev HvxVR:$Vt, HvxVR:$Vs)>; 1870b57cec5SDimitry Andric def: Pat<(VecPI16 (concat_vectors HVI16:$Vs, HVI16:$Vt)), 1880b57cec5SDimitry Andric (Combinev HvxVR:$Vt, HvxVR:$Vs)>; 1890b57cec5SDimitry Andric def: Pat<(VecPI32 (concat_vectors HVI32:$Vs, HVI32:$Vt)), 1900b57cec5SDimitry Andric (Combinev HvxVR:$Vt, HvxVR:$Vs)>; 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric def: Pat<(VecQ8 (qcat HQ16:$Qs, HQ16:$Qt)), (Combineq $Qt, $Qs)>; 1930b57cec5SDimitry Andric def: Pat<(VecQ16 (qcat HQ32:$Qs, HQ32:$Qt)), (Combineq $Qt, $Qs)>; 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric def: Pat<(HexagonVEXTRACTW HVI8:$Vu, I32:$Rs), 1960b57cec5SDimitry Andric (V6_extractw HvxVR:$Vu, I32:$Rs)>; 1970b57cec5SDimitry Andric def: Pat<(HexagonVEXTRACTW HVI16:$Vu, I32:$Rs), 1980b57cec5SDimitry Andric (V6_extractw HvxVR:$Vu, I32:$Rs)>; 1990b57cec5SDimitry Andric def: Pat<(HexagonVEXTRACTW HVI32:$Vu, I32:$Rs), 2000b57cec5SDimitry Andric (V6_extractw HvxVR:$Vu, I32:$Rs)>; 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric def: Pat<(HexagonVINSERTW0 HVI8:$Vu, I32:$Rt), 2030b57cec5SDimitry Andric (V6_vinsertwr HvxVR:$Vu, I32:$Rt)>; 2040b57cec5SDimitry Andric def: Pat<(HexagonVINSERTW0 HVI16:$Vu, I32:$Rt), 2050b57cec5SDimitry Andric (V6_vinsertwr HvxVR:$Vu, I32:$Rt)>; 2060b57cec5SDimitry Andric def: Pat<(HexagonVINSERTW0 HVI32:$Vu, I32:$Rt), 2070b57cec5SDimitry Andric (V6_vinsertwr HvxVR:$Vu, I32:$Rt)>; 2080b57cec5SDimitry Andric} 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andricdef Vsplatib: OutPatFrag<(ops node:$V), (V6_lvsplatw (ToI32 (SplatB $V)))>; 2110b57cec5SDimitry Andricdef Vsplatih: OutPatFrag<(ops node:$V), (V6_lvsplatw (ToI32 (SplatH $V)))>; 2120b57cec5SDimitry Andricdef Vsplatiw: OutPatFrag<(ops node:$V), (V6_lvsplatw (ToI32 $V))>; 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andricdef Vsplatrb: OutPatFrag<(ops node:$Rs), (V6_lvsplatw (S2_vsplatrb $Rs))>; 2150b57cec5SDimitry Andricdef Vsplatrh: OutPatFrag<(ops node:$Rs), 2160b57cec5SDimitry Andric (V6_lvsplatw (A2_combine_ll $Rs, $Rs))>; 2170b57cec5SDimitry Andricdef Vsplatrw: OutPatFrag<(ops node:$Rs), (V6_lvsplatw $Rs)>; 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andricdef Rep: OutPatFrag<(ops node:$N), (Combinev $N, $N)>; 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 2220b57cec5SDimitry Andric let AddedComplexity = 10 in { 2230b57cec5SDimitry Andric def: Pat<(VecI8 (HexagonVSPLAT u8_0ImmPred:$V)), (Vsplatib $V)>; 2240b57cec5SDimitry Andric def: Pat<(VecI16 (HexagonVSPLAT u16_0ImmPred:$V)), (Vsplatih $V)>; 2250b57cec5SDimitry Andric def: Pat<(VecI32 (HexagonVSPLAT anyimm:$V)), (Vsplatiw $V)>; 2260b57cec5SDimitry Andric def: Pat<(VecPI8 (HexagonVSPLAT u8_0ImmPred:$V)), (Rep (Vsplatib $V))>; 2270b57cec5SDimitry Andric def: Pat<(VecPI16 (HexagonVSPLAT u16_0ImmPred:$V)), (Rep (Vsplatih $V))>; 2280b57cec5SDimitry Andric def: Pat<(VecPI32 (HexagonVSPLAT anyimm:$V)), (Rep (Vsplatiw $V))>; 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric def: Pat<(VecI8 (HexagonVSPLAT I32:$Rs)), (Vsplatrb $Rs)>; 2310b57cec5SDimitry Andric def: Pat<(VecI16 (HexagonVSPLAT I32:$Rs)), (Vsplatrh $Rs)>; 2320b57cec5SDimitry Andric def: Pat<(VecI32 (HexagonVSPLAT I32:$Rs)), (Vsplatrw $Rs)>; 2330b57cec5SDimitry Andric def: Pat<(VecPI8 (HexagonVSPLAT I32:$Rs)), (Rep (Vsplatrb $Rs))>; 2340b57cec5SDimitry Andric def: Pat<(VecPI16 (HexagonVSPLAT I32:$Rs)), (Rep (Vsplatrh $Rs))>; 2350b57cec5SDimitry Andric def: Pat<(VecPI32 (HexagonVSPLAT I32:$Rs)), (Rep (Vsplatrw $Rs))>; 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric def: Pat<(VecI8 (HexagonVSPLATW I32:$Rs)), (Vsplatrw $Rs)>; 2380b57cec5SDimitry Andric def: Pat<(VecI16 (HexagonVSPLATW I32:$Rs)), (Vsplatrw $Rs)>; 2390b57cec5SDimitry Andric def: Pat<(VecI32 (HexagonVSPLATW I32:$Rs)), (Vsplatrw $Rs)>; 2400b57cec5SDimitry Andric def: Pat<(VecPI8 (HexagonVSPLATW I32:$Rs)), (Rep (Vsplatrw $Rs))>; 2410b57cec5SDimitry Andric def: Pat<(VecPI16 (HexagonVSPLATW I32:$Rs)), (Rep (Vsplatrw $Rs))>; 2420b57cec5SDimitry Andric def: Pat<(VecPI32 (HexagonVSPLATW I32:$Rs)), (Rep (Vsplatrw $Rs))>; 2430b57cec5SDimitry Andric} 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andricclass Vneg1<ValueType VecTy> 2460b57cec5SDimitry Andric : PatFrag<(ops), (VecTy (HexagonVSPLATW (i32 -1)))>; 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andricclass Vnot<ValueType VecTy> 2490b57cec5SDimitry Andric : PatFrag<(ops node:$Vs), (xor $Vs, Vneg1<VecTy>)>; 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 252*8bcb0991SDimitry Andric let AddedComplexity = 220 in { 253*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminb, V6_vmaxb, vselect, setgt, VecQ8, HVI8>; 254*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminb, V6_vmaxb, vselect, setge, VecQ8, HVI8>; 255*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminub, V6_vmaxub, vselect, setugt, VecQ8, HVI8>; 256*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminub, V6_vmaxub, vselect, setuge, VecQ8, HVI8>; 257*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminh, V6_vmaxh, vselect, setgt, VecQ16, HVI16>; 258*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminh, V6_vmaxh, vselect, setge, VecQ16, HVI16>; 259*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminuh, V6_vmaxuh, vselect, setugt, VecQ16, HVI16>; 260*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminuh, V6_vmaxuh, vselect, setuge, VecQ16, HVI16>; 261*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminw, V6_vmaxw, vselect, setgt, VecQ32, HVI32>; 262*8bcb0991SDimitry Andric defm: MinMax_pats<V6_vminw, V6_vmaxw, vselect, setge, VecQ32, HVI32>; 263*8bcb0991SDimitry Andric } 264*8bcb0991SDimitry Andric} 265*8bcb0991SDimitry Andric 266*8bcb0991SDimitry Andriclet Predicates = [UseHVX] in { 2670b57cec5SDimitry Andric let AddedComplexity = 200 in { 2680b57cec5SDimitry Andric def: Pat<(Vnot<VecI8> HVI8:$Vs), (V6_vnot HvxVR:$Vs)>; 2690b57cec5SDimitry Andric def: Pat<(Vnot<VecI16> HVI16:$Vs), (V6_vnot HvxVR:$Vs)>; 2700b57cec5SDimitry Andric def: Pat<(Vnot<VecI32> HVI32:$Vs), (V6_vnot HvxVR:$Vs)>; 2710b57cec5SDimitry Andric } 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddb, Add, VecI8, HVI8>; 2740b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddh, Add, VecI16, HVI16>; 2750b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddw, Add, VecI32, HVI32>; 2760b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddb_dv, Add, VecPI8, HWI8>; 2770b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddh_dv, Add, VecPI16, HWI16>; 2780b57cec5SDimitry Andric def: OpR_RR_pat<V6_vaddw_dv, Add, VecPI32, HWI32>; 2790b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubb, Sub, VecI8, HVI8>; 2800b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubh, Sub, VecI16, HVI16>; 2810b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubw, Sub, VecI32, HVI32>; 2820b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubb_dv, Sub, VecPI8, HWI8>; 2830b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubh_dv, Sub, VecPI16, HWI16>; 2840b57cec5SDimitry Andric def: OpR_RR_pat<V6_vsubw_dv, Sub, VecPI32, HWI32>; 2850b57cec5SDimitry Andric def: OpR_RR_pat<V6_vand, And, VecI8, HVI8>; 2860b57cec5SDimitry Andric def: OpR_RR_pat<V6_vand, And, VecI16, HVI16>; 2870b57cec5SDimitry Andric def: OpR_RR_pat<V6_vand, And, VecI32, HVI32>; 2880b57cec5SDimitry Andric def: OpR_RR_pat<V6_vor, Or, VecI8, HVI8>; 2890b57cec5SDimitry Andric def: OpR_RR_pat<V6_vor, Or, VecI16, HVI16>; 2900b57cec5SDimitry Andric def: OpR_RR_pat<V6_vor, Or, VecI32, HVI32>; 2910b57cec5SDimitry Andric def: OpR_RR_pat<V6_vxor, Xor, VecI8, HVI8>; 2920b57cec5SDimitry Andric def: OpR_RR_pat<V6_vxor, Xor, VecI16, HVI16>; 2930b57cec5SDimitry Andric def: OpR_RR_pat<V6_vxor, Xor, VecI32, HVI32>; 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric def: Pat<(vselect HQ8:$Qu, HVI8:$Vs, HVI8:$Vt), 2960b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vs, HvxVR:$Vt)>; 2970b57cec5SDimitry Andric def: Pat<(vselect HQ16:$Qu, HVI16:$Vs, HVI16:$Vt), 2980b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vs, HvxVR:$Vt)>; 2990b57cec5SDimitry Andric def: Pat<(vselect HQ32:$Qu, HVI32:$Vs, HVI32:$Vt), 3000b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vs, HvxVR:$Vt)>; 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andric def: Pat<(vselect (qnot HQ8:$Qu), HVI8:$Vs, HVI8:$Vt), 3030b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vt, HvxVR:$Vs)>; 3040b57cec5SDimitry Andric def: Pat<(vselect (qnot HQ16:$Qu), HVI16:$Vs, HVI16:$Vt), 3050b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vt, HvxVR:$Vs)>; 3060b57cec5SDimitry Andric def: Pat<(vselect (qnot HQ32:$Qu), HVI32:$Vs, HVI32:$Vt), 3070b57cec5SDimitry Andric (V6_vmux HvxQR:$Qu, HvxVR:$Vt, HvxVR:$Vs)>; 3080b57cec5SDimitry Andric} 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 3110b57cec5SDimitry Andric def: Pat<(VecPI16 (sext HVI8:$Vs)), (VSxtb $Vs)>; 3120b57cec5SDimitry Andric def: Pat<(VecPI32 (sext HVI16:$Vs)), (VSxth $Vs)>; 3130b57cec5SDimitry Andric def: Pat<(VecPI16 (zext HVI8:$Vs)), (VZxtb $Vs)>; 3140b57cec5SDimitry Andric def: Pat<(VecPI32 (zext HVI16:$Vs)), (VZxth $Vs)>; 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric def: Pat<(VecI16 (sext_invec HVI8:$Vs)), (LoVec (VSxtb $Vs))>; 3170b57cec5SDimitry Andric def: Pat<(VecI32 (sext_invec HVI16:$Vs)), (LoVec (VSxth $Vs))>; 3180b57cec5SDimitry Andric def: Pat<(VecI32 (sext_invec HVI8:$Vs)), 3190b57cec5SDimitry Andric (LoVec (VSxth (LoVec (VSxtb $Vs))))>; 3200b57cec5SDimitry Andric def: Pat<(VecPI16 (sext_invec HWI8:$Vss)), (VSxtb (LoVec $Vss))>; 3210b57cec5SDimitry Andric def: Pat<(VecPI32 (sext_invec HWI16:$Vss)), (VSxth (LoVec $Vss))>; 3220b57cec5SDimitry Andric def: Pat<(VecPI32 (sext_invec HWI8:$Vss)), 3230b57cec5SDimitry Andric (VSxth (LoVec (VSxtb (LoVec $Vss))))>; 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andric def: Pat<(VecI16 (zext_invec HVI8:$Vs)), (LoVec (VZxtb $Vs))>; 3260b57cec5SDimitry Andric def: Pat<(VecI32 (zext_invec HVI16:$Vs)), (LoVec (VZxth $Vs))>; 3270b57cec5SDimitry Andric def: Pat<(VecI32 (zext_invec HVI8:$Vs)), 3280b57cec5SDimitry Andric (LoVec (VZxth (LoVec (VZxtb $Vs))))>; 3290b57cec5SDimitry Andric def: Pat<(VecPI16 (zext_invec HWI8:$Vss)), (VZxtb (LoVec $Vss))>; 3300b57cec5SDimitry Andric def: Pat<(VecPI32 (zext_invec HWI16:$Vss)), (VZxth (LoVec $Vss))>; 3310b57cec5SDimitry Andric def: Pat<(VecPI32 (zext_invec HWI8:$Vss)), 3320b57cec5SDimitry Andric (VZxth (LoVec (VZxtb (LoVec $Vss))))>; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric def: Pat<(VecI8 (trunc HWI16:$Vss)), 3350b57cec5SDimitry Andric (V6_vpackeb (HiVec $Vss), (LoVec $Vss))>; 3360b57cec5SDimitry Andric def: Pat<(VecI16 (trunc HWI32:$Vss)), 3370b57cec5SDimitry Andric (V6_vpackeh (HiVec $Vss), (LoVec $Vss))>; 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric def: Pat<(VecQ8 (trunc HVI8:$Vs)), 3400b57cec5SDimitry Andric (V6_vandvrt HvxVR:$Vs, (A2_tfrsi 0x01010101))>; 3410b57cec5SDimitry Andric def: Pat<(VecQ16 (trunc HVI16:$Vs)), 3420b57cec5SDimitry Andric (V6_vandvrt HvxVR:$Vs, (A2_tfrsi 0x01010101))>; 3430b57cec5SDimitry Andric def: Pat<(VecQ32 (trunc HVI32:$Vs)), 3440b57cec5SDimitry Andric (V6_vandvrt HvxVR:$Vs, (A2_tfrsi 0x01010101))>; 3450b57cec5SDimitry Andric} 3460b57cec5SDimitry Andric 3470b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 3480b57cec5SDimitry Andric // The "source" types are not legal, and there are no parameterized 3490b57cec5SDimitry Andric // definitions for them, but they are length-specific. 3500b57cec5SDimitry Andric let Predicates = [UseHVX,UseHVX64B] in { 3510b57cec5SDimitry Andric def: Pat<(VecI16 (sext_inreg HVI16:$Vs, v32i8)), 3520b57cec5SDimitry Andric (V6_vasrh (V6_vaslh HVI16:$Vs, (A2_tfrsi 8)), (A2_tfrsi 8))>; 3530b57cec5SDimitry Andric def: Pat<(VecI32 (sext_inreg HVI32:$Vs, v16i8)), 3540b57cec5SDimitry Andric (V6_vasrw (V6_vaslw HVI32:$Vs, (A2_tfrsi 24)), (A2_tfrsi 24))>; 3550b57cec5SDimitry Andric def: Pat<(VecI32 (sext_inreg HVI32:$Vs, v16i16)), 3560b57cec5SDimitry Andric (V6_vasrw (V6_vaslw HVI32:$Vs, (A2_tfrsi 16)), (A2_tfrsi 16))>; 3570b57cec5SDimitry Andric } 3580b57cec5SDimitry Andric let Predicates = [UseHVX,UseHVX128B] in { 3590b57cec5SDimitry Andric def: Pat<(VecI16 (sext_inreg HVI16:$Vs, v64i8)), 3600b57cec5SDimitry Andric (V6_vasrh (V6_vaslh HVI16:$Vs, (A2_tfrsi 8)), (A2_tfrsi 8))>; 3610b57cec5SDimitry Andric def: Pat<(VecI32 (sext_inreg HVI32:$Vs, v32i8)), 3620b57cec5SDimitry Andric (V6_vasrw (V6_vaslw HVI32:$Vs, (A2_tfrsi 24)), (A2_tfrsi 24))>; 3630b57cec5SDimitry Andric def: Pat<(VecI32 (sext_inreg HVI32:$Vs, v32i16)), 3640b57cec5SDimitry Andric (V6_vasrw (V6_vaslw HVI32:$Vs, (A2_tfrsi 16)), (A2_tfrsi 16))>; 3650b57cec5SDimitry Andric } 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric def: Pat<(HexagonVASL HVI8:$Vs, I32:$Rt), 3680b57cec5SDimitry Andric (V6_vpackeb (V6_vaslh (HiVec (VZxtb HvxVR:$Vs)), I32:$Rt), 3690b57cec5SDimitry Andric (V6_vaslh (LoVec (VZxtb HvxVR:$Vs)), I32:$Rt))>; 3700b57cec5SDimitry Andric def: Pat<(HexagonVASR HVI8:$Vs, I32:$Rt), 3710b57cec5SDimitry Andric (V6_vpackeb (V6_vasrh (HiVec (VSxtb HvxVR:$Vs)), I32:$Rt), 3720b57cec5SDimitry Andric (V6_vasrh (LoVec (VSxtb HvxVR:$Vs)), I32:$Rt))>; 3730b57cec5SDimitry Andric def: Pat<(HexagonVLSR HVI8:$Vs, I32:$Rt), 3740b57cec5SDimitry Andric (V6_vpackeb (V6_vlsrh (HiVec (VZxtb HvxVR:$Vs)), I32:$Rt), 3750b57cec5SDimitry Andric (V6_vlsrh (LoVec (VZxtb HvxVR:$Vs)), I32:$Rt))>; 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric def: Pat<(HexagonVASL HVI16:$Vs, I32:$Rt), (V6_vaslh HvxVR:$Vs, I32:$Rt)>; 3780b57cec5SDimitry Andric def: Pat<(HexagonVASL HVI32:$Vs, I32:$Rt), (V6_vaslw HvxVR:$Vs, I32:$Rt)>; 3790b57cec5SDimitry Andric def: Pat<(HexagonVASR HVI16:$Vs, I32:$Rt), (V6_vasrh HvxVR:$Vs, I32:$Rt)>; 3800b57cec5SDimitry Andric def: Pat<(HexagonVASR HVI32:$Vs, I32:$Rt), (V6_vasrw HvxVR:$Vs, I32:$Rt)>; 3810b57cec5SDimitry Andric def: Pat<(HexagonVLSR HVI16:$Vs, I32:$Rt), (V6_vlsrh HvxVR:$Vs, I32:$Rt)>; 3820b57cec5SDimitry Andric def: Pat<(HexagonVLSR HVI32:$Vs, I32:$Rt), (V6_vlsrw HvxVR:$Vs, I32:$Rt)>; 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric def: Pat<(add HVI32:$Vx, (HexagonVASL HVI32:$Vu, I32:$Rt)), 3850b57cec5SDimitry Andric (V6_vaslw_acc HvxVR:$Vx, HvxVR:$Vu, I32:$Rt)>; 3860b57cec5SDimitry Andric def: Pat<(add HVI32:$Vx, (HexagonVASR HVI32:$Vu, I32:$Rt)), 3870b57cec5SDimitry Andric (V6_vasrw_acc HvxVR:$Vx, HvxVR:$Vu, I32:$Rt)>; 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andric def: Pat<(shl HVI16:$Vs, HVI16:$Vt), (V6_vaslhv HvxVR:$Vs, HvxVR:$Vt)>; 3900b57cec5SDimitry Andric def: Pat<(shl HVI32:$Vs, HVI32:$Vt), (V6_vaslwv HvxVR:$Vs, HvxVR:$Vt)>; 3910b57cec5SDimitry Andric def: Pat<(sra HVI16:$Vs, HVI16:$Vt), (V6_vasrhv HvxVR:$Vs, HvxVR:$Vt)>; 3920b57cec5SDimitry Andric def: Pat<(sra HVI32:$Vs, HVI32:$Vt), (V6_vasrwv HvxVR:$Vs, HvxVR:$Vt)>; 3930b57cec5SDimitry Andric def: Pat<(srl HVI16:$Vs, HVI16:$Vt), (V6_vlsrhv HvxVR:$Vs, HvxVR:$Vt)>; 3940b57cec5SDimitry Andric def: Pat<(srl HVI32:$Vs, HVI32:$Vt), (V6_vlsrwv HvxVR:$Vs, HvxVR:$Vt)>; 3950b57cec5SDimitry Andric 3960b57cec5SDimitry Andric def: Pat<(VecI16 (bswap HVI16:$Vs)), 3970b57cec5SDimitry Andric (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x01010101)))>; 3980b57cec5SDimitry Andric def: Pat<(VecI32 (bswap HVI32:$Vs)), 3990b57cec5SDimitry Andric (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x03030303)))>; 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andric def: Pat<(VecI8 (ctpop HVI8:$Vs)), 4020b57cec5SDimitry Andric (V6_vpackeb (V6_vpopcounth (HiVec (V6_vunpackub HvxVR:$Vs))), 4030b57cec5SDimitry Andric (V6_vpopcounth (LoVec (V6_vunpackub HvxVR:$Vs))))>; 4040b57cec5SDimitry Andric def: Pat<(VecI16 (ctpop HVI16:$Vs)), (V6_vpopcounth HvxVR:$Vs)>; 4050b57cec5SDimitry Andric def: Pat<(VecI32 (ctpop HVI32:$Vs)), 4060b57cec5SDimitry Andric (V6_vaddw (LoVec (V6_vzh (V6_vpopcounth HvxVR:$Vs))), 4070b57cec5SDimitry Andric (HiVec (V6_vzh (V6_vpopcounth HvxVR:$Vs))))>; 4080b57cec5SDimitry Andric 4090b57cec5SDimitry Andric def: Pat<(VecI8 (ctlz HVI8:$Vs)), 4100b57cec5SDimitry Andric (V6_vsubb (V6_vpackeb (V6_vcl0h (HiVec (V6_vunpackub HvxVR:$Vs))), 4110b57cec5SDimitry Andric (V6_vcl0h (LoVec (V6_vunpackub HvxVR:$Vs)))), 4120b57cec5SDimitry Andric (V6_lvsplatw (A2_tfrsi 0x08080808)))>; 4130b57cec5SDimitry Andric def: Pat<(VecI16 (ctlz HVI16:$Vs)), (V6_vcl0h HvxVR:$Vs)>; 4140b57cec5SDimitry Andric def: Pat<(VecI32 (ctlz HVI32:$Vs)), (V6_vcl0w HvxVR:$Vs)>; 4150b57cec5SDimitry Andric} 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andricclass HvxSel_pat<InstHexagon MI, PatFrag RegPred> 4180b57cec5SDimitry Andric : Pat<(select I1:$Pu, RegPred:$Vs, RegPred:$Vt), 4190b57cec5SDimitry Andric (MI I1:$Pu, RegPred:$Vs, RegPred:$Vt)>; 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 4220b57cec5SDimitry Andric def: HvxSel_pat<PS_vselect, HVI8>; 4230b57cec5SDimitry Andric def: HvxSel_pat<PS_vselect, HVI16>; 4240b57cec5SDimitry Andric def: HvxSel_pat<PS_vselect, HVI32>; 4250b57cec5SDimitry Andric def: HvxSel_pat<PS_wselect, HWI8>; 4260b57cec5SDimitry Andric def: HvxSel_pat<PS_wselect, HWI16>; 4270b57cec5SDimitry Andric def: HvxSel_pat<PS_wselect, HWI32>; 4280b57cec5SDimitry Andric} 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andriclet Predicates = [UseHVX] in { 4310b57cec5SDimitry Andric def: Pat<(VecQ8 (qtrue)), (PS_qtrue)>; 4320b57cec5SDimitry Andric def: Pat<(VecQ16 (qtrue)), (PS_qtrue)>; 4330b57cec5SDimitry Andric def: Pat<(VecQ32 (qtrue)), (PS_qtrue)>; 4340b57cec5SDimitry Andric def: Pat<(VecQ8 (qfalse)), (PS_qfalse)>; 4350b57cec5SDimitry Andric def: Pat<(VecQ16 (qfalse)), (PS_qfalse)>; 4360b57cec5SDimitry Andric def: Pat<(VecQ32 (qfalse)), (PS_qfalse)>; 4370b57cec5SDimitry Andric 4380b57cec5SDimitry Andric def: Pat<(vnot HQ8:$Qs), (V6_pred_not HvxQR:$Qs)>; 4390b57cec5SDimitry Andric def: Pat<(vnot HQ16:$Qs), (V6_pred_not HvxQR:$Qs)>; 4400b57cec5SDimitry Andric def: Pat<(vnot HQ32:$Qs), (V6_pred_not HvxQR:$Qs)>; 4410b57cec5SDimitry Andric def: Pat<(qnot HQ8:$Qs), (V6_pred_not HvxQR:$Qs)>; 4420b57cec5SDimitry Andric def: Pat<(qnot HQ16:$Qs), (V6_pred_not HvxQR:$Qs)>; 4430b57cec5SDimitry Andric def: Pat<(qnot HQ32:$Qs), (V6_pred_not HvxQR:$Qs)>; 4440b57cec5SDimitry Andric 4450b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and, And, VecQ8, HQ8>; 4460b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and, And, VecQ16, HQ16>; 4470b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and, And, VecQ32, HQ32>; 4480b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or, Or, VecQ8, HQ8>; 4490b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or, Or, VecQ16, HQ16>; 4500b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or, Or, VecQ32, HQ32>; 4510b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_xor, Xor, VecQ8, HQ8>; 4520b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_xor, Xor, VecQ16, HQ16>; 4530b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_xor, Xor, VecQ32, HQ32>; 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and_n, Not2<And>, VecQ8, HQ8>; 4560b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and_n, Not2<And>, VecQ16, HQ16>; 4570b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_and_n, Not2<And>, VecQ32, HQ32>; 4580b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or_n, Not2<Or>, VecQ8, HQ8>; 4590b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or_n, Not2<Or>, VecQ16, HQ16>; 4600b57cec5SDimitry Andric def: OpR_RR_pat<V6_pred_or_n, Not2<Or>, VecQ32, HQ32>; 4610b57cec5SDimitry Andric 4620b57cec5SDimitry Andric def: OpR_RR_pat<V6_veqb, seteq, VecQ8, HVI8>; 4630b57cec5SDimitry Andric def: OpR_RR_pat<V6_veqh, seteq, VecQ16, HVI16>; 4640b57cec5SDimitry Andric def: OpR_RR_pat<V6_veqw, seteq, VecQ32, HVI32>; 4650b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgtb, setgt, VecQ8, HVI8>; 4660b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgth, setgt, VecQ16, HVI16>; 4670b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgtw, setgt, VecQ32, HVI32>; 4680b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgtub, setugt, VecQ8, HVI8>; 4690b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgtuh, setugt, VecQ16, HVI16>; 4700b57cec5SDimitry Andric def: OpR_RR_pat<V6_vgtuw, setugt, VecQ32, HVI32>; 4710b57cec5SDimitry Andric 4720b57cec5SDimitry Andric def: AccRRR_pat<V6_veqb_and, And, seteq, HQ8, HVI8, HVI8>; 4730b57cec5SDimitry Andric def: AccRRR_pat<V6_veqb_or, Or, seteq, HQ8, HVI8, HVI8>; 4740b57cec5SDimitry Andric def: AccRRR_pat<V6_veqb_xor, Xor, seteq, HQ8, HVI8, HVI8>; 4750b57cec5SDimitry Andric def: AccRRR_pat<V6_veqh_and, And, seteq, HQ16, HVI16, HVI16>; 4760b57cec5SDimitry Andric def: AccRRR_pat<V6_veqh_or, Or, seteq, HQ16, HVI16, HVI16>; 4770b57cec5SDimitry Andric def: AccRRR_pat<V6_veqh_xor, Xor, seteq, HQ16, HVI16, HVI16>; 4780b57cec5SDimitry Andric def: AccRRR_pat<V6_veqw_and, And, seteq, HQ32, HVI32, HVI32>; 4790b57cec5SDimitry Andric def: AccRRR_pat<V6_veqw_or, Or, seteq, HQ32, HVI32, HVI32>; 4800b57cec5SDimitry Andric def: AccRRR_pat<V6_veqw_xor, Xor, seteq, HQ32, HVI32, HVI32>; 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtb_and, And, setgt, HQ8, HVI8, HVI8>; 4830b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtb_or, Or, setgt, HQ8, HVI8, HVI8>; 4840b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtb_xor, Xor, setgt, HQ8, HVI8, HVI8>; 4850b57cec5SDimitry Andric def: AccRRR_pat<V6_vgth_and, And, setgt, HQ16, HVI16, HVI16>; 4860b57cec5SDimitry Andric def: AccRRR_pat<V6_vgth_or, Or, setgt, HQ16, HVI16, HVI16>; 4870b57cec5SDimitry Andric def: AccRRR_pat<V6_vgth_xor, Xor, setgt, HQ16, HVI16, HVI16>; 4880b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtw_and, And, setgt, HQ32, HVI32, HVI32>; 4890b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtw_or, Or, setgt, HQ32, HVI32, HVI32>; 4900b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtw_xor, Xor, setgt, HQ32, HVI32, HVI32>; 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtub_and, And, setugt, HQ8, HVI8, HVI8>; 4930b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtub_or, Or, setugt, HQ8, HVI8, HVI8>; 4940b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtub_xor, Xor, setugt, HQ8, HVI8, HVI8>; 4950b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuh_and, And, setugt, HQ16, HVI16, HVI16>; 4960b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuh_or, Or, setugt, HQ16, HVI16, HVI16>; 4970b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuh_xor, Xor, setugt, HQ16, HVI16, HVI16>; 4980b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuw_and, And, setugt, HQ32, HVI32, HVI32>; 4990b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuw_or, Or, setugt, HQ32, HVI32, HVI32>; 5000b57cec5SDimitry Andric def: AccRRR_pat<V6_vgtuw_xor, Xor, setugt, HQ32, HVI32, HVI32>; 5010b57cec5SDimitry Andric} 502