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