15f613dfdSUlrich Weigand//===-- SystemZOperators.td - SystemZ-specific operators ------*- tblgen-*-===// 25f613dfdSUlrich Weigand// 35f613dfdSUlrich Weigand// The LLVM Compiler Infrastructure 45f613dfdSUlrich Weigand// 55f613dfdSUlrich Weigand// This file is distributed under the University of Illinois Open Source 65f613dfdSUlrich Weigand// License. See LICENSE.TXT for details. 75f613dfdSUlrich Weigand// 85f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 95f613dfdSUlrich Weigand 105f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 115f613dfdSUlrich Weigand// Type profiles 125f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 135f613dfdSUlrich Weiganddef SDT_CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i64>]>; 145f613dfdSUlrich Weiganddef SDT_CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i64>, 155f613dfdSUlrich Weigand SDTCisVT<1, i64>]>; 165f613dfdSUlrich Weiganddef SDT_ZCall : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>; 175f613dfdSUlrich Weiganddef SDT_ZCmp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>; 185bc670bbSRichard Sandiforddef SDT_ZICmp : SDTypeProfile<0, 3, 195bc670bbSRichard Sandiford [SDTCisSameAs<0, 1>, 205bc670bbSRichard Sandiford SDTCisVT<2, i32>]>; 213d768e33SRichard Sandiforddef SDT_ZBRCCMask : SDTypeProfile<0, 3, 22ca44614aSRichard Sandiford [SDTCisVT<0, i32>, 23ca44614aSRichard Sandiford SDTCisVT<1, i32>, 243d768e33SRichard Sandiford SDTCisVT<2, OtherVT>]>; 253d768e33SRichard Sandiforddef SDT_ZSelectCCMask : SDTypeProfile<1, 4, 265f613dfdSUlrich Weigand [SDTCisSameAs<0, 1>, 275f613dfdSUlrich Weigand SDTCisSameAs<1, 2>, 28ca44614aSRichard Sandiford SDTCisVT<3, i32>, 29ca44614aSRichard Sandiford SDTCisVT<4, i32>]>; 305f613dfdSUlrich Weiganddef SDT_ZWrapPtr : SDTypeProfile<1, 1, 315f613dfdSUlrich Weigand [SDTCisSameAs<0, 1>, 325f613dfdSUlrich Weigand SDTCisPtrTy<0>]>; 3354b36916SRichard Sandiforddef SDT_ZWrapOffset : SDTypeProfile<1, 2, 3454b36916SRichard Sandiford [SDTCisSameAs<0, 1>, 3554b36916SRichard Sandiford SDTCisSameAs<0, 2>, 3654b36916SRichard Sandiford SDTCisPtrTy<0>]>; 375f613dfdSUlrich Weiganddef SDT_ZAdjDynAlloc : SDTypeProfile<1, 0, [SDTCisVT<0, i64>]>; 385f613dfdSUlrich Weiganddef SDT_ZExtractAccess : SDTypeProfile<1, 1, 395f613dfdSUlrich Weigand [SDTCisVT<0, i32>, 40ca44614aSRichard Sandiford SDTCisVT<1, i32>]>; 415f613dfdSUlrich Weiganddef SDT_ZGR128Binary32 : SDTypeProfile<1, 2, 425f613dfdSUlrich Weigand [SDTCisVT<0, untyped>, 435f613dfdSUlrich Weigand SDTCisVT<1, untyped>, 445f613dfdSUlrich Weigand SDTCisVT<2, i32>]>; 455f613dfdSUlrich Weiganddef SDT_ZGR128Binary64 : SDTypeProfile<1, 2, 465f613dfdSUlrich Weigand [SDTCisVT<0, untyped>, 475f613dfdSUlrich Weigand SDTCisVT<1, untyped>, 485f613dfdSUlrich Weigand SDTCisVT<2, i64>]>; 495f613dfdSUlrich Weiganddef SDT_ZAtomicLoadBinaryW : SDTypeProfile<1, 5, 505f613dfdSUlrich Weigand [SDTCisVT<0, i32>, 515f613dfdSUlrich Weigand SDTCisPtrTy<1>, 525f613dfdSUlrich Weigand SDTCisVT<2, i32>, 535f613dfdSUlrich Weigand SDTCisVT<3, i32>, 545f613dfdSUlrich Weigand SDTCisVT<4, i32>, 555f613dfdSUlrich Weigand SDTCisVT<5, i32>]>; 565f613dfdSUlrich Weiganddef SDT_ZAtomicCmpSwapW : SDTypeProfile<1, 6, 575f613dfdSUlrich Weigand [SDTCisVT<0, i32>, 585f613dfdSUlrich Weigand SDTCisPtrTy<1>, 595f613dfdSUlrich Weigand SDTCisVT<2, i32>, 605f613dfdSUlrich Weigand SDTCisVT<3, i32>, 615f613dfdSUlrich Weigand SDTCisVT<4, i32>, 625f613dfdSUlrich Weigand SDTCisVT<5, i32>, 635f613dfdSUlrich Weigand SDTCisVT<6, i32>]>; 64761703a2SRichard Sandiforddef SDT_ZMemMemLength : SDTypeProfile<0, 3, 65d131ff8cSRichard Sandiford [SDTCisPtrTy<0>, 66d131ff8cSRichard Sandiford SDTCisPtrTy<1>, 675e318f0bSRichard Sandiford SDTCisVT<2, i64>]>; 685e318f0bSRichard Sandiforddef SDT_ZMemMemLoop : SDTypeProfile<0, 4, 695e318f0bSRichard Sandiford [SDTCisPtrTy<0>, 705e318f0bSRichard Sandiford SDTCisPtrTy<1>, 715e318f0bSRichard Sandiford SDTCisVT<2, i64>, 725e318f0bSRichard Sandiford SDTCisVT<3, i64>]>; 73ca232710SRichard Sandiforddef SDT_ZString : SDTypeProfile<1, 3, 74ca232710SRichard Sandiford [SDTCisPtrTy<0>, 75ca232710SRichard Sandiford SDTCisPtrTy<1>, 76ca232710SRichard Sandiford SDTCisPtrTy<2>, 77ca232710SRichard Sandiford SDTCisVT<3, i32>]>; 78564681c8SRichard Sandiforddef SDT_ZI32Intrinsic : SDTypeProfile<1, 0, [SDTCisVT<0, i32>]>; 7903481334SRichard Sandiforddef SDT_ZPrefetch : SDTypeProfile<0, 2, 80ca44614aSRichard Sandiford [SDTCisVT<0, i32>, 8103481334SRichard Sandiford SDTCisPtrTy<1>]>; 8257c85f53SUlrich Weiganddef SDT_ZTBegin : SDTypeProfile<0, 2, 8357c85f53SUlrich Weigand [SDTCisPtrTy<0>, 8457c85f53SUlrich Weigand SDTCisVT<1, i32>]>; 85ce4c1095SUlrich Weiganddef SDT_ZInsertVectorElt : SDTypeProfile<1, 3, 86ce4c1095SUlrich Weigand [SDTCisVec<0>, 87ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 88ce4c1095SUlrich Weigand SDTCisVT<3, i32>]>; 89ce4c1095SUlrich Weiganddef SDT_ZExtractVectorElt : SDTypeProfile<1, 2, 90ce4c1095SUlrich Weigand [SDTCisVec<1>, 91ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 92ce4c1095SUlrich Weiganddef SDT_ZReplicate : SDTypeProfile<1, 1, 93ce4c1095SUlrich Weigand [SDTCisVec<0>]>; 94ce4c1095SUlrich Weiganddef SDT_ZVecBinary : SDTypeProfile<1, 2, 95ce4c1095SUlrich Weigand [SDTCisVec<0>, 96ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 97ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>]>; 98ce4c1095SUlrich Weiganddef SDT_ZVecBinaryInt : SDTypeProfile<1, 2, 99ce4c1095SUlrich Weigand [SDTCisVec<0>, 100ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 101ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 102ce4c1095SUlrich Weiganddef SDT_ZVecBinaryConv : SDTypeProfile<1, 2, 103ce4c1095SUlrich Weigand [SDTCisVec<0>, 104ce4c1095SUlrich Weigand SDTCisVec<1>, 105ce4c1095SUlrich Weigand SDTCisSameAs<1, 2>]>; 106ce4c1095SUlrich Weiganddef SDT_ZRotateMask : SDTypeProfile<1, 2, 107ce4c1095SUlrich Weigand [SDTCisVec<0>, 108ce4c1095SUlrich Weigand SDTCisVT<1, i32>, 109ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 110ce4c1095SUlrich Weiganddef SDT_ZJoinDwords : SDTypeProfile<1, 2, 111ce4c1095SUlrich Weigand [SDTCisVT<0, v2i64>, 112ce4c1095SUlrich Weigand SDTCisVT<1, i64>, 113ce4c1095SUlrich Weigand SDTCisVT<2, i64>]>; 114ce4c1095SUlrich Weiganddef SDT_ZVecTernary : SDTypeProfile<1, 3, 115ce4c1095SUlrich Weigand [SDTCisVec<0>, 116ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 117ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>, 118ce4c1095SUlrich Weigand SDTCisSameAs<0, 3>]>; 119ce4c1095SUlrich Weiganddef SDT_ZVecTernaryInt : SDTypeProfile<1, 3, 120ce4c1095SUlrich Weigand [SDTCisVec<0>, 121ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 122ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>, 123ce4c1095SUlrich Weigand SDTCisVT<3, i32>]>; 1245f613dfdSUlrich Weigand 1255f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 1265f613dfdSUlrich Weigand// Node definitions 1275f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 1285f613dfdSUlrich Weigand 1295f613dfdSUlrich Weigand// These are target-independent nodes, but have target-specific formats. 1305f613dfdSUlrich Weiganddef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_CallSeqStart, 1315f613dfdSUlrich Weigand [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>; 1325f613dfdSUlrich Weiganddef callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_CallSeqEnd, 1335f613dfdSUlrich Weigand [SDNPHasChain, SDNPSideEffect, SDNPOptInGlue, 1345f613dfdSUlrich Weigand SDNPOutGlue]>; 1357db6918eSUlrich Weiganddef global_offset_table : SDNode<"ISD::GLOBAL_OFFSET_TABLE", SDTPtrLeaf>; 1365f613dfdSUlrich Weigand 1375f613dfdSUlrich Weigand// Nodes for SystemZISD::*. See SystemZISelLowering.h for more details. 1385f613dfdSUlrich Weiganddef z_retflag : SDNode<"SystemZISD::RET_FLAG", SDTNone, 1395f613dfdSUlrich Weigand [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 1405f613dfdSUlrich Weiganddef z_call : SDNode<"SystemZISD::CALL", SDT_ZCall, 1415f613dfdSUlrich Weigand [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 1425f613dfdSUlrich Weigand SDNPVariadic]>; 143709bda66SRichard Sandiforddef z_sibcall : SDNode<"SystemZISD::SIBCALL", SDT_ZCall, 144709bda66SRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 145709bda66SRichard Sandiford SDNPVariadic]>; 1467db6918eSUlrich Weiganddef z_tls_gdcall : SDNode<"SystemZISD::TLS_GDCALL", SDT_ZCall, 1477db6918eSUlrich Weigand [SDNPHasChain, SDNPInGlue, SDNPOutGlue, 1487db6918eSUlrich Weigand SDNPVariadic]>; 1497db6918eSUlrich Weiganddef z_tls_ldcall : SDNode<"SystemZISD::TLS_LDCALL", SDT_ZCall, 1507db6918eSUlrich Weigand [SDNPHasChain, SDNPInGlue, SDNPOutGlue, 1517db6918eSUlrich Weigand SDNPVariadic]>; 1525f613dfdSUlrich Weiganddef z_pcrel_wrapper : SDNode<"SystemZISD::PCREL_WRAPPER", SDT_ZWrapPtr, []>; 15354b36916SRichard Sandiforddef z_pcrel_offset : SDNode<"SystemZISD::PCREL_OFFSET", 15454b36916SRichard Sandiford SDT_ZWrapOffset, []>; 15557485472SRichard Sandiforddef z_iabs : SDNode<"SystemZISD::IABS", SDTIntUnaryOp, []>; 1565bc670bbSRichard Sandiforddef z_icmp : SDNode<"SystemZISD::ICMP", SDT_ZICmp, [SDNPOutGlue]>; 1575bc670bbSRichard Sandiforddef z_fcmp : SDNode<"SystemZISD::FCMP", SDT_ZCmp, [SDNPOutGlue]>; 158a9eb9972SRichard Sandiforddef z_tm : SDNode<"SystemZISD::TM", SDT_ZICmp, [SDNPOutGlue]>; 1595f613dfdSUlrich Weiganddef z_br_ccmask : SDNode<"SystemZISD::BR_CCMASK", SDT_ZBRCCMask, 1605f613dfdSUlrich Weigand [SDNPHasChain, SDNPInGlue]>; 1615f613dfdSUlrich Weiganddef z_select_ccmask : SDNode<"SystemZISD::SELECT_CCMASK", SDT_ZSelectCCMask, 1625f613dfdSUlrich Weigand [SDNPInGlue]>; 1635f613dfdSUlrich Weiganddef z_adjdynalloc : SDNode<"SystemZISD::ADJDYNALLOC", SDT_ZAdjDynAlloc>; 1645f613dfdSUlrich Weiganddef z_extract_access : SDNode<"SystemZISD::EXTRACT_ACCESS", 1655f613dfdSUlrich Weigand SDT_ZExtractAccess>; 166b401218cSUlrich Weiganddef z_popcnt : SDNode<"SystemZISD::POPCNT", SDTIntUnaryOp>; 1675f613dfdSUlrich Weiganddef z_umul_lohi64 : SDNode<"SystemZISD::UMUL_LOHI64", SDT_ZGR128Binary64>; 168e6e78855SRichard Sandiforddef z_sdivrem32 : SDNode<"SystemZISD::SDIVREM32", SDT_ZGR128Binary32>; 1695f613dfdSUlrich Weiganddef z_sdivrem64 : SDNode<"SystemZISD::SDIVREM64", SDT_ZGR128Binary64>; 1705f613dfdSUlrich Weiganddef z_udivrem32 : SDNode<"SystemZISD::UDIVREM32", SDT_ZGR128Binary32>; 1715f613dfdSUlrich Weiganddef z_udivrem64 : SDNode<"SystemZISD::UDIVREM64", SDT_ZGR128Binary64>; 1725f613dfdSUlrich Weigand 1739afe613dSRichard Sandiforddef z_serialize : SDNode<"SystemZISD::SERIALIZE", SDTNone, 1749afe613dSRichard Sandiford [SDNPHasChain, SDNPMayStore]>; 1759afe613dSRichard Sandiford 176ce4c1095SUlrich Weigand// Defined because the index is an i32 rather than a pointer. 177ce4c1095SUlrich Weiganddef z_vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT", 178ce4c1095SUlrich Weigand SDT_ZInsertVectorElt>; 179ce4c1095SUlrich Weiganddef z_vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT", 180ce4c1095SUlrich Weigand SDT_ZExtractVectorElt>; 181ce4c1095SUlrich Weiganddef z_byte_mask : SDNode<"SystemZISD::BYTE_MASK", SDT_ZReplicate>; 182ce4c1095SUlrich Weiganddef z_rotate_mask : SDNode<"SystemZISD::ROTATE_MASK", SDT_ZRotateMask>; 183ce4c1095SUlrich Weiganddef z_replicate : SDNode<"SystemZISD::REPLICATE", SDT_ZReplicate>; 184ce4c1095SUlrich Weiganddef z_join_dwords : SDNode<"SystemZISD::JOIN_DWORDS", SDT_ZJoinDwords>; 185ce4c1095SUlrich Weiganddef z_splat : SDNode<"SystemZISD::SPLAT", SDT_ZVecBinaryInt>; 186ce4c1095SUlrich Weiganddef z_merge_high : SDNode<"SystemZISD::MERGE_HIGH", SDT_ZVecBinary>; 187ce4c1095SUlrich Weiganddef z_merge_low : SDNode<"SystemZISD::MERGE_LOW", SDT_ZVecBinary>; 188ce4c1095SUlrich Weiganddef z_shl_double : SDNode<"SystemZISD::SHL_DOUBLE", SDT_ZVecTernaryInt>; 189ce4c1095SUlrich Weiganddef z_permute_dwords : SDNode<"SystemZISD::PERMUTE_DWORDS", 190ce4c1095SUlrich Weigand SDT_ZVecTernaryInt>; 191ce4c1095SUlrich Weiganddef z_permute : SDNode<"SystemZISD::PERMUTE", SDT_ZVecTernary>; 192ce4c1095SUlrich Weiganddef z_pack : SDNode<"SystemZISD::PACK", SDT_ZVecBinaryConv>; 193ce4c1095SUlrich Weiganddef z_vshl_by_scalar : SDNode<"SystemZISD::VSHL_BY_SCALAR", 194ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 195ce4c1095SUlrich Weiganddef z_vsrl_by_scalar : SDNode<"SystemZISD::VSRL_BY_SCALAR", 196ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 197ce4c1095SUlrich Weiganddef z_vsra_by_scalar : SDNode<"SystemZISD::VSRA_BY_SCALAR", 198ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 199ce4c1095SUlrich Weiganddef z_vsum : SDNode<"SystemZISD::VSUM", SDT_ZVecBinaryConv>; 200ce4c1095SUlrich Weiganddef z_vicmpe : SDNode<"SystemZISD::VICMPE", SDT_ZVecBinary>; 201ce4c1095SUlrich Weiganddef z_vicmph : SDNode<"SystemZISD::VICMPH", SDT_ZVecBinary>; 202ce4c1095SUlrich Weiganddef z_vicmphl : SDNode<"SystemZISD::VICMPHL", SDT_ZVecBinary>; 203*cd808237SUlrich Weiganddef z_vfcmpe : SDNode<"SystemZISD::VFCMPE", SDT_ZVecBinaryConv>; 204*cd808237SUlrich Weiganddef z_vfcmph : SDNode<"SystemZISD::VFCMPH", SDT_ZVecBinaryConv>; 205*cd808237SUlrich Weiganddef z_vfcmphe : SDNode<"SystemZISD::VFCMPHE", SDT_ZVecBinaryConv>; 206ce4c1095SUlrich Weigand 2075f613dfdSUlrich Weigandclass AtomicWOp<string name, SDTypeProfile profile = SDT_ZAtomicLoadBinaryW> 2085f613dfdSUlrich Weigand : SDNode<"SystemZISD::"##name, profile, 2095f613dfdSUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; 2105f613dfdSUlrich Weigand 2115f613dfdSUlrich Weiganddef z_atomic_swapw : AtomicWOp<"ATOMIC_SWAPW">; 2125f613dfdSUlrich Weiganddef z_atomic_loadw_add : AtomicWOp<"ATOMIC_LOADW_ADD">; 2135f613dfdSUlrich Weiganddef z_atomic_loadw_sub : AtomicWOp<"ATOMIC_LOADW_SUB">; 2145f613dfdSUlrich Weiganddef z_atomic_loadw_and : AtomicWOp<"ATOMIC_LOADW_AND">; 2155f613dfdSUlrich Weiganddef z_atomic_loadw_or : AtomicWOp<"ATOMIC_LOADW_OR">; 2165f613dfdSUlrich Weiganddef z_atomic_loadw_xor : AtomicWOp<"ATOMIC_LOADW_XOR">; 2175f613dfdSUlrich Weiganddef z_atomic_loadw_nand : AtomicWOp<"ATOMIC_LOADW_NAND">; 2185f613dfdSUlrich Weiganddef z_atomic_loadw_min : AtomicWOp<"ATOMIC_LOADW_MIN">; 2195f613dfdSUlrich Weiganddef z_atomic_loadw_max : AtomicWOp<"ATOMIC_LOADW_MAX">; 2205f613dfdSUlrich Weiganddef z_atomic_loadw_umin : AtomicWOp<"ATOMIC_LOADW_UMIN">; 2215f613dfdSUlrich Weiganddef z_atomic_loadw_umax : AtomicWOp<"ATOMIC_LOADW_UMAX">; 2225f613dfdSUlrich Weiganddef z_atomic_cmp_swapw : AtomicWOp<"ATOMIC_CMP_SWAPW", SDT_ZAtomicCmpSwapW>; 2235f613dfdSUlrich Weigand 224761703a2SRichard Sandiforddef z_mvc : SDNode<"SystemZISD::MVC", SDT_ZMemMemLength, 225d131ff8cSRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 2265e318f0bSRichard Sandiforddef z_mvc_loop : SDNode<"SystemZISD::MVC_LOOP", SDT_ZMemMemLoop, 2275e318f0bSRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 228178273a1SRichard Sandiforddef z_nc : SDNode<"SystemZISD::NC", SDT_ZMemMemLength, 229178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 230178273a1SRichard Sandiforddef z_nc_loop : SDNode<"SystemZISD::NC_LOOP", SDT_ZMemMemLoop, 231178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 232178273a1SRichard Sandiforddef z_oc : SDNode<"SystemZISD::OC", SDT_ZMemMemLength, 233178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 234178273a1SRichard Sandiforddef z_oc_loop : SDNode<"SystemZISD::OC_LOOP", SDT_ZMemMemLoop, 235178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 236178273a1SRichard Sandiforddef z_xc : SDNode<"SystemZISD::XC", SDT_ZMemMemLength, 237178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 238178273a1SRichard Sandiforddef z_xc_loop : SDNode<"SystemZISD::XC_LOOP", SDT_ZMemMemLoop, 239178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 240761703a2SRichard Sandiforddef z_clc : SDNode<"SystemZISD::CLC", SDT_ZMemMemLength, 241564681c8SRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPMayLoad]>; 2425e318f0bSRichard Sandiforddef z_clc_loop : SDNode<"SystemZISD::CLC_LOOP", SDT_ZMemMemLoop, 2435e318f0bSRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPMayLoad]>; 244ca232710SRichard Sandiforddef z_strcmp : SDNode<"SystemZISD::STRCMP", SDT_ZString, 245ca232710SRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPMayLoad]>; 246bb83a50fSRichard Sandiforddef z_stpcpy : SDNode<"SystemZISD::STPCPY", SDT_ZString, 247bb83a50fSRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 2480dec06a2SRichard Sandiforddef z_search_string : SDNode<"SystemZISD::SEARCH_STRING", SDT_ZString, 2490dec06a2SRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPMayLoad]>; 250564681c8SRichard Sandiforddef z_ipm : SDNode<"SystemZISD::IPM", SDT_ZI32Intrinsic, 251564681c8SRichard Sandiford [SDNPInGlue]>; 25203481334SRichard Sandiforddef z_prefetch : SDNode<"SystemZISD::PREFETCH", SDT_ZPrefetch, 25303481334SRichard Sandiford [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 25403481334SRichard Sandiford SDNPMemOperand]>; 255d131ff8cSRichard Sandiford 25657c85f53SUlrich Weiganddef z_tbegin : SDNode<"SystemZISD::TBEGIN", SDT_ZTBegin, 25757c85f53SUlrich Weigand [SDNPHasChain, SDNPOutGlue, SDNPMayStore, 25857c85f53SUlrich Weigand SDNPSideEffect]>; 25957c85f53SUlrich Weiganddef z_tbegin_nofloat : SDNode<"SystemZISD::TBEGIN_NOFLOAT", SDT_ZTBegin, 26057c85f53SUlrich Weigand [SDNPHasChain, SDNPOutGlue, SDNPMayStore, 26157c85f53SUlrich Weigand SDNPSideEffect]>; 26257c85f53SUlrich Weiganddef z_tend : SDNode<"SystemZISD::TEND", SDTNone, 26357c85f53SUlrich Weigand [SDNPHasChain, SDNPOutGlue, SDNPSideEffect]>; 26457c85f53SUlrich Weigand 265ce4c1095SUlrich Weiganddef z_vshl : SDNode<"ISD::SHL", SDT_ZVecBinary>; 266ce4c1095SUlrich Weiganddef z_vsra : SDNode<"ISD::SRA", SDT_ZVecBinary>; 267ce4c1095SUlrich Weiganddef z_vsrl : SDNode<"ISD::SRL", SDT_ZVecBinary>; 268ce4c1095SUlrich Weigand 2695f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 2705f613dfdSUlrich Weigand// Pattern fragments 2715f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 2725f613dfdSUlrich Weigand 2735bc670bbSRichard Sandiford// Signed and unsigned comparisons. 2745bc670bbSRichard Sandiforddef z_scmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, imm), [{ 2755bc670bbSRichard Sandiford unsigned Type = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue(); 2765bc670bbSRichard Sandiford return Type != SystemZICMP::UnsignedOnly; 2775bc670bbSRichard Sandiford}]>; 2785bc670bbSRichard Sandiforddef z_ucmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, imm), [{ 2795bc670bbSRichard Sandiford unsigned Type = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue(); 2805bc670bbSRichard Sandiford return Type != SystemZICMP::SignedOnly; 2815bc670bbSRichard Sandiford}]>; 2825bc670bbSRichard Sandiford 283a9eb9972SRichard Sandiford// Register- and memory-based TEST UNDER MASK. 284a9eb9972SRichard Sandiforddef z_tm_reg : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, imm)>; 285a9eb9972SRichard Sandiforddef z_tm_mem : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, 0)>; 286a9eb9972SRichard Sandiford 2875f613dfdSUlrich Weigand// Register sign-extend operations. Sub-32-bit values are represented as i32s. 2885f613dfdSUlrich Weiganddef sext8 : PatFrag<(ops node:$src), (sext_inreg node:$src, i8)>; 2895f613dfdSUlrich Weiganddef sext16 : PatFrag<(ops node:$src), (sext_inreg node:$src, i16)>; 2905f613dfdSUlrich Weiganddef sext32 : PatFrag<(ops node:$src), (sext (i32 node:$src))>; 2915f613dfdSUlrich Weigand 292ce4c1095SUlrich Weigand// Match extensions of an i32 to an i64, followed by an in-register sign 293ce4c1095SUlrich Weigand// extension from a sub-i32 value. 294ce4c1095SUlrich Weiganddef sext8dbl : PatFrag<(ops node:$src), (sext8 (anyext node:$src))>; 295ce4c1095SUlrich Weiganddef sext16dbl : PatFrag<(ops node:$src), (sext16 (anyext node:$src))>; 296ce4c1095SUlrich Weigand 2975f613dfdSUlrich Weigand// Register zero-extend operations. Sub-32-bit values are represented as i32s. 2985f613dfdSUlrich Weiganddef zext8 : PatFrag<(ops node:$src), (and node:$src, 0xff)>; 2995f613dfdSUlrich Weiganddef zext16 : PatFrag<(ops node:$src), (and node:$src, 0xffff)>; 3005f613dfdSUlrich Weiganddef zext32 : PatFrag<(ops node:$src), (zext (i32 node:$src))>; 3015f613dfdSUlrich Weigand 302ce4c1095SUlrich Weigand// Match extensions of an i32 to an i64, followed by an AND of the low 303ce4c1095SUlrich Weigand// i8 or i16 part. 304ce4c1095SUlrich Weiganddef zext8dbl : PatFrag<(ops node:$src), (zext8 (anyext node:$src))>; 305ce4c1095SUlrich Weiganddef zext16dbl : PatFrag<(ops node:$src), (zext16 (anyext node:$src))>; 306ce4c1095SUlrich Weigand 3075f613dfdSUlrich Weigand// Typed floating-point loads. 3085f613dfdSUlrich Weiganddef loadf32 : PatFrag<(ops node:$src), (f32 (load node:$src))>; 3095f613dfdSUlrich Weiganddef loadf64 : PatFrag<(ops node:$src), (f64 (load node:$src))>; 3105f613dfdSUlrich Weigand 311109a7c6fSRichard Sandiford// Extending loads in which the extension type can be signed. 312109a7c6fSRichard Sandiforddef asextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 313109a7c6fSRichard Sandiford unsigned Type = cast<LoadSDNode>(N)->getExtensionType(); 314109a7c6fSRichard Sandiford return Type == ISD::EXTLOAD || Type == ISD::SEXTLOAD; 315109a7c6fSRichard Sandiford}]>; 316109a7c6fSRichard Sandiforddef asextloadi8 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 317109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 318109a7c6fSRichard Sandiford}]>; 319109a7c6fSRichard Sandiforddef asextloadi16 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 320109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 321109a7c6fSRichard Sandiford}]>; 322109a7c6fSRichard Sandiforddef asextloadi32 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 323109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 324109a7c6fSRichard Sandiford}]>; 325109a7c6fSRichard Sandiford 326109a7c6fSRichard Sandiford// Extending loads in which the extension type can be unsigned. 327109a7c6fSRichard Sandiforddef azextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 328109a7c6fSRichard Sandiford unsigned Type = cast<LoadSDNode>(N)->getExtensionType(); 329109a7c6fSRichard Sandiford return Type == ISD::EXTLOAD || Type == ISD::ZEXTLOAD; 330109a7c6fSRichard Sandiford}]>; 331109a7c6fSRichard Sandiforddef azextloadi8 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 332109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 333109a7c6fSRichard Sandiford}]>; 334109a7c6fSRichard Sandiforddef azextloadi16 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 335109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 336109a7c6fSRichard Sandiford}]>; 337109a7c6fSRichard Sandiforddef azextloadi32 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 338109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 339109a7c6fSRichard Sandiford}]>; 340109a7c6fSRichard Sandiford 341b86a8348SRichard Sandiford// Extending loads in which the extension type doesn't matter. 342b86a8348SRichard Sandiforddef anyextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 343b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getExtensionType() != ISD::NON_EXTLOAD; 344b86a8348SRichard Sandiford}]>; 345b86a8348SRichard Sandiforddef anyextloadi8 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 346b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 347b86a8348SRichard Sandiford}]>; 348b86a8348SRichard Sandiforddef anyextloadi16 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 349b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 350b86a8348SRichard Sandiford}]>; 351b86a8348SRichard Sandiforddef anyextloadi32 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 352b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 353b86a8348SRichard Sandiford}]>; 354b86a8348SRichard Sandiford 3555f613dfdSUlrich Weigand// Aligned loads. 3565f613dfdSUlrich Weigandclass AlignedLoad<SDPatternOperator load> 3575f613dfdSUlrich Weigand : PatFrag<(ops node:$addr), (load node:$addr), [{ 35821f5d68aSRichard Sandiford auto *Load = cast<LoadSDNode>(N); 3595f613dfdSUlrich Weigand return Load->getAlignment() >= Load->getMemoryVT().getStoreSize(); 3605f613dfdSUlrich Weigand}]>; 3615f613dfdSUlrich Weiganddef aligned_load : AlignedLoad<load>; 362109a7c6fSRichard Sandiforddef aligned_asextloadi16 : AlignedLoad<asextloadi16>; 363109a7c6fSRichard Sandiforddef aligned_asextloadi32 : AlignedLoad<asextloadi32>; 364109a7c6fSRichard Sandiforddef aligned_azextloadi16 : AlignedLoad<azextloadi16>; 365109a7c6fSRichard Sandiforddef aligned_azextloadi32 : AlignedLoad<azextloadi32>; 3665f613dfdSUlrich Weigand 3675f613dfdSUlrich Weigand// Aligned stores. 3685f613dfdSUlrich Weigandclass AlignedStore<SDPatternOperator store> 3695f613dfdSUlrich Weigand : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr), [{ 37021f5d68aSRichard Sandiford auto *Store = cast<StoreSDNode>(N); 3715f613dfdSUlrich Weigand return Store->getAlignment() >= Store->getMemoryVT().getStoreSize(); 3725f613dfdSUlrich Weigand}]>; 3735f613dfdSUlrich Weiganddef aligned_store : AlignedStore<store>; 3745f613dfdSUlrich Weiganddef aligned_truncstorei16 : AlignedStore<truncstorei16>; 3755f613dfdSUlrich Weiganddef aligned_truncstorei32 : AlignedStore<truncstorei32>; 3765f613dfdSUlrich Weigand 37730efd87fSRichard Sandiford// Non-volatile loads. Used for instructions that might access the storage 37830efd87fSRichard Sandiford// location multiple times. 37930efd87fSRichard Sandifordclass NonvolatileLoad<SDPatternOperator load> 38030efd87fSRichard Sandiford : PatFrag<(ops node:$addr), (load node:$addr), [{ 38121f5d68aSRichard Sandiford auto *Load = cast<LoadSDNode>(N); 38230efd87fSRichard Sandiford return !Load->isVolatile(); 38330efd87fSRichard Sandiford}]>; 38430efd87fSRichard Sandiforddef nonvolatile_load : NonvolatileLoad<load>; 385b86a8348SRichard Sandiforddef nonvolatile_anyextloadi8 : NonvolatileLoad<anyextloadi8>; 386b86a8348SRichard Sandiforddef nonvolatile_anyextloadi16 : NonvolatileLoad<anyextloadi16>; 387b86a8348SRichard Sandiforddef nonvolatile_anyextloadi32 : NonvolatileLoad<anyextloadi32>; 38830efd87fSRichard Sandiford 38930efd87fSRichard Sandiford// Non-volatile stores. 39030efd87fSRichard Sandifordclass NonvolatileStore<SDPatternOperator store> 39130efd87fSRichard Sandiford : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr), [{ 39221f5d68aSRichard Sandiford auto *Store = cast<StoreSDNode>(N); 39330efd87fSRichard Sandiford return !Store->isVolatile(); 39430efd87fSRichard Sandiford}]>; 39530efd87fSRichard Sandiforddef nonvolatile_store : NonvolatileStore<store>; 396b86a8348SRichard Sandiforddef nonvolatile_truncstorei8 : NonvolatileStore<truncstorei8>; 397b86a8348SRichard Sandiforddef nonvolatile_truncstorei16 : NonvolatileStore<truncstorei16>; 398b86a8348SRichard Sandiforddef nonvolatile_truncstorei32 : NonvolatileStore<truncstorei32>; 39930efd87fSRichard Sandiford 400178273a1SRichard Sandiford// A store of a load that can be implemented using MVC. 401178273a1SRichard Sandiforddef mvc_store : PatFrag<(ops node:$value, node:$addr), 402178273a1SRichard Sandiford (unindexedstore node:$value, node:$addr), 403178273a1SRichard Sandiford [{ return storeLoadCanUseMVC(N); }]>; 404178273a1SRichard Sandiford 405178273a1SRichard Sandiford// Binary read-modify-write operations on memory in which the other 406178273a1SRichard Sandiford// operand is also memory and for which block operations like NC can 407178273a1SRichard Sandiford// be used. There are two patterns for each operator, depending on 408178273a1SRichard Sandiford// which operand contains the "other" load. 409178273a1SRichard Sandifordmulticlass block_op<SDPatternOperator operator> { 410178273a1SRichard Sandiford def "1" : PatFrag<(ops node:$value, node:$addr), 411178273a1SRichard Sandiford (unindexedstore (operator node:$value, 412178273a1SRichard Sandiford (unindexedload node:$addr)), 413178273a1SRichard Sandiford node:$addr), 414178273a1SRichard Sandiford [{ return storeLoadCanUseBlockBinary(N, 0); }]>; 415178273a1SRichard Sandiford def "2" : PatFrag<(ops node:$value, node:$addr), 416178273a1SRichard Sandiford (unindexedstore (operator (unindexedload node:$addr), 417178273a1SRichard Sandiford node:$value), 418178273a1SRichard Sandiford node:$addr), 419178273a1SRichard Sandiford [{ return storeLoadCanUseBlockBinary(N, 1); }]>; 420178273a1SRichard Sandiford} 421178273a1SRichard Sandiforddefm block_and : block_op<and>; 422178273a1SRichard Sandiforddefm block_or : block_op<or>; 423178273a1SRichard Sandiforddefm block_xor : block_op<xor>; 424178273a1SRichard Sandiford 4255f613dfdSUlrich Weigand// Insertions. 4265f613dfdSUlrich Weiganddef inserti8 : PatFrag<(ops node:$src1, node:$src2), 4275f613dfdSUlrich Weigand (or (and node:$src1, -256), node:$src2)>; 4285f613dfdSUlrich Weiganddef insertll : PatFrag<(ops node:$src1, node:$src2), 4295f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffffffff0000), node:$src2)>; 4305f613dfdSUlrich Weiganddef insertlh : PatFrag<(ops node:$src1, node:$src2), 4315f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffff0000ffff), node:$src2)>; 4325f613dfdSUlrich Weiganddef inserthl : PatFrag<(ops node:$src1, node:$src2), 4335f613dfdSUlrich Weigand (or (and node:$src1, 0xffff0000ffffffff), node:$src2)>; 4345f613dfdSUlrich Weiganddef inserthh : PatFrag<(ops node:$src1, node:$src2), 4355f613dfdSUlrich Weigand (or (and node:$src1, 0x0000ffffffffffff), node:$src2)>; 4365f613dfdSUlrich Weiganddef insertlf : PatFrag<(ops node:$src1, node:$src2), 4375f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffff00000000), node:$src2)>; 4385f613dfdSUlrich Weiganddef inserthf : PatFrag<(ops node:$src1, node:$src2), 4395f613dfdSUlrich Weigand (or (and node:$src1, 0x00000000ffffffff), node:$src2)>; 4405f613dfdSUlrich Weigand 4415f613dfdSUlrich Weigand// ORs that can be treated as insertions. 4425f613dfdSUlrich Weiganddef or_as_inserti8 : PatFrag<(ops node:$src1, node:$src2), 4435f613dfdSUlrich Weigand (or node:$src1, node:$src2), [{ 4445f613dfdSUlrich Weigand unsigned BitWidth = N->getValueType(0).getScalarType().getSizeInBits(); 4455f613dfdSUlrich Weigand return CurDAG->MaskedValueIsZero(N->getOperand(0), 4465f613dfdSUlrich Weigand APInt::getLowBitsSet(BitWidth, 8)); 4475f613dfdSUlrich Weigand}]>; 4485f613dfdSUlrich Weigand 4495f613dfdSUlrich Weigand// ORs that can be treated as reversed insertions. 4505f613dfdSUlrich Weiganddef or_as_revinserti8 : PatFrag<(ops node:$src1, node:$src2), 4515f613dfdSUlrich Weigand (or node:$src1, node:$src2), [{ 4525f613dfdSUlrich Weigand unsigned BitWidth = N->getValueType(0).getScalarType().getSizeInBits(); 4535f613dfdSUlrich Weigand return CurDAG->MaskedValueIsZero(N->getOperand(1), 4545f613dfdSUlrich Weigand APInt::getLowBitsSet(BitWidth, 8)); 4555f613dfdSUlrich Weigand}]>; 4565f613dfdSUlrich Weigand 45757485472SRichard Sandiford// Negative integer absolute. 45857485472SRichard Sandiforddef z_inegabs : PatFrag<(ops node:$src), (ineg (z_iabs node:$src))>; 45957485472SRichard Sandiford 4604b897054SRichard Sandiford// Integer absolute, matching the canonical form generated by DAGCombiner. 4614b897054SRichard Sandiforddef z_iabs32 : PatFrag<(ops node:$src), 4624b897054SRichard Sandiford (xor (add node:$src, (sra node:$src, (i32 31))), 4634b897054SRichard Sandiford (sra node:$src, (i32 31)))>; 4644b897054SRichard Sandiforddef z_iabs64 : PatFrag<(ops node:$src), 4654b897054SRichard Sandiford (xor (add node:$src, (sra node:$src, (i32 63))), 4664b897054SRichard Sandiford (sra node:$src, (i32 63)))>; 467784a5803SRichard Sandiforddef z_inegabs32 : PatFrag<(ops node:$src), (ineg (z_iabs32 node:$src))>; 468784a5803SRichard Sandiforddef z_inegabs64 : PatFrag<(ops node:$src), (ineg (z_iabs64 node:$src))>; 4694b897054SRichard Sandiford 470ce4c1095SUlrich Weigand// Integer multiply-and-add 471ce4c1095SUlrich Weiganddef z_muladd : PatFrag<(ops node:$src1, node:$src2, node:$src3), 472ce4c1095SUlrich Weigand (add (mul node:$src1, node:$src2), node:$src3)>; 473ce4c1095SUlrich Weigand 474*cd808237SUlrich Weigand// Fused multiply-subtract, using the natural operand order. 475*cd808237SUlrich Weiganddef fms : PatFrag<(ops node:$src1, node:$src2, node:$src3), 476*cd808237SUlrich Weigand (fma node:$src1, node:$src2, (fneg node:$src3))>; 477*cd808237SUlrich Weigand 4785f613dfdSUlrich Weigand// Fused multiply-add and multiply-subtract, but with the order of the 4795f613dfdSUlrich Weigand// operands matching SystemZ's MA and MS instructions. 4805f613dfdSUlrich Weiganddef z_fma : PatFrag<(ops node:$src1, node:$src2, node:$src3), 4815f613dfdSUlrich Weigand (fma node:$src2, node:$src3, node:$src1)>; 4825f613dfdSUlrich Weiganddef z_fms : PatFrag<(ops node:$src1, node:$src2, node:$src3), 4835f613dfdSUlrich Weigand (fma node:$src2, node:$src3, (fneg node:$src1))>; 4845f613dfdSUlrich Weigand 4855f613dfdSUlrich Weigand// Floating-point negative absolute. 4865f613dfdSUlrich Weiganddef fnabs : PatFrag<(ops node:$ptr), (fneg (fabs node:$ptr))>; 4875f613dfdSUlrich Weigand 4885f613dfdSUlrich Weigand// Create a unary operator that loads from memory and then performs 4895f613dfdSUlrich Weigand// the given operation on it. 49030efd87fSRichard Sandifordclass loadu<SDPatternOperator operator, SDPatternOperator load = load> 4915f613dfdSUlrich Weigand : PatFrag<(ops node:$addr), (operator (load node:$addr))>; 4925f613dfdSUlrich Weigand 4935f613dfdSUlrich Weigand// Create a store operator that performs the given unary operation 4945f613dfdSUlrich Weigand// on the value before storing it. 49530efd87fSRichard Sandifordclass storeu<SDPatternOperator operator, SDPatternOperator store = store> 4965f613dfdSUlrich Weigand : PatFrag<(ops node:$value, node:$addr), 4975f613dfdSUlrich Weigand (store (operator node:$value), node:$addr)>; 498ce4c1095SUlrich Weigand 499ce4c1095SUlrich Weigand// Vector representation of all-zeros and all-ones. 500ce4c1095SUlrich Weiganddef z_vzero : PatFrag<(ops), (bitconvert (v16i8 (z_byte_mask (i32 0))))>; 501ce4c1095SUlrich Weiganddef z_vones : PatFrag<(ops), (bitconvert (v16i8 (z_byte_mask (i32 65535))))>; 502ce4c1095SUlrich Weigand 503ce4c1095SUlrich Weigand// Load a scalar and replicate it in all elements of a vector. 504ce4c1095SUlrich Weigandclass z_replicate_load<ValueType scalartype, SDPatternOperator load> 505ce4c1095SUlrich Weigand : PatFrag<(ops node:$addr), 506ce4c1095SUlrich Weigand (z_replicate (scalartype (load node:$addr)))>; 507ce4c1095SUlrich Weiganddef z_replicate_loadi8 : z_replicate_load<i32, anyextloadi8>; 508ce4c1095SUlrich Weiganddef z_replicate_loadi16 : z_replicate_load<i32, anyextloadi16>; 509ce4c1095SUlrich Weiganddef z_replicate_loadi32 : z_replicate_load<i32, load>; 510ce4c1095SUlrich Weiganddef z_replicate_loadi64 : z_replicate_load<i64, load>; 511*cd808237SUlrich Weiganddef z_replicate_loadf64 : z_replicate_load<f64, load>; 512ce4c1095SUlrich Weigand 513ce4c1095SUlrich Weigand// Load a scalar and insert it into a single element of a vector. 514ce4c1095SUlrich Weigandclass z_vle<ValueType scalartype, SDPatternOperator load> 515ce4c1095SUlrich Weigand : PatFrag<(ops node:$vec, node:$addr, node:$index), 516ce4c1095SUlrich Weigand (z_vector_insert node:$vec, (scalartype (load node:$addr)), 517ce4c1095SUlrich Weigand node:$index)>; 518ce4c1095SUlrich Weiganddef z_vlei8 : z_vle<i32, anyextloadi8>; 519ce4c1095SUlrich Weiganddef z_vlei16 : z_vle<i32, anyextloadi16>; 520ce4c1095SUlrich Weiganddef z_vlei32 : z_vle<i32, load>; 521ce4c1095SUlrich Weiganddef z_vlei64 : z_vle<i64, load>; 522*cd808237SUlrich Weiganddef z_vlef64 : z_vle<f64, load>; 523ce4c1095SUlrich Weigand 524ce4c1095SUlrich Weigand// Load a scalar and insert it into the low element of the high i64 of a 525ce4c1095SUlrich Weigand// zeroed vector. 526ce4c1095SUlrich Weigandclass z_vllez<ValueType scalartype, SDPatternOperator load, int index> 527ce4c1095SUlrich Weigand : PatFrag<(ops node:$addr), 528ce4c1095SUlrich Weigand (z_vector_insert (z_vzero), 529ce4c1095SUlrich Weigand (scalartype (load node:$addr)), (i32 index))>; 530ce4c1095SUlrich Weiganddef z_vllezi8 : z_vllez<i32, anyextloadi8, 7>; 531ce4c1095SUlrich Weiganddef z_vllezi16 : z_vllez<i32, anyextloadi16, 3>; 532ce4c1095SUlrich Weiganddef z_vllezi32 : z_vllez<i32, load, 1>; 533ce4c1095SUlrich Weiganddef z_vllezi64 : PatFrag<(ops node:$addr), 534ce4c1095SUlrich Weigand (z_join_dwords (i64 (load node:$addr)), (i64 0))>; 535*cd808237SUlrich Weiganddef z_vllezf64 : PatFrag<(ops node:$addr), 536*cd808237SUlrich Weigand (z_merge_high 537*cd808237SUlrich Weigand (scalar_to_vector (f64 (load node:$addr))), 538*cd808237SUlrich Weigand (z_vzero))>; 539ce4c1095SUlrich Weigand 540ce4c1095SUlrich Weigand// Store one element of a vector. 541ce4c1095SUlrich Weigandclass z_vste<ValueType scalartype, SDPatternOperator store> 542ce4c1095SUlrich Weigand : PatFrag<(ops node:$vec, node:$addr, node:$index), 543ce4c1095SUlrich Weigand (store (scalartype (z_vector_extract node:$vec, node:$index)), 544ce4c1095SUlrich Weigand node:$addr)>; 545ce4c1095SUlrich Weiganddef z_vstei8 : z_vste<i32, truncstorei8>; 546ce4c1095SUlrich Weiganddef z_vstei16 : z_vste<i32, truncstorei16>; 547ce4c1095SUlrich Weiganddef z_vstei32 : z_vste<i32, store>; 548ce4c1095SUlrich Weiganddef z_vstei64 : z_vste<i64, store>; 549*cd808237SUlrich Weiganddef z_vstef64 : z_vste<f64, store>; 550ce4c1095SUlrich Weigand 551ce4c1095SUlrich Weigand// Arithmetic negation on vectors. 552ce4c1095SUlrich Weiganddef z_vneg : PatFrag<(ops node:$x), (sub (z_vzero), node:$x)>; 553ce4c1095SUlrich Weigand 554ce4c1095SUlrich Weigand// Bitwise negation on vectors. 555ce4c1095SUlrich Weiganddef z_vnot : PatFrag<(ops node:$x), (xor node:$x, (z_vones))>; 556ce4c1095SUlrich Weigand 557ce4c1095SUlrich Weigand// Signed "integer greater than zero" on vectors. 558ce4c1095SUlrich Weiganddef z_vicmph_zero : PatFrag<(ops node:$x), (z_vicmph node:$x, (z_vzero))>; 559ce4c1095SUlrich Weigand 560ce4c1095SUlrich Weigand// Signed "integer less than zero" on vectors. 561ce4c1095SUlrich Weiganddef z_vicmpl_zero : PatFrag<(ops node:$x), (z_vicmph (z_vzero), node:$x)>; 562ce4c1095SUlrich Weigand 563ce4c1095SUlrich Weigand// Integer absolute on vectors. 564ce4c1095SUlrich Weigandclass z_viabs<int shift> 565ce4c1095SUlrich Weigand : PatFrag<(ops node:$src), 566ce4c1095SUlrich Weigand (xor (add node:$src, (z_vsra_by_scalar node:$src, (i32 shift))), 567ce4c1095SUlrich Weigand (z_vsra_by_scalar node:$src, (i32 shift)))>; 568ce4c1095SUlrich Weiganddef z_viabs8 : z_viabs<7>; 569ce4c1095SUlrich Weiganddef z_viabs16 : z_viabs<15>; 570ce4c1095SUlrich Weiganddef z_viabs32 : z_viabs<31>; 571ce4c1095SUlrich Weiganddef z_viabs64 : z_viabs<63>; 572ce4c1095SUlrich Weigand 573ce4c1095SUlrich Weigand// Sign-extend the i64 elements of a vector. 574ce4c1095SUlrich Weigandclass z_vse<int shift> 575ce4c1095SUlrich Weigand : PatFrag<(ops node:$src), 576ce4c1095SUlrich Weigand (z_vsra_by_scalar (z_vshl_by_scalar node:$src, shift), shift)>; 577ce4c1095SUlrich Weiganddef z_vsei8 : z_vse<56>; 578ce4c1095SUlrich Weiganddef z_vsei16 : z_vse<48>; 579ce4c1095SUlrich Weiganddef z_vsei32 : z_vse<32>; 580ce4c1095SUlrich Weigand 581ce4c1095SUlrich Weigand// ...and again with the extensions being done on individual i64 scalars. 582ce4c1095SUlrich Weigandclass z_vse_by_parts<SDPatternOperator operator, int index1, int index2> 583ce4c1095SUlrich Weigand : PatFrag<(ops node:$src), 584ce4c1095SUlrich Weigand (z_join_dwords 585ce4c1095SUlrich Weigand (operator (z_vector_extract node:$src, index1)), 586ce4c1095SUlrich Weigand (operator (z_vector_extract node:$src, index2)))>; 587ce4c1095SUlrich Weiganddef z_vsei8_by_parts : z_vse_by_parts<sext8dbl, 7, 15>; 588ce4c1095SUlrich Weiganddef z_vsei16_by_parts : z_vse_by_parts<sext16dbl, 3, 7>; 589ce4c1095SUlrich Weiganddef z_vsei32_by_parts : z_vse_by_parts<sext32, 1, 3>; 590