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