xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SystemZ/SystemZOperators.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//===-- SystemZOperators.td - SystemZ-specific operators ------*- tblgen-*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
100b57cec5SDimitry Andric// Type profiles
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andricdef SDT_CallSeqStart        : SDCallSeqStart<[SDTCisVT<0, i64>,
130b57cec5SDimitry Andric                                              SDTCisVT<1, i64>]>;
140b57cec5SDimitry Andricdef SDT_CallSeqEnd          : SDCallSeqEnd<[SDTCisVT<0, i64>,
150b57cec5SDimitry Andric                                            SDTCisVT<1, i64>]>;
160b57cec5SDimitry Andricdef SDT_ZCall               : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>;
170b57cec5SDimitry Andricdef SDT_ZCmp                : SDTypeProfile<1, 2,
180b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
190b57cec5SDimitry Andric                                             SDTCisSameAs<1, 2>]>;
200b57cec5SDimitry Andricdef SDT_ZICmp               : SDTypeProfile<1, 3,
210b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
220b57cec5SDimitry Andric                                             SDTCisSameAs<1, 2>,
230b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
240b57cec5SDimitry Andricdef SDT_ZBRCCMask           : SDTypeProfile<0, 4,
250b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
260b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
270b57cec5SDimitry Andric                                             SDTCisVT<2, OtherVT>,
280b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
290b57cec5SDimitry Andricdef SDT_ZSelectCCMask       : SDTypeProfile<1, 5,
300b57cec5SDimitry Andric                                            [SDTCisSameAs<0, 1>,
310b57cec5SDimitry Andric                                             SDTCisSameAs<1, 2>,
320b57cec5SDimitry Andric                                             SDTCisVT<3, i32>,
330b57cec5SDimitry Andric                                             SDTCisVT<4, i32>,
340b57cec5SDimitry Andric                                             SDTCisVT<5, i32>]>;
350b57cec5SDimitry Andricdef SDT_ZWrapPtr            : SDTypeProfile<1, 1,
360b57cec5SDimitry Andric                                            [SDTCisSameAs<0, 1>,
370b57cec5SDimitry Andric                                             SDTCisPtrTy<0>]>;
380b57cec5SDimitry Andricdef SDT_ZWrapOffset         : SDTypeProfile<1, 2,
390b57cec5SDimitry Andric                                            [SDTCisSameAs<0, 1>,
400b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
410b57cec5SDimitry Andric                                             SDTCisPtrTy<0>]>;
420b57cec5SDimitry Andricdef SDT_ZAdjDynAlloc        : SDTypeProfile<1, 0, [SDTCisVT<0, i64>]>;
435ffd83dbSDimitry Andricdef SDT_ZProbedAlloca       : SDTypeProfile<1, 2,
445ffd83dbSDimitry Andric                                            [SDTCisSameAs<0, 1>,
455ffd83dbSDimitry Andric                                             SDTCisSameAs<0, 2>,
465ffd83dbSDimitry Andric                                             SDTCisPtrTy<0>]>;
470b57cec5SDimitry Andricdef SDT_ZGR128Binary        : SDTypeProfile<1, 2,
480b57cec5SDimitry Andric                                            [SDTCisVT<0, untyped>,
490b57cec5SDimitry Andric                                             SDTCisInt<1>,
500b57cec5SDimitry Andric                                             SDTCisInt<2>]>;
510b57cec5SDimitry Andricdef SDT_ZBinaryWithFlags    : SDTypeProfile<2, 2,
520b57cec5SDimitry Andric                                            [SDTCisInt<0>,
530b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
540b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
550b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>]>;
560b57cec5SDimitry Andricdef SDT_ZBinaryWithCarry    : SDTypeProfile<2, 3,
570b57cec5SDimitry Andric                                            [SDTCisInt<0>,
580b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
590b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
600b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>,
610b57cec5SDimitry Andric                                             SDTCisVT<1, i32>]>;
625f757f3fSDimitry Andricdef SDT_ZBinaryConv         : SDTypeProfile<1, 2,
635f757f3fSDimitry Andric                                            [SDTCisInt<0>,
645f757f3fSDimitry Andric                                             SDTCisInt<1>,
655f757f3fSDimitry Andric                                             SDTCisSameAs<1, 2>]>;
665f757f3fSDimitry Andricdef SDT_ZTernary            : SDTypeProfile<1, 3,
675f757f3fSDimitry Andric                                            [SDTCisInt<0>,
685f757f3fSDimitry Andric                                             SDTCisSameAs<0, 1>,
695f757f3fSDimitry Andric                                             SDTCisSameAs<0, 2>,
705f757f3fSDimitry Andric                                             SDTCisSameAs<0, 3>]>;
710b57cec5SDimitry Andricdef SDT_ZAtomicLoadBinaryW  : SDTypeProfile<1, 5,
720b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
730b57cec5SDimitry Andric                                             SDTCisPtrTy<1>,
740b57cec5SDimitry Andric                                             SDTCisVT<2, i32>,
750b57cec5SDimitry Andric                                             SDTCisVT<3, i32>,
760b57cec5SDimitry Andric                                             SDTCisVT<4, i32>,
770b57cec5SDimitry Andric                                             SDTCisVT<5, i32>]>;
780b57cec5SDimitry Andricdef SDT_ZAtomicCmpSwapW     : SDTypeProfile<2, 6,
790b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
800b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
810b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
820b57cec5SDimitry Andric                                             SDTCisVT<3, i32>,
830b57cec5SDimitry Andric                                             SDTCisVT<4, i32>,
840b57cec5SDimitry Andric                                             SDTCisVT<5, i32>,
850b57cec5SDimitry Andric                                             SDTCisVT<6, i32>,
860b57cec5SDimitry Andric                                             SDTCisVT<7, i32>]>;
870b57cec5SDimitry Andricdef SDT_ZAtomicCmpSwap      : SDTypeProfile<2, 3,
880b57cec5SDimitry Andric                                            [SDTCisInt<0>,
890b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
900b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
910b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>,
920b57cec5SDimitry Andric                                             SDTCisSameAs<0, 4>]>;
930b57cec5SDimitry Andricdef SDT_ZAtomicLoad128      : SDTypeProfile<1, 1,
940b57cec5SDimitry Andric                                            [SDTCisVT<0, untyped>,
950b57cec5SDimitry Andric                                             SDTCisPtrTy<1>]>;
960b57cec5SDimitry Andricdef SDT_ZAtomicStore128     : SDTypeProfile<0, 2,
970b57cec5SDimitry Andric                                            [SDTCisVT<0, untyped>,
980b57cec5SDimitry Andric                                             SDTCisPtrTy<1>]>;
990b57cec5SDimitry Andricdef SDT_ZAtomicCmpSwap128   : SDTypeProfile<2, 3,
1000b57cec5SDimitry Andric                                            [SDTCisVT<0, untyped>,
1010b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1020b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
1030b57cec5SDimitry Andric                                             SDTCisVT<3, untyped>,
1040b57cec5SDimitry Andric                                             SDTCisVT<4, untyped>]>;
1050b57cec5SDimitry Andricdef SDT_ZMemMemLength       : SDTypeProfile<0, 3,
1060b57cec5SDimitry Andric                                            [SDTCisPtrTy<0>,
1070b57cec5SDimitry Andric                                             SDTCisPtrTy<1>,
1080b57cec5SDimitry Andric                                             SDTCisVT<2, i64>]>;
1090b57cec5SDimitry Andricdef SDT_ZMemMemLengthCC     : SDTypeProfile<1, 3,
1100b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
1110b57cec5SDimitry Andric                                             SDTCisPtrTy<1>,
1120b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
1130b57cec5SDimitry Andric                                             SDTCisVT<3, i64>]>;
1140eae32dcSDimitry Andricdef SDT_ZMemsetMVC          : SDTypeProfile<0, 3,
1150eae32dcSDimitry Andric                                            [SDTCisPtrTy<0>,
1160eae32dcSDimitry Andric                                             SDTCisVT<1, i64>,
1170eae32dcSDimitry Andric                                             SDTCisVT<2, i32>]>;
1180b57cec5SDimitry Andricdef SDT_ZString             : SDTypeProfile<1, 3,
1190b57cec5SDimitry Andric                                            [SDTCisPtrTy<0>,
1200b57cec5SDimitry Andric                                             SDTCisPtrTy<1>,
1210b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
1220b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
1230b57cec5SDimitry Andricdef SDT_ZStringCC           : SDTypeProfile<2, 3,
1240b57cec5SDimitry Andric                                            [SDTCisPtrTy<0>,
1250b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1260b57cec5SDimitry Andric                                             SDTCisPtrTy<2>,
1270b57cec5SDimitry Andric                                             SDTCisPtrTy<3>,
1280b57cec5SDimitry Andric                                             SDTCisVT<4, i32>]>;
1290b57cec5SDimitry Andricdef SDT_ZIPM                : SDTypeProfile<1, 1,
1300b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
1310b57cec5SDimitry Andric                                             SDTCisVT<1, i32>]>;
1320b57cec5SDimitry Andricdef SDT_ZPrefetch           : SDTypeProfile<0, 2,
1330b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
1340b57cec5SDimitry Andric                                             SDTCisPtrTy<1>]>;
135*0fca6ea1SDimitry Andricdef SDT_ZStoreInherent      : SDTypeProfile<0, 1,
136*0fca6ea1SDimitry Andric                                            [SDTCisPtrTy<0>]>;
1370b57cec5SDimitry Andricdef SDT_ZTBegin             : SDTypeProfile<1, 2,
1380b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
1390b57cec5SDimitry Andric                                             SDTCisPtrTy<1>,
1400b57cec5SDimitry Andric                                             SDTCisVT<2, i32>]>;
14106c3fb27SDimitry Andricdef SDT_ZADAENTRY           : SDTypeProfile<1, 3,
14206c3fb27SDimitry Andric                                            [SDTCisPtrTy<0>,
14306c3fb27SDimitry Andric                                             SDTCisPtrTy<1>,
14406c3fb27SDimitry Andric                                             SDTCisPtrTy<2>,
14506c3fb27SDimitry Andric                                             SDTCisVT<3, i64>]>;
1460b57cec5SDimitry Andricdef SDT_ZTEnd               : SDTypeProfile<1, 0,
1470b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>]>;
1480b57cec5SDimitry Andricdef SDT_ZInsertVectorElt    : SDTypeProfile<1, 3,
1490b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1500b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
1510b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
1520b57cec5SDimitry Andricdef SDT_ZExtractVectorElt   : SDTypeProfile<1, 2,
1530b57cec5SDimitry Andric                                            [SDTCisVec<1>,
1540b57cec5SDimitry Andric                                             SDTCisVT<2, i32>]>;
1550b57cec5SDimitry Andricdef SDT_ZReplicate          : SDTypeProfile<1, 1,
1560b57cec5SDimitry Andric                                            [SDTCisVec<0>]>;
1570b57cec5SDimitry Andricdef SDT_ZVecUnaryConv       : SDTypeProfile<1, 1,
1580b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1590b57cec5SDimitry Andric                                             SDTCisVec<1>]>;
1600b57cec5SDimitry Andricdef SDT_ZVecUnary           : SDTypeProfile<1, 1,
1610b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1620b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>]>;
1630b57cec5SDimitry Andricdef SDT_ZVecUnaryCC         : SDTypeProfile<2, 1,
1640b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1650b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1660b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>]>;
1670b57cec5SDimitry Andricdef SDT_ZVecBinary          : SDTypeProfile<1, 2,
1680b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1690b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
1700b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>]>;
1710b57cec5SDimitry Andricdef SDT_ZVecBinaryCC        : SDTypeProfile<2, 2,
1720b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1730b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1740b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
1750b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>]>;
1760b57cec5SDimitry Andricdef SDT_ZVecBinaryInt       : SDTypeProfile<1, 2,
1770b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1780b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
1790b57cec5SDimitry Andric                                             SDTCisVT<2, i32>]>;
1800b57cec5SDimitry Andricdef SDT_ZVecBinaryConv      : SDTypeProfile<1, 2,
1810b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1820b57cec5SDimitry Andric                                             SDTCisVec<1>,
1830b57cec5SDimitry Andric                                             SDTCisSameAs<1, 2>]>;
1840b57cec5SDimitry Andricdef SDT_ZVecBinaryConvCC    : SDTypeProfile<2, 2,
1850b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1860b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1870b57cec5SDimitry Andric                                             SDTCisVec<2>,
1880b57cec5SDimitry Andric                                             SDTCisSameAs<2, 3>]>;
1890b57cec5SDimitry Andricdef SDT_ZVecBinaryConvIntCC : SDTypeProfile<2, 2,
1900b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1910b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1920b57cec5SDimitry Andric                                             SDTCisVec<2>,
1930b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
1940b57cec5SDimitry Andricdef SDT_ZRotateMask         : SDTypeProfile<1, 2,
1950b57cec5SDimitry Andric                                            [SDTCisVec<0>,
1960b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
1970b57cec5SDimitry Andric                                             SDTCisVT<2, i32>]>;
1980b57cec5SDimitry Andricdef SDT_ZJoinDwords         : SDTypeProfile<1, 2,
1990b57cec5SDimitry Andric                                            [SDTCisVT<0, v2i64>,
2000b57cec5SDimitry Andric                                             SDTCisVT<1, i64>,
2010b57cec5SDimitry Andric                                             SDTCisVT<2, i64>]>;
2020b57cec5SDimitry Andricdef SDT_ZVecTernary         : SDTypeProfile<1, 3,
2030b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2040b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
2050b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
2060b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>]>;
2070b57cec5SDimitry Andricdef SDT_ZVecTernaryConvCC   : SDTypeProfile<2, 3,
2080b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2090b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
2100b57cec5SDimitry Andric                                             SDTCisVec<2>,
2110b57cec5SDimitry Andric                                             SDTCisSameAs<2, 3>,
2120b57cec5SDimitry Andric                                             SDTCisSameAs<0, 4>]>;
2130b57cec5SDimitry Andricdef SDT_ZVecTernaryInt      : SDTypeProfile<1, 3,
2140b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2150b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
2160b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
2170b57cec5SDimitry Andric                                             SDTCisVT<3, i32>]>;
2180b57cec5SDimitry Andricdef SDT_ZVecTernaryIntCC    : SDTypeProfile<2, 3,
2190b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2200b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
2210b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
2220b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>,
2230b57cec5SDimitry Andric                                             SDTCisVT<4, i32>]>;
2240b57cec5SDimitry Andricdef SDT_ZVecQuaternaryInt   : SDTypeProfile<1, 4,
2250b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2260b57cec5SDimitry Andric                                             SDTCisSameAs<0, 1>,
2270b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
2280b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>,
2290b57cec5SDimitry Andric                                             SDTCisVT<4, i32>]>;
2300b57cec5SDimitry Andricdef SDT_ZVecQuaternaryIntCC : SDTypeProfile<2, 4,
2310b57cec5SDimitry Andric                                            [SDTCisVec<0>,
2320b57cec5SDimitry Andric                                             SDTCisVT<1, i32>,
2330b57cec5SDimitry Andric                                             SDTCisSameAs<0, 2>,
2340b57cec5SDimitry Andric                                             SDTCisSameAs<0, 3>,
2350b57cec5SDimitry Andric                                             SDTCisSameAs<0, 4>,
2360b57cec5SDimitry Andric                                             SDTCisVT<5, i32>]>;
2370b57cec5SDimitry Andricdef SDT_ZTest               : SDTypeProfile<1, 2,
2380b57cec5SDimitry Andric                                            [SDTCisVT<0, i32>,
2390b57cec5SDimitry Andric                                             SDTCisVT<2, i64>]>;
2400b57cec5SDimitry Andric
2410b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2420b57cec5SDimitry Andric// Node definitions
2430b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric// These are target-independent nodes, but have target-specific formats.
2460b57cec5SDimitry Andricdef callseq_start       : SDNode<"ISD::CALLSEQ_START", SDT_CallSeqStart,
2470b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>;
2480b57cec5SDimitry Andricdef callseq_end         : SDNode<"ISD::CALLSEQ_END",   SDT_CallSeqEnd,
2490b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPSideEffect, SDNPOptInGlue,
2500b57cec5SDimitry Andric                                  SDNPOutGlue]>;
2510b57cec5SDimitry Andricdef global_offset_table : SDNode<"ISD::GLOBAL_OFFSET_TABLE", SDTPtrLeaf>;
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andric// Nodes for SystemZISD::*.  See SystemZISelLowering.h for more details.
25406c3fb27SDimitry Andricdef z_retglue           : SDNode<"SystemZISD::RET_GLUE", SDTNone,
2550b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
2560b57cec5SDimitry Andricdef z_call              : SDNode<"SystemZISD::CALL", SDT_ZCall,
2570b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue,
2580b57cec5SDimitry Andric                                  SDNPVariadic]>;
2590b57cec5SDimitry Andricdef z_sibcall           : SDNode<"SystemZISD::SIBCALL", SDT_ZCall,
2600b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue,
2610b57cec5SDimitry Andric                                  SDNPVariadic]>;
2620b57cec5SDimitry Andricdef z_tls_gdcall        : SDNode<"SystemZISD::TLS_GDCALL", SDT_ZCall,
2630b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPInGlue, SDNPOutGlue,
2640b57cec5SDimitry Andric                                  SDNPVariadic]>;
2650b57cec5SDimitry Andricdef z_tls_ldcall        : SDNode<"SystemZISD::TLS_LDCALL", SDT_ZCall,
2660b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPInGlue, SDNPOutGlue,
2670b57cec5SDimitry Andric                                  SDNPVariadic]>;
2680b57cec5SDimitry Andricdef z_pcrel_wrapper     : SDNode<"SystemZISD::PCREL_WRAPPER", SDT_ZWrapPtr, []>;
2690b57cec5SDimitry Andricdef z_pcrel_offset      : SDNode<"SystemZISD::PCREL_OFFSET",
2700b57cec5SDimitry Andric                                 SDT_ZWrapOffset, []>;
2710b57cec5SDimitry Andricdef z_icmp              : SDNode<"SystemZISD::ICMP", SDT_ZICmp>;
2720b57cec5SDimitry Andricdef z_fcmp              : SDNode<"SystemZISD::FCMP", SDT_ZCmp>;
273480093f4SDimitry Andricdef z_strict_fcmp       : SDNode<"SystemZISD::STRICT_FCMP", SDT_ZCmp,
274480093f4SDimitry Andric                                 [SDNPHasChain]>;
275480093f4SDimitry Andricdef z_strict_fcmps      : SDNode<"SystemZISD::STRICT_FCMPS", SDT_ZCmp,
276480093f4SDimitry Andric                                 [SDNPHasChain]>;
2770b57cec5SDimitry Andricdef z_tm                : SDNode<"SystemZISD::TM", SDT_ZICmp>;
2780b57cec5SDimitry Andricdef z_br_ccmask_1       : SDNode<"SystemZISD::BR_CCMASK", SDT_ZBRCCMask,
2790b57cec5SDimitry Andric                                 [SDNPHasChain]>;
2800b57cec5SDimitry Andricdef z_select_ccmask_1   : SDNode<"SystemZISD::SELECT_CCMASK",
2810b57cec5SDimitry Andric                                 SDT_ZSelectCCMask>;
2820b57cec5SDimitry Andricdef z_ipm_1             : SDNode<"SystemZISD::IPM", SDT_ZIPM>;
2830b57cec5SDimitry Andricdef z_adjdynalloc       : SDNode<"SystemZISD::ADJDYNALLOC", SDT_ZAdjDynAlloc>;
2845ffd83dbSDimitry Andricdef z_probed_alloca     : SDNode<"SystemZISD::PROBED_ALLOCA", SDT_ZProbedAlloca,
2855ffd83dbSDimitry Andric                                 [SDNPHasChain]>;
2860b57cec5SDimitry Andricdef z_popcnt            : SDNode<"SystemZISD::POPCNT", SDTIntUnaryOp>;
2870b57cec5SDimitry Andricdef z_smul_lohi         : SDNode<"SystemZISD::SMUL_LOHI", SDT_ZGR128Binary>;
2880b57cec5SDimitry Andricdef z_umul_lohi         : SDNode<"SystemZISD::UMUL_LOHI", SDT_ZGR128Binary>;
2890b57cec5SDimitry Andricdef z_sdivrem           : SDNode<"SystemZISD::SDIVREM", SDT_ZGR128Binary>;
2900b57cec5SDimitry Andricdef z_udivrem           : SDNode<"SystemZISD::UDIVREM", SDT_ZGR128Binary>;
2910b57cec5SDimitry Andricdef z_saddo             : SDNode<"SystemZISD::SADDO", SDT_ZBinaryWithFlags>;
2920b57cec5SDimitry Andricdef z_ssubo             : SDNode<"SystemZISD::SSUBO", SDT_ZBinaryWithFlags>;
2930b57cec5SDimitry Andricdef z_uaddo             : SDNode<"SystemZISD::UADDO", SDT_ZBinaryWithFlags>;
2940b57cec5SDimitry Andricdef z_usubo             : SDNode<"SystemZISD::USUBO", SDT_ZBinaryWithFlags>;
2950b57cec5SDimitry Andricdef z_addcarry_1        : SDNode<"SystemZISD::ADDCARRY", SDT_ZBinaryWithCarry>;
2960b57cec5SDimitry Andricdef z_subcarry_1        : SDNode<"SystemZISD::SUBCARRY", SDT_ZBinaryWithCarry>;
2975f757f3fSDimitry Andricdef z_vacc              : SDNode<"SystemZISD::VACC", SDTIntBinOp>;
2985f757f3fSDimitry Andricdef z_vac               : SDNode<"SystemZISD::VAC", SDT_ZTernary>;
2995f757f3fSDimitry Andricdef z_vaccc             : SDNode<"SystemZISD::VACCC", SDT_ZTernary>;
3005f757f3fSDimitry Andricdef z_vscbi             : SDNode<"SystemZISD::VSCBI", SDTIntBinOp>;
3015f757f3fSDimitry Andricdef z_vsbi              : SDNode<"SystemZISD::VSBI", SDT_ZTernary>;
3025f757f3fSDimitry Andricdef z_vsbcbi            : SDNode<"SystemZISD::VSBCBI", SDT_ZTernary>;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andricdef z_loadbswap        : SDNode<"SystemZISD::LRV", SDTLoad,
3050b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
3060b57cec5SDimitry Andricdef z_storebswap       : SDNode<"SystemZISD::STRV", SDTStore,
3070b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
3080b57cec5SDimitry Andricdef z_loadeswap        : SDNode<"SystemZISD::VLER", SDTLoad,
3090b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
3100b57cec5SDimitry Andricdef z_storeeswap       : SDNode<"SystemZISD::VSTER", SDTStore,
3110b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
312*0fca6ea1SDimitry Andricdef z_stckf            : SDNode<"SystemZISD::STCKF", SDT_ZStoreInherent,
313*0fca6ea1SDimitry Andric                                [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
3140b57cec5SDimitry Andric
3150b57cec5SDimitry Andricdef z_tdc               : SDNode<"SystemZISD::TDC", SDT_ZTest>;
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andric// Defined because the index is an i32 rather than a pointer.
3180b57cec5SDimitry Andricdef z_vector_insert     : SDNode<"ISD::INSERT_VECTOR_ELT",
3190b57cec5SDimitry Andric                                 SDT_ZInsertVectorElt>;
3200b57cec5SDimitry Andricdef z_vector_extract    : SDNode<"ISD::EXTRACT_VECTOR_ELT",
3210b57cec5SDimitry Andric                                 SDT_ZExtractVectorElt>;
3220b57cec5SDimitry Andricdef z_byte_mask         : SDNode<"SystemZISD::BYTE_MASK", SDT_ZReplicate>;
3230b57cec5SDimitry Andricdef z_rotate_mask       : SDNode<"SystemZISD::ROTATE_MASK", SDT_ZRotateMask>;
3240b57cec5SDimitry Andricdef z_replicate         : SDNode<"SystemZISD::REPLICATE", SDT_ZReplicate>;
3250b57cec5SDimitry Andricdef z_join_dwords       : SDNode<"SystemZISD::JOIN_DWORDS", SDT_ZJoinDwords>;
3260b57cec5SDimitry Andricdef z_splat             : SDNode<"SystemZISD::SPLAT", SDT_ZVecBinaryInt>;
3270b57cec5SDimitry Andricdef z_merge_high        : SDNode<"SystemZISD::MERGE_HIGH", SDT_ZVecBinary>;
3280b57cec5SDimitry Andricdef z_merge_low         : SDNode<"SystemZISD::MERGE_LOW", SDT_ZVecBinary>;
3290b57cec5SDimitry Andricdef z_shl_double        : SDNode<"SystemZISD::SHL_DOUBLE", SDT_ZVecTernaryInt>;
3300b57cec5SDimitry Andricdef z_permute_dwords    : SDNode<"SystemZISD::PERMUTE_DWORDS",
3310b57cec5SDimitry Andric                                 SDT_ZVecTernaryInt>;
3320b57cec5SDimitry Andricdef z_permute           : SDNode<"SystemZISD::PERMUTE", SDT_ZVecTernary>;
3330b57cec5SDimitry Andricdef z_pack              : SDNode<"SystemZISD::PACK", SDT_ZVecBinaryConv>;
3340b57cec5SDimitry Andricdef z_packs_cc          : SDNode<"SystemZISD::PACKS_CC", SDT_ZVecBinaryConvCC>;
3350b57cec5SDimitry Andricdef z_packls_cc         : SDNode<"SystemZISD::PACKLS_CC", SDT_ZVecBinaryConvCC>;
3360b57cec5SDimitry Andricdef z_unpack_high       : SDNode<"SystemZISD::UNPACK_HIGH", SDT_ZVecUnaryConv>;
3370b57cec5SDimitry Andricdef z_unpackl_high      : SDNode<"SystemZISD::UNPACKL_HIGH", SDT_ZVecUnaryConv>;
3380b57cec5SDimitry Andricdef z_unpack_low        : SDNode<"SystemZISD::UNPACK_LOW", SDT_ZVecUnaryConv>;
3390b57cec5SDimitry Andricdef z_unpackl_low       : SDNode<"SystemZISD::UNPACKL_LOW", SDT_ZVecUnaryConv>;
3400b57cec5SDimitry Andricdef z_vshl_by_scalar    : SDNode<"SystemZISD::VSHL_BY_SCALAR",
3410b57cec5SDimitry Andric                                 SDT_ZVecBinaryInt>;
3420b57cec5SDimitry Andricdef z_vsrl_by_scalar    : SDNode<"SystemZISD::VSRL_BY_SCALAR",
3430b57cec5SDimitry Andric                                 SDT_ZVecBinaryInt>;
3440b57cec5SDimitry Andricdef z_vsra_by_scalar    : SDNode<"SystemZISD::VSRA_BY_SCALAR",
3450b57cec5SDimitry Andric                                 SDT_ZVecBinaryInt>;
3465f757f3fSDimitry Andricdef z_vrotl_by_scalar   : SDNode<"SystemZISD::VROTL_BY_SCALAR",
3475f757f3fSDimitry Andric                                 SDT_ZVecBinaryInt>;
3485f757f3fSDimitry Andricdef z_vsum              : SDNode<"SystemZISD::VSUM", SDT_ZBinaryConv>;
3490b57cec5SDimitry Andricdef z_vicmpe            : SDNode<"SystemZISD::VICMPE", SDT_ZVecBinary>;
3500b57cec5SDimitry Andricdef z_vicmph            : SDNode<"SystemZISD::VICMPH", SDT_ZVecBinary>;
3510b57cec5SDimitry Andricdef z_vicmphl           : SDNode<"SystemZISD::VICMPHL", SDT_ZVecBinary>;
3520b57cec5SDimitry Andricdef z_vicmpes           : SDNode<"SystemZISD::VICMPES", SDT_ZVecBinaryCC>;
3530b57cec5SDimitry Andricdef z_vicmphs           : SDNode<"SystemZISD::VICMPHS", SDT_ZVecBinaryCC>;
3540b57cec5SDimitry Andricdef z_vicmphls          : SDNode<"SystemZISD::VICMPHLS", SDT_ZVecBinaryCC>;
3550b57cec5SDimitry Andricdef z_vfcmpe            : SDNode<"SystemZISD::VFCMPE", SDT_ZVecBinaryConv>;
356480093f4SDimitry Andricdef z_strict_vfcmpe     : SDNode<"SystemZISD::STRICT_VFCMPE",
357480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
358480093f4SDimitry Andricdef z_strict_vfcmpes    : SDNode<"SystemZISD::STRICT_VFCMPES",
359480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
3600b57cec5SDimitry Andricdef z_vfcmph            : SDNode<"SystemZISD::VFCMPH", SDT_ZVecBinaryConv>;
361480093f4SDimitry Andricdef z_strict_vfcmph     : SDNode<"SystemZISD::STRICT_VFCMPH",
362480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
363480093f4SDimitry Andricdef z_strict_vfcmphs    : SDNode<"SystemZISD::STRICT_VFCMPHS",
364480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
3650b57cec5SDimitry Andricdef z_vfcmphe           : SDNode<"SystemZISD::VFCMPHE", SDT_ZVecBinaryConv>;
366480093f4SDimitry Andricdef z_strict_vfcmphe    : SDNode<"SystemZISD::STRICT_VFCMPHE",
367480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
368480093f4SDimitry Andricdef z_strict_vfcmphes   : SDNode<"SystemZISD::STRICT_VFCMPHES",
369480093f4SDimitry Andric                                 SDT_ZVecBinaryConv, [SDNPHasChain]>;
3700b57cec5SDimitry Andricdef z_vfcmpes           : SDNode<"SystemZISD::VFCMPES", SDT_ZVecBinaryConvCC>;
3710b57cec5SDimitry Andricdef z_vfcmphs           : SDNode<"SystemZISD::VFCMPHS", SDT_ZVecBinaryConvCC>;
3720b57cec5SDimitry Andricdef z_vfcmphes          : SDNode<"SystemZISD::VFCMPHES", SDT_ZVecBinaryConvCC>;
3730b57cec5SDimitry Andricdef z_vextend           : SDNode<"SystemZISD::VEXTEND", SDT_ZVecUnaryConv>;
374480093f4SDimitry Andricdef z_strict_vextend    : SDNode<"SystemZISD::STRICT_VEXTEND",
375480093f4SDimitry Andric                                 SDT_ZVecUnaryConv, [SDNPHasChain]>;
3760b57cec5SDimitry Andricdef z_vround            : SDNode<"SystemZISD::VROUND", SDT_ZVecUnaryConv>;
377480093f4SDimitry Andricdef z_strict_vround     : SDNode<"SystemZISD::STRICT_VROUND",
378480093f4SDimitry Andric                                 SDT_ZVecUnaryConv, [SDNPHasChain]>;
3790b57cec5SDimitry Andricdef z_vtm               : SDNode<"SystemZISD::VTM", SDT_ZCmp>;
3805f757f3fSDimitry Andricdef z_scmp128hi         : SDNode<"SystemZISD::SCMP128HI", SDT_ZCmp>;
3815f757f3fSDimitry Andricdef z_ucmp128hi         : SDNode<"SystemZISD::UCMP128HI", SDT_ZCmp>;
3820b57cec5SDimitry Andricdef z_vfae_cc           : SDNode<"SystemZISD::VFAE_CC", SDT_ZVecTernaryIntCC>;
3830b57cec5SDimitry Andricdef z_vfaez_cc          : SDNode<"SystemZISD::VFAEZ_CC", SDT_ZVecTernaryIntCC>;
3840b57cec5SDimitry Andricdef z_vfee_cc           : SDNode<"SystemZISD::VFEE_CC", SDT_ZVecBinaryCC>;
3850b57cec5SDimitry Andricdef z_vfeez_cc          : SDNode<"SystemZISD::VFEEZ_CC", SDT_ZVecBinaryCC>;
3860b57cec5SDimitry Andricdef z_vfene_cc          : SDNode<"SystemZISD::VFENE_CC", SDT_ZVecBinaryCC>;
3870b57cec5SDimitry Andricdef z_vfenez_cc         : SDNode<"SystemZISD::VFENEZ_CC", SDT_ZVecBinaryCC>;
3880b57cec5SDimitry Andricdef z_vistr_cc          : SDNode<"SystemZISD::VISTR_CC", SDT_ZVecUnaryCC>;
3890b57cec5SDimitry Andricdef z_vstrc_cc          : SDNode<"SystemZISD::VSTRC_CC",
3900b57cec5SDimitry Andric                                 SDT_ZVecQuaternaryIntCC>;
3910b57cec5SDimitry Andricdef z_vstrcz_cc         : SDNode<"SystemZISD::VSTRCZ_CC",
3920b57cec5SDimitry Andric                                 SDT_ZVecQuaternaryIntCC>;
3930b57cec5SDimitry Andricdef z_vstrs_cc          : SDNode<"SystemZISD::VSTRS_CC",
3940b57cec5SDimitry Andric                                 SDT_ZVecTernaryConvCC>;
3950b57cec5SDimitry Andricdef z_vstrsz_cc         : SDNode<"SystemZISD::VSTRSZ_CC",
3960b57cec5SDimitry Andric                                 SDT_ZVecTernaryConvCC>;
3970b57cec5SDimitry Andricdef z_vftci             : SDNode<"SystemZISD::VFTCI", SDT_ZVecBinaryConvIntCC>;
3980b57cec5SDimitry Andric
3990b57cec5SDimitry Andricclass AtomicWOp<string name, SDTypeProfile profile = SDT_ZAtomicLoadBinaryW>
4005ffd83dbSDimitry Andric  : SDNode<"SystemZISD::"#name, profile,
4010b57cec5SDimitry Andric           [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>;
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andricdef z_atomic_swapw      : AtomicWOp<"ATOMIC_SWAPW">;
4040b57cec5SDimitry Andricdef z_atomic_loadw_add  : AtomicWOp<"ATOMIC_LOADW_ADD">;
4050b57cec5SDimitry Andricdef z_atomic_loadw_sub  : AtomicWOp<"ATOMIC_LOADW_SUB">;
4060b57cec5SDimitry Andricdef z_atomic_loadw_and  : AtomicWOp<"ATOMIC_LOADW_AND">;
4070b57cec5SDimitry Andricdef z_atomic_loadw_or   : AtomicWOp<"ATOMIC_LOADW_OR">;
4080b57cec5SDimitry Andricdef z_atomic_loadw_xor  : AtomicWOp<"ATOMIC_LOADW_XOR">;
4090b57cec5SDimitry Andricdef z_atomic_loadw_nand : AtomicWOp<"ATOMIC_LOADW_NAND">;
4100b57cec5SDimitry Andricdef z_atomic_loadw_min  : AtomicWOp<"ATOMIC_LOADW_MIN">;
4110b57cec5SDimitry Andricdef z_atomic_loadw_max  : AtomicWOp<"ATOMIC_LOADW_MAX">;
4120b57cec5SDimitry Andricdef z_atomic_loadw_umin : AtomicWOp<"ATOMIC_LOADW_UMIN">;
4130b57cec5SDimitry Andricdef z_atomic_loadw_umax : AtomicWOp<"ATOMIC_LOADW_UMAX">;
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andricdef z_atomic_cmp_swap   : SDNode<"SystemZISD::ATOMIC_CMP_SWAP",
4160b57cec5SDimitry Andric                                 SDT_ZAtomicCmpSwap,
4170b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMayLoad,
4180b57cec5SDimitry Andric                                  SDNPMemOperand]>;
4190b57cec5SDimitry Andricdef z_atomic_cmp_swapw  : SDNode<"SystemZISD::ATOMIC_CMP_SWAPW",
4200b57cec5SDimitry Andric                                 SDT_ZAtomicCmpSwapW,
4210b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMayLoad,
4220b57cec5SDimitry Andric                                  SDNPMemOperand]>;
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andricdef z_atomic_load_128   : SDNode<"SystemZISD::ATOMIC_LOAD_128",
4250b57cec5SDimitry Andric                                 SDT_ZAtomicLoad128,
4260b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
4270b57cec5SDimitry Andricdef z_atomic_store_128  : SDNode<"SystemZISD::ATOMIC_STORE_128",
4280b57cec5SDimitry Andric                                 SDT_ZAtomicStore128,
4290b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
4300b57cec5SDimitry Andricdef z_atomic_cmp_swap_128 : SDNode<"SystemZISD::ATOMIC_CMP_SWAP_128",
4310b57cec5SDimitry Andric                                   SDT_ZAtomicCmpSwap128,
4320b57cec5SDimitry Andric                                   [SDNPHasChain, SDNPMayStore, SDNPMayLoad,
4330b57cec5SDimitry Andric                                    SDNPMemOperand]>;
4340b57cec5SDimitry Andric
4350b57cec5SDimitry Andricdef z_mvc               : SDNode<"SystemZISD::MVC", SDT_ZMemMemLength,
4360b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4370b57cec5SDimitry Andricdef z_nc                : SDNode<"SystemZISD::NC", SDT_ZMemMemLength,
4380b57cec5SDimitry Andric                                  [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4390b57cec5SDimitry Andricdef z_oc                : SDNode<"SystemZISD::OC", SDT_ZMemMemLength,
4400b57cec5SDimitry Andric                                  [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4410b57cec5SDimitry Andricdef z_xc                : SDNode<"SystemZISD::XC", SDT_ZMemMemLength,
4420b57cec5SDimitry Andric                                  [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4430b57cec5SDimitry Andricdef z_clc               : SDNode<"SystemZISD::CLC", SDT_ZMemMemLengthCC,
4440b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad]>;
4450eae32dcSDimitry Andricdef z_memset_mvc        : SDNode<"SystemZISD::MEMSET_MVC", SDT_ZMemsetMVC,
4460eae32dcSDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4470b57cec5SDimitry Andricdef z_strcmp            : SDNode<"SystemZISD::STRCMP", SDT_ZStringCC,
4480b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad]>;
4490b57cec5SDimitry Andricdef z_stpcpy            : SDNode<"SystemZISD::STPCPY", SDT_ZString,
4500b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPMayLoad]>;
4510b57cec5SDimitry Andricdef z_search_string     : SDNode<"SystemZISD::SEARCH_STRING", SDT_ZStringCC,
4520b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad]>;
4530b57cec5SDimitry Andricdef z_prefetch          : SDNode<"SystemZISD::PREFETCH", SDT_ZPrefetch,
4540b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayLoad, SDNPMayStore,
4550b57cec5SDimitry Andric                                  SDNPMemOperand]>;
4560b57cec5SDimitry Andric
4570b57cec5SDimitry Andricdef z_tbegin            : SDNode<"SystemZISD::TBEGIN", SDT_ZTBegin,
4580b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPSideEffect]>;
4590b57cec5SDimitry Andricdef z_tbegin_nofloat    : SDNode<"SystemZISD::TBEGIN_NOFLOAT", SDT_ZTBegin,
4600b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPMayStore, SDNPSideEffect]>;
4610b57cec5SDimitry Andricdef z_tend              : SDNode<"SystemZISD::TEND", SDT_ZTEnd,
4620b57cec5SDimitry Andric                                 [SDNPHasChain, SDNPSideEffect]>;
4630b57cec5SDimitry Andric
46406c3fb27SDimitry Andricdef z_ada_entry         : SDNode<"SystemZISD::ADA_ENTRY",
46506c3fb27SDimitry Andric                                  SDT_ZADAENTRY>;
46606c3fb27SDimitry Andric
4670b57cec5SDimitry Andricdef z_vshl              : SDNode<"ISD::SHL", SDT_ZVecBinary>;
4680b57cec5SDimitry Andricdef z_vsra              : SDNode<"ISD::SRA", SDT_ZVecBinary>;
4690b57cec5SDimitry Andricdef z_vsrl              : SDNode<"ISD::SRL", SDT_ZVecBinary>;
4700b57cec5SDimitry Andric
4710b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4720b57cec5SDimitry Andric// Pattern fragments
4730b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andricdef z_loadbswap16 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{
4760b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
4770b57cec5SDimitry Andric}]>;
4780b57cec5SDimitry Andricdef z_loadbswap32 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{
4790b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
4800b57cec5SDimitry Andric}]>;
4810b57cec5SDimitry Andricdef z_loadbswap64 : PatFrag<(ops node:$addr), (z_loadbswap node:$addr), [{
4820b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
4830b57cec5SDimitry Andric}]>;
4840b57cec5SDimitry Andric
4850b57cec5SDimitry Andricdef z_storebswap16 : PatFrag<(ops node:$src, node:$addr),
4860b57cec5SDimitry Andric                             (z_storebswap node:$src, node:$addr), [{
4870b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
4880b57cec5SDimitry Andric}]>;
4890b57cec5SDimitry Andricdef z_storebswap32 : PatFrag<(ops node:$src, node:$addr),
4900b57cec5SDimitry Andric                             (z_storebswap node:$src, node:$addr), [{
4910b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
4920b57cec5SDimitry Andric}]>;
4930b57cec5SDimitry Andricdef z_storebswap64 : PatFrag<(ops node:$src, node:$addr),
4940b57cec5SDimitry Andric                             (z_storebswap node:$src, node:$addr), [{
4950b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
4960b57cec5SDimitry Andric}]>;
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andric// Fragments including CC as an implicit source.
4990b57cec5SDimitry Andricdef z_br_ccmask
5000b57cec5SDimitry Andric  : PatFrag<(ops node:$valid, node:$mask, node:$bb),
5010b57cec5SDimitry Andric            (z_br_ccmask_1 node:$valid, node:$mask, node:$bb, CC)>;
5020b57cec5SDimitry Andricdef z_select_ccmask
5030b57cec5SDimitry Andric  : PatFrag<(ops node:$true, node:$false, node:$valid, node:$mask),
5040b57cec5SDimitry Andric            (z_select_ccmask_1 node:$true, node:$false,
5050b57cec5SDimitry Andric                               node:$valid, node:$mask, CC)>;
5060b57cec5SDimitry Andricdef z_ipm : PatFrag<(ops), (z_ipm_1 CC)>;
5070b57cec5SDimitry Andricdef z_addcarry : PatFrag<(ops node:$lhs, node:$rhs),
5080b57cec5SDimitry Andric                              (z_addcarry_1 node:$lhs, node:$rhs, CC)>;
5090b57cec5SDimitry Andricdef z_subcarry : PatFrag<(ops node:$lhs, node:$rhs),
5100b57cec5SDimitry Andric                              (z_subcarry_1 node:$lhs, node:$rhs, CC)>;
5110b57cec5SDimitry Andric
5120b57cec5SDimitry Andric// Signed and unsigned comparisons.
5138bcb0991SDimitry Andricdef z_scmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, timm), [{
514647cbc5dSDimitry Andric  unsigned Type = N->getConstantOperandVal(2);
5150b57cec5SDimitry Andric  return Type != SystemZICMP::UnsignedOnly;
5160b57cec5SDimitry Andric}]>;
5178bcb0991SDimitry Andricdef z_ucmp : PatFrag<(ops node:$a, node:$b), (z_icmp node:$a, node:$b, timm), [{
518647cbc5dSDimitry Andric  unsigned Type = N->getConstantOperandVal(2);
5190b57cec5SDimitry Andric  return Type != SystemZICMP::SignedOnly;
5200b57cec5SDimitry Andric}]>;
5210b57cec5SDimitry Andric
5220b57cec5SDimitry Andric// Register- and memory-based TEST UNDER MASK.
5238bcb0991SDimitry Andricdef z_tm_reg : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, timm)>;
5240b57cec5SDimitry Andricdef z_tm_mem : PatFrag<(ops node:$a, node:$b), (z_tm node:$a, node:$b, 0)>;
5250b57cec5SDimitry Andric
5260b57cec5SDimitry Andric// Register sign-extend operations.  Sub-32-bit values are represented as i32s.
5270b57cec5SDimitry Andricdef sext8  : PatFrag<(ops node:$src), (sext_inreg node:$src, i8)>;
5280b57cec5SDimitry Andricdef sext16 : PatFrag<(ops node:$src), (sext_inreg node:$src, i16)>;
5290b57cec5SDimitry Andricdef sext32 : PatFrag<(ops node:$src), (sext (i32 node:$src))>;
5300b57cec5SDimitry Andric
5310b57cec5SDimitry Andric// Match extensions of an i32 to an i64, followed by an in-register sign
5320b57cec5SDimitry Andric// extension from a sub-i32 value.
5330b57cec5SDimitry Andricdef sext8dbl : PatFrag<(ops node:$src), (sext8 (anyext node:$src))>;
5340b57cec5SDimitry Andricdef sext16dbl : PatFrag<(ops node:$src), (sext16 (anyext node:$src))>;
5350b57cec5SDimitry Andric
5360b57cec5SDimitry Andric// Register zero-extend operations.  Sub-32-bit values are represented as i32s.
5370b57cec5SDimitry Andricdef zext8  : PatFrag<(ops node:$src), (and node:$src, 0xff)>;
5380b57cec5SDimitry Andricdef zext16 : PatFrag<(ops node:$src), (and node:$src, 0xffff)>;
5390b57cec5SDimitry Andricdef zext32 : PatFrag<(ops node:$src), (zext (i32 node:$src))>;
5400b57cec5SDimitry Andric
541*0fca6ea1SDimitry Andric// Match a load or a non-extending atomic load.
542*0fca6ea1SDimitry Andricdef z_load : PatFrags<(ops node:$ptr),
543*0fca6ea1SDimitry Andric                      [(load node:$ptr),
544*0fca6ea1SDimitry Andric                       (atomic_load node:$ptr)], [{
545*0fca6ea1SDimitry Andric  if (auto *AL = dyn_cast<AtomicSDNode>(N))
546*0fca6ea1SDimitry Andric    if (AL->getExtensionType() != ISD::NON_EXTLOAD)
547*0fca6ea1SDimitry Andric      return false;
548*0fca6ea1SDimitry Andric  return true;
5490b57cec5SDimitry Andric}]>;
5500b57cec5SDimitry Andric
551*0fca6ea1SDimitry Andric// Sign extending (atomic) loads.
552*0fca6ea1SDimitry Andricdef z_sextload : PatFrags<(ops node:$ptr),
553*0fca6ea1SDimitry Andric                          [(unindexedload node:$ptr),
554*0fca6ea1SDimitry Andric                           (atomic_load node:$ptr)], [{
555*0fca6ea1SDimitry Andric  return getLoadExtType(N) == ISD::SEXTLOAD;
5560b57cec5SDimitry Andric}]>;
557*0fca6ea1SDimitry Andricdef z_sextloadi8 : PatFrag<(ops node:$ptr), (z_sextload node:$ptr), [{
558*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
5590b57cec5SDimitry Andric}]>;
560*0fca6ea1SDimitry Andricdef z_sextloadi16 : PatFrag<(ops node:$ptr), (z_sextload node:$ptr), [{
561*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
5620b57cec5SDimitry Andric}]>;
563*0fca6ea1SDimitry Andricdef z_sextloadi32 : PatFrag<(ops node:$ptr), (z_sextload node:$ptr), [{
564*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
565*0fca6ea1SDimitry Andric}]>;
566*0fca6ea1SDimitry Andricdef z_sextloadi64 : PatFrag<(ops node:$ptr), (z_sextload node:$ptr), [{
567*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i64;
5680b57cec5SDimitry Andric}]>;
5690b57cec5SDimitry Andric
570*0fca6ea1SDimitry Andric// Zero extending (atomic) loads.
571*0fca6ea1SDimitry Andricdef z_zextload : PatFrags<(ops node:$ptr),
572*0fca6ea1SDimitry Andric                          [(unindexedload node:$ptr),
573*0fca6ea1SDimitry Andric                           (atomic_load node:$ptr)], [{
574*0fca6ea1SDimitry Andric  return getLoadExtType(N) == ISD::ZEXTLOAD;
575*0fca6ea1SDimitry Andric}]>;
576*0fca6ea1SDimitry Andricdef z_zextloadi8 : PatFrag<(ops node:$ptr), (z_zextload node:$ptr), [{
577*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
578*0fca6ea1SDimitry Andric}]>;
579*0fca6ea1SDimitry Andricdef z_zextloadi16 : PatFrag<(ops node:$ptr), (z_zextload node:$ptr), [{
580*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
581*0fca6ea1SDimitry Andric}]>;
582*0fca6ea1SDimitry Andricdef z_zextloadi32 : PatFrag<(ops node:$ptr), (z_zextload node:$ptr), [{
583*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
584*0fca6ea1SDimitry Andric}]>;
585*0fca6ea1SDimitry Andricdef z_zextloadi64 : PatFrag<(ops node:$ptr), (z_zextload node:$ptr), [{
586*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i64;
587*0fca6ea1SDimitry Andric}]>;
588*0fca6ea1SDimitry Andric
589*0fca6ea1SDimitry Andric// Extending (atomic) loads in which the extension type can be signed.
590*0fca6ea1SDimitry Andricdef z_asextload : PatFrags<(ops node:$ptr),
591*0fca6ea1SDimitry Andric                           [(unindexedload node:$ptr),
592*0fca6ea1SDimitry Andric                            (atomic_load node:$ptr)], [{
593*0fca6ea1SDimitry Andric  ISD::LoadExtType ETy = getLoadExtType(N);
594*0fca6ea1SDimitry Andric  return ETy == ISD::EXTLOAD || ETy == ISD::SEXTLOAD;
595*0fca6ea1SDimitry Andric}]>;
596*0fca6ea1SDimitry Andricdef z_asextloadi8 : PatFrag<(ops node:$ptr), (z_asextload node:$ptr), [{
597*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
598*0fca6ea1SDimitry Andric}]>;
599*0fca6ea1SDimitry Andricdef z_asextloadi16 : PatFrag<(ops node:$ptr), (z_asextload node:$ptr), [{
600*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
601*0fca6ea1SDimitry Andric}]>;
602*0fca6ea1SDimitry Andricdef z_asextloadi32 : PatFrag<(ops node:$ptr), (z_asextload node:$ptr), [{
603*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
604*0fca6ea1SDimitry Andric}]>;
605*0fca6ea1SDimitry Andric
606*0fca6ea1SDimitry Andric// Extending (atomic) loads in which the extension type can be unsigned.
607*0fca6ea1SDimitry Andricdef z_azextload : PatFrags<(ops node:$ptr),
608*0fca6ea1SDimitry Andric                           [(unindexedload node:$ptr),
609*0fca6ea1SDimitry Andric                           (atomic_load node:$ptr)], [{
610*0fca6ea1SDimitry Andric  ISD::LoadExtType ETy = getLoadExtType(N);
611*0fca6ea1SDimitry Andric  return ETy == ISD::EXTLOAD || ETy == ISD::ZEXTLOAD;
612*0fca6ea1SDimitry Andric}]>;
613*0fca6ea1SDimitry Andricdef z_azextloadi8 : PatFrag<(ops node:$ptr), (z_azextload node:$ptr), [{
614*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
615*0fca6ea1SDimitry Andric}]>;
616*0fca6ea1SDimitry Andricdef z_azextloadi16 : PatFrag<(ops node:$ptr), (z_azextload node:$ptr), [{
617*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
618*0fca6ea1SDimitry Andric}]>;
619*0fca6ea1SDimitry Andricdef z_azextloadi32 : PatFrag<(ops node:$ptr), (z_azextload node:$ptr), [{
620*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
621*0fca6ea1SDimitry Andric}]>;
622*0fca6ea1SDimitry Andric
623*0fca6ea1SDimitry Andric// Extending (atomic) loads in which the extension type doesn't matter.
624*0fca6ea1SDimitry Andricdef z_anyextload : PatFrags<(ops node:$ptr),
625*0fca6ea1SDimitry Andric                            [(unindexedload node:$ptr),
626*0fca6ea1SDimitry Andric                             (atomic_load node:$ptr)], [{
627*0fca6ea1SDimitry Andric  return getLoadExtType(N) != ISD::NON_EXTLOAD;
628*0fca6ea1SDimitry Andric}]>;
629*0fca6ea1SDimitry Andricdef z_anyextloadi8 : PatFrag<(ops node:$ptr), (z_anyextload node:$ptr), [{
630*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
631*0fca6ea1SDimitry Andric}]>;
632*0fca6ea1SDimitry Andricdef z_anyextloadi16 : PatFrag<(ops node:$ptr), (z_anyextload node:$ptr), [{
633*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
634*0fca6ea1SDimitry Andric}]>;
635*0fca6ea1SDimitry Andricdef z_anyextloadi32 : PatFrag<(ops node:$ptr), (z_anyextload node:$ptr), [{
636*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
637*0fca6ea1SDimitry Andric}]>;
638*0fca6ea1SDimitry Andricdef z_anyextloadi64 : PatFrag<(ops node:$ptr), (z_anyextload node:$ptr), [{
639*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i64;
640*0fca6ea1SDimitry Andric}]>;
641*0fca6ea1SDimitry Andric
642*0fca6ea1SDimitry Andric// Extending non-atomic loads in which the extension type doesn't matter.
6430b57cec5SDimitry Andricdef anyextload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{
6440b57cec5SDimitry Andric  return cast<LoadSDNode>(N)->getExtensionType() != ISD::NON_EXTLOAD;
6450b57cec5SDimitry Andric}]>;
6460b57cec5SDimitry Andricdef anyextloadi8 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{
6470b57cec5SDimitry Andric  return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
6480b57cec5SDimitry Andric}]>;
6490b57cec5SDimitry Andricdef anyextloadi16 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{
6500b57cec5SDimitry Andric  return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
6510b57cec5SDimitry Andric}]>;
6520b57cec5SDimitry Andricdef anyextloadi32 : PatFrag<(ops node:$ptr), (anyextload node:$ptr), [{
6530b57cec5SDimitry Andric  return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
6540b57cec5SDimitry Andric}]>;
6550b57cec5SDimitry Andric
656*0fca6ea1SDimitry Andric// Extending (atomic) loads that are not sign/zero extending.
657*0fca6ea1SDimitry Andricdef z_extload : PatFrags<(ops node:$ptr),
658*0fca6ea1SDimitry Andric                         [(extload node:$ptr),
659*0fca6ea1SDimitry Andric                          (atomic_load node:$ptr)], [{
660*0fca6ea1SDimitry Andric  return getLoadExtType(N) == ISD::EXTLOAD;
661*0fca6ea1SDimitry Andric}]>;
662*0fca6ea1SDimitry Andricdef z_extloadi8 : PatFrag<(ops node:$ptr), (z_extload node:$ptr), [{
663*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i8;
664*0fca6ea1SDimitry Andric}]>;
665*0fca6ea1SDimitry Andricdef z_extloadi16 : PatFrag<(ops node:$ptr), (z_extload node:$ptr), [{
666*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i16;
667*0fca6ea1SDimitry Andric}]>;
668*0fca6ea1SDimitry Andricdef z_extloadi32 : PatFrag<(ops node:$ptr), (z_extload node:$ptr), [{
669*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i32;
670*0fca6ea1SDimitry Andric}]>;
671*0fca6ea1SDimitry Andricdef z_extloadi64 : PatFrag<(ops node:$ptr), (z_extload node:$ptr), [{
672*0fca6ea1SDimitry Andric  return cast<MemSDNode>(N)->getMemoryVT() == MVT::i64;
673*0fca6ea1SDimitry Andric}]>;
674*0fca6ea1SDimitry Andric
675*0fca6ea1SDimitry Andric// Extending atomic FP loads.
676*0fca6ea1SDimitry Andricdef z_any_extloadf32 : PatFrags<(ops node:$ptr),
677*0fca6ea1SDimitry Andric                                [(any_extloadf32 node:$ptr),
678*0fca6ea1SDimitry Andric                                 (any_fpextend (f32 (atomic_load node:$ptr)))]>;
679*0fca6ea1SDimitry Andricdef z_any_extloadf64 : PatFrags<(ops node:$ptr),
680*0fca6ea1SDimitry Andric                                [(any_extloadf64 node:$ptr),
681*0fca6ea1SDimitry Andric                                 (any_fpextend (f64 (atomic_load node:$ptr)))]>;
682*0fca6ea1SDimitry Andric
6830b57cec5SDimitry Andric// Aligned loads.
6840b57cec5SDimitry Andricclass AlignedLoad<SDPatternOperator load>
685e8d8bef9SDimitry Andric  : PatFrag<(ops node:$addr), (load node:$addr),
686e8d8bef9SDimitry Andric  [{ return storeLoadIsAligned(N); }]>;
687*0fca6ea1SDimitry Andricdef aligned_z_load         : AlignedLoad<z_load>;
688*0fca6ea1SDimitry Andricdef aligned_z_asextloadi16 : AlignedLoad<z_asextloadi16>;
689*0fca6ea1SDimitry Andricdef aligned_z_asextloadi32 : AlignedLoad<z_asextloadi32>;
690*0fca6ea1SDimitry Andricdef aligned_z_azextloadi16 : AlignedLoad<z_azextloadi16>;
691*0fca6ea1SDimitry Andricdef aligned_z_azextloadi32 : AlignedLoad<z_azextloadi32>;
6920b57cec5SDimitry Andric
6930b57cec5SDimitry Andric// Aligned stores.
6940b57cec5SDimitry Andricclass AlignedStore<SDPatternOperator store>
695e8d8bef9SDimitry Andric  : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr),
696e8d8bef9SDimitry Andric  [{ return storeLoadIsAligned(N); }]>;
6970b57cec5SDimitry Andricdef aligned_store         : AlignedStore<store>;
6980b57cec5SDimitry Andricdef aligned_truncstorei16 : AlignedStore<truncstorei16>;
6990b57cec5SDimitry Andricdef aligned_truncstorei32 : AlignedStore<truncstorei32>;
7000b57cec5SDimitry Andric
7010b57cec5SDimitry Andric// Non-volatile loads.  Used for instructions that might access the storage
7020b57cec5SDimitry Andric// location multiple times.
7030b57cec5SDimitry Andricclass NonvolatileLoad<SDPatternOperator load>
7040b57cec5SDimitry Andric  : PatFrag<(ops node:$addr), (load node:$addr), [{
7050b57cec5SDimitry Andric  auto *Load = cast<LoadSDNode>(N);
7060b57cec5SDimitry Andric  return !Load->isVolatile();
7070b57cec5SDimitry Andric}]>;
7080b57cec5SDimitry Andricdef nonvolatile_anyextloadi8  : NonvolatileLoad<anyextloadi8>;
7090b57cec5SDimitry Andricdef nonvolatile_anyextloadi16 : NonvolatileLoad<anyextloadi16>;
7100b57cec5SDimitry Andricdef nonvolatile_anyextloadi32 : NonvolatileLoad<anyextloadi32>;
7110b57cec5SDimitry Andric
7120b57cec5SDimitry Andric// Non-volatile stores.
7130b57cec5SDimitry Andricclass NonvolatileStore<SDPatternOperator store>
7140b57cec5SDimitry Andric  : PatFrag<(ops node:$src, node:$addr), (store node:$src, node:$addr), [{
7150b57cec5SDimitry Andric  auto *Store = cast<StoreSDNode>(N);
7160b57cec5SDimitry Andric  return !Store->isVolatile();
7170b57cec5SDimitry Andric}]>;
7180b57cec5SDimitry Andricdef nonvolatile_truncstorei8  : NonvolatileStore<truncstorei8>;
7190b57cec5SDimitry Andricdef nonvolatile_truncstorei16 : NonvolatileStore<truncstorei16>;
7200b57cec5SDimitry Andricdef nonvolatile_truncstorei32 : NonvolatileStore<truncstorei32>;
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andric// A store of a load that can be implemented using MVC.
7230b57cec5SDimitry Andricdef mvc_store : PatFrag<(ops node:$value, node:$addr),
7240b57cec5SDimitry Andric                        (unindexedstore node:$value, node:$addr),
7250b57cec5SDimitry Andric                        [{ return storeLoadCanUseMVC(N); }]>;
7260b57cec5SDimitry Andric
7270b57cec5SDimitry Andric// Binary read-modify-write operations on memory in which the other
7280b57cec5SDimitry Andric// operand is also memory and for which block operations like NC can
7290b57cec5SDimitry Andric// be used.  There are two patterns for each operator, depending on
7300b57cec5SDimitry Andric// which operand contains the "other" load.
7310b57cec5SDimitry Andricmulticlass block_op<SDPatternOperator operator> {
7320b57cec5SDimitry Andric  def "1" : PatFrag<(ops node:$value, node:$addr),
7330b57cec5SDimitry Andric                    (unindexedstore (operator node:$value,
7340b57cec5SDimitry Andric                                              (unindexedload node:$addr)),
7350b57cec5SDimitry Andric                                    node:$addr),
7360b57cec5SDimitry Andric                    [{ return storeLoadCanUseBlockBinary(N, 0); }]>;
7370b57cec5SDimitry Andric  def "2" : PatFrag<(ops node:$value, node:$addr),
7380b57cec5SDimitry Andric                    (unindexedstore (operator (unindexedload node:$addr),
7390b57cec5SDimitry Andric                                              node:$value),
7400b57cec5SDimitry Andric                                    node:$addr),
7410b57cec5SDimitry Andric                    [{ return storeLoadCanUseBlockBinary(N, 1); }]>;
7420b57cec5SDimitry Andric}
7430b57cec5SDimitry Andricdefm block_and : block_op<and>;
7440b57cec5SDimitry Andricdefm block_or  : block_op<or>;
7450b57cec5SDimitry Andricdefm block_xor : block_op<xor>;
7460b57cec5SDimitry Andric
7470b57cec5SDimitry Andric// Insertions.
7480b57cec5SDimitry Andricdef inserti8 : PatFrag<(ops node:$src1, node:$src2),
7490b57cec5SDimitry Andric                       (or (and node:$src1, -256), node:$src2)>;
7500b57cec5SDimitry Andricdef insertll : PatFrag<(ops node:$src1, node:$src2),
7510b57cec5SDimitry Andric                       (or (and node:$src1, 0xffffffffffff0000), node:$src2)>;
7520b57cec5SDimitry Andricdef insertlh : PatFrag<(ops node:$src1, node:$src2),
7530b57cec5SDimitry Andric                       (or (and node:$src1, 0xffffffff0000ffff), node:$src2)>;
7540b57cec5SDimitry Andricdef inserthl : PatFrag<(ops node:$src1, node:$src2),
7550b57cec5SDimitry Andric                       (or (and node:$src1, 0xffff0000ffffffff), node:$src2)>;
7560b57cec5SDimitry Andricdef inserthh : PatFrag<(ops node:$src1, node:$src2),
7570b57cec5SDimitry Andric                       (or (and node:$src1, 0x0000ffffffffffff), node:$src2)>;
7580b57cec5SDimitry Andricdef insertlf : PatFrag<(ops node:$src1, node:$src2),
7590b57cec5SDimitry Andric                       (or (and node:$src1, 0xffffffff00000000), node:$src2)>;
7600b57cec5SDimitry Andricdef inserthf : PatFrag<(ops node:$src1, node:$src2),
7610b57cec5SDimitry Andric                       (or (and node:$src1, 0x00000000ffffffff), node:$src2)>;
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andric// ORs that can be treated as insertions.
7640b57cec5SDimitry Andricdef or_as_inserti8 : PatFrag<(ops node:$src1, node:$src2),
7650b57cec5SDimitry Andric                             (or node:$src1, node:$src2), [{
7660b57cec5SDimitry Andric  unsigned BitWidth = N->getValueType(0).getScalarSizeInBits();
7670b57cec5SDimitry Andric  return CurDAG->MaskedValueIsZero(N->getOperand(0),
7680b57cec5SDimitry Andric                                   APInt::getLowBitsSet(BitWidth, 8));
7690b57cec5SDimitry Andric}]>;
7700b57cec5SDimitry Andric
7710b57cec5SDimitry Andric// ORs that can be treated as reversed insertions.
7720b57cec5SDimitry Andricdef or_as_revinserti8 : PatFrag<(ops node:$src1, node:$src2),
7730b57cec5SDimitry Andric                                (or node:$src1, node:$src2), [{
7740b57cec5SDimitry Andric  unsigned BitWidth = N->getValueType(0).getScalarSizeInBits();
7750b57cec5SDimitry Andric  return CurDAG->MaskedValueIsZero(N->getOperand(1),
7760b57cec5SDimitry Andric                                   APInt::getLowBitsSet(BitWidth, 8));
7770b57cec5SDimitry Andric}]>;
7780b57cec5SDimitry Andric
7790b57cec5SDimitry Andric// Negative integer absolute.
780e8d8bef9SDimitry Andricdef z_inegabs : PatFrag<(ops node:$src), (ineg (abs node:$src))>;
7810b57cec5SDimitry Andric
7820b57cec5SDimitry Andric// Integer multiply-and-add
7830b57cec5SDimitry Andricdef z_muladd : PatFrag<(ops node:$src1, node:$src2, node:$src3),
7840b57cec5SDimitry Andric                       (add (mul node:$src1, node:$src2), node:$src3)>;
7850b57cec5SDimitry Andric
7860b57cec5SDimitry Andric// Alternatives to match operations with or without an overflow CC result.
7870b57cec5SDimitry Andricdef z_sadd : PatFrags<(ops node:$src1, node:$src2),
7880b57cec5SDimitry Andric                      [(z_saddo node:$src1, node:$src2),
7890b57cec5SDimitry Andric                       (add node:$src1, node:$src2)]>;
7900b57cec5SDimitry Andricdef z_uadd : PatFrags<(ops node:$src1, node:$src2),
7910b57cec5SDimitry Andric                      [(z_uaddo node:$src1, node:$src2),
7920b57cec5SDimitry Andric                       (add node:$src1, node:$src2)]>;
7930b57cec5SDimitry Andricdef z_ssub : PatFrags<(ops node:$src1, node:$src2),
7940b57cec5SDimitry Andric                      [(z_ssubo node:$src1, node:$src2),
7950b57cec5SDimitry Andric                       (sub node:$src1, node:$src2)]>;
7960b57cec5SDimitry Andricdef z_usub : PatFrags<(ops node:$src1, node:$src2),
7970b57cec5SDimitry Andric                      [(z_usubo node:$src1, node:$src2),
7980b57cec5SDimitry Andric                       (sub node:$src1, node:$src2)]>;
7990b57cec5SDimitry Andric
8000b57cec5SDimitry Andric// Combined logical operations.
8010b57cec5SDimitry Andricdef andc : PatFrag<(ops node:$src1, node:$src2),
8020b57cec5SDimitry Andric                   (and node:$src1, (not node:$src2))>;
8030b57cec5SDimitry Andricdef orc  : PatFrag<(ops node:$src1, node:$src2),
8040b57cec5SDimitry Andric                   (or node:$src1, (not node:$src2))>;
8050b57cec5SDimitry Andricdef nand : PatFrag<(ops node:$src1, node:$src2),
8060b57cec5SDimitry Andric                   (not (and node:$src1, node:$src2))>;
8070b57cec5SDimitry Andricdef nor  : PatFrag<(ops node:$src1, node:$src2),
8080b57cec5SDimitry Andric                   (not (or node:$src1, node:$src2))>;
8090b57cec5SDimitry Andricdef nxor : PatFrag<(ops node:$src1, node:$src2),
8100b57cec5SDimitry Andric                   (not (xor node:$src1, node:$src2))>;
8110b57cec5SDimitry Andric
8120b57cec5SDimitry Andric// Fused multiply-subtract, using the natural operand order.
8130b57cec5SDimitry Andricdef any_fms : PatFrag<(ops node:$src1, node:$src2, node:$src3),
8140b57cec5SDimitry Andric                      (any_fma node:$src1, node:$src2, (fneg node:$src3))>;
8150b57cec5SDimitry Andric
8160b57cec5SDimitry Andric// Fused multiply-add and multiply-subtract, but with the order of the
8170b57cec5SDimitry Andric// operands matching SystemZ's MA and MS instructions.
8180b57cec5SDimitry Andricdef z_any_fma : PatFrag<(ops node:$src1, node:$src2, node:$src3),
8190b57cec5SDimitry Andric                        (any_fma node:$src2, node:$src3, node:$src1)>;
8200b57cec5SDimitry Andricdef z_any_fms : PatFrag<(ops node:$src1, node:$src2, node:$src3),
8210b57cec5SDimitry Andric                        (any_fma node:$src2, node:$src3, (fneg node:$src1))>;
8220b57cec5SDimitry Andric
8230b57cec5SDimitry Andric// Negative fused multiply-add and multiply-subtract.
8240b57cec5SDimitry Andricdef any_fnma : PatFrag<(ops node:$src1, node:$src2, node:$src3),
8250b57cec5SDimitry Andric                       (fneg (any_fma node:$src1, node:$src2, node:$src3))>;
8260b57cec5SDimitry Andricdef any_fnms : PatFrag<(ops node:$src1, node:$src2, node:$src3),
8270b57cec5SDimitry Andric                       (fneg (any_fms node:$src1, node:$src2, node:$src3))>;
8280b57cec5SDimitry Andric
8290b57cec5SDimitry Andric// Floating-point negative absolute.
8300b57cec5SDimitry Andricdef fnabs : PatFrag<(ops node:$ptr), (fneg (fabs node:$ptr))>;
8310b57cec5SDimitry Andric
832*0fca6ea1SDimitry Andric// Floating-point operations which will not participate in reassociation, and
833*0fca6ea1SDimitry Andric// therefore are candidates for reg/mem folding during isel.
834*0fca6ea1SDimitry Andricdef z_any_fadd_noreassoc : PatFrag<(ops node:$src1, node:$src2),
835*0fca6ea1SDimitry Andric                                   (any_fadd node:$src1, node:$src2),
836*0fca6ea1SDimitry Andric                                   [{ return !shouldSelectForReassoc(N); }]>;
837*0fca6ea1SDimitry Andricdef z_any_fsub_noreassoc : PatFrag<(ops node:$src1, node:$src2),
838*0fca6ea1SDimitry Andric                                   (any_fsub node:$src1, node:$src2),
839*0fca6ea1SDimitry Andric                                   [{ return !shouldSelectForReassoc(N); }]>;
840*0fca6ea1SDimitry Andricdef z_any_fmul_noreassoc : PatFrag<(ops node:$src1, node:$src2),
841*0fca6ea1SDimitry Andric                                   (any_fmul node:$src1, node:$src2),
842*0fca6ea1SDimitry Andric                                   [{ return !shouldSelectForReassoc(N); }]>;
843*0fca6ea1SDimitry Andric
844480093f4SDimitry Andric// Strict floating-point fragments.
845480093f4SDimitry Andricdef z_any_fcmp    : PatFrags<(ops node:$lhs, node:$rhs),
846480093f4SDimitry Andric                             [(z_strict_fcmp node:$lhs, node:$rhs),
847480093f4SDimitry Andric                              (z_fcmp node:$lhs, node:$rhs)]>;
848480093f4SDimitry Andricdef z_any_vfcmpe  : PatFrags<(ops node:$lhs, node:$rhs),
849480093f4SDimitry Andric                             [(z_strict_vfcmpe node:$lhs, node:$rhs),
850480093f4SDimitry Andric                              (z_vfcmpe node:$lhs, node:$rhs)]>;
851480093f4SDimitry Andricdef z_any_vfcmph  : PatFrags<(ops node:$lhs, node:$rhs),
852480093f4SDimitry Andric                             [(z_strict_vfcmph node:$lhs, node:$rhs),
853480093f4SDimitry Andric                              (z_vfcmph node:$lhs, node:$rhs)]>;
854480093f4SDimitry Andricdef z_any_vfcmphe : PatFrags<(ops node:$lhs, node:$rhs),
855480093f4SDimitry Andric                             [(z_strict_vfcmphe node:$lhs, node:$rhs),
856480093f4SDimitry Andric                              (z_vfcmphe node:$lhs, node:$rhs)]>;
857480093f4SDimitry Andricdef z_any_vextend : PatFrags<(ops node:$src),
858480093f4SDimitry Andric                             [(z_strict_vextend node:$src),
859480093f4SDimitry Andric                              (z_vextend node:$src)]>;
860480093f4SDimitry Andricdef z_any_vround  : PatFrags<(ops node:$src),
861480093f4SDimitry Andric                             [(z_strict_vround node:$src),
862480093f4SDimitry Andric                              (z_vround node:$src)]>;
863480093f4SDimitry Andric
8640b57cec5SDimitry Andric// Create a unary operator that loads from memory and then performs
8650b57cec5SDimitry Andric// the given operation on it.
866*0fca6ea1SDimitry Andricclass loadu<SDPatternOperator operator, SDPatternOperator load = z_load>
8670b57cec5SDimitry Andric  : PatFrag<(ops node:$addr), (operator (load node:$addr))>;
8680b57cec5SDimitry Andric
8690b57cec5SDimitry Andric// Create a store operator that performs the given unary operation
8700b57cec5SDimitry Andric// on the value before storing it.
8710b57cec5SDimitry Andricclass storeu<SDPatternOperator operator, SDPatternOperator store = store>
8720b57cec5SDimitry Andric  : PatFrag<(ops node:$value, node:$addr),
8730b57cec5SDimitry Andric            (store (operator node:$value), node:$addr)>;
8740b57cec5SDimitry Andric
8750b57cec5SDimitry Andric// Create a store operator that performs the given inherent operation
8760b57cec5SDimitry Andric// and stores the resulting value.
8770b57cec5SDimitry Andricclass storei<SDPatternOperator operator, SDPatternOperator store = store>
8780b57cec5SDimitry Andric  : PatFrag<(ops node:$addr),
8790b57cec5SDimitry Andric            (store (operator), node:$addr)>;
8800b57cec5SDimitry Andric
8810b57cec5SDimitry Andric// Create a shift operator that optionally ignores an AND of the
8820b57cec5SDimitry Andric// shift count with an immediate if the bottom 6 bits are all set.
8830b57cec5SDimitry Andricdef imm32bottom6set : PatLeaf<(i32 imm), [{
8840b57cec5SDimitry Andric  return (N->getZExtValue() & 0x3f) == 0x3f;
8850b57cec5SDimitry Andric}]>;
8860b57cec5SDimitry Andricclass shiftop<SDPatternOperator operator>
8870b57cec5SDimitry Andric  : PatFrags<(ops node:$val, node:$count),
8880b57cec5SDimitry Andric             [(operator node:$val, node:$count),
8890b57cec5SDimitry Andric              (operator node:$val, (and node:$count, imm32bottom6set))]>;
8900b57cec5SDimitry Andric
8915f757f3fSDimitry Andric// Create a shift operator that optionally ignores an AND of the
8925f757f3fSDimitry Andric// shift count with an immediate if the bottom 7 bits are all set.
8935f757f3fSDimitry Andricdef imm32bottom7set : PatLeaf<(i32 imm), [{
8945f757f3fSDimitry Andric  return (N->getZExtValue() & 0x7f) == 0x7f;
8955f757f3fSDimitry Andric}]>;
8965f757f3fSDimitry Andricclass vshiftop<SDPatternOperator operator>
8975f757f3fSDimitry Andric  : PatFrags<(ops node:$val, node:$count),
8985f757f3fSDimitry Andric             [(operator node:$val, node:$count),
8995f757f3fSDimitry Andric              (operator node:$val, (and node:$count, imm32bottom7set))]>;
9005f757f3fSDimitry Andric
9010b57cec5SDimitry Andricdef imm32mod64  : PatLeaf<(i32 imm), [{
9020b57cec5SDimitry Andric  return (N->getZExtValue() % 64 == 0);
9030b57cec5SDimitry Andric}]>;
9040b57cec5SDimitry Andric
9055f757f3fSDimitry Andricdef imm32nobits : PatLeaf<(i32 imm), [{
9065f757f3fSDimitry Andric  return (N->getZExtValue() & 0x07) == 0;
9075f757f3fSDimitry Andric}]>;
9085f757f3fSDimitry Andricdef imm32nobytes : PatLeaf<(i32 imm), [{
9095f757f3fSDimitry Andric  return (N->getZExtValue() & 0x78) == 0;
9105f757f3fSDimitry Andric}]>;
9115f757f3fSDimitry Andric
9120b57cec5SDimitry Andric// Load a scalar and replicate it in all elements of a vector.
9130b57cec5SDimitry Andricclass z_replicate_load<ValueType scalartype, SDPatternOperator load>
9140b57cec5SDimitry Andric  : PatFrag<(ops node:$addr),
9150b57cec5SDimitry Andric            (z_replicate (scalartype (load node:$addr)))>;
916*0fca6ea1SDimitry Andricdef z_replicate_loadi8  : z_replicate_load<i32, z_anyextloadi8>;
917*0fca6ea1SDimitry Andricdef z_replicate_loadi16 : z_replicate_load<i32, z_anyextloadi16>;
918*0fca6ea1SDimitry Andricdef z_replicate_loadi32 : z_replicate_load<i32, z_load>;
919*0fca6ea1SDimitry Andricdef z_replicate_loadi64 : z_replicate_load<i64, z_load>;
920*0fca6ea1SDimitry Andricdef z_replicate_loadf32 : z_replicate_load<f32, z_load>;
921*0fca6ea1SDimitry Andricdef z_replicate_loadf64 : z_replicate_load<f64, z_load>;
9220b57cec5SDimitry Andric// Byte-swapped replicated vector element loads.
9230b57cec5SDimitry Andricdef z_replicate_loadbswapi16 : z_replicate_load<i32, z_loadbswap16>;
9240b57cec5SDimitry Andricdef z_replicate_loadbswapi32 : z_replicate_load<i32, z_loadbswap32>;
9250b57cec5SDimitry Andricdef z_replicate_loadbswapi64 : z_replicate_load<i64, z_loadbswap64>;
9260b57cec5SDimitry Andric
9270b57cec5SDimitry Andric// Load a scalar and insert it into a single element of a vector.
9280b57cec5SDimitry Andricclass z_vle<ValueType scalartype, SDPatternOperator load>
9290b57cec5SDimitry Andric  : PatFrag<(ops node:$vec, node:$addr, node:$index),
9300b57cec5SDimitry Andric            (z_vector_insert node:$vec, (scalartype (load node:$addr)),
9310b57cec5SDimitry Andric                             node:$index)>;
932*0fca6ea1SDimitry Andricdef z_vlei8  : z_vle<i32, z_anyextloadi8>;
933*0fca6ea1SDimitry Andricdef z_vlei16 : z_vle<i32, z_anyextloadi16>;
934*0fca6ea1SDimitry Andricdef z_vlei32 : z_vle<i32, z_load>;
935*0fca6ea1SDimitry Andricdef z_vlei64 : z_vle<i64, z_load>;
936*0fca6ea1SDimitry Andricdef z_vlef32 : z_vle<f32, z_load>;
937*0fca6ea1SDimitry Andricdef z_vlef64 : z_vle<f64, z_load>;
9380b57cec5SDimitry Andric// Byte-swapped vector element loads.
9390b57cec5SDimitry Andricdef z_vlebri16 : z_vle<i32, z_loadbswap16>;
9400b57cec5SDimitry Andricdef z_vlebri32 : z_vle<i32, z_loadbswap32>;
9410b57cec5SDimitry Andricdef z_vlebri64 : z_vle<i64, z_loadbswap64>;
9420b57cec5SDimitry Andric
9430b57cec5SDimitry Andric// Load a scalar and insert it into the low element of the high i64 of a
9440b57cec5SDimitry Andric// zeroed vector.
9450b57cec5SDimitry Andricclass z_vllez<ValueType scalartype, SDPatternOperator load, int index>
9460b57cec5SDimitry Andric  : PatFrag<(ops node:$addr),
9470b57cec5SDimitry Andric            (z_vector_insert immAllZerosV,
9480b57cec5SDimitry Andric                             (scalartype (load node:$addr)), (i32 index))>;
949*0fca6ea1SDimitry Andricdef z_vllezi8  : z_vllez<i32, z_anyextloadi8, 7>;
950*0fca6ea1SDimitry Andricdef z_vllezi16 : z_vllez<i32, z_anyextloadi16, 3>;
951*0fca6ea1SDimitry Andricdef z_vllezi32 : z_vllez<i32, z_load, 1>;
9520b57cec5SDimitry Andricdef z_vllezi64 : PatFrags<(ops node:$addr),
9530b57cec5SDimitry Andric                          [(z_vector_insert immAllZerosV,
954*0fca6ea1SDimitry Andric                                            (i64 (z_load node:$addr)), (i32 0)),
955*0fca6ea1SDimitry Andric                           (z_join_dwords (i64 (z_load node:$addr)), (i64 0))]>;
9560b57cec5SDimitry Andric// We use high merges to form a v4f32 from four f32s.  Propagating zero
9570b57cec5SDimitry Andric// into all elements but index 1 gives this expression.
9580b57cec5SDimitry Andricdef z_vllezf32 : PatFrag<(ops node:$addr),
9590b57cec5SDimitry Andric                         (z_merge_high
9600b57cec5SDimitry Andric                          (v2i64
9610b57cec5SDimitry Andric                           (z_unpackl_high
9620b57cec5SDimitry Andric                            (v4i32
9630b57cec5SDimitry Andric                             (bitconvert
9640b57cec5SDimitry Andric                              (v4f32 (scalar_to_vector
965*0fca6ea1SDimitry Andric                                      (f32 (z_load node:$addr)))))))),
9660b57cec5SDimitry Andric                          (v2i64
9670b57cec5SDimitry Andric                           (bitconvert (v4f32 immAllZerosV))))>;
9680b57cec5SDimitry Andricdef z_vllezf64 : PatFrag<(ops node:$addr),
9690b57cec5SDimitry Andric                         (z_merge_high
970*0fca6ea1SDimitry Andric                          (v2f64 (scalar_to_vector (f64 (z_load node:$addr)))),
9710b57cec5SDimitry Andric                          immAllZerosV)>;
9720b57cec5SDimitry Andric
9730b57cec5SDimitry Andric// Similarly for the high element of a zeroed vector.
974*0fca6ea1SDimitry Andricdef z_vllezli32 : z_vllez<i32, z_load, 0>;
9750b57cec5SDimitry Andricdef z_vllezlf32 : PatFrag<(ops node:$addr),
9760b57cec5SDimitry Andric                          (z_merge_high
9770b57cec5SDimitry Andric                           (v2i64
9780b57cec5SDimitry Andric                            (bitconvert
9790b57cec5SDimitry Andric                             (z_merge_high
9800b57cec5SDimitry Andric                              (v4f32 (scalar_to_vector
981*0fca6ea1SDimitry Andric                                      (f32 (z_load node:$addr)))),
9820b57cec5SDimitry Andric                              (v4f32 immAllZerosV)))),
9830b57cec5SDimitry Andric                           (v2i64
9840b57cec5SDimitry Andric                            (bitconvert (v4f32 immAllZerosV))))>;
9850b57cec5SDimitry Andric
9860b57cec5SDimitry Andric// Byte-swapped variants.
9870b57cec5SDimitry Andricdef z_vllebrzi16  : z_vllez<i32, z_loadbswap16, 3>;
9880b57cec5SDimitry Andricdef z_vllebrzi32  : z_vllez<i32, z_loadbswap32, 1>;
9890b57cec5SDimitry Andricdef z_vllebrzli32 : z_vllez<i32, z_loadbswap32, 0>;
9900b57cec5SDimitry Andricdef z_vllebrzi64  : PatFrags<(ops node:$addr),
9910b57cec5SDimitry Andric                             [(z_vector_insert immAllZerosV,
9920b57cec5SDimitry Andric                                               (i64 (z_loadbswap64 node:$addr)),
9930b57cec5SDimitry Andric                                               (i32 0)),
9940b57cec5SDimitry Andric                              (z_join_dwords (i64 (z_loadbswap64 node:$addr)),
9950b57cec5SDimitry Andric                                             (i64 0))]>;
9960b57cec5SDimitry Andric
9970b57cec5SDimitry Andric
9980b57cec5SDimitry Andric// Store one element of a vector.
9990b57cec5SDimitry Andricclass z_vste<ValueType scalartype, SDPatternOperator store>
10000b57cec5SDimitry Andric  : PatFrag<(ops node:$vec, node:$addr, node:$index),
10010b57cec5SDimitry Andric            (store (scalartype (z_vector_extract node:$vec, node:$index)),
10020b57cec5SDimitry Andric                   node:$addr)>;
10030b57cec5SDimitry Andricdef z_vstei8  : z_vste<i32, truncstorei8>;
10040b57cec5SDimitry Andricdef z_vstei16 : z_vste<i32, truncstorei16>;
10050b57cec5SDimitry Andricdef z_vstei32 : z_vste<i32, store>;
10060b57cec5SDimitry Andricdef z_vstei64 : z_vste<i64, store>;
10070b57cec5SDimitry Andricdef z_vstef32 : z_vste<f32, store>;
10080b57cec5SDimitry Andricdef z_vstef64 : z_vste<f64, store>;
10090b57cec5SDimitry Andric// Byte-swapped vector element stores.
10100b57cec5SDimitry Andricdef z_vstebri16 : z_vste<i32, z_storebswap16>;
10110b57cec5SDimitry Andricdef z_vstebri32 : z_vste<i32, z_storebswap32>;
10120b57cec5SDimitry Andricdef z_vstebri64 : z_vste<i64, z_storebswap64>;
10130b57cec5SDimitry Andric
10140b57cec5SDimitry Andric// Arithmetic negation on vectors.
10150b57cec5SDimitry Andricdef z_vneg : PatFrag<(ops node:$x), (sub immAllZerosV, node:$x)>;
10160b57cec5SDimitry Andric
10170b57cec5SDimitry Andric// Bitwise negation on vectors.
10180b57cec5SDimitry Andricdef z_vnot : PatFrag<(ops node:$x), (xor node:$x, immAllOnesV)>;
10190b57cec5SDimitry Andric
10200b57cec5SDimitry Andric// Signed "integer greater than zero" on vectors.
10210b57cec5SDimitry Andricdef z_vicmph_zero : PatFrag<(ops node:$x), (z_vicmph node:$x, immAllZerosV)>;
10220b57cec5SDimitry Andric
10230b57cec5SDimitry Andric// Signed "integer less than zero" on vectors.
10240b57cec5SDimitry Andricdef z_vicmpl_zero : PatFrag<(ops node:$x), (z_vicmph immAllZerosV, node:$x)>;
10250b57cec5SDimitry Andric
10260b57cec5SDimitry Andric// Sign-extend the i64 elements of a vector.
10270b57cec5SDimitry Andricclass z_vse<int shift>
10280b57cec5SDimitry Andric  : PatFrag<(ops node:$src),
10290b57cec5SDimitry Andric            (z_vsra_by_scalar (z_vshl_by_scalar node:$src, shift), shift)>;
10300b57cec5SDimitry Andricdef z_vsei8  : z_vse<56>;
10310b57cec5SDimitry Andricdef z_vsei16 : z_vse<48>;
10320b57cec5SDimitry Andricdef z_vsei32 : z_vse<32>;
10330b57cec5SDimitry Andric
10340b57cec5SDimitry Andric// ...and again with the extensions being done on individual i64 scalars.
10350b57cec5SDimitry Andricclass z_vse_by_parts<SDPatternOperator operator, int index1, int index2>
10360b57cec5SDimitry Andric  : PatFrag<(ops node:$src),
10370b57cec5SDimitry Andric            (z_join_dwords
10380b57cec5SDimitry Andric             (operator (z_vector_extract node:$src, index1)),
10390b57cec5SDimitry Andric             (operator (z_vector_extract node:$src, index2)))>;
10400b57cec5SDimitry Andricdef z_vsei8_by_parts  : z_vse_by_parts<sext8dbl, 7, 15>;
10410b57cec5SDimitry Andricdef z_vsei16_by_parts : z_vse_by_parts<sext16dbl, 3, 7>;
10420b57cec5SDimitry Andricdef z_vsei32_by_parts : z_vse_by_parts<sext32, 1, 3>;
1043