15f613dfdSUlrich Weigand//===-- SystemZOperators.td - SystemZ-specific operators ------*- tblgen-*-===// 25f613dfdSUlrich Weigand// 32946cd70SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65f613dfdSUlrich Weigand// 75f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 85f613dfdSUlrich Weigand 95f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 105f613dfdSUlrich Weigand// Type profiles 115f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 12d526b13eSSerge Pavlovdef SDT_CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i64>, 13d526b13eSSerge Pavlov SDTCisVT<1, i64>]>; 145f613dfdSUlrich Weiganddef SDT_CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i64>, 155f613dfdSUlrich Weigand SDTCisVT<1, i64>]>; 165f613dfdSUlrich Weiganddef SDT_ZCall : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>; 17b32f3656SUlrich Weiganddef SDT_ZCmp : SDTypeProfile<1, 2, 18b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 19b32f3656SUlrich Weigand SDTCisSameAs<1, 2>]>; 20b32f3656SUlrich Weiganddef SDT_ZICmp : SDTypeProfile<1, 3, 21b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 22b32f3656SUlrich Weigand SDTCisSameAs<1, 2>, 23b32f3656SUlrich Weigand SDTCisVT<3, i32>]>; 24b32f3656SUlrich Weiganddef SDT_ZBRCCMask : SDTypeProfile<0, 4, 25ca44614aSRichard Sandiford [SDTCisVT<0, i32>, 26ca44614aSRichard Sandiford SDTCisVT<1, i32>, 27b32f3656SUlrich Weigand SDTCisVT<2, OtherVT>, 28b32f3656SUlrich Weigand SDTCisVT<3, i32>]>; 29b32f3656SUlrich Weiganddef SDT_ZSelectCCMask : SDTypeProfile<1, 5, 305f613dfdSUlrich Weigand [SDTCisSameAs<0, 1>, 315f613dfdSUlrich Weigand SDTCisSameAs<1, 2>, 32ca44614aSRichard Sandiford SDTCisVT<3, i32>, 33b32f3656SUlrich Weigand SDTCisVT<4, i32>, 34b32f3656SUlrich Weigand SDTCisVT<5, i32>]>; 355f613dfdSUlrich Weiganddef SDT_ZWrapPtr : SDTypeProfile<1, 1, 365f613dfdSUlrich Weigand [SDTCisSameAs<0, 1>, 375f613dfdSUlrich Weigand SDTCisPtrTy<0>]>; 3854b36916SRichard Sandiforddef SDT_ZWrapOffset : SDTypeProfile<1, 2, 3954b36916SRichard Sandiford [SDTCisSameAs<0, 1>, 4054b36916SRichard Sandiford SDTCisSameAs<0, 2>, 4154b36916SRichard Sandiford SDTCisPtrTy<0>]>; 425f613dfdSUlrich Weiganddef SDT_ZAdjDynAlloc : SDTypeProfile<1, 0, [SDTCisVT<0, i64>]>; 43515bfc66SJonas Paulssondef SDT_ZProbedAlloca : SDTypeProfile<1, 2, 44515bfc66SJonas Paulsson [SDTCisSameAs<0, 1>, 45515bfc66SJonas Paulsson SDTCisSameAs<0, 2>, 46515bfc66SJonas Paulsson SDTCisPtrTy<0>]>; 4743579cf4SUlrich Weiganddef SDT_ZGR128Binary : SDTypeProfile<1, 2, 485f613dfdSUlrich Weigand [SDTCisVT<0, untyped>, 4943579cf4SUlrich Weigand SDTCisInt<1>, 5043579cf4SUlrich Weigand SDTCisInt<2>]>; 51c3ec80feSUlrich Weiganddef SDT_ZBinaryWithFlags : SDTypeProfile<2, 2, 52c3ec80feSUlrich Weigand [SDTCisInt<0>, 53c3ec80feSUlrich Weigand SDTCisVT<1, i32>, 54c3ec80feSUlrich Weigand SDTCisSameAs<0, 2>, 55c3ec80feSUlrich Weigand SDTCisSameAs<0, 3>]>; 56c3ec80feSUlrich Weiganddef SDT_ZBinaryWithCarry : SDTypeProfile<2, 3, 57c3ec80feSUlrich Weigand [SDTCisInt<0>, 58c3ec80feSUlrich Weigand SDTCisVT<1, i32>, 59c3ec80feSUlrich Weigand SDTCisSameAs<0, 2>, 60c3ec80feSUlrich Weigand SDTCisSameAs<0, 3>, 61c3ec80feSUlrich Weigand SDTCisVT<1, i32>]>; 625f613dfdSUlrich Weiganddef SDT_ZAtomicLoadBinaryW : SDTypeProfile<1, 5, 635f613dfdSUlrich Weigand [SDTCisVT<0, i32>, 645f613dfdSUlrich Weigand SDTCisPtrTy<1>, 655f613dfdSUlrich Weigand SDTCisVT<2, i32>, 665f613dfdSUlrich Weigand SDTCisVT<3, i32>, 675f613dfdSUlrich Weigand SDTCisVT<4, i32>, 685f613dfdSUlrich Weigand SDTCisVT<5, i32>]>; 69b32f3656SUlrich Weiganddef SDT_ZAtomicCmpSwapW : SDTypeProfile<2, 6, 705f613dfdSUlrich Weigand [SDTCisVT<0, i32>, 71b32f3656SUlrich Weigand SDTCisVT<1, i32>, 72b32f3656SUlrich Weigand SDTCisPtrTy<2>, 735f613dfdSUlrich Weigand SDTCisVT<3, i32>, 745f613dfdSUlrich Weigand SDTCisVT<4, i32>, 755f613dfdSUlrich Weigand SDTCisVT<5, i32>, 76b32f3656SUlrich Weigand SDTCisVT<6, i32>, 77b32f3656SUlrich Weigand SDTCisVT<7, i32>]>; 78b32f3656SUlrich Weiganddef SDT_ZAtomicCmpSwap : SDTypeProfile<2, 3, 790f1de049SUlrich Weigand [SDTCisInt<0>, 80b32f3656SUlrich Weigand SDTCisVT<1, i32>, 81b32f3656SUlrich Weigand SDTCisPtrTy<2>, 82b32f3656SUlrich Weigand SDTCisSameAs<0, 3>, 83b32f3656SUlrich Weigand SDTCisSameAs<0, 4>]>; 84a11f63a9SUlrich Weiganddef SDT_ZAtomicLoad128 : SDTypeProfile<1, 1, 85a11f63a9SUlrich Weigand [SDTCisVT<0, untyped>, 86a11f63a9SUlrich Weigand SDTCisPtrTy<1>]>; 87a11f63a9SUlrich Weiganddef SDT_ZAtomicStore128 : SDTypeProfile<0, 2, 88a11f63a9SUlrich Weigand [SDTCisVT<0, untyped>, 89a11f63a9SUlrich Weigand SDTCisPtrTy<1>]>; 90b32f3656SUlrich Weiganddef SDT_ZAtomicCmpSwap128 : SDTypeProfile<2, 3, 91a11f63a9SUlrich Weigand [SDTCisVT<0, untyped>, 92b32f3656SUlrich Weigand SDTCisVT<1, i32>, 93b32f3656SUlrich Weigand SDTCisPtrTy<2>, 94b32f3656SUlrich Weigand SDTCisVT<3, untyped>, 95b32f3656SUlrich Weigand SDTCisVT<4, untyped>]>; 96761703a2SRichard Sandiforddef SDT_ZMemMemLength : SDTypeProfile<0, 3, 97d131ff8cSRichard Sandiford [SDTCisPtrTy<0>, 98d131ff8cSRichard Sandiford SDTCisPtrTy<1>, 995e318f0bSRichard Sandiford SDTCisVT<2, i64>]>; 100b32f3656SUlrich Weiganddef SDT_ZMemMemLengthCC : SDTypeProfile<1, 3, 101b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 102b32f3656SUlrich Weigand SDTCisPtrTy<1>, 103b32f3656SUlrich Weigand SDTCisPtrTy<2>, 104b32f3656SUlrich Weigand SDTCisVT<3, i64>]>; 105*cbf682cbSJonas Paulssondef SDT_ZMemsetMVC : SDTypeProfile<0, 3, 106*cbf682cbSJonas Paulsson [SDTCisPtrTy<0>, 107*cbf682cbSJonas Paulsson SDTCisVT<1, i64>, 108*cbf682cbSJonas Paulsson SDTCisVT<2, i32>]>; 109ca232710SRichard Sandiforddef SDT_ZString : SDTypeProfile<1, 3, 110ca232710SRichard Sandiford [SDTCisPtrTy<0>, 111ca232710SRichard Sandiford SDTCisPtrTy<1>, 112ca232710SRichard Sandiford SDTCisPtrTy<2>, 113ca232710SRichard Sandiford SDTCisVT<3, i32>]>; 114b32f3656SUlrich Weiganddef SDT_ZStringCC : SDTypeProfile<2, 3, 115b32f3656SUlrich Weigand [SDTCisPtrTy<0>, 116b32f3656SUlrich Weigand SDTCisVT<1, i32>, 117b32f3656SUlrich Weigand SDTCisPtrTy<2>, 118b32f3656SUlrich Weigand SDTCisPtrTy<3>, 119b32f3656SUlrich Weigand SDTCisVT<4, i32>]>; 120b32f3656SUlrich Weiganddef SDT_ZIPM : SDTypeProfile<1, 1, 121b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 122b32f3656SUlrich Weigand SDTCisVT<1, i32>]>; 12303481334SRichard Sandiforddef SDT_ZPrefetch : SDTypeProfile<0, 2, 124ca44614aSRichard Sandiford [SDTCisVT<0, i32>, 12503481334SRichard Sandiford SDTCisPtrTy<1>]>; 126b32f3656SUlrich Weiganddef SDT_ZTBegin : SDTypeProfile<1, 2, 127b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 128b32f3656SUlrich Weigand SDTCisPtrTy<1>, 129b32f3656SUlrich Weigand SDTCisVT<2, i32>]>; 130b32f3656SUlrich Weiganddef SDT_ZTEnd : SDTypeProfile<1, 0, 131b32f3656SUlrich Weigand [SDTCisVT<0, i32>]>; 132ce4c1095SUlrich Weiganddef SDT_ZInsertVectorElt : SDTypeProfile<1, 3, 133ce4c1095SUlrich Weigand [SDTCisVec<0>, 134ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 135ce4c1095SUlrich Weigand SDTCisVT<3, i32>]>; 136ce4c1095SUlrich Weiganddef SDT_ZExtractVectorElt : SDTypeProfile<1, 2, 137ce4c1095SUlrich Weigand [SDTCisVec<1>, 138ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 139ce4c1095SUlrich Weiganddef SDT_ZReplicate : SDTypeProfile<1, 1, 140ce4c1095SUlrich Weigand [SDTCisVec<0>]>; 14180b3af7aSUlrich Weiganddef SDT_ZVecUnaryConv : SDTypeProfile<1, 1, 14280b3af7aSUlrich Weigand [SDTCisVec<0>, 14380b3af7aSUlrich Weigand SDTCisVec<1>]>; 144c1708b26SUlrich Weiganddef SDT_ZVecUnary : SDTypeProfile<1, 1, 145c1708b26SUlrich Weigand [SDTCisVec<0>, 146c1708b26SUlrich Weigand SDTCisSameAs<0, 1>]>; 147b32f3656SUlrich Weiganddef SDT_ZVecUnaryCC : SDTypeProfile<2, 1, 148b32f3656SUlrich Weigand [SDTCisVec<0>, 149b32f3656SUlrich Weigand SDTCisVT<1, i32>, 150b32f3656SUlrich Weigand SDTCisSameAs<0, 2>]>; 151ce4c1095SUlrich Weiganddef SDT_ZVecBinary : SDTypeProfile<1, 2, 152ce4c1095SUlrich Weigand [SDTCisVec<0>, 153ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 154ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>]>; 155b32f3656SUlrich Weiganddef SDT_ZVecBinaryCC : SDTypeProfile<2, 2, 156b32f3656SUlrich Weigand [SDTCisVec<0>, 157b32f3656SUlrich Weigand SDTCisVT<1, i32>, 158b32f3656SUlrich Weigand SDTCisSameAs<0, 2>, 159b32f3656SUlrich Weigand SDTCisSameAs<0, 2>]>; 160ce4c1095SUlrich Weiganddef SDT_ZVecBinaryInt : SDTypeProfile<1, 2, 161ce4c1095SUlrich Weigand [SDTCisVec<0>, 162ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 163ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 164ce4c1095SUlrich Weiganddef SDT_ZVecBinaryConv : SDTypeProfile<1, 2, 165ce4c1095SUlrich Weigand [SDTCisVec<0>, 166ce4c1095SUlrich Weigand SDTCisVec<1>, 167ce4c1095SUlrich Weigand SDTCisSameAs<1, 2>]>; 168b32f3656SUlrich Weiganddef SDT_ZVecBinaryConvCC : SDTypeProfile<2, 2, 169c1708b26SUlrich Weigand [SDTCisVec<0>, 170b32f3656SUlrich Weigand SDTCisVT<1, i32>, 171b32f3656SUlrich Weigand SDTCisVec<2>, 172b32f3656SUlrich Weigand SDTCisSameAs<2, 3>]>; 173b32f3656SUlrich Weiganddef SDT_ZVecBinaryConvIntCC : SDTypeProfile<2, 2, 174b32f3656SUlrich Weigand [SDTCisVec<0>, 175b32f3656SUlrich Weigand SDTCisVT<1, i32>, 176b32f3656SUlrich Weigand SDTCisVec<2>, 177b32f3656SUlrich Weigand SDTCisVT<3, i32>]>; 178ce4c1095SUlrich Weiganddef SDT_ZRotateMask : SDTypeProfile<1, 2, 179ce4c1095SUlrich Weigand [SDTCisVec<0>, 180ce4c1095SUlrich Weigand SDTCisVT<1, i32>, 181ce4c1095SUlrich Weigand SDTCisVT<2, i32>]>; 182ce4c1095SUlrich Weiganddef SDT_ZJoinDwords : SDTypeProfile<1, 2, 183ce4c1095SUlrich Weigand [SDTCisVT<0, v2i64>, 184ce4c1095SUlrich Weigand SDTCisVT<1, i64>, 185ce4c1095SUlrich Weigand SDTCisVT<2, i64>]>; 186ce4c1095SUlrich Weiganddef SDT_ZVecTernary : SDTypeProfile<1, 3, 187ce4c1095SUlrich Weigand [SDTCisVec<0>, 188ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 189ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>, 190ce4c1095SUlrich Weigand SDTCisSameAs<0, 3>]>; 1910f0a8b77SUlrich Weiganddef SDT_ZVecTernaryConvCC : SDTypeProfile<2, 3, 1920f0a8b77SUlrich Weigand [SDTCisVec<0>, 1930f0a8b77SUlrich Weigand SDTCisVT<1, i32>, 1940f0a8b77SUlrich Weigand SDTCisVec<2>, 1950f0a8b77SUlrich Weigand SDTCisSameAs<2, 3>, 1960f0a8b77SUlrich Weigand SDTCisSameAs<0, 4>]>; 197ce4c1095SUlrich Weiganddef SDT_ZVecTernaryInt : SDTypeProfile<1, 3, 198ce4c1095SUlrich Weigand [SDTCisVec<0>, 199ce4c1095SUlrich Weigand SDTCisSameAs<0, 1>, 200ce4c1095SUlrich Weigand SDTCisSameAs<0, 2>, 201ce4c1095SUlrich Weigand SDTCisVT<3, i32>]>; 202b32f3656SUlrich Weiganddef SDT_ZVecTernaryIntCC : SDTypeProfile<2, 3, 203b32f3656SUlrich Weigand [SDTCisVec<0>, 204b32f3656SUlrich Weigand SDTCisVT<1, i32>, 205b32f3656SUlrich Weigand SDTCisSameAs<0, 2>, 206b32f3656SUlrich Weigand SDTCisSameAs<0, 3>, 207b32f3656SUlrich Weigand SDTCisVT<4, i32>]>; 208c1708b26SUlrich Weiganddef SDT_ZVecQuaternaryInt : SDTypeProfile<1, 4, 209c1708b26SUlrich Weigand [SDTCisVec<0>, 210c1708b26SUlrich Weigand SDTCisSameAs<0, 1>, 211c1708b26SUlrich Weigand SDTCisSameAs<0, 2>, 212c1708b26SUlrich Weigand SDTCisSameAs<0, 3>, 213c1708b26SUlrich Weigand SDTCisVT<4, i32>]>; 214b32f3656SUlrich Weiganddef SDT_ZVecQuaternaryIntCC : SDTypeProfile<2, 4, 215b32f3656SUlrich Weigand [SDTCisVec<0>, 216b32f3656SUlrich Weigand SDTCisVT<1, i32>, 217b32f3656SUlrich Weigand SDTCisSameAs<0, 2>, 218b32f3656SUlrich Weigand SDTCisSameAs<0, 3>, 219b32f3656SUlrich Weigand SDTCisSameAs<0, 4>, 220b32f3656SUlrich Weigand SDTCisVT<5, i32>]>; 221b32f3656SUlrich Weiganddef SDT_ZTest : SDTypeProfile<1, 2, 222b32f3656SUlrich Weigand [SDTCisVT<0, i32>, 223b32f3656SUlrich Weigand SDTCisVT<2, i64>]>; 2245f613dfdSUlrich Weigand 2255f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 2265f613dfdSUlrich Weigand// Node definitions 2275f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 2285f613dfdSUlrich Weigand 2295f613dfdSUlrich Weigand// These are target-independent nodes, but have target-specific formats. 2305f613dfdSUlrich Weiganddef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_CallSeqStart, 2315f613dfdSUlrich Weigand [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>; 2325f613dfdSUlrich Weiganddef callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_CallSeqEnd, 2335f613dfdSUlrich Weigand [SDNPHasChain, SDNPSideEffect, SDNPOptInGlue, 2345f613dfdSUlrich Weigand SDNPOutGlue]>; 2357db6918eSUlrich Weiganddef global_offset_table : SDNode<"ISD::GLOBAL_OFFSET_TABLE", SDTPtrLeaf>; 2365f613dfdSUlrich Weigand 2375f613dfdSUlrich Weigand// Nodes for SystemZISD::*. See SystemZISelLowering.h for more details. 2385f613dfdSUlrich Weiganddef z_retflag : SDNode<"SystemZISD::RET_FLAG", SDTNone, 2395f613dfdSUlrich Weigand [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 2405f613dfdSUlrich Weiganddef z_call : SDNode<"SystemZISD::CALL", SDT_ZCall, 2415f613dfdSUlrich Weigand [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 2425f613dfdSUlrich Weigand SDNPVariadic]>; 243709bda66SRichard Sandiforddef z_sibcall : SDNode<"SystemZISD::SIBCALL", SDT_ZCall, 244709bda66SRichard Sandiford [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 245709bda66SRichard Sandiford SDNPVariadic]>; 2467db6918eSUlrich Weiganddef z_tls_gdcall : SDNode<"SystemZISD::TLS_GDCALL", SDT_ZCall, 2477db6918eSUlrich Weigand [SDNPHasChain, SDNPInGlue, SDNPOutGlue, 2487db6918eSUlrich Weigand SDNPVariadic]>; 2497db6918eSUlrich Weiganddef z_tls_ldcall : SDNode<"SystemZISD::TLS_LDCALL", SDT_ZCall, 2507db6918eSUlrich Weigand [SDNPHasChain, SDNPInGlue, SDNPOutGlue, 2517db6918eSUlrich Weigand SDNPVariadic]>; 2525f613dfdSUlrich Weiganddef z_pcrel_wrapper : SDNode<"SystemZISD::PCREL_WRAPPER", SDT_ZWrapPtr, []>; 25354b36916SRichard Sandiforddef z_pcrel_offset : SDNode<"SystemZISD::PCREL_OFFSET", 25454b36916SRichard Sandiford SDT_ZWrapOffset, []>; 255b32f3656SUlrich Weiganddef z_icmp : SDNode<"SystemZISD::ICMP", SDT_ZICmp>; 256b32f3656SUlrich Weiganddef z_fcmp : SDNode<"SystemZISD::FCMP", SDT_ZCmp>; 2579db13b5aSUlrich Weiganddef z_strict_fcmp : SDNode<"SystemZISD::STRICT_FCMP", SDT_ZCmp, 2589db13b5aSUlrich Weigand [SDNPHasChain]>; 2599db13b5aSUlrich Weiganddef z_strict_fcmps : SDNode<"SystemZISD::STRICT_FCMPS", SDT_ZCmp, 2609db13b5aSUlrich Weigand [SDNPHasChain]>; 261b32f3656SUlrich Weiganddef z_tm : SDNode<"SystemZISD::TM", SDT_ZICmp>; 262b32f3656SUlrich Weiganddef z_br_ccmask_1 : SDNode<"SystemZISD::BR_CCMASK", SDT_ZBRCCMask, 263b32f3656SUlrich Weigand [SDNPHasChain]>; 264b32f3656SUlrich Weiganddef z_select_ccmask_1 : SDNode<"SystemZISD::SELECT_CCMASK", 265b32f3656SUlrich Weigand SDT_ZSelectCCMask>; 266b32f3656SUlrich Weiganddef z_ipm_1 : SDNode<"SystemZISD::IPM", SDT_ZIPM>; 2675f613dfdSUlrich Weiganddef z_adjdynalloc : SDNode<"SystemZISD::ADJDYNALLOC", SDT_ZAdjDynAlloc>; 268515bfc66SJonas Paulssondef z_probed_alloca : SDNode<"SystemZISD::PROBED_ALLOCA", SDT_ZProbedAlloca, 269515bfc66SJonas Paulsson [SDNPHasChain]>; 270b401218cSUlrich Weiganddef z_popcnt : SDNode<"SystemZISD::POPCNT", SDTIntUnaryOp>; 2712b3482feSUlrich Weiganddef z_smul_lohi : SDNode<"SystemZISD::SMUL_LOHI", SDT_ZGR128Binary>; 27243579cf4SUlrich Weiganddef z_umul_lohi : SDNode<"SystemZISD::UMUL_LOHI", SDT_ZGR128Binary>; 27343579cf4SUlrich Weiganddef z_sdivrem : SDNode<"SystemZISD::SDIVREM", SDT_ZGR128Binary>; 27443579cf4SUlrich Weiganddef z_udivrem : SDNode<"SystemZISD::UDIVREM", SDT_ZGR128Binary>; 275c3ec80feSUlrich Weiganddef z_saddo : SDNode<"SystemZISD::SADDO", SDT_ZBinaryWithFlags>; 276c3ec80feSUlrich Weiganddef z_ssubo : SDNode<"SystemZISD::SSUBO", SDT_ZBinaryWithFlags>; 277c3ec80feSUlrich Weiganddef z_uaddo : SDNode<"SystemZISD::UADDO", SDT_ZBinaryWithFlags>; 278c3ec80feSUlrich Weiganddef z_usubo : SDNode<"SystemZISD::USUBO", SDT_ZBinaryWithFlags>; 279c3ec80feSUlrich Weiganddef z_addcarry_1 : SDNode<"SystemZISD::ADDCARRY", SDT_ZBinaryWithCarry>; 280c3ec80feSUlrich Weiganddef z_subcarry_1 : SDNode<"SystemZISD::SUBCARRY", SDT_ZBinaryWithCarry>; 2815f613dfdSUlrich Weigand 282a9ac6d6cSUlrich Weiganddef z_membarrier : SDNode<"SystemZISD::MEMBARRIER", SDTNone, 283a9ac6d6cSUlrich Weigand [SDNPHasChain, SDNPSideEffect]>; 2849afe613dSRichard Sandiford 285c5854b0aSUlrich Weiganddef z_loadbswap : SDNode<"SystemZISD::LRV", SDTLoad, 28628b759c4SBryan Chan [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 287c5854b0aSUlrich Weiganddef z_storebswap : SDNode<"SystemZISD::STRV", SDTStore, 28828b759c4SBryan Chan [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 2890f0a8b77SUlrich Weiganddef z_loadeswap : SDNode<"SystemZISD::VLER", SDTLoad, 2900f0a8b77SUlrich Weigand [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 2910f0a8b77SUlrich Weiganddef z_storeeswap : SDNode<"SystemZISD::VSTER", SDTStore, 2920f0a8b77SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 29328b759c4SBryan Chan 294b32f3656SUlrich Weiganddef z_tdc : SDNode<"SystemZISD::TDC", SDT_ZTest>; 295518cbc7cSMarcin Koscielnicki 296ce4c1095SUlrich Weigand// Defined because the index is an i32 rather than a pointer. 297ce4c1095SUlrich Weiganddef z_vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT", 298ce4c1095SUlrich Weigand SDT_ZInsertVectorElt>; 299ce4c1095SUlrich Weiganddef z_vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT", 300ce4c1095SUlrich Weigand SDT_ZExtractVectorElt>; 301c110b5b6SJonas Paulssondef z_byte_mask : SDNode<"SystemZISD::BYTE_MASK", SDT_ZReplicate>; 302ce4c1095SUlrich Weiganddef z_rotate_mask : SDNode<"SystemZISD::ROTATE_MASK", SDT_ZRotateMask>; 303ce4c1095SUlrich Weiganddef z_replicate : SDNode<"SystemZISD::REPLICATE", SDT_ZReplicate>; 304ce4c1095SUlrich Weiganddef z_join_dwords : SDNode<"SystemZISD::JOIN_DWORDS", SDT_ZJoinDwords>; 305ce4c1095SUlrich Weiganddef z_splat : SDNode<"SystemZISD::SPLAT", SDT_ZVecBinaryInt>; 306ce4c1095SUlrich Weiganddef z_merge_high : SDNode<"SystemZISD::MERGE_HIGH", SDT_ZVecBinary>; 307ce4c1095SUlrich Weiganddef z_merge_low : SDNode<"SystemZISD::MERGE_LOW", SDT_ZVecBinary>; 308ce4c1095SUlrich Weiganddef z_shl_double : SDNode<"SystemZISD::SHL_DOUBLE", SDT_ZVecTernaryInt>; 309ce4c1095SUlrich Weiganddef z_permute_dwords : SDNode<"SystemZISD::PERMUTE_DWORDS", 310ce4c1095SUlrich Weigand SDT_ZVecTernaryInt>; 311ce4c1095SUlrich Weiganddef z_permute : SDNode<"SystemZISD::PERMUTE", SDT_ZVecTernary>; 312ce4c1095SUlrich Weiganddef z_pack : SDNode<"SystemZISD::PACK", SDT_ZVecBinaryConv>; 313b32f3656SUlrich Weiganddef z_packs_cc : SDNode<"SystemZISD::PACKS_CC", SDT_ZVecBinaryConvCC>; 314b32f3656SUlrich Weiganddef z_packls_cc : SDNode<"SystemZISD::PACKLS_CC", SDT_ZVecBinaryConvCC>; 315cd2a1b53SUlrich Weiganddef z_unpack_high : SDNode<"SystemZISD::UNPACK_HIGH", SDT_ZVecUnaryConv>; 316cd2a1b53SUlrich Weiganddef z_unpackl_high : SDNode<"SystemZISD::UNPACKL_HIGH", SDT_ZVecUnaryConv>; 317cd2a1b53SUlrich Weiganddef z_unpack_low : SDNode<"SystemZISD::UNPACK_LOW", SDT_ZVecUnaryConv>; 318cd2a1b53SUlrich Weiganddef z_unpackl_low : SDNode<"SystemZISD::UNPACKL_LOW", SDT_ZVecUnaryConv>; 319ce4c1095SUlrich Weiganddef z_vshl_by_scalar : SDNode<"SystemZISD::VSHL_BY_SCALAR", 320ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 321ce4c1095SUlrich Weiganddef z_vsrl_by_scalar : SDNode<"SystemZISD::VSRL_BY_SCALAR", 322ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 323ce4c1095SUlrich Weiganddef z_vsra_by_scalar : SDNode<"SystemZISD::VSRA_BY_SCALAR", 324ce4c1095SUlrich Weigand SDT_ZVecBinaryInt>; 325ce4c1095SUlrich Weiganddef z_vsum : SDNode<"SystemZISD::VSUM", SDT_ZVecBinaryConv>; 326ce4c1095SUlrich Weiganddef z_vicmpe : SDNode<"SystemZISD::VICMPE", SDT_ZVecBinary>; 327ce4c1095SUlrich Weiganddef z_vicmph : SDNode<"SystemZISD::VICMPH", SDT_ZVecBinary>; 328ce4c1095SUlrich Weiganddef z_vicmphl : SDNode<"SystemZISD::VICMPHL", SDT_ZVecBinary>; 329b32f3656SUlrich Weiganddef z_vicmpes : SDNode<"SystemZISD::VICMPES", SDT_ZVecBinaryCC>; 330b32f3656SUlrich Weiganddef z_vicmphs : SDNode<"SystemZISD::VICMPHS", SDT_ZVecBinaryCC>; 331b32f3656SUlrich Weiganddef z_vicmphls : SDNode<"SystemZISD::VICMPHLS", SDT_ZVecBinaryCC>; 332cd808237SUlrich Weiganddef z_vfcmpe : SDNode<"SystemZISD::VFCMPE", SDT_ZVecBinaryConv>; 3339db13b5aSUlrich Weiganddef z_strict_vfcmpe : SDNode<"SystemZISD::STRICT_VFCMPE", 3349db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 3359db13b5aSUlrich Weiganddef z_strict_vfcmpes : SDNode<"SystemZISD::STRICT_VFCMPES", 3369db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 337cd808237SUlrich Weiganddef z_vfcmph : SDNode<"SystemZISD::VFCMPH", SDT_ZVecBinaryConv>; 3389db13b5aSUlrich Weiganddef z_strict_vfcmph : SDNode<"SystemZISD::STRICT_VFCMPH", 3399db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 3409db13b5aSUlrich Weiganddef z_strict_vfcmphs : SDNode<"SystemZISD::STRICT_VFCMPHS", 3419db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 342cd808237SUlrich Weiganddef z_vfcmphe : SDNode<"SystemZISD::VFCMPHE", SDT_ZVecBinaryConv>; 3439db13b5aSUlrich Weiganddef z_strict_vfcmphe : SDNode<"SystemZISD::STRICT_VFCMPHE", 3449db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 3459db13b5aSUlrich Weiganddef z_strict_vfcmphes : SDNode<"SystemZISD::STRICT_VFCMPHES", 3469db13b5aSUlrich Weigand SDT_ZVecBinaryConv, [SDNPHasChain]>; 347b32f3656SUlrich Weiganddef z_vfcmpes : SDNode<"SystemZISD::VFCMPES", SDT_ZVecBinaryConvCC>; 348b32f3656SUlrich Weiganddef z_vfcmphs : SDNode<"SystemZISD::VFCMPHS", SDT_ZVecBinaryConvCC>; 349b32f3656SUlrich Weiganddef z_vfcmphes : SDNode<"SystemZISD::VFCMPHES", SDT_ZVecBinaryConvCC>; 35080b3af7aSUlrich Weiganddef z_vextend : SDNode<"SystemZISD::VEXTEND", SDT_ZVecUnaryConv>; 3519db13b5aSUlrich Weiganddef z_strict_vextend : SDNode<"SystemZISD::STRICT_VEXTEND", 3529db13b5aSUlrich Weigand SDT_ZVecUnaryConv, [SDNPHasChain]>; 35380b3af7aSUlrich Weiganddef z_vround : SDNode<"SystemZISD::VROUND", SDT_ZVecUnaryConv>; 354ede8293dSUlrich Weiganddef z_strict_vround : SDNode<"SystemZISD::STRICT_VROUND", 355ede8293dSUlrich Weigand SDT_ZVecUnaryConv, [SDNPHasChain]>; 356b32f3656SUlrich Weiganddef z_vtm : SDNode<"SystemZISD::VTM", SDT_ZCmp>; 357b32f3656SUlrich Weiganddef z_vfae_cc : SDNode<"SystemZISD::VFAE_CC", SDT_ZVecTernaryIntCC>; 358b32f3656SUlrich Weiganddef z_vfaez_cc : SDNode<"SystemZISD::VFAEZ_CC", SDT_ZVecTernaryIntCC>; 359b32f3656SUlrich Weiganddef z_vfee_cc : SDNode<"SystemZISD::VFEE_CC", SDT_ZVecBinaryCC>; 360b32f3656SUlrich Weiganddef z_vfeez_cc : SDNode<"SystemZISD::VFEEZ_CC", SDT_ZVecBinaryCC>; 361b32f3656SUlrich Weiganddef z_vfene_cc : SDNode<"SystemZISD::VFENE_CC", SDT_ZVecBinaryCC>; 362b32f3656SUlrich Weiganddef z_vfenez_cc : SDNode<"SystemZISD::VFENEZ_CC", SDT_ZVecBinaryCC>; 363b32f3656SUlrich Weiganddef z_vistr_cc : SDNode<"SystemZISD::VISTR_CC", SDT_ZVecUnaryCC>; 364b32f3656SUlrich Weiganddef z_vstrc_cc : SDNode<"SystemZISD::VSTRC_CC", 365b32f3656SUlrich Weigand SDT_ZVecQuaternaryIntCC>; 366c1708b26SUlrich Weiganddef z_vstrcz_cc : SDNode<"SystemZISD::VSTRCZ_CC", 367b32f3656SUlrich Weigand SDT_ZVecQuaternaryIntCC>; 3680f0a8b77SUlrich Weiganddef z_vstrs_cc : SDNode<"SystemZISD::VSTRS_CC", 3690f0a8b77SUlrich Weigand SDT_ZVecTernaryConvCC>; 3700f0a8b77SUlrich Weiganddef z_vstrsz_cc : SDNode<"SystemZISD::VSTRSZ_CC", 3710f0a8b77SUlrich Weigand SDT_ZVecTernaryConvCC>; 372b32f3656SUlrich Weiganddef z_vftci : SDNode<"SystemZISD::VFTCI", SDT_ZVecBinaryConvIntCC>; 373ce4c1095SUlrich Weigand 3745f613dfdSUlrich Weigandclass AtomicWOp<string name, SDTypeProfile profile = SDT_ZAtomicLoadBinaryW> 3752cb48d62SFangrui Song : SDNode<"SystemZISD::"#name, profile, 3765f613dfdSUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; 3775f613dfdSUlrich Weigand 3785f613dfdSUlrich Weiganddef z_atomic_swapw : AtomicWOp<"ATOMIC_SWAPW">; 3795f613dfdSUlrich Weiganddef z_atomic_loadw_add : AtomicWOp<"ATOMIC_LOADW_ADD">; 3805f613dfdSUlrich Weiganddef z_atomic_loadw_sub : AtomicWOp<"ATOMIC_LOADW_SUB">; 3815f613dfdSUlrich Weiganddef z_atomic_loadw_and : AtomicWOp<"ATOMIC_LOADW_AND">; 3825f613dfdSUlrich Weiganddef z_atomic_loadw_or : AtomicWOp<"ATOMIC_LOADW_OR">; 3835f613dfdSUlrich Weiganddef z_atomic_loadw_xor : AtomicWOp<"ATOMIC_LOADW_XOR">; 3845f613dfdSUlrich Weiganddef z_atomic_loadw_nand : AtomicWOp<"ATOMIC_LOADW_NAND">; 3855f613dfdSUlrich Weiganddef z_atomic_loadw_min : AtomicWOp<"ATOMIC_LOADW_MIN">; 3865f613dfdSUlrich Weiganddef z_atomic_loadw_max : AtomicWOp<"ATOMIC_LOADW_MAX">; 3875f613dfdSUlrich Weiganddef z_atomic_loadw_umin : AtomicWOp<"ATOMIC_LOADW_UMIN">; 3885f613dfdSUlrich Weiganddef z_atomic_loadw_umax : AtomicWOp<"ATOMIC_LOADW_UMAX">; 3890f1de049SUlrich Weigand 3900f1de049SUlrich Weiganddef z_atomic_cmp_swap : SDNode<"SystemZISD::ATOMIC_CMP_SWAP", 3910f1de049SUlrich Weigand SDT_ZAtomicCmpSwap, 3920f1de049SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 393b32f3656SUlrich Weigand SDNPMemOperand]>; 3940f1de049SUlrich Weiganddef z_atomic_cmp_swapw : SDNode<"SystemZISD::ATOMIC_CMP_SWAPW", 3950f1de049SUlrich Weigand SDT_ZAtomicCmpSwapW, 3960f1de049SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 397b32f3656SUlrich Weigand SDNPMemOperand]>; 3985f613dfdSUlrich Weigand 399a11f63a9SUlrich Weiganddef z_atomic_load_128 : SDNode<"SystemZISD::ATOMIC_LOAD_128", 400a11f63a9SUlrich Weigand SDT_ZAtomicLoad128, 401a11f63a9SUlrich Weigand [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 402a11f63a9SUlrich Weiganddef z_atomic_store_128 : SDNode<"SystemZISD::ATOMIC_STORE_128", 403a11f63a9SUlrich Weigand SDT_ZAtomicStore128, 404a11f63a9SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 405a11f63a9SUlrich Weiganddef z_atomic_cmp_swap_128 : SDNode<"SystemZISD::ATOMIC_CMP_SWAP_128", 406a11f63a9SUlrich Weigand SDT_ZAtomicCmpSwap128, 407a11f63a9SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 408b32f3656SUlrich Weigand SDNPMemOperand]>; 409a11f63a9SUlrich Weigand 410761703a2SRichard Sandiforddef z_mvc : SDNode<"SystemZISD::MVC", SDT_ZMemMemLength, 411d131ff8cSRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 412178273a1SRichard Sandiforddef z_nc : SDNode<"SystemZISD::NC", SDT_ZMemMemLength, 413178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 414178273a1SRichard Sandiforddef z_oc : SDNode<"SystemZISD::OC", SDT_ZMemMemLength, 415178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 416178273a1SRichard Sandiforddef z_xc : SDNode<"SystemZISD::XC", SDT_ZMemMemLength, 417178273a1SRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 418b32f3656SUlrich Weiganddef z_clc : SDNode<"SystemZISD::CLC", SDT_ZMemMemLengthCC, 419b32f3656SUlrich Weigand [SDNPHasChain, SDNPMayLoad]>; 420*cbf682cbSJonas Paulssondef z_memset_mvc : SDNode<"SystemZISD::MEMSET_MVC", SDT_ZMemsetMVC, 421*cbf682cbSJonas Paulsson [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 422b32f3656SUlrich Weiganddef z_strcmp : SDNode<"SystemZISD::STRCMP", SDT_ZStringCC, 423b32f3656SUlrich Weigand [SDNPHasChain, SDNPMayLoad]>; 424bb83a50fSRichard Sandiforddef z_stpcpy : SDNode<"SystemZISD::STPCPY", SDT_ZString, 425bb83a50fSRichard Sandiford [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>; 426b32f3656SUlrich Weiganddef z_search_string : SDNode<"SystemZISD::SEARCH_STRING", SDT_ZStringCC, 427b32f3656SUlrich Weigand [SDNPHasChain, SDNPMayLoad]>; 42803481334SRichard Sandiforddef z_prefetch : SDNode<"SystemZISD::PREFETCH", SDT_ZPrefetch, 42903481334SRichard Sandiford [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 43003481334SRichard Sandiford SDNPMemOperand]>; 431d131ff8cSRichard Sandiford 43257c85f53SUlrich Weiganddef z_tbegin : SDNode<"SystemZISD::TBEGIN", SDT_ZTBegin, 433b32f3656SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPSideEffect]>; 43457c85f53SUlrich Weiganddef z_tbegin_nofloat : SDNode<"SystemZISD::TBEGIN_NOFLOAT", SDT_ZTBegin, 435b32f3656SUlrich Weigand [SDNPHasChain, SDNPMayStore, SDNPSideEffect]>; 436b32f3656SUlrich Weiganddef z_tend : SDNode<"SystemZISD::TEND", SDT_ZTEnd, 437b32f3656SUlrich Weigand [SDNPHasChain, SDNPSideEffect]>; 43857c85f53SUlrich Weigand 439ce4c1095SUlrich Weiganddef z_vshl : SDNode<"ISD::SHL", SDT_ZVecBinary>; 440ce4c1095SUlrich Weiganddef z_vsra : SDNode<"ISD::SRA", SDT_ZVecBinary>; 441ce4c1095SUlrich Weiganddef z_vsrl : SDNode<"ISD::SRL", SDT_ZVecBinary>; 442ce4c1095SUlrich Weigand 4435f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 4445f613dfdSUlrich Weigand// Pattern fragments 4455f613dfdSUlrich Weigand//===----------------------------------------------------------------------===// 4465f613dfdSUlrich Weigand 447c5854b0aSUlrich Weiganddef z_loadbswap16 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{ 448c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 449c5854b0aSUlrich Weigand}]>; 450c5854b0aSUlrich Weiganddef z_loadbswap32 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{ 451c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 452c5854b0aSUlrich Weigand}]>; 453c5854b0aSUlrich Weiganddef z_loadbswap64 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{ 454c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 455c5854b0aSUlrich Weigand}]>; 45628b759c4SBryan Chan 457c5854b0aSUlrich Weiganddef z_storebswap16 : PatFrag<(ops node:$src, node:$addr), 458c5854b0aSUlrich Weigand (z_storebswap node:$src, node:$addr), [{ 459c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 460c5854b0aSUlrich Weigand}]>; 461c5854b0aSUlrich Weiganddef z_storebswap32 : PatFrag<(ops node:$src, node:$addr), 462c5854b0aSUlrich Weigand (z_storebswap node:$src, node:$addr), [{ 463c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 464c5854b0aSUlrich Weigand}]>; 465c5854b0aSUlrich Weiganddef z_storebswap64 : PatFrag<(ops node:$src, node:$addr), 466c5854b0aSUlrich Weigand (z_storebswap node:$src, node:$addr), [{ 467c5854b0aSUlrich Weigand return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 468c5854b0aSUlrich Weigand}]>; 46928b759c4SBryan Chan 470b32f3656SUlrich Weigand// Fragments including CC as an implicit source. 471b32f3656SUlrich Weiganddef z_br_ccmask 472b32f3656SUlrich Weigand : PatFrag<(ops node:$valid, node:$mask, node:$bb), 473b32f3656SUlrich Weigand (z_br_ccmask_1 node:$valid, node:$mask, node:$bb, CC)>; 474b32f3656SUlrich Weiganddef z_select_ccmask 475b32f3656SUlrich Weigand : PatFrag<(ops node:$true, node:$false, node:$valid, node:$mask), 476b32f3656SUlrich Weigand (z_select_ccmask_1 node:$true, node:$false, 477b32f3656SUlrich Weigand node:$valid, node:$mask, CC)>; 478b32f3656SUlrich Weiganddef z_ipm : PatFrag<(ops), (z_ipm_1 CC)>; 479c3ec80feSUlrich Weiganddef z_addcarry : PatFrag<(ops node:$lhs, node:$rhs), 480c3ec80feSUlrich Weigand (z_addcarry_1 node:$lhs, node:$rhs, CC)>; 481c3ec80feSUlrich Weiganddef z_subcarry : PatFrag<(ops node:$lhs, node:$rhs), 482c3ec80feSUlrich Weigand (z_subcarry_1 node:$lhs, node:$rhs, CC)>; 483b32f3656SUlrich Weigand 4845bc670bbSRichard Sandiford// Signed and unsigned comparisons. 4853ecab8e4SMatt Arsenaultdef z_scmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, timm), [{ 4865bc670bbSRichard Sandiford unsigned Type = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue(); 4875bc670bbSRichard Sandiford return Type != SystemZICMP::UnsignedOnly; 4885bc670bbSRichard Sandiford}]>; 4893ecab8e4SMatt Arsenaultdef z_ucmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, timm), [{ 4905bc670bbSRichard Sandiford unsigned Type = cast<ConstantSDNode>(N->getOperand(2))->getZExtValue(); 4915bc670bbSRichard Sandiford return Type != SystemZICMP::SignedOnly; 4925bc670bbSRichard Sandiford}]>; 4935bc670bbSRichard Sandiford 494a9eb9972SRichard Sandiford// Register- and memory-based TEST UNDER MASK. 4953ecab8e4SMatt Arsenaultdef z_tm_reg : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, timm)>; 496a9eb9972SRichard Sandiforddef z_tm_mem : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, 0)>; 497a9eb9972SRichard Sandiford 4985f613dfdSUlrich Weigand// Register sign-extend operations. Sub-32-bit values are represented as i32s. 4995f613dfdSUlrich Weiganddef sext8 : PatFrag<(ops node:$src), (sext_inreg node:$src, i8)>; 5005f613dfdSUlrich Weiganddef sext16 : PatFrag<(ops node:$src), (sext_inreg node:$src, i16)>; 5015f613dfdSUlrich Weiganddef sext32 : PatFrag<(ops node:$src), (sext (i32 node:$src))>; 5025f613dfdSUlrich Weigand 503ce4c1095SUlrich Weigand// Match extensions of an i32 to an i64, followed by an in-register sign 504ce4c1095SUlrich Weigand// extension from a sub-i32 value. 505ce4c1095SUlrich Weiganddef sext8dbl : PatFrag<(ops node:$src), (sext8 (anyext node:$src))>; 506ce4c1095SUlrich Weiganddef sext16dbl : PatFrag<(ops node:$src), (sext16 (anyext node:$src))>; 507ce4c1095SUlrich Weigand 5085f613dfdSUlrich Weigand// Register zero-extend operations. Sub-32-bit values are represented as i32s. 5095f613dfdSUlrich Weiganddef zext8 : PatFrag<(ops node:$src), (and node:$src, 0xff)>; 5105f613dfdSUlrich Weiganddef zext16 : PatFrag<(ops node:$src), (and node:$src, 0xffff)>; 5115f613dfdSUlrich Weiganddef zext32 : PatFrag<(ops node:$src), (zext (i32 node:$src))>; 5125f613dfdSUlrich Weigand 513109a7c6fSRichard Sandiford// Extending loads in which the extension type can be signed. 514109a7c6fSRichard Sandiforddef asextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 515109a7c6fSRichard Sandiford unsigned Type = cast<LoadSDNode>(N)->getExtensionType(); 516109a7c6fSRichard Sandiford return Type == ISD::EXTLOAD || Type == ISD::SEXTLOAD; 517109a7c6fSRichard Sandiford}]>; 518109a7c6fSRichard Sandiforddef asextloadi8 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 519109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 520109a7c6fSRichard Sandiford}]>; 521109a7c6fSRichard Sandiforddef asextloadi16 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 522109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 523109a7c6fSRichard Sandiford}]>; 524109a7c6fSRichard Sandiforddef asextloadi32 : PatFrag<(ops node:$ptr), (asextload node:$ptr), [{ 525109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 526109a7c6fSRichard Sandiford}]>; 527109a7c6fSRichard Sandiford 528109a7c6fSRichard Sandiford// Extending loads in which the extension type can be unsigned. 529109a7c6fSRichard Sandiforddef azextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 530109a7c6fSRichard Sandiford unsigned Type = cast<LoadSDNode>(N)->getExtensionType(); 531109a7c6fSRichard Sandiford return Type == ISD::EXTLOAD || Type == ISD::ZEXTLOAD; 532109a7c6fSRichard Sandiford}]>; 533109a7c6fSRichard Sandiforddef azextloadi8 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 534109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 535109a7c6fSRichard Sandiford}]>; 536109a7c6fSRichard Sandiforddef azextloadi16 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 537109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 538109a7c6fSRichard Sandiford}]>; 539109a7c6fSRichard Sandiforddef azextloadi32 : PatFrag<(ops node:$ptr), (azextload node:$ptr), [{ 540109a7c6fSRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 541109a7c6fSRichard Sandiford}]>; 542109a7c6fSRichard Sandiford 543b86a8348SRichard Sandiford// Extending loads in which the extension type doesn't matter. 544b86a8348SRichard Sandiforddef anyextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ 545b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getExtensionType() != ISD::NON_EXTLOAD; 546b86a8348SRichard Sandiford}]>; 547b86a8348SRichard Sandiforddef anyextloadi8 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 548b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; 549b86a8348SRichard Sandiford}]>; 550b86a8348SRichard Sandiforddef anyextloadi16 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 551b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; 552b86a8348SRichard Sandiford}]>; 553b86a8348SRichard Sandiforddef anyextloadi32 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{ 554b86a8348SRichard Sandiford return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; 555b86a8348SRichard Sandiford}]>; 556b86a8348SRichard Sandiford 5575f613dfdSUlrich Weigand// Aligned loads. 5585f613dfdSUlrich Weigandclass AlignedLoad<SDPatternOperator load> 55975a5febeSJonas Paulsson : PatFrag<(ops node:$addr), (load node:$addr), 56075a5febeSJonas Paulsson [{ return storeLoadIsAligned(N); }]>; 5615f613dfdSUlrich Weiganddef aligned_load : AlignedLoad<load>; 562109a7c6fSRichard Sandiforddef aligned_asextloadi16 : AlignedLoad<asextloadi16>; 563109a7c6fSRichard Sandiforddef aligned_asextloadi32 : AlignedLoad<asextloadi32>; 564109a7c6fSRichard Sandiforddef aligned_azextloadi16 : AlignedLoad<azextloadi16>; 565109a7c6fSRichard Sandiforddef aligned_azextloadi32 : AlignedLoad<azextloadi32>; 5665f613dfdSUlrich Weigand 5675f613dfdSUlrich Weigand// Aligned stores. 5685f613dfdSUlrich Weigandclass AlignedStore<SDPatternOperator store> 56975a5febeSJonas Paulsson : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr), 57075a5febeSJonas Paulsson [{ return storeLoadIsAligned(N); }]>; 5715f613dfdSUlrich Weiganddef aligned_store : AlignedStore<store>; 5725f613dfdSUlrich Weiganddef aligned_truncstorei16 : AlignedStore<truncstorei16>; 5735f613dfdSUlrich Weiganddef aligned_truncstorei32 : AlignedStore<truncstorei32>; 5745f613dfdSUlrich Weigand 57530efd87fSRichard Sandiford// Non-volatile loads. Used for instructions that might access the storage 57630efd87fSRichard Sandiford// location multiple times. 57730efd87fSRichard Sandifordclass NonvolatileLoad<SDPatternOperator load> 57830efd87fSRichard Sandiford : PatFrag<(ops node:$addr), (load node:$addr), [{ 57921f5d68aSRichard Sandiford auto *Load = cast<LoadSDNode>(N); 58030efd87fSRichard Sandiford return !Load->isVolatile(); 58130efd87fSRichard Sandiford}]>; 582b86a8348SRichard Sandiforddef nonvolatile_anyextloadi8 : NonvolatileLoad<anyextloadi8>; 583b86a8348SRichard Sandiforddef nonvolatile_anyextloadi16 : NonvolatileLoad<anyextloadi16>; 584b86a8348SRichard Sandiforddef nonvolatile_anyextloadi32 : NonvolatileLoad<anyextloadi32>; 58530efd87fSRichard Sandiford 58630efd87fSRichard Sandiford// Non-volatile stores. 58730efd87fSRichard Sandifordclass NonvolatileStore<SDPatternOperator store> 58830efd87fSRichard Sandiford : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr), [{ 58921f5d68aSRichard Sandiford auto *Store = cast<StoreSDNode>(N); 59030efd87fSRichard Sandiford return !Store->isVolatile(); 59130efd87fSRichard Sandiford}]>; 592b86a8348SRichard Sandiforddef nonvolatile_truncstorei8 : NonvolatileStore<truncstorei8>; 593b86a8348SRichard Sandiforddef nonvolatile_truncstorei16 : NonvolatileStore<truncstorei16>; 594b86a8348SRichard Sandiforddef nonvolatile_truncstorei32 : NonvolatileStore<truncstorei32>; 59530efd87fSRichard Sandiford 596178273a1SRichard Sandiford// A store of a load that can be implemented using MVC. 597178273a1SRichard Sandiforddef mvc_store : PatFrag<(ops node:$value, node:$addr), 598178273a1SRichard Sandiford (unindexedstore node:$value, node:$addr), 599178273a1SRichard Sandiford [{ return storeLoadCanUseMVC(N); }]>; 600178273a1SRichard Sandiford 601178273a1SRichard Sandiford// Binary read-modify-write operations on memory in which the other 602178273a1SRichard Sandiford// operand is also memory and for which block operations like NC can 603178273a1SRichard Sandiford// be used. There are two patterns for each operator, depending on 604178273a1SRichard Sandiford// which operand contains the "other" load. 605178273a1SRichard Sandifordmulticlass block_op<SDPatternOperator operator> { 606178273a1SRichard Sandiford def "1" : PatFrag<(ops node:$value, node:$addr), 607178273a1SRichard Sandiford (unindexedstore (operator node:$value, 608178273a1SRichard Sandiford (unindexedload node:$addr)), 609178273a1SRichard Sandiford node:$addr), 610178273a1SRichard Sandiford [{ return storeLoadCanUseBlockBinary(N, 0); }]>; 611178273a1SRichard Sandiford def "2" : PatFrag<(ops node:$value, node:$addr), 612178273a1SRichard Sandiford (unindexedstore (operator (unindexedload node:$addr), 613178273a1SRichard Sandiford node:$value), 614178273a1SRichard Sandiford node:$addr), 615178273a1SRichard Sandiford [{ return storeLoadCanUseBlockBinary(N, 1); }]>; 616178273a1SRichard Sandiford} 617178273a1SRichard Sandiforddefm block_and : block_op<and>; 618178273a1SRichard Sandiforddefm block_or : block_op<or>; 619178273a1SRichard Sandiforddefm block_xor : block_op<xor>; 620178273a1SRichard Sandiford 6215f613dfdSUlrich Weigand// Insertions. 6225f613dfdSUlrich Weiganddef inserti8 : PatFrag<(ops node:$src1, node:$src2), 6235f613dfdSUlrich Weigand (or (and node:$src1, -256), node:$src2)>; 6245f613dfdSUlrich Weiganddef insertll : PatFrag<(ops node:$src1, node:$src2), 6255f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffffffff0000), node:$src2)>; 6265f613dfdSUlrich Weiganddef insertlh : PatFrag<(ops node:$src1, node:$src2), 6275f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffff0000ffff), node:$src2)>; 6285f613dfdSUlrich Weiganddef inserthl : PatFrag<(ops node:$src1, node:$src2), 6295f613dfdSUlrich Weigand (or (and node:$src1, 0xffff0000ffffffff), node:$src2)>; 6305f613dfdSUlrich Weiganddef inserthh : PatFrag<(ops node:$src1, node:$src2), 6315f613dfdSUlrich Weigand (or (and node:$src1, 0x0000ffffffffffff), node:$src2)>; 6325f613dfdSUlrich Weiganddef insertlf : PatFrag<(ops node:$src1, node:$src2), 6335f613dfdSUlrich Weigand (or (and node:$src1, 0xffffffff00000000), node:$src2)>; 6345f613dfdSUlrich Weiganddef inserthf : PatFrag<(ops node:$src1, node:$src2), 6355f613dfdSUlrich Weigand (or (and node:$src1, 0x00000000ffffffff), node:$src2)>; 6365f613dfdSUlrich Weigand 6375f613dfdSUlrich Weigand// ORs that can be treated as insertions. 6385f613dfdSUlrich Weiganddef or_as_inserti8 : PatFrag<(ops node:$src1, node:$src2), 6395f613dfdSUlrich Weigand (or node:$src1, node:$src2), [{ 640bd6fca14SSanjay Patel unsigned BitWidth = N->getValueType(0).getScalarSizeInBits(); 6415f613dfdSUlrich Weigand return CurDAG->MaskedValueIsZero(N->getOperand(0), 6425f613dfdSUlrich Weigand APInt::getLowBitsSet(BitWidth, 8)); 6435f613dfdSUlrich Weigand}]>; 6445f613dfdSUlrich Weigand 6455f613dfdSUlrich Weigand// ORs that can be treated as reversed insertions. 6465f613dfdSUlrich Weiganddef or_as_revinserti8 : PatFrag<(ops node:$src1, node:$src2), 6475f613dfdSUlrich Weigand (or node:$src1, node:$src2), [{ 648bd6fca14SSanjay Patel unsigned BitWidth = N->getValueType(0).getScalarSizeInBits(); 6495f613dfdSUlrich Weigand return CurDAG->MaskedValueIsZero(N->getOperand(1), 6505f613dfdSUlrich Weigand APInt::getLowBitsSet(BitWidth, 8)); 6515f613dfdSUlrich Weigand}]>; 6525f613dfdSUlrich Weigand 65357485472SRichard Sandiford// Negative integer absolute. 65445b8e37aSJonas Paulssondef z_inegabs : PatFrag<(ops node:$src), (ineg (abs node:$src))>; 6554b897054SRichard Sandiford 656ce4c1095SUlrich Weigand// Integer multiply-and-add 657ce4c1095SUlrich Weiganddef z_muladd : PatFrag<(ops node:$src1, node:$src2, node:$src3), 658ce4c1095SUlrich Weigand (add (mul node:$src1, node:$src2), node:$src3)>; 659ce4c1095SUlrich Weigand 660c48aefb6SUlrich Weigand// Alternatives to match operations with or without an overflow CC result. 661c48aefb6SUlrich Weiganddef z_sadd : PatFrags<(ops node:$src1, node:$src2), 662c48aefb6SUlrich Weigand [(z_saddo node:$src1, node:$src2), 663c48aefb6SUlrich Weigand (add node:$src1, node:$src2)]>; 664c48aefb6SUlrich Weiganddef z_uadd : PatFrags<(ops node:$src1, node:$src2), 665c48aefb6SUlrich Weigand [(z_uaddo node:$src1, node:$src2), 666c48aefb6SUlrich Weigand (add node:$src1, node:$src2)]>; 667c48aefb6SUlrich Weiganddef z_ssub : PatFrags<(ops node:$src1, node:$src2), 668c48aefb6SUlrich Weigand [(z_ssubo node:$src1, node:$src2), 669c48aefb6SUlrich Weigand (sub node:$src1, node:$src2)]>; 670c48aefb6SUlrich Weiganddef z_usub : PatFrags<(ops node:$src1, node:$src2), 671c48aefb6SUlrich Weigand [(z_usubo node:$src1, node:$src2), 672c48aefb6SUlrich Weigand (sub node:$src1, node:$src2)]>; 673c48aefb6SUlrich Weigand 6740f0a8b77SUlrich Weigand// Combined logical operations. 6750f0a8b77SUlrich Weiganddef andc : PatFrag<(ops node:$src1, node:$src2), 6760f0a8b77SUlrich Weigand (and node:$src1, (not node:$src2))>; 6770f0a8b77SUlrich Weiganddef orc : PatFrag<(ops node:$src1, node:$src2), 6780f0a8b77SUlrich Weigand (or node:$src1, (not node:$src2))>; 6790f0a8b77SUlrich Weiganddef nand : PatFrag<(ops node:$src1, node:$src2), 6800f0a8b77SUlrich Weigand (not (and node:$src1, node:$src2))>; 6810f0a8b77SUlrich Weiganddef nor : PatFrag<(ops node:$src1, node:$src2), 6820f0a8b77SUlrich Weigand (not (or node:$src1, node:$src2))>; 6830f0a8b77SUlrich Weiganddef nxor : PatFrag<(ops node:$src1, node:$src2), 6840f0a8b77SUlrich Weigand (not (xor node:$src1, node:$src2))>; 6850f0a8b77SUlrich Weigand 686cd808237SUlrich Weigand// Fused multiply-subtract, using the natural operand order. 6876c5d5ce5SUlrich Weiganddef any_fms : PatFrag<(ops node:$src1, node:$src2, node:$src3), 6886c5d5ce5SUlrich Weigand (any_fma node:$src1, node:$src2, (fneg node:$src3))>; 689cd808237SUlrich Weigand 6905f613dfdSUlrich Weigand// Fused multiply-add and multiply-subtract, but with the order of the 6915f613dfdSUlrich Weigand// operands matching SystemZ's MA and MS instructions. 6926c5d5ce5SUlrich Weiganddef z_any_fma : PatFrag<(ops node:$src1, node:$src2, node:$src3), 6936c5d5ce5SUlrich Weigand (any_fma node:$src2, node:$src3, node:$src1)>; 6946c5d5ce5SUlrich Weiganddef z_any_fms : PatFrag<(ops node:$src1, node:$src2, node:$src3), 6956c5d5ce5SUlrich Weigand (any_fma node:$src2, node:$src3, (fneg node:$src1))>; 6965f613dfdSUlrich Weigand 6972b3482feSUlrich Weigand// Negative fused multiply-add and multiply-subtract. 6986c5d5ce5SUlrich Weiganddef any_fnma : PatFrag<(ops node:$src1, node:$src2, node:$src3), 6996c5d5ce5SUlrich Weigand (fneg (any_fma node:$src1, node:$src2, node:$src3))>; 7006c5d5ce5SUlrich Weiganddef any_fnms : PatFrag<(ops node:$src1, node:$src2, node:$src3), 7016c5d5ce5SUlrich Weigand (fneg (any_fms node:$src1, node:$src2, node:$src3))>; 7022b3482feSUlrich Weigand 7035f613dfdSUlrich Weigand// Floating-point negative absolute. 7045f613dfdSUlrich Weiganddef fnabs : PatFrag<(ops node:$ptr), (fneg (fabs node:$ptr))>; 7055f613dfdSUlrich Weigand 7069db13b5aSUlrich Weigand// Strict floating-point fragments. 7079db13b5aSUlrich Weiganddef z_any_fcmp : PatFrags<(ops node:$lhs, node:$rhs), 7089db13b5aSUlrich Weigand [(z_strict_fcmp node:$lhs, node:$rhs), 7099db13b5aSUlrich Weigand (z_fcmp node:$lhs, node:$rhs)]>; 7109db13b5aSUlrich Weiganddef z_any_vfcmpe : PatFrags<(ops node:$lhs, node:$rhs), 7119db13b5aSUlrich Weigand [(z_strict_vfcmpe node:$lhs, node:$rhs), 7129db13b5aSUlrich Weigand (z_vfcmpe node:$lhs, node:$rhs)]>; 7139db13b5aSUlrich Weiganddef z_any_vfcmph : PatFrags<(ops node:$lhs, node:$rhs), 7149db13b5aSUlrich Weigand [(z_strict_vfcmph node:$lhs, node:$rhs), 7159db13b5aSUlrich Weigand (z_vfcmph node:$lhs, node:$rhs)]>; 7169db13b5aSUlrich Weiganddef z_any_vfcmphe : PatFrags<(ops node:$lhs, node:$rhs), 7179db13b5aSUlrich Weigand [(z_strict_vfcmphe node:$lhs, node:$rhs), 7189db13b5aSUlrich Weigand (z_vfcmphe node:$lhs, node:$rhs)]>; 7199db13b5aSUlrich Weiganddef z_any_vextend : PatFrags<(ops node:$src), 7209db13b5aSUlrich Weigand [(z_strict_vextend node:$src), 7219db13b5aSUlrich Weigand (z_vextend node:$src)]>; 722ede8293dSUlrich Weiganddef z_any_vround : PatFrags<(ops node:$src), 723ede8293dSUlrich Weigand [(z_strict_vround node:$src), 724ede8293dSUlrich Weigand (z_vround node:$src)]>; 7259db13b5aSUlrich Weigand 7265f613dfdSUlrich Weigand// Create a unary operator that loads from memory and then performs 7275f613dfdSUlrich Weigand// the given operation on it. 72830efd87fSRichard Sandifordclass loadu<SDPatternOperator operator, SDPatternOperator load = load> 7295f613dfdSUlrich Weigand : PatFrag<(ops node:$addr), (operator (load node:$addr))>; 7305f613dfdSUlrich Weigand 7315f613dfdSUlrich Weigand// Create a store operator that performs the given unary operation 7325f613dfdSUlrich Weigand// on the value before storing it. 73330efd87fSRichard Sandifordclass storeu<SDPatternOperator operator, SDPatternOperator store = store> 7345f613dfdSUlrich Weigand : PatFrag<(ops node:$value, node:$addr), 7355f613dfdSUlrich Weigand (store (operator node:$value), node:$addr)>; 736ce4c1095SUlrich Weigand 7371c5a5c42SUlrich Weigand// Create a store operator that performs the given inherent operation 7381c5a5c42SUlrich Weigand// and stores the resulting value. 7391c5a5c42SUlrich Weigandclass storei<SDPatternOperator operator, SDPatternOperator store = store> 7401c5a5c42SUlrich Weigand : PatFrag<(ops node:$addr), 7411c5a5c42SUlrich Weigand (store (operator), node:$addr)>; 7421c5a5c42SUlrich Weigand 74358a9786eSUlrich Weigand// Create a shift operator that optionally ignores an AND of the 74458a9786eSUlrich Weigand// shift count with an immediate if the bottom 6 bits are all set. 74558a9786eSUlrich Weiganddef imm32bottom6set : PatLeaf<(i32 imm), [{ 74658a9786eSUlrich Weigand return (N->getZExtValue() & 0x3f) == 0x3f; 74758a9786eSUlrich Weigand}]>; 74858a9786eSUlrich Weigandclass shiftop<SDPatternOperator operator> 74958a9786eSUlrich Weigand : PatFrags<(ops node:$val, node:$count), 75058a9786eSUlrich Weigand [(operator node:$val, node:$count), 75158a9786eSUlrich Weigand (operator node:$val, (and node:$count, imm32bottom6set))]>; 75258a9786eSUlrich Weigand 753f76fe454SJonas Paulssondef imm32mod64 : PatLeaf<(i32 imm), [{ 754f76fe454SJonas Paulsson return (N->getZExtValue() % 64 == 0); 755f76fe454SJonas Paulsson}]>; 756f76fe454SJonas Paulsson 757ce4c1095SUlrich Weigand// Load a scalar and replicate it in all elements of a vector. 758ce4c1095SUlrich Weigandclass z_replicate_load<ValueType scalartype, SDPatternOperator load> 759ce4c1095SUlrich Weigand : PatFrag<(ops node:$addr), 760ce4c1095SUlrich Weigand (z_replicate (scalartype (load node:$addr)))>; 761ce4c1095SUlrich Weiganddef z_replicate_loadi8 : z_replicate_load<i32, anyextloadi8>; 762ce4c1095SUlrich Weiganddef z_replicate_loadi16 : z_replicate_load<i32, anyextloadi16>; 763ce4c1095SUlrich Weiganddef z_replicate_loadi32 : z_replicate_load<i32, load>; 764ce4c1095SUlrich Weiganddef z_replicate_loadi64 : z_replicate_load<i64, load>; 76580b3af7aSUlrich Weiganddef z_replicate_loadf32 : z_replicate_load<f32, load>; 766cd808237SUlrich Weiganddef z_replicate_loadf64 : z_replicate_load<f64, load>; 7670f0a8b77SUlrich Weigand// Byte-swapped replicated vector element loads. 7680f0a8b77SUlrich Weiganddef z_replicate_loadbswapi16 : z_replicate_load<i32, z_loadbswap16>; 7690f0a8b77SUlrich Weiganddef z_replicate_loadbswapi32 : z_replicate_load<i32, z_loadbswap32>; 7700f0a8b77SUlrich Weiganddef z_replicate_loadbswapi64 : z_replicate_load<i64, z_loadbswap64>; 771ce4c1095SUlrich Weigand 772ce4c1095SUlrich Weigand// Load a scalar and insert it into a single element of a vector. 773ce4c1095SUlrich Weigandclass z_vle<ValueType scalartype, SDPatternOperator load> 774ce4c1095SUlrich Weigand : PatFrag<(ops node:$vec, node:$addr, node:$index), 775ce4c1095SUlrich Weigand (z_vector_insert node:$vec, (scalartype (load node:$addr)), 776ce4c1095SUlrich Weigand node:$index)>; 777ce4c1095SUlrich Weiganddef z_vlei8 : z_vle<i32, anyextloadi8>; 778ce4c1095SUlrich Weiganddef z_vlei16 : z_vle<i32, anyextloadi16>; 779ce4c1095SUlrich Weiganddef z_vlei32 : z_vle<i32, load>; 780ce4c1095SUlrich Weiganddef z_vlei64 : z_vle<i64, load>; 78180b3af7aSUlrich Weiganddef z_vlef32 : z_vle<f32, load>; 782cd808237SUlrich Weiganddef z_vlef64 : z_vle<f64, load>; 7830f0a8b77SUlrich Weigand// Byte-swapped vector element loads. 7840f0a8b77SUlrich Weiganddef z_vlebri16 : z_vle<i32, z_loadbswap16>; 7850f0a8b77SUlrich Weiganddef z_vlebri32 : z_vle<i32, z_loadbswap32>; 7860f0a8b77SUlrich Weiganddef z_vlebri64 : z_vle<i64, z_loadbswap64>; 787ce4c1095SUlrich Weigand 788ce4c1095SUlrich Weigand// Load a scalar and insert it into the low element of the high i64 of a 789ce4c1095SUlrich Weigand// zeroed vector. 790ce4c1095SUlrich Weigandclass z_vllez<ValueType scalartype, SDPatternOperator load, int index> 791ce4c1095SUlrich Weigand : PatFrag<(ops node:$addr), 7921a872f2bSCraig Topper (z_vector_insert immAllZerosV, 793ce4c1095SUlrich Weigand (scalartype (load node:$addr)), (i32 index))>; 794ce4c1095SUlrich Weiganddef z_vllezi8 : z_vllez<i32, anyextloadi8, 7>; 795ce4c1095SUlrich Weiganddef z_vllezi16 : z_vllez<i32, anyextloadi16, 3>; 796ce4c1095SUlrich Weiganddef z_vllezi32 : z_vllez<i32, load, 1>; 79744d37ae3SUlrich Weiganddef z_vllezi64 : PatFrags<(ops node:$addr), 7981a872f2bSCraig Topper [(z_vector_insert immAllZerosV, 79944d37ae3SUlrich Weigand (i64 (load node:$addr)), (i32 0)), 80044d37ae3SUlrich Weigand (z_join_dwords (i64 (load node:$addr)), (i64 0))]>; 80180b3af7aSUlrich Weigand// We use high merges to form a v4f32 from four f32s. Propagating zero 80280b3af7aSUlrich Weigand// into all elements but index 1 gives this expression. 80380b3af7aSUlrich Weiganddef z_vllezf32 : PatFrag<(ops node:$addr), 80480b3af7aSUlrich Weigand (z_merge_high 805cd2a1b53SUlrich Weigand (v2i64 806cd2a1b53SUlrich Weigand (z_unpackl_high 807cd2a1b53SUlrich Weigand (v4i32 808cd2a1b53SUlrich Weigand (bitconvert 80980b3af7aSUlrich Weigand (v4f32 (scalar_to_vector 810cd2a1b53SUlrich Weigand (f32 (load node:$addr)))))))), 8118cda83a5SJonas Paulsson (v2i64 8121a872f2bSCraig Topper (bitconvert (v4f32 immAllZerosV))))>; 813cd808237SUlrich Weiganddef z_vllezf64 : PatFrag<(ops node:$addr), 814cd808237SUlrich Weigand (z_merge_high 81544d37ae3SUlrich Weigand (v2f64 (scalar_to_vector (f64 (load node:$addr)))), 8161a872f2bSCraig Topper immAllZerosV)>; 817ce4c1095SUlrich Weigand 8182b3482feSUlrich Weigand// Similarly for the high element of a zeroed vector. 8192b3482feSUlrich Weiganddef z_vllezli32 : z_vllez<i32, load, 0>; 8202b3482feSUlrich Weiganddef z_vllezlf32 : PatFrag<(ops node:$addr), 8212b3482feSUlrich Weigand (z_merge_high 8222b3482feSUlrich Weigand (v2i64 8232b3482feSUlrich Weigand (bitconvert 8242b3482feSUlrich Weigand (z_merge_high 8252b3482feSUlrich Weigand (v4f32 (scalar_to_vector 8262b3482feSUlrich Weigand (f32 (load node:$addr)))), 8271a872f2bSCraig Topper (v4f32 immAllZerosV)))), 8288cda83a5SJonas Paulsson (v2i64 8291a872f2bSCraig Topper (bitconvert (v4f32 immAllZerosV))))>; 8302b3482feSUlrich Weigand 8310f0a8b77SUlrich Weigand// Byte-swapped variants. 8320f0a8b77SUlrich Weiganddef z_vllebrzi16 : z_vllez<i32, z_loadbswap16, 3>; 8330f0a8b77SUlrich Weiganddef z_vllebrzi32 : z_vllez<i32, z_loadbswap32, 1>; 8340f0a8b77SUlrich Weiganddef z_vllebrzli32 : z_vllez<i32, z_loadbswap32, 0>; 8350f0a8b77SUlrich Weiganddef z_vllebrzi64 : PatFrags<(ops node:$addr), 8360f0a8b77SUlrich Weigand [(z_vector_insert immAllZerosV, 8370f0a8b77SUlrich Weigand (i64 (z_loadbswap64 node:$addr)), 8380f0a8b77SUlrich Weigand (i32 0)), 8390f0a8b77SUlrich Weigand (z_join_dwords (i64 (z_loadbswap64 node:$addr)), 8400f0a8b77SUlrich Weigand (i64 0))]>; 8410f0a8b77SUlrich Weigand 8420f0a8b77SUlrich Weigand 843ce4c1095SUlrich Weigand// Store one element of a vector. 844ce4c1095SUlrich Weigandclass z_vste<ValueType scalartype, SDPatternOperator store> 845ce4c1095SUlrich Weigand : PatFrag<(ops node:$vec, node:$addr, node:$index), 846ce4c1095SUlrich Weigand (store (scalartype (z_vector_extract node:$vec, node:$index)), 847ce4c1095SUlrich Weigand node:$addr)>; 848ce4c1095SUlrich Weiganddef z_vstei8 : z_vste<i32, truncstorei8>; 849ce4c1095SUlrich Weiganddef z_vstei16 : z_vste<i32, truncstorei16>; 850ce4c1095SUlrich Weiganddef z_vstei32 : z_vste<i32, store>; 851ce4c1095SUlrich Weiganddef z_vstei64 : z_vste<i64, store>; 85280b3af7aSUlrich Weiganddef z_vstef32 : z_vste<f32, store>; 853cd808237SUlrich Weiganddef z_vstef64 : z_vste<f64, store>; 8540f0a8b77SUlrich Weigand// Byte-swapped vector element stores. 8550f0a8b77SUlrich Weiganddef z_vstebri16 : z_vste<i32, z_storebswap16>; 8560f0a8b77SUlrich Weiganddef z_vstebri32 : z_vste<i32, z_storebswap32>; 8570f0a8b77SUlrich Weiganddef z_vstebri64 : z_vste<i64, z_storebswap64>; 858ce4c1095SUlrich Weigand 859ce4c1095SUlrich Weigand// Arithmetic negation on vectors. 8601a872f2bSCraig Topperdef z_vneg : PatFrag<(ops node:$x), (sub immAllZerosV, node:$x)>; 861ce4c1095SUlrich Weigand 862ce4c1095SUlrich Weigand// Bitwise negation on vectors. 8631a872f2bSCraig Topperdef z_vnot : PatFrag<(ops node:$x), (xor node:$x, immAllOnesV)>; 864ce4c1095SUlrich Weigand 865ce4c1095SUlrich Weigand// Signed "integer greater than zero" on vectors. 8661a872f2bSCraig Topperdef z_vicmph_zero : PatFrag<(ops node:$x), (z_vicmph node:$x, immAllZerosV)>; 867ce4c1095SUlrich Weigand 868ce4c1095SUlrich Weigand// Signed "integer less than zero" on vectors. 8691a872f2bSCraig Topperdef z_vicmpl_zero : PatFrag<(ops node:$x), (z_vicmph immAllZerosV, node:$x)>; 870ce4c1095SUlrich Weigand 871ce4c1095SUlrich Weigand// Sign-extend the i64 elements of a vector. 872ce4c1095SUlrich Weigandclass z_vse<int shift> 873ce4c1095SUlrich Weigand : PatFrag<(ops node:$src), 874ce4c1095SUlrich Weigand (z_vsra_by_scalar (z_vshl_by_scalar node:$src, shift), shift)>; 875ce4c1095SUlrich Weiganddef z_vsei8 : z_vse<56>; 876ce4c1095SUlrich Weiganddef z_vsei16 : z_vse<48>; 877ce4c1095SUlrich Weiganddef z_vsei32 : z_vse<32>; 878ce4c1095SUlrich Weigand 879ce4c1095SUlrich Weigand// ...and again with the extensions being done on individual i64 scalars. 880ce4c1095SUlrich Weigandclass z_vse_by_parts<SDPatternOperator operator, int index1, int index2> 881ce4c1095SUlrich Weigand : PatFrag<(ops node:$src), 882ce4c1095SUlrich Weigand (z_join_dwords 883ce4c1095SUlrich Weigand (operator (z_vector_extract node:$src, index1)), 884ce4c1095SUlrich Weigand (operator (z_vector_extract node:$src, index2)))>; 885ce4c1095SUlrich Weiganddef z_vsei8_by_parts : z_vse_by_parts<sext8dbl, 7, 15>; 886ce4c1095SUlrich Weiganddef z_vsei16_by_parts : z_vse_by_parts<sext16dbl, 3, 7>; 887ce4c1095SUlrich Weiganddef z_vsei32_by_parts : z_vse_by_parts<sext32, 1, 3>; 888