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