1689db42cSShengchen Kan//===----------X86InstrFragments - X86 Pattern fragments. --*- tablegen -*-===// 2689db42cSShengchen Kan// 3689db42cSShengchen Kan// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4689db42cSShengchen Kan// See https://llvm.org/LICENSE.txt for license information. 5689db42cSShengchen Kan// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6689db42cSShengchen Kan// 7689db42cSShengchen Kan//===----------------------------------------------------------------------===// 8689db42cSShengchen Kan 9689db42cSShengchen Kan// X86-specific DAG node. 10689db42cSShengchen Kandef SDTX86CmpTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisInt<1>, 11689db42cSShengchen Kan SDTCisSameAs<1, 2>]>; 12689db42cSShengchen Kandef SDTX86FCmp : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisFP<1>, 13689db42cSShengchen Kan SDTCisSameAs<1, 2>]>; 14689db42cSShengchen Kan 15331eb8a0SShengchen Kandef SDTX86Ccmp : SDTypeProfile<1, 5, 16331eb8a0SShengchen Kan [SDTCisVT<3, i8>, SDTCisVT<4, i8>, SDTCisVT<5, i32>]>; 17331eb8a0SShengchen Kan 1815fc801cSShengchen Kan// RES = op PTR, PASSTHRU, COND, EFLAGS 1915fc801cSShengchen Kandef SDTX86Cload : SDTypeProfile<1, 4, 2015fc801cSShengchen Kan [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisSameAs<0, 2>, 2115fc801cSShengchen Kan SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; 2215fc801cSShengchen Kan// op VAL, PTR, COND, EFLAGS 2315fc801cSShengchen Kandef SDTX86Cstore : SDTypeProfile<0, 4, 2415fc801cSShengchen Kan [SDTCisInt<0>, SDTCisPtrTy<1>, 2515fc801cSShengchen Kan SDTCisVT<2, i8>, SDTCisVT<3, i32>]>; 2615fc801cSShengchen Kan 27689db42cSShengchen Kandef SDTX86Cmov : SDTypeProfile<1, 4, 28689db42cSShengchen Kan [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 29689db42cSShengchen Kan SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; 30689db42cSShengchen Kan 31689db42cSShengchen Kan// Unary and binary operator instructions that set EFLAGS as a side-effect. 32689db42cSShengchen Kandef SDTUnaryArithWithFlags : SDTypeProfile<2, 1, 33689db42cSShengchen Kan [SDTCisSameAs<0, 2>, 34689db42cSShengchen Kan SDTCisInt<0>, SDTCisVT<1, i32>]>; 35689db42cSShengchen Kan 36689db42cSShengchen Kandef SDTBinaryArithWithFlags : SDTypeProfile<2, 2, 37689db42cSShengchen Kan [SDTCisSameAs<0, 2>, 38689db42cSShengchen Kan SDTCisSameAs<0, 3>, 39689db42cSShengchen Kan SDTCisInt<0>, SDTCisVT<1, i32>]>; 40689db42cSShengchen Kan 41689db42cSShengchen Kan// SDTBinaryArithWithFlagsInOut - RES1, EFLAGS = op LHS, RHS, EFLAGS 42689db42cSShengchen Kandef SDTBinaryArithWithFlagsInOut : SDTypeProfile<2, 3, 43689db42cSShengchen Kan [SDTCisSameAs<0, 2>, 44689db42cSShengchen Kan SDTCisSameAs<0, 3>, 45689db42cSShengchen Kan SDTCisInt<0>, 46689db42cSShengchen Kan SDTCisVT<1, i32>, 47689db42cSShengchen Kan SDTCisVT<4, i32>]>; 48aa5dc539SSergei Barannikov 49689db42cSShengchen Kandef SDTX86BrCond : SDTypeProfile<0, 3, 50689db42cSShengchen Kan [SDTCisVT<0, OtherVT>, 51689db42cSShengchen Kan SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 52689db42cSShengchen Kan 53689db42cSShengchen Kandef SDTX86SetCC : SDTypeProfile<1, 2, 54689db42cSShengchen Kan [SDTCisVT<0, i8>, 55689db42cSShengchen Kan SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 56689db42cSShengchen Kandef SDTX86SetCC_C : SDTypeProfile<1, 2, 57689db42cSShengchen Kan [SDTCisInt<0>, 58689db42cSShengchen Kan SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 59689db42cSShengchen Kan 60689db42cSShengchen Kandef SDTX86sahf : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i8>]>; 61689db42cSShengchen Kan 62689db42cSShengchen Kandef SDTX86rdrand : SDTypeProfile<2, 0, [SDTCisInt<0>, SDTCisVT<1, i32>]>; 63689db42cSShengchen Kan 64689db42cSShengchen Kandef SDTX86rdpkru : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 65689db42cSShengchen Kandef SDTX86wrpkru : SDTypeProfile<0, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, 66689db42cSShengchen Kan SDTCisVT<2, i32>]>; 67689db42cSShengchen Kan 68689db42cSShengchen Kandef SDTX86cas : SDTypeProfile<0, 3, [SDTCisPtrTy<0>, SDTCisInt<1>, 69689db42cSShengchen Kan SDTCisVT<2, i8>]>; 70689db42cSShengchen Kandef SDTX86cas8pair : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 71689db42cSShengchen Kandef SDTX86cas16pair : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i64>]>; 72689db42cSShengchen Kan 73689db42cSShengchen Kandef SDTLockBinaryArithWithFlags : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 74689db42cSShengchen Kan SDTCisPtrTy<1>, 75689db42cSShengchen Kan SDTCisInt<2>]>; 76689db42cSShengchen Kan 77689db42cSShengchen Kandef SDTLockUnaryArithWithFlags : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, 78689db42cSShengchen Kan SDTCisPtrTy<1>]>; 79689db42cSShengchen Kan 80689db42cSShengchen Kandef SDTX86Ret : SDTypeProfile<0, -1, [SDTCisVT<0, i32>]>; 81689db42cSShengchen Kan 82689db42cSShengchen Kandef SDT_X86CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>, 83689db42cSShengchen Kan SDTCisVT<1, i32>]>; 84689db42cSShengchen Kandef SDT_X86CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>, 85689db42cSShengchen Kan SDTCisVT<1, i32>]>; 86689db42cSShengchen Kan 87689db42cSShengchen Kandef SDT_X86Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; 88689db42cSShengchen Kan 89689db42cSShengchen Kandef SDT_X86NtBrind : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; 90689db42cSShengchen Kan 91689db42cSShengchen Kandef SDT_X86VASTART_SAVE_XMM_REGS : SDTypeProfile<0, -1, [SDTCisVT<0, i8>, 92689db42cSShengchen Kan SDTCisPtrTy<1>]>; 93689db42cSShengchen Kan 94689db42cSShengchen Kandef SDT_X86VAARG : SDTypeProfile<1, -1, [SDTCisPtrTy<0>, 95689db42cSShengchen Kan SDTCisPtrTy<1>, 96689db42cSShengchen Kan SDTCisVT<2, i32>, 97689db42cSShengchen Kan SDTCisVT<3, i8>, 98689db42cSShengchen Kan SDTCisVT<4, i32>]>; 99689db42cSShengchen Kan 100689db42cSShengchen Kandef SDTX86RepStr : SDTypeProfile<0, 1, [SDTCisVT<0, OtherVT>]>; 101689db42cSShengchen Kan 102689db42cSShengchen Kandef SDTX86Void : SDTypeProfile<0, 0, []>; 103689db42cSShengchen Kan 104689db42cSShengchen Kandef SDTX86Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; 105689db42cSShengchen Kan 106689db42cSShengchen Kandef SDT_X86TLSADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 107689db42cSShengchen Kan 108689db42cSShengchen Kandef SDT_X86TLSBASEADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 109689db42cSShengchen Kan 110689db42cSShengchen Kandef SDT_X86TLSCALL : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 111689db42cSShengchen Kan 112689db42cSShengchen Kandef SDT_X86DYN_ALLOCA : SDTypeProfile<0, 1, [SDTCisVT<0, iPTR>]>; 113689db42cSShengchen Kan 114689db42cSShengchen Kandef SDT_X86SEG_ALLOCA : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; 115689db42cSShengchen Kan 116689db42cSShengchen Kandef SDT_X86PROBED_ALLOCA : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; 117689db42cSShengchen Kan 118689db42cSShengchen Kandef SDT_X86EHRET : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 119689db42cSShengchen Kan 120689db42cSShengchen Kandef SDT_X86TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i32>]>; 121689db42cSShengchen Kan 122689db42cSShengchen Kandef SDT_X86ENQCMD : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 123689db42cSShengchen Kan SDTCisPtrTy<1>, SDTCisSameAs<1, 2>]>; 124689db42cSShengchen Kan 125689db42cSShengchen Kandef SDT_X86AESENCDECKL : SDTypeProfile<2, 2, [SDTCisVT<0, v2i64>, 126689db42cSShengchen Kan SDTCisVT<1, i32>, 127689db42cSShengchen Kan SDTCisVT<2, v2i64>, 128689db42cSShengchen Kan SDTCisPtrTy<3>]>; 129689db42cSShengchen Kan 130689db42cSShengchen Kandef SDTX86Cmpccxadd : SDTypeProfile<1, 4, [SDTCisSameAs<0, 2>, 131689db42cSShengchen Kan SDTCisPtrTy<1>, SDTCisSameAs<2, 3>, 132689db42cSShengchen Kan SDTCisVT<4, i8>]>; 133689db42cSShengchen Kan 134689db42cSShengchen Kandef X86MFence : SDNode<"X86ISD::MFENCE", SDTNone, [SDNPHasChain]>; 135689db42cSShengchen Kan 136689db42cSShengchen Kan 137*90e9895aSSimon Pilgrimdef X86bsf : SDNode<"X86ISD::BSF", SDTBinaryArithWithFlags>; 138*90e9895aSSimon Pilgrimdef X86bsr : SDNode<"X86ISD::BSR", SDTBinaryArithWithFlags>; 139689db42cSShengchen Kandef X86fshl : SDNode<"X86ISD::FSHL", SDTIntShiftDOp>; 140689db42cSShengchen Kandef X86fshr : SDNode<"X86ISD::FSHR", SDTIntShiftDOp>; 141689db42cSShengchen Kan 142689db42cSShengchen Kandef X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest>; 143689db42cSShengchen Kandef X86fcmp : SDNode<"X86ISD::FCMP", SDTX86FCmp>; 144689db42cSShengchen Kandef X86strict_fcmp : SDNode<"X86ISD::STRICT_FCMP", SDTX86FCmp, [SDNPHasChain]>; 145689db42cSShengchen Kandef X86strict_fcmps : SDNode<"X86ISD::STRICT_FCMPS", SDTX86FCmp, [SDNPHasChain]>; 146689db42cSShengchen Kandef X86bt : SDNode<"X86ISD::BT", SDTX86CmpTest>; 147689db42cSShengchen Kan 148331eb8a0SShengchen Kandef X86ccmp : SDNode<"X86ISD::CCMP", SDTX86Ccmp>; 149331eb8a0SShengchen Kandef X86ctest : SDNode<"X86ISD::CTEST", SDTX86Ccmp>; 150331eb8a0SShengchen Kan 15115fc801cSShengchen Kandef X86cload : SDNode<"X86ISD::CLOAD", SDTX86Cload, [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 15215fc801cSShengchen Kandef X86cstore : SDNode<"X86ISD::CSTORE", SDTX86Cstore, [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 15315fc801cSShengchen Kan 154689db42cSShengchen Kandef X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov>; 155689db42cSShengchen Kandef X86brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, 156689db42cSShengchen Kan [SDNPHasChain]>; 157689db42cSShengchen Kandef X86setcc : SDNode<"X86ISD::SETCC", SDTX86SetCC>; 158689db42cSShengchen Kandef X86setcc_c : SDNode<"X86ISD::SETCC_CARRY", SDTX86SetCC_C>; 159689db42cSShengchen Kan 160689db42cSShengchen Kandef X86rdrand : SDNode<"X86ISD::RDRAND", SDTX86rdrand, 161689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 162689db42cSShengchen Kan 163689db42cSShengchen Kandef X86rdseed : SDNode<"X86ISD::RDSEED", SDTX86rdrand, 164689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 165689db42cSShengchen Kan 166689db42cSShengchen Kandef X86rdpkru : SDNode<"X86ISD::RDPKRU", SDTX86rdpkru, 167689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 168689db42cSShengchen Kandef X86wrpkru : SDNode<"X86ISD::WRPKRU", SDTX86wrpkru, 169689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 170689db42cSShengchen Kan 171689db42cSShengchen Kandef X86cas : SDNode<"X86ISD::LCMPXCHG_DAG", SDTX86cas, 172689db42cSShengchen Kan [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 173689db42cSShengchen Kan SDNPMayLoad, SDNPMemOperand]>; 174689db42cSShengchen Kandef X86cas8 : SDNode<"X86ISD::LCMPXCHG8_DAG", SDTX86cas8pair, 175689db42cSShengchen Kan [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 176689db42cSShengchen Kan SDNPMayLoad, SDNPMemOperand]>; 177689db42cSShengchen Kandef X86cas16 : SDNode<"X86ISD::LCMPXCHG16_DAG", SDTX86cas16pair, 178689db42cSShengchen Kan [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 179689db42cSShengchen Kan SDNPMayLoad, SDNPMemOperand]>; 180689db42cSShengchen Kan 181689db42cSShengchen Kandef X86retglue : SDNode<"X86ISD::RET_GLUE", SDTX86Ret, 182689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 183689db42cSShengchen Kandef X86iret : SDNode<"X86ISD::IRET", SDTX86Ret, 184689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue]>; 185689db42cSShengchen Kan 186689db42cSShengchen Kandef X86vastart_save_xmm_regs : 187689db42cSShengchen Kan SDNode<"X86ISD::VASTART_SAVE_XMM_REGS", 188689db42cSShengchen Kan SDT_X86VASTART_SAVE_XMM_REGS, 189689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPVariadic]>; 190689db42cSShengchen Kandef X86vaarg64 : 191689db42cSShengchen Kan SDNode<"X86ISD::VAARG_64", SDT_X86VAARG, 192689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 193689db42cSShengchen Kan SDNPMemOperand]>; 194689db42cSShengchen Kandef X86vaargx32 : 195689db42cSShengchen Kan SDNode<"X86ISD::VAARG_X32", SDT_X86VAARG, 196689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 197689db42cSShengchen Kan SDNPMemOperand]>; 198689db42cSShengchen Kandef X86callseq_start : 199689db42cSShengchen Kan SDNode<"ISD::CALLSEQ_START", SDT_X86CallSeqStart, 200689db42cSShengchen Kan [SDNPHasChain, SDNPOutGlue]>; 201689db42cSShengchen Kandef X86callseq_end : 202689db42cSShengchen Kan SDNode<"ISD::CALLSEQ_END", SDT_X86CallSeqEnd, 203689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 204689db42cSShengchen Kan 205689db42cSShengchen Kandef X86call : SDNode<"X86ISD::CALL", SDT_X86Call, 206689db42cSShengchen Kan [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 207689db42cSShengchen Kan SDNPVariadic]>; 208689db42cSShengchen Kan 209689db42cSShengchen Kandef X86call_rvmarker : SDNode<"X86ISD::CALL_RVMARKER", SDT_X86Call, 210689db42cSShengchen Kan [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 211689db42cSShengchen Kan SDNPVariadic]>; 212689db42cSShengchen Kan 213689db42cSShengchen Kan 214689db42cSShengchen Kandef X86NoTrackCall : SDNode<"X86ISD::NT_CALL", SDT_X86Call, 215689db42cSShengchen Kan [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 216689db42cSShengchen Kan SDNPVariadic]>; 217689db42cSShengchen Kandef X86NoTrackBrind : SDNode<"X86ISD::NT_BRIND", SDT_X86NtBrind, 218689db42cSShengchen Kan [SDNPHasChain]>; 219689db42cSShengchen Kan 220689db42cSShengchen Kandef X86rep_stos: SDNode<"X86ISD::REP_STOS", SDTX86RepStr, 221689db42cSShengchen Kan [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore]>; 222689db42cSShengchen Kandef X86rep_movs: SDNode<"X86ISD::REP_MOVS", SDTX86RepStr, 223689db42cSShengchen Kan [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 224689db42cSShengchen Kan SDNPMayLoad]>; 225689db42cSShengchen Kan 226689db42cSShengchen Kandef X86Wrapper : SDNode<"X86ISD::Wrapper", SDTX86Wrapper>; 227689db42cSShengchen Kandef X86WrapperRIP : SDNode<"X86ISD::WrapperRIP", SDTX86Wrapper>; 228689db42cSShengchen Kan 229689db42cSShengchen Kandef X86RecoverFrameAlloc : SDNode<"ISD::LOCAL_RECOVER", 230689db42cSShengchen Kan SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, 231689db42cSShengchen Kan SDTCisInt<1>]>>; 232689db42cSShengchen Kan 233689db42cSShengchen Kandef X86tlsaddr : SDNode<"X86ISD::TLSADDR", SDT_X86TLSADDR, 234689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 235689db42cSShengchen Kan 236689db42cSShengchen Kandef X86tlsbaseaddr : SDNode<"X86ISD::TLSBASEADDR", SDT_X86TLSBASEADDR, 237689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 238689db42cSShengchen Kan 239f4676b6bSPhoebe Wangdef X86tlsdesc : SDNode<"X86ISD::TLSDESC", SDT_X86TLSADDR, 240f4676b6bSPhoebe Wang [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 241f4676b6bSPhoebe Wang 242689db42cSShengchen Kandef X86ehret : SDNode<"X86ISD::EH_RETURN", SDT_X86EHRET, 243689db42cSShengchen Kan [SDNPHasChain]>; 244689db42cSShengchen Kan 245689db42cSShengchen Kandef X86eh_sjlj_setjmp : SDNode<"X86ISD::EH_SJLJ_SETJMP", 246689db42cSShengchen Kan SDTypeProfile<1, 1, [SDTCisInt<0>, 247689db42cSShengchen Kan SDTCisPtrTy<1>]>, 248689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 249689db42cSShengchen Kandef X86eh_sjlj_longjmp : SDNode<"X86ISD::EH_SJLJ_LONGJMP", 250689db42cSShengchen Kan SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>, 251689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 252689db42cSShengchen Kandef X86eh_sjlj_setup_dispatch : SDNode<"X86ISD::EH_SJLJ_SETUP_DISPATCH", 253689db42cSShengchen Kan SDTypeProfile<0, 0, []>, 254689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 255689db42cSShengchen Kan 256689db42cSShengchen Kandef X86tcret : SDNode<"X86ISD::TC_RETURN", SDT_X86TCRET, 257689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 258689db42cSShengchen Kan 259689db42cSShengchen Kandef X86add_flag : SDNode<"X86ISD::ADD", SDTBinaryArithWithFlags, 260689db42cSShengchen Kan [SDNPCommutative]>; 261689db42cSShengchen Kandef X86sub_flag : SDNode<"X86ISD::SUB", SDTBinaryArithWithFlags>; 262689db42cSShengchen Kandef X86smul_flag : SDNode<"X86ISD::SMUL", SDTBinaryArithWithFlags, 263689db42cSShengchen Kan [SDNPCommutative]>; 264aa5dc539SSergei Barannikovdef X86umul_flag : SDNode<"X86ISD::UMUL", SDTBinaryArithWithFlags, 265689db42cSShengchen Kan [SDNPCommutative]>; 266689db42cSShengchen Kandef X86adc_flag : SDNode<"X86ISD::ADC", SDTBinaryArithWithFlagsInOut>; 267689db42cSShengchen Kandef X86sbb_flag : SDNode<"X86ISD::SBB", SDTBinaryArithWithFlagsInOut>; 268689db42cSShengchen Kan 269689db42cSShengchen Kandef X86or_flag : SDNode<"X86ISD::OR", SDTBinaryArithWithFlags, 270689db42cSShengchen Kan [SDNPCommutative]>; 271689db42cSShengchen Kandef X86xor_flag : SDNode<"X86ISD::XOR", SDTBinaryArithWithFlags, 272689db42cSShengchen Kan [SDNPCommutative]>; 273689db42cSShengchen Kandef X86and_flag : SDNode<"X86ISD::AND", SDTBinaryArithWithFlags, 274689db42cSShengchen Kan [SDNPCommutative]>; 275689db42cSShengchen Kan 276689db42cSShengchen Kandef X86lock_add : SDNode<"X86ISD::LADD", SDTLockBinaryArithWithFlags, 277689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 278689db42cSShengchen Kan SDNPMemOperand]>; 279689db42cSShengchen Kandef X86lock_sub : SDNode<"X86ISD::LSUB", SDTLockBinaryArithWithFlags, 280689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 281689db42cSShengchen Kan SDNPMemOperand]>; 282689db42cSShengchen Kandef X86lock_or : SDNode<"X86ISD::LOR", SDTLockBinaryArithWithFlags, 283689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 284689db42cSShengchen Kan SDNPMemOperand]>; 285689db42cSShengchen Kandef X86lock_xor : SDNode<"X86ISD::LXOR", SDTLockBinaryArithWithFlags, 286689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 287689db42cSShengchen Kan SDNPMemOperand]>; 288689db42cSShengchen Kandef X86lock_and : SDNode<"X86ISD::LAND", SDTLockBinaryArithWithFlags, 289689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 290689db42cSShengchen Kan SDNPMemOperand]>; 291689db42cSShengchen Kan 292689db42cSShengchen Kandef X86bextr : SDNode<"X86ISD::BEXTR", SDTIntBinOp>; 293689db42cSShengchen Kandef X86bextri : SDNode<"X86ISD::BEXTRI", SDTIntBinOp>; 294689db42cSShengchen Kan 295689db42cSShengchen Kandef X86bzhi : SDNode<"X86ISD::BZHI", SDTIntBinOp>; 296689db42cSShengchen Kan 297689db42cSShengchen Kandef X86pdep : SDNode<"X86ISD::PDEP", SDTIntBinOp>; 298689db42cSShengchen Kandef X86pext : SDNode<"X86ISD::PEXT", SDTIntBinOp>; 299689db42cSShengchen Kan 300689db42cSShengchen Kandef X86mul_imm : SDNode<"X86ISD::MUL_IMM", SDTIntBinOp>; 301689db42cSShengchen Kan 302689db42cSShengchen Kandef X86DynAlloca : SDNode<"X86ISD::DYN_ALLOCA", SDT_X86DYN_ALLOCA, 303689db42cSShengchen Kan [SDNPHasChain, SDNPOutGlue]>; 304689db42cSShengchen Kan 305689db42cSShengchen Kandef X86SegAlloca : SDNode<"X86ISD::SEG_ALLOCA", SDT_X86SEG_ALLOCA, 306689db42cSShengchen Kan [SDNPHasChain]>; 307689db42cSShengchen Kan 308689db42cSShengchen Kandef X86ProbedAlloca : SDNode<"X86ISD::PROBED_ALLOCA", SDT_X86PROBED_ALLOCA, 309689db42cSShengchen Kan [SDNPHasChain]>; 310689db42cSShengchen Kan 311689db42cSShengchen Kandef X86TLSCall : SDNode<"X86ISD::TLSCALL", SDT_X86TLSCALL, 312689db42cSShengchen Kan [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 313689db42cSShengchen Kan 314689db42cSShengchen Kandef X86lwpins : SDNode<"X86ISD::LWPINS", 315689db42cSShengchen Kan SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 316689db42cSShengchen Kan SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 317689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPSideEffect]>; 318689db42cSShengchen Kan 319689db42cSShengchen Kandef X86umwait : SDNode<"X86ISD::UMWAIT", 320689db42cSShengchen Kan SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 321689db42cSShengchen Kan SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 322689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 323689db42cSShengchen Kan 324689db42cSShengchen Kandef X86tpause : SDNode<"X86ISD::TPAUSE", 325689db42cSShengchen Kan SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 326689db42cSShengchen Kan SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 327689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 328689db42cSShengchen Kan 329689db42cSShengchen Kandef X86enqcmd : SDNode<"X86ISD::ENQCMD", SDT_X86ENQCMD, 330689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 331689db42cSShengchen Kandef X86enqcmds : SDNode<"X86ISD::ENQCMDS", SDT_X86ENQCMD, 332689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 333689db42cSShengchen Kandef X86testui : SDNode<"X86ISD::TESTUI", 334689db42cSShengchen Kan SDTypeProfile<1, 0, [SDTCisVT<0, i32>]>, 335689db42cSShengchen Kan [SDNPHasChain, SDNPSideEffect]>; 336689db42cSShengchen Kan 337689db42cSShengchen Kandef X86aesenc128kl : SDNode<"X86ISD::AESENC128KL", SDT_X86AESENCDECKL, 338689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 339689db42cSShengchen Kan SDNPMemOperand]>; 340689db42cSShengchen Kandef X86aesdec128kl : SDNode<"X86ISD::AESDEC128KL", SDT_X86AESENCDECKL, 341689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 342689db42cSShengchen Kan SDNPMemOperand]>; 343689db42cSShengchen Kandef X86aesenc256kl : SDNode<"X86ISD::AESENC256KL", SDT_X86AESENCDECKL, 344689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 345689db42cSShengchen Kan SDNPMemOperand]>; 346689db42cSShengchen Kandef X86aesdec256kl : SDNode<"X86ISD::AESDEC256KL", SDT_X86AESENCDECKL, 347689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 348689db42cSShengchen Kan SDNPMemOperand]>; 349689db42cSShengchen Kan 350689db42cSShengchen Kandef X86cmpccxadd : SDNode<"X86ISD::CMPCCXADD", SDTX86Cmpccxadd, 351689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 352689db42cSShengchen Kan SDNPMemOperand]>; 353689db42cSShengchen Kan 354689db42cSShengchen Kan// Define X86-specific addressing mode. 3556b223260SSergei Barannikovlet WantsParent = true in 3566b223260SSergei Barannikovdef addr : ComplexPattern<iPTR, 5, "selectAddr">; 357689db42cSShengchen Kandef lea32addr : ComplexPattern<i32, 5, "selectLEAAddr", 358689db42cSShengchen Kan [add, sub, mul, X86mul_imm, shl, or, xor, frameindex], 359689db42cSShengchen Kan []>; 360689db42cSShengchen Kan// In 64-bit mode 32-bit LEAs can use RIP-relative addressing. 361689db42cSShengchen Kandef lea64_32addr : ComplexPattern<i32, 5, "selectLEA64_32Addr", 362689db42cSShengchen Kan [add, sub, mul, X86mul_imm, shl, or, xor, 363689db42cSShengchen Kan frameindex, X86WrapperRIP], 364689db42cSShengchen Kan []>; 365689db42cSShengchen Kan 366689db42cSShengchen Kandef tls32addr : ComplexPattern<i32, 5, "selectTLSADDRAddr", 367689db42cSShengchen Kan [tglobaltlsaddr], []>; 368689db42cSShengchen Kan 369689db42cSShengchen Kandef tls32baseaddr : ComplexPattern<i32, 5, "selectTLSADDRAddr", 370689db42cSShengchen Kan [tglobaltlsaddr], []>; 371689db42cSShengchen Kan 372689db42cSShengchen Kandef lea64addr : ComplexPattern<i64, 5, "selectLEAAddr", 373689db42cSShengchen Kan [add, sub, mul, X86mul_imm, shl, or, xor, frameindex, 374689db42cSShengchen Kan X86WrapperRIP], []>; 375689db42cSShengchen Kan 376689db42cSShengchen Kandef tls64addr : ComplexPattern<i64, 5, "selectTLSADDRAddr", 377689db42cSShengchen Kan [tglobaltlsaddr], []>; 378689db42cSShengchen Kan 379689db42cSShengchen Kandef tls64baseaddr : ComplexPattern<i64, 5, "selectTLSADDRAddr", 380689db42cSShengchen Kan [tglobaltlsaddr], []>; 381689db42cSShengchen Kan 3826b223260SSergei Barannikovlet WantsParent = true in 3836b223260SSergei Barannikovdef vectoraddr : ComplexPattern<iPTR, 5, "selectVectorAddr">; 384689db42cSShengchen Kan 385689db42cSShengchen Kan// A relocatable immediate is an operand that can be relocated by the linker to 386689db42cSShengchen Kan// an immediate, such as a regular symbol in non-PIC code. 387689db42cSShengchen Kandef relocImm : ComplexPattern<iAny, 1, "selectRelocImm", 388689db42cSShengchen Kan [X86Wrapper], [], 0>; 389689db42cSShengchen Kan 390689db42cSShengchen Kan// X86 specific condition code. These correspond to CondCode in 391689db42cSShengchen Kan// X86InstrInfo.h. They must be kept in synch. 392689db42cSShengchen Kandef X86_COND_O : PatLeaf<(i8 0)>; 393689db42cSShengchen Kandef X86_COND_NO : PatLeaf<(i8 1)>; 394689db42cSShengchen Kandef X86_COND_B : PatLeaf<(i8 2)>; // alt. COND_C 395689db42cSShengchen Kandef X86_COND_AE : PatLeaf<(i8 3)>; // alt. COND_NC 396689db42cSShengchen Kandef X86_COND_E : PatLeaf<(i8 4)>; // alt. COND_Z 397689db42cSShengchen Kandef X86_COND_NE : PatLeaf<(i8 5)>; // alt. COND_NZ 398689db42cSShengchen Kandef X86_COND_BE : PatLeaf<(i8 6)>; // alt. COND_NA 399689db42cSShengchen Kandef X86_COND_A : PatLeaf<(i8 7)>; // alt. COND_NBE 400689db42cSShengchen Kandef X86_COND_S : PatLeaf<(i8 8)>; 401689db42cSShengchen Kandef X86_COND_NS : PatLeaf<(i8 9)>; 402689db42cSShengchen Kandef X86_COND_P : PatLeaf<(i8 10)>; // alt. COND_PE 403689db42cSShengchen Kandef X86_COND_NP : PatLeaf<(i8 11)>; // alt. COND_PO 404689db42cSShengchen Kandef X86_COND_L : PatLeaf<(i8 12)>; // alt. COND_NGE 405689db42cSShengchen Kandef X86_COND_GE : PatLeaf<(i8 13)>; // alt. COND_NL 406689db42cSShengchen Kandef X86_COND_LE : PatLeaf<(i8 14)>; // alt. COND_NG 407689db42cSShengchen Kandef X86_COND_G : PatLeaf<(i8 15)>; // alt. COND_NLE 408689db42cSShengchen Kan 409689db42cSShengchen Kandef i16immSExt8 : ImmLeaf<i16, [{ return isInt<8>(Imm); }]>; 410689db42cSShengchen Kandef i32immSExt8 : ImmLeaf<i32, [{ return isInt<8>(Imm); }]>; 411689db42cSShengchen Kandef i64immSExt8 : ImmLeaf<i64, [{ return isInt<8>(Imm); }]>; 412689db42cSShengchen Kandef i64immSExt32 : ImmLeaf<i64, [{ return isInt<32>(Imm); }]>; 413689db42cSShengchen Kandef i64timmSExt32 : TImmLeaf<i64, [{ return isInt<32>(Imm); }]>; 414689db42cSShengchen Kan 415689db42cSShengchen Kandef i16relocImmSExt8 : PatLeaf<(i16 relocImm), [{ 416689db42cSShengchen Kan return isSExtAbsoluteSymbolRef(8, N); 417689db42cSShengchen Kan}]>; 418689db42cSShengchen Kandef i32relocImmSExt8 : PatLeaf<(i32 relocImm), [{ 419689db42cSShengchen Kan return isSExtAbsoluteSymbolRef(8, N); 420689db42cSShengchen Kan}]>; 421689db42cSShengchen Kandef i64relocImmSExt8 : PatLeaf<(i64 relocImm), [{ 422689db42cSShengchen Kan return isSExtAbsoluteSymbolRef(8, N); 423689db42cSShengchen Kan}]>; 424689db42cSShengchen Kandef i64relocImmSExt32 : PatLeaf<(i64 relocImm), [{ 425689db42cSShengchen Kan return isSExtAbsoluteSymbolRef(32, N); 426689db42cSShengchen Kan}]>; 427689db42cSShengchen Kan 428689db42cSShengchen Kan// If we have multiple users of an immediate, it's much smaller to reuse 429689db42cSShengchen Kan// the register, rather than encode the immediate in every instruction. 430689db42cSShengchen Kan// This has the risk of increasing register pressure from stretched live 431689db42cSShengchen Kan// ranges, however, the immediates should be trivial to rematerialize by 432689db42cSShengchen Kan// the RA in the event of high register pressure. 433689db42cSShengchen Kan// TODO : This is currently enabled for stores and binary ops. There are more 434689db42cSShengchen Kan// cases for which this can be enabled, though this catches the bulk of the 435689db42cSShengchen Kan// issues. 436689db42cSShengchen Kan// TODO2 : This should really also be enabled under O2, but there's currently 437689db42cSShengchen Kan// an issue with RA where we don't pull the constants into their users 438689db42cSShengchen Kan// when we rematerialize them. I'll follow-up on enabling O2 after we fix that 439689db42cSShengchen Kan// issue. 440689db42cSShengchen Kan// TODO3 : This is currently limited to single basic blocks (DAG creation 441689db42cSShengchen Kan// pulls block immediates to the top and merges them if necessary). 442689db42cSShengchen Kan// Eventually, it would be nice to allow ConstantHoisting to merge constants 443689db42cSShengchen Kan// globally for potentially added savings. 444689db42cSShengchen Kan// 445689db42cSShengchen Kandef imm_su : PatLeaf<(imm), [{ 446689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 447689db42cSShengchen Kan}]>; 448689db42cSShengchen Kandef i64immSExt32_su : PatLeaf<(i64immSExt32), [{ 449689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 450689db42cSShengchen Kan}]>; 451689db42cSShengchen Kan 452689db42cSShengchen Kandef relocImm8_su : PatLeaf<(i8 relocImm), [{ 453689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 454689db42cSShengchen Kan}]>; 455689db42cSShengchen Kandef relocImm16_su : PatLeaf<(i16 relocImm), [{ 456689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 457689db42cSShengchen Kan}]>; 458689db42cSShengchen Kandef relocImm32_su : PatLeaf<(i32 relocImm), [{ 459689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 460689db42cSShengchen Kan}]>; 461689db42cSShengchen Kan 462689db42cSShengchen Kandef i16relocImmSExt8_su : PatLeaf<(i16relocImmSExt8), [{ 463689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 464689db42cSShengchen Kan}]>; 465689db42cSShengchen Kandef i32relocImmSExt8_su : PatLeaf<(i32relocImmSExt8), [{ 466689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 467689db42cSShengchen Kan}]>; 468689db42cSShengchen Kandef i64relocImmSExt8_su : PatLeaf<(i64relocImmSExt8), [{ 469689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 470689db42cSShengchen Kan}]>; 471689db42cSShengchen Kandef i64relocImmSExt32_su : PatLeaf<(i64relocImmSExt32), [{ 472689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 473689db42cSShengchen Kan}]>; 474689db42cSShengchen Kan 475689db42cSShengchen Kandef i16immSExt8_su : PatLeaf<(i16immSExt8), [{ 476689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 477689db42cSShengchen Kan}]>; 478689db42cSShengchen Kandef i32immSExt8_su : PatLeaf<(i32immSExt8), [{ 479689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 480689db42cSShengchen Kan}]>; 481689db42cSShengchen Kandef i64immSExt8_su : PatLeaf<(i64immSExt8), [{ 482689db42cSShengchen Kan return !shouldAvoidImmediateInstFormsForSize(N); 483689db42cSShengchen Kan}]>; 484689db42cSShengchen Kan 485689db42cSShengchen Kan// i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit 486689db42cSShengchen Kan// unsigned field. 487689db42cSShengchen Kandef i64immZExt32 : ImmLeaf<i64, [{ return isUInt<32>(Imm); }]>; 488689db42cSShengchen Kan 489689db42cSShengchen Kandef i64immZExt32SExt8 : ImmLeaf<i64, [{ 490689db42cSShengchen Kan return isUInt<32>(Imm) && isInt<8>(static_cast<int32_t>(Imm)); 491689db42cSShengchen Kan}]>; 492689db42cSShengchen Kan 493689db42cSShengchen Kan// Helper fragments for loads. 494689db42cSShengchen Kan 495689db42cSShengchen Kan// It's safe to fold a zextload/extload from i1 as a regular i8 load. The 496689db42cSShengchen Kan// upper bits are guaranteed to be zero and we were going to emit a MOV8rm 497689db42cSShengchen Kan// which might get folded during peephole anyway. 498689db42cSShengchen Kandef loadi8 : PatFrag<(ops node:$ptr), (i8 (unindexedload node:$ptr)), [{ 499689db42cSShengchen Kan LoadSDNode *LD = cast<LoadSDNode>(N); 500689db42cSShengchen Kan ISD::LoadExtType ExtType = LD->getExtensionType(); 501689db42cSShengchen Kan return ExtType == ISD::NON_EXTLOAD || ExtType == ISD::EXTLOAD || 502689db42cSShengchen Kan ExtType == ISD::ZEXTLOAD; 503689db42cSShengchen Kan}]>; 504689db42cSShengchen Kan 505689db42cSShengchen Kan// It's always safe to treat a anyext i16 load as a i32 load if the i16 is 506689db42cSShengchen Kan// known to be 32-bit aligned or better. Ditto for i8 to i16. 507689db42cSShengchen Kandef loadi16 : PatFrag<(ops node:$ptr), (i16 (unindexedload node:$ptr)), [{ 508689db42cSShengchen Kan LoadSDNode *LD = cast<LoadSDNode>(N); 509689db42cSShengchen Kan ISD::LoadExtType ExtType = LD->getExtensionType(); 510689db42cSShengchen Kan if (ExtType == ISD::NON_EXTLOAD) 511689db42cSShengchen Kan return true; 512689db42cSShengchen Kan if (ExtType == ISD::EXTLOAD && EnablePromoteAnyextLoad) 513689db42cSShengchen Kan return LD->getAlign() >= 2 && LD->isSimple(); 514689db42cSShengchen Kan return false; 515689db42cSShengchen Kan}]>; 516689db42cSShengchen Kan 517689db42cSShengchen Kandef loadi32 : PatFrag<(ops node:$ptr), (i32 (unindexedload node:$ptr)), [{ 518689db42cSShengchen Kan LoadSDNode *LD = cast<LoadSDNode>(N); 519689db42cSShengchen Kan ISD::LoadExtType ExtType = LD->getExtensionType(); 520689db42cSShengchen Kan if (ExtType == ISD::NON_EXTLOAD) 521689db42cSShengchen Kan return true; 522689db42cSShengchen Kan if (ExtType == ISD::EXTLOAD && EnablePromoteAnyextLoad) 523689db42cSShengchen Kan return LD->getAlign() >= 4 && LD->isSimple(); 524689db42cSShengchen Kan return false; 525689db42cSShengchen Kan}]>; 526689db42cSShengchen Kan 527689db42cSShengchen Kandef loadi64 : PatFrag<(ops node:$ptr), (i64 (load node:$ptr))>; 528689db42cSShengchen Kandef loadf16 : PatFrag<(ops node:$ptr), (f16 (load node:$ptr))>; 529689db42cSShengchen Kandef loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>; 530689db42cSShengchen Kandef loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>; 531689db42cSShengchen Kandef loadf80 : PatFrag<(ops node:$ptr), (f80 (load node:$ptr))>; 532689db42cSShengchen Kandef loadf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr))>; 533689db42cSShengchen Kandef alignedloadf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr)), [{ 534689db42cSShengchen Kan LoadSDNode *Ld = cast<LoadSDNode>(N); 535689db42cSShengchen Kan return Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 536689db42cSShengchen Kan}]>; 537689db42cSShengchen Kandef memopf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr)), [{ 538689db42cSShengchen Kan LoadSDNode *Ld = cast<LoadSDNode>(N); 539689db42cSShengchen Kan return Subtarget->hasSSEUnalignedMem() || 540689db42cSShengchen Kan Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 541689db42cSShengchen Kan}]>; 542689db42cSShengchen Kan 543689db42cSShengchen Kandef sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>; 544689db42cSShengchen Kandef sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>; 545689db42cSShengchen Kandef sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>; 546689db42cSShengchen Kandef sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>; 547689db42cSShengchen Kandef sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>; 548689db42cSShengchen Kandef sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>; 549689db42cSShengchen Kan 550689db42cSShengchen Kandef zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>; 551689db42cSShengchen Kandef zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>; 552689db42cSShengchen Kandef zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>; 553689db42cSShengchen Kandef zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>; 554689db42cSShengchen Kandef zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>; 555689db42cSShengchen Kandef zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>; 556689db42cSShengchen Kandef zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>; 557689db42cSShengchen Kandef zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>; 558689db42cSShengchen Kandef zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>; 559689db42cSShengchen Kandef zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>; 560689db42cSShengchen Kan 561689db42cSShengchen Kandef extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>; 562689db42cSShengchen Kandef extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>; 563689db42cSShengchen Kandef extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>; 564689db42cSShengchen Kandef extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>; 565689db42cSShengchen Kandef extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>; 566689db42cSShengchen Kandef extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>; 567689db42cSShengchen Kandef extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>; 568689db42cSShengchen Kandef extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>; 569689db42cSShengchen Kandef extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>; 570689db42cSShengchen Kan 571689db42cSShengchen Kan// We can treat an i8/i16 extending load to i64 as a 32 bit load if its known 572689db42cSShengchen Kan// to be 4 byte aligned or better. 573689db42cSShengchen Kandef extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (unindexedload node:$ptr)), [{ 574689db42cSShengchen Kan LoadSDNode *LD = cast<LoadSDNode>(N); 575689db42cSShengchen Kan ISD::LoadExtType ExtType = LD->getExtensionType(); 576689db42cSShengchen Kan if (ExtType != ISD::EXTLOAD) 577689db42cSShengchen Kan return false; 578689db42cSShengchen Kan if (LD->getMemoryVT() == MVT::i32) 579689db42cSShengchen Kan return true; 580689db42cSShengchen Kan 581689db42cSShengchen Kan return LD->getAlign() >= 4 && LD->isSimple(); 582689db42cSShengchen Kan}]>; 583689db42cSShengchen Kan 584689db42cSShengchen Kan// binary op with only one user 585689db42cSShengchen Kanclass binop_oneuse<SDPatternOperator operator> 586689db42cSShengchen Kan : PatFrag<(ops node:$A, node:$B), 587689db42cSShengchen Kan (operator node:$A, node:$B), [{ 588689db42cSShengchen Kan return N->hasOneUse(); 589689db42cSShengchen Kan}]>; 590689db42cSShengchen Kan 591689db42cSShengchen Kandef add_su : binop_oneuse<add>; 592689db42cSShengchen Kandef and_su : binop_oneuse<and>; 593689db42cSShengchen Kandef srl_su : binop_oneuse<srl>; 594689db42cSShengchen Kan 595331eb8a0SShengchen Kanclass binop_twouses<SDPatternOperator operator> 596331eb8a0SShengchen Kan : PatFrag<(ops node:$A, node:$B), 597331eb8a0SShengchen Kan (operator node:$A, node:$B), [{ 598331eb8a0SShengchen Kan return N->hasNUsesOfValue(2, 0); 599331eb8a0SShengchen Kan}]>; 600331eb8a0SShengchen Kan 601331eb8a0SShengchen Kandef and_du : binop_twouses<and>; 602331eb8a0SShengchen Kan 603689db42cSShengchen Kan// unary op with only one user 604689db42cSShengchen Kanclass unop_oneuse<SDPatternOperator operator> 605689db42cSShengchen Kan : PatFrag<(ops node:$A), 606689db42cSShengchen Kan (operator node:$A), [{ 607689db42cSShengchen Kan return N->hasOneUse(); 608689db42cSShengchen Kan}]>; 609689db42cSShengchen Kan 610689db42cSShengchen Kan 611689db42cSShengchen Kandef ineg_su : unop_oneuse<ineg>; 612689db42cSShengchen Kandef trunc_su : unop_oneuse<trunc>; 613689db42cSShengchen Kan 614689db42cSShengchen Kandef X86add_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 615689db42cSShengchen Kan (X86add_flag node:$lhs, node:$rhs), [{ 616689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 1)); 617689db42cSShengchen Kan}]>; 618689db42cSShengchen Kan 619689db42cSShengchen Kandef X86sub_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 620689db42cSShengchen Kan (X86sub_flag node:$lhs, node:$rhs), [{ 621689db42cSShengchen Kan // Only use DEC if the result is used. 622689db42cSShengchen Kan return !SDValue(N, 0).use_empty() && hasNoCarryFlagUses(SDValue(N, 1)); 623689db42cSShengchen Kan}]>; 624689db42cSShengchen Kan 625689db42cSShengchen Kandef X86testpat : PatFrag<(ops node:$lhs, node:$rhs), 626689db42cSShengchen Kan (X86cmp (and_su node:$lhs, node:$rhs), 0)>; 627331eb8a0SShengchen Kandef X86ctestpat : PatFrag<(ops node:$lhs, node:$rhs, node:$dcf, node:$cond), 628331eb8a0SShengchen Kan (X86ctest (and_du node:$lhs, node:$rhs), 629331eb8a0SShengchen Kan (and_du node:$lhs, node:$rhs), node:$dcf, 630331eb8a0SShengchen Kan node:$cond, EFLAGS)>; 631689db42cSShengchen Kan 632689db42cSShengchen Kandef X86any_fcmp : PatFrags<(ops node:$lhs, node:$rhs), 633689db42cSShengchen Kan [(X86strict_fcmp node:$lhs, node:$rhs), 634689db42cSShengchen Kan (X86fcmp node:$lhs, node:$rhs)]>; 635689db42cSShengchen Kan 636689db42cSShengchen Kandef PrefetchWLevel : PatFrag<(ops), (i32 timm), [{ 6374def1ce1SFreddy Ye return N->getSExtValue() <= 3; 638689db42cSShengchen Kan}]>; 639689db42cSShengchen Kan 640689db42cSShengchen Kandef X86lock_add_nocf : PatFrag<(ops node:$lhs, node:$rhs), 641689db42cSShengchen Kan (X86lock_add node:$lhs, node:$rhs), [{ 642689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 0)); 643689db42cSShengchen Kan}]>; 644689db42cSShengchen Kan 645689db42cSShengchen Kandef X86lock_sub_nocf : PatFrag<(ops node:$lhs, node:$rhs), 646689db42cSShengchen Kan (X86lock_sub node:$lhs, node:$rhs), [{ 647689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 0)); 648689db42cSShengchen Kan}]>; 649689db42cSShengchen Kan 650689db42cSShengchen Kandef X86tcret_6regs : PatFrag<(ops node:$ptr, node:$off), 651689db42cSShengchen Kan (X86tcret node:$ptr, node:$off), [{ 652689db42cSShengchen Kan // X86tcret args: (*chain, ptr, imm, regs..., glue) 653689db42cSShengchen Kan unsigned NumRegs = 0; 654689db42cSShengchen Kan for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i) 655689db42cSShengchen Kan if (isa<RegisterSDNode>(N->getOperand(i)) && ++NumRegs > 6) 656689db42cSShengchen Kan return false; 657689db42cSShengchen Kan return true; 658689db42cSShengchen Kan}]>; 659689db42cSShengchen Kan 660689db42cSShengchen Kandef X86tcret_1reg : PatFrag<(ops node:$ptr, node:$off), 661689db42cSShengchen Kan (X86tcret node:$ptr, node:$off), [{ 662689db42cSShengchen Kan // X86tcret args: (*chain, ptr, imm, regs..., glue) 663689db42cSShengchen Kan unsigned NumRegs = 1; 664689db42cSShengchen Kan const SDValue& BasePtr = cast<LoadSDNode>(N->getOperand(1))->getBasePtr(); 665689db42cSShengchen Kan if (isa<FrameIndexSDNode>(BasePtr)) 666689db42cSShengchen Kan NumRegs = 3; 667689db42cSShengchen Kan else if (BasePtr->getNumOperands() && isa<GlobalAddressSDNode>(BasePtr->getOperand(0))) 668689db42cSShengchen Kan NumRegs = 3; 669689db42cSShengchen Kan for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i) 670689db42cSShengchen Kan if (isa<RegisterSDNode>(N->getOperand(i)) && ( NumRegs-- == 0)) 671689db42cSShengchen Kan return false; 672689db42cSShengchen Kan return true; 673689db42cSShengchen Kan}]>; 674689db42cSShengchen Kan 675689db42cSShengchen Kan// If this is an anyext of the remainder of an 8-bit sdivrem, use a MOVSX 676689db42cSShengchen Kan// instead of a MOVZX. The sdivrem lowering will emit emit a MOVSX to move 677689db42cSShengchen Kan// %ah to the lower byte of a register. By using a MOVSX here we allow a 678689db42cSShengchen Kan// post-isel peephole to merge the two MOVSX instructions into one. 679689db42cSShengchen Kandef anyext_sdiv : PatFrag<(ops node:$lhs), (anyext node:$lhs),[{ 680689db42cSShengchen Kan return (N->getOperand(0).getOpcode() == ISD::SDIVREM && 681689db42cSShengchen Kan N->getOperand(0).getResNo() == 1); 682689db42cSShengchen Kan}]>; 683689db42cSShengchen Kan 684689db42cSShengchen Kan// Any instruction that defines a 32-bit result leaves the high half of the 685689db42cSShengchen Kan// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may 686689db42cSShengchen Kan// be copying from a truncate. AssertSext/AssertZext/AssertAlign aren't saying 687689db42cSShengchen Kan// anything about the upper 32 bits, they're probably just qualifying a 688*90e9895aSSimon Pilgrim// CopyFromReg. FREEZE may be coming from a a truncate. BitScan fall through 689*90e9895aSSimon Pilgrim// values may not zero the upper bits correctly. 690*90e9895aSSimon Pilgrim// Any other 32-bit operation will zero-extend up to 64 bits. 691689db42cSShengchen Kandef def32 : PatLeaf<(i32 GR32:$src), [{ 692689db42cSShengchen Kan return N->getOpcode() != ISD::TRUNCATE && 693689db42cSShengchen Kan N->getOpcode() != TargetOpcode::EXTRACT_SUBREG && 694689db42cSShengchen Kan N->getOpcode() != ISD::CopyFromReg && 695689db42cSShengchen Kan N->getOpcode() != ISD::AssertSext && 696689db42cSShengchen Kan N->getOpcode() != ISD::AssertZext && 697689db42cSShengchen Kan N->getOpcode() != ISD::AssertAlign && 698*90e9895aSSimon Pilgrim N->getOpcode() != ISD::FREEZE && 699*90e9895aSSimon Pilgrim !((N->getOpcode() == X86ISD::BSF || N->getOpcode() == X86ISD::BSR) && 700*90e9895aSSimon Pilgrim (!N->getOperand(0).isUndef() && !isa<ConstantSDNode>(N->getOperand(0)))); 701689db42cSShengchen Kan}]>; 702689db42cSShengchen Kan 703689db42cSShengchen Kan// Treat an 'or' node is as an 'add' if the or'ed bits are known to be zero. 704689db42cSShengchen Kandef or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{ 705689db42cSShengchen Kan if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1))) 706689db42cSShengchen Kan return CurDAG->MaskedValueIsZero(N->getOperand(0), CN->getAPIntValue()); 707689db42cSShengchen Kan 708689db42cSShengchen Kan KnownBits Known0 = CurDAG->computeKnownBits(N->getOperand(0), 0); 709689db42cSShengchen Kan KnownBits Known1 = CurDAG->computeKnownBits(N->getOperand(1), 0); 710689db42cSShengchen Kan return (~Known0.Zero & ~Known1.Zero) == 0; 711689db42cSShengchen Kan}]>; 712689db42cSShengchen Kan 713689db42cSShengchen Kandef shiftMask8 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 714689db42cSShengchen Kan return isUnneededShiftMask(N, 3); 715689db42cSShengchen Kan}]>; 716689db42cSShengchen Kan 717689db42cSShengchen Kandef shiftMask16 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 718689db42cSShengchen Kan return isUnneededShiftMask(N, 4); 719689db42cSShengchen Kan}]>; 720689db42cSShengchen Kan 721689db42cSShengchen Kandef shiftMask32 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 722689db42cSShengchen Kan return isUnneededShiftMask(N, 5); 723689db42cSShengchen Kan}]>; 724689db42cSShengchen Kan 725689db42cSShengchen Kandef shiftMask64 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 726689db42cSShengchen Kan return isUnneededShiftMask(N, 6); 727689db42cSShengchen Kan}]>; 728689db42cSShengchen Kan 729689db42cSShengchen Kan//===----------------------------------------------------------------------===// 730689db42cSShengchen Kan// Pattern fragments to auto generate BMI instructions. 731689db42cSShengchen Kan//===----------------------------------------------------------------------===// 732689db42cSShengchen Kan 733689db42cSShengchen Kandef or_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 734689db42cSShengchen Kan (X86or_flag node:$lhs, node:$rhs), [{ 735689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 1)); 736689db42cSShengchen Kan}]>; 737689db42cSShengchen Kan 738689db42cSShengchen Kandef xor_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 739689db42cSShengchen Kan (X86xor_flag node:$lhs, node:$rhs), [{ 740689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 1)); 741689db42cSShengchen Kan}]>; 742689db42cSShengchen Kan 743689db42cSShengchen Kandef and_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 744689db42cSShengchen Kan (X86and_flag node:$lhs, node:$rhs), [{ 745689db42cSShengchen Kan return hasNoCarryFlagUses(SDValue(N, 1)); 746689db42cSShengchen Kan}]>; 747689db42cSShengchen Kan 748689db42cSShengchen Kan//===----------------------------------------------------------------------===// 749689db42cSShengchen Kan// FPStack specific DAG Nodes. 750689db42cSShengchen Kan//===----------------------------------------------------------------------===// 751689db42cSShengchen Kan 752689db42cSShengchen Kandef SDTX86Fld : SDTypeProfile<1, 1, [SDTCisFP<0>, 753689db42cSShengchen Kan SDTCisPtrTy<1>]>; 754689db42cSShengchen Kandef SDTX86Fst : SDTypeProfile<0, 2, [SDTCisFP<0>, 755689db42cSShengchen Kan SDTCisPtrTy<1>]>; 756689db42cSShengchen Kandef SDTX86Fild : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisPtrTy<1>]>; 757689db42cSShengchen Kandef SDTX86Fist : SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisPtrTy<1>]>; 758689db42cSShengchen Kan 759689db42cSShengchen Kandef SDTX86CwdStore : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 760689db42cSShengchen Kandef SDTX86CwdLoad : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 761689db42cSShengchen Kandef SDTX86FPEnv : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 762689db42cSShengchen Kan 763689db42cSShengchen Kandef X86fp80_add : SDNode<"X86ISD::FP80_ADD", SDTFPBinOp, [SDNPCommutative]>; 764689db42cSShengchen Kandef X86strict_fp80_add : SDNode<"X86ISD::STRICT_FP80_ADD", SDTFPBinOp, 765689db42cSShengchen Kan [SDNPHasChain,SDNPCommutative]>; 766689db42cSShengchen Kandef any_X86fp80_add : PatFrags<(ops node:$lhs, node:$rhs), 767689db42cSShengchen Kan [(X86strict_fp80_add node:$lhs, node:$rhs), 768689db42cSShengchen Kan (X86fp80_add node:$lhs, node:$rhs)]>; 769689db42cSShengchen Kan 770689db42cSShengchen Kandef X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, 771689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 772689db42cSShengchen Kandef X86fst : SDNode<"X86ISD::FST", SDTX86Fst, 773689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 774689db42cSShengchen Kandef X86fild : SDNode<"X86ISD::FILD", SDTX86Fild, 775689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 776689db42cSShengchen Kandef X86fist : SDNode<"X86ISD::FIST", SDTX86Fist, 777689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 778689db42cSShengchen Kandef X86fp_to_mem : SDNode<"X86ISD::FP_TO_INT_IN_MEM", SDTX86Fst, 779689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 780689db42cSShengchen Kandef X86fp_cwd_get16 : SDNode<"X86ISD::FNSTCW16m", SDTX86CwdStore, 781689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPSideEffect, 782689db42cSShengchen Kan SDNPMemOperand]>; 783689db42cSShengchen Kandef X86fp_cwd_set16 : SDNode<"X86ISD::FLDCW16m", SDTX86CwdLoad, 784689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 785689db42cSShengchen Kan SDNPMemOperand]>; 786689db42cSShengchen Kandef X86fpenv_get : SDNode<"X86ISD::FNSTENVm", SDTX86FPEnv, 787689db42cSShengchen Kan [SDNPHasChain, SDNPMayStore, SDNPSideEffect, 788689db42cSShengchen Kan SDNPMemOperand]>; 789689db42cSShengchen Kandef X86fpenv_set : SDNode<"X86ISD::FLDENVm", SDTX86FPEnv, 790689db42cSShengchen Kan [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 791689db42cSShengchen Kan SDNPMemOperand]>; 792689db42cSShengchen Kan 793689db42cSShengchen Kandef X86fstf32 : PatFrag<(ops node:$val, node:$ptr), 794689db42cSShengchen Kan (X86fst node:$val, node:$ptr), [{ 795689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32; 796689db42cSShengchen Kan}]>; 797689db42cSShengchen Kandef X86fstf64 : PatFrag<(ops node:$val, node:$ptr), 798689db42cSShengchen Kan (X86fst node:$val, node:$ptr), [{ 799689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64; 800689db42cSShengchen Kan}]>; 801689db42cSShengchen Kandef X86fstf80 : PatFrag<(ops node:$val, node:$ptr), 802689db42cSShengchen Kan (X86fst node:$val, node:$ptr), [{ 803689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80; 804689db42cSShengchen Kan}]>; 805689db42cSShengchen Kan 806689db42cSShengchen Kandef X86fldf32 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 807689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32; 808689db42cSShengchen Kan}]>; 809689db42cSShengchen Kandef X86fldf64 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 810689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64; 811689db42cSShengchen Kan}]>; 812689db42cSShengchen Kandef X86fldf80 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 813689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80; 814689db42cSShengchen Kan}]>; 815689db42cSShengchen Kan 816689db42cSShengchen Kandef X86fild16 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 817689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 818689db42cSShengchen Kan}]>; 819689db42cSShengchen Kandef X86fild32 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 820689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 821689db42cSShengchen Kan}]>; 822689db42cSShengchen Kandef X86fild64 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 823689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 824689db42cSShengchen Kan}]>; 825689db42cSShengchen Kan 826689db42cSShengchen Kandef X86fist32 : PatFrag<(ops node:$val, node:$ptr), 827689db42cSShengchen Kan (X86fist node:$val, node:$ptr), [{ 828689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 829689db42cSShengchen Kan}]>; 830689db42cSShengchen Kan 831689db42cSShengchen Kandef X86fist64 : PatFrag<(ops node:$val, node:$ptr), 832689db42cSShengchen Kan (X86fist node:$val, node:$ptr), [{ 833689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 834689db42cSShengchen Kan}]>; 835689db42cSShengchen Kan 836689db42cSShengchen Kandef X86fp_to_i16mem : PatFrag<(ops node:$val, node:$ptr), 837689db42cSShengchen Kan (X86fp_to_mem node:$val, node:$ptr), [{ 838689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 839689db42cSShengchen Kan}]>; 840689db42cSShengchen Kandef X86fp_to_i32mem : PatFrag<(ops node:$val, node:$ptr), 841689db42cSShengchen Kan (X86fp_to_mem node:$val, node:$ptr), [{ 842689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 843689db42cSShengchen Kan}]>; 844689db42cSShengchen Kandef X86fp_to_i64mem : PatFrag<(ops node:$val, node:$ptr), 845689db42cSShengchen Kan (X86fp_to_mem node:$val, node:$ptr), [{ 846689db42cSShengchen Kan return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 847689db42cSShengchen Kan}]>; 848689db42cSShengchen Kan 849689db42cSShengchen Kan//===----------------------------------------------------------------------===// 850689db42cSShengchen Kan// FPStack pattern fragments 851689db42cSShengchen Kan//===----------------------------------------------------------------------===// 852689db42cSShengchen Kan 853689db42cSShengchen Kandef fpimm0 : FPImmLeaf<fAny, [{ 854689db42cSShengchen Kan return Imm.isExactlyValue(+0.0); 855689db42cSShengchen Kan}]>; 856689db42cSShengchen Kan 857689db42cSShengchen Kandef fpimmneg0 : FPImmLeaf<fAny, [{ 858689db42cSShengchen Kan return Imm.isExactlyValue(-0.0); 859689db42cSShengchen Kan}]>; 860689db42cSShengchen Kan 861689db42cSShengchen Kandef fpimm1 : FPImmLeaf<fAny, [{ 862689db42cSShengchen Kan return Imm.isExactlyValue(+1.0); 863689db42cSShengchen Kan}]>; 864689db42cSShengchen Kan 865689db42cSShengchen Kandef fpimmneg1 : FPImmLeaf<fAny, [{ 866689db42cSShengchen Kan return Imm.isExactlyValue(-1.0); 867689db42cSShengchen Kan}]>; 868