15f757f3fSDimitry Andric//===----------X86InstrFragments - X86 Pattern fragments. --*- tablegen -*-===// 25f757f3fSDimitry Andric// 35f757f3fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45f757f3fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 55f757f3fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65f757f3fSDimitry Andric// 75f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 85f757f3fSDimitry Andric 95f757f3fSDimitry Andric// X86-specific DAG node. 105f757f3fSDimitry Andricdef SDTX86CmpTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisInt<1>, 115f757f3fSDimitry Andric SDTCisSameAs<1, 2>]>; 125f757f3fSDimitry Andricdef SDTX86FCmp : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisFP<1>, 135f757f3fSDimitry Andric SDTCisSameAs<1, 2>]>; 145f757f3fSDimitry Andric 15*0fca6ea1SDimitry Andricdef SDTX86Ccmp : SDTypeProfile<1, 5, 16*0fca6ea1SDimitry Andric [SDTCisVT<3, i8>, SDTCisVT<4, i8>, SDTCisVT<5, i32>]>; 17*0fca6ea1SDimitry Andric 18*0fca6ea1SDimitry Andric// RES = op PTR, PASSTHRU, COND, EFLAGS 19*0fca6ea1SDimitry Andricdef SDTX86Cload : SDTypeProfile<1, 4, 20*0fca6ea1SDimitry Andric [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisSameAs<0, 2>, 21*0fca6ea1SDimitry Andric SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; 22*0fca6ea1SDimitry Andric// op VAL, PTR, COND, EFLAGS 23*0fca6ea1SDimitry Andricdef SDTX86Cstore : SDTypeProfile<0, 4, 24*0fca6ea1SDimitry Andric [SDTCisInt<0>, SDTCisPtrTy<1>, 25*0fca6ea1SDimitry Andric SDTCisVT<2, i8>, SDTCisVT<3, i32>]>; 26*0fca6ea1SDimitry Andric 275f757f3fSDimitry Andricdef SDTX86Cmov : SDTypeProfile<1, 4, 285f757f3fSDimitry Andric [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 295f757f3fSDimitry Andric SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; 305f757f3fSDimitry Andric 315f757f3fSDimitry Andric// Unary and binary operator instructions that set EFLAGS as a side-effect. 325f757f3fSDimitry Andricdef SDTUnaryArithWithFlags : SDTypeProfile<2, 1, 335f757f3fSDimitry Andric [SDTCisSameAs<0, 2>, 345f757f3fSDimitry Andric SDTCisInt<0>, SDTCisVT<1, i32>]>; 355f757f3fSDimitry Andric 365f757f3fSDimitry Andricdef SDTBinaryArithWithFlags : SDTypeProfile<2, 2, 375f757f3fSDimitry Andric [SDTCisSameAs<0, 2>, 385f757f3fSDimitry Andric SDTCisSameAs<0, 3>, 395f757f3fSDimitry Andric SDTCisInt<0>, SDTCisVT<1, i32>]>; 405f757f3fSDimitry Andric 415f757f3fSDimitry Andric// SDTBinaryArithWithFlagsInOut - RES1, EFLAGS = op LHS, RHS, EFLAGS 425f757f3fSDimitry Andricdef SDTBinaryArithWithFlagsInOut : SDTypeProfile<2, 3, 435f757f3fSDimitry Andric [SDTCisSameAs<0, 2>, 445f757f3fSDimitry Andric SDTCisSameAs<0, 3>, 455f757f3fSDimitry Andric SDTCisInt<0>, 465f757f3fSDimitry Andric SDTCisVT<1, i32>, 475f757f3fSDimitry Andric SDTCisVT<4, i32>]>; 485f757f3fSDimitry Andric// RES1, RES2, FLAGS = op LHS, RHS 495f757f3fSDimitry Andricdef SDT2ResultBinaryArithWithFlags : SDTypeProfile<3, 2, 505f757f3fSDimitry Andric [SDTCisSameAs<0, 1>, 515f757f3fSDimitry Andric SDTCisSameAs<0, 2>, 525f757f3fSDimitry Andric SDTCisSameAs<0, 3>, 535f757f3fSDimitry Andric SDTCisInt<0>, SDTCisVT<1, i32>]>; 545f757f3fSDimitry Andricdef SDTX86BrCond : SDTypeProfile<0, 3, 555f757f3fSDimitry Andric [SDTCisVT<0, OtherVT>, 565f757f3fSDimitry Andric SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 575f757f3fSDimitry Andric 585f757f3fSDimitry Andricdef SDTX86SetCC : SDTypeProfile<1, 2, 595f757f3fSDimitry Andric [SDTCisVT<0, i8>, 605f757f3fSDimitry Andric SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 615f757f3fSDimitry Andricdef SDTX86SetCC_C : SDTypeProfile<1, 2, 625f757f3fSDimitry Andric [SDTCisInt<0>, 635f757f3fSDimitry Andric SDTCisVT<1, i8>, SDTCisVT<2, i32>]>; 645f757f3fSDimitry Andric 655f757f3fSDimitry Andricdef SDTX86sahf : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i8>]>; 665f757f3fSDimitry Andric 675f757f3fSDimitry Andricdef SDTX86rdrand : SDTypeProfile<2, 0, [SDTCisInt<0>, SDTCisVT<1, i32>]>; 685f757f3fSDimitry Andric 695f757f3fSDimitry Andricdef SDTX86rdpkru : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 705f757f3fSDimitry Andricdef SDTX86wrpkru : SDTypeProfile<0, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, 715f757f3fSDimitry Andric SDTCisVT<2, i32>]>; 725f757f3fSDimitry Andric 735f757f3fSDimitry Andricdef SDTX86cas : SDTypeProfile<0, 3, [SDTCisPtrTy<0>, SDTCisInt<1>, 745f757f3fSDimitry Andric SDTCisVT<2, i8>]>; 755f757f3fSDimitry Andricdef SDTX86cas8pair : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 765f757f3fSDimitry Andricdef SDTX86cas16pair : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i64>]>; 775f757f3fSDimitry Andric 785f757f3fSDimitry Andricdef SDTLockBinaryArithWithFlags : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 795f757f3fSDimitry Andric SDTCisPtrTy<1>, 805f757f3fSDimitry Andric SDTCisInt<2>]>; 815f757f3fSDimitry Andric 825f757f3fSDimitry Andricdef SDTLockUnaryArithWithFlags : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, 835f757f3fSDimitry Andric SDTCisPtrTy<1>]>; 845f757f3fSDimitry Andric 855f757f3fSDimitry Andricdef SDTX86Ret : SDTypeProfile<0, -1, [SDTCisVT<0, i32>]>; 865f757f3fSDimitry Andric 875f757f3fSDimitry Andricdef SDT_X86CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>, 885f757f3fSDimitry Andric SDTCisVT<1, i32>]>; 895f757f3fSDimitry Andricdef SDT_X86CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>, 905f757f3fSDimitry Andric SDTCisVT<1, i32>]>; 915f757f3fSDimitry Andric 925f757f3fSDimitry Andricdef SDT_X86Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; 935f757f3fSDimitry Andric 945f757f3fSDimitry Andricdef SDT_X86NtBrind : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; 955f757f3fSDimitry Andric 965f757f3fSDimitry Andricdef SDT_X86VASTART_SAVE_XMM_REGS : SDTypeProfile<0, -1, [SDTCisVT<0, i8>, 975f757f3fSDimitry Andric SDTCisPtrTy<1>]>; 985f757f3fSDimitry Andric 995f757f3fSDimitry Andricdef SDT_X86VAARG : SDTypeProfile<1, -1, [SDTCisPtrTy<0>, 1005f757f3fSDimitry Andric SDTCisPtrTy<1>, 1015f757f3fSDimitry Andric SDTCisVT<2, i32>, 1025f757f3fSDimitry Andric SDTCisVT<3, i8>, 1035f757f3fSDimitry Andric SDTCisVT<4, i32>]>; 1045f757f3fSDimitry Andric 1055f757f3fSDimitry Andricdef SDTX86RepStr : SDTypeProfile<0, 1, [SDTCisVT<0, OtherVT>]>; 1065f757f3fSDimitry Andric 1075f757f3fSDimitry Andricdef SDTX86Void : SDTypeProfile<0, 0, []>; 1085f757f3fSDimitry Andric 1095f757f3fSDimitry Andricdef SDTX86Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; 1105f757f3fSDimitry Andric 1115f757f3fSDimitry Andricdef SDT_X86TLSADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 1125f757f3fSDimitry Andric 1135f757f3fSDimitry Andricdef SDT_X86TLSBASEADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 1145f757f3fSDimitry Andric 1155f757f3fSDimitry Andricdef SDT_X86TLSCALL : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 1165f757f3fSDimitry Andric 1175f757f3fSDimitry Andricdef SDT_X86DYN_ALLOCA : SDTypeProfile<0, 1, [SDTCisVT<0, iPTR>]>; 1185f757f3fSDimitry Andric 1195f757f3fSDimitry Andricdef SDT_X86SEG_ALLOCA : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; 1205f757f3fSDimitry Andric 1215f757f3fSDimitry Andricdef SDT_X86PROBED_ALLOCA : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; 1225f757f3fSDimitry Andric 1235f757f3fSDimitry Andricdef SDT_X86EHRET : SDTypeProfile<0, 1, [SDTCisInt<0>]>; 1245f757f3fSDimitry Andric 1255f757f3fSDimitry Andricdef SDT_X86TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i32>]>; 1265f757f3fSDimitry Andric 1275f757f3fSDimitry Andricdef SDT_X86ENQCMD : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 1285f757f3fSDimitry Andric SDTCisPtrTy<1>, SDTCisSameAs<1, 2>]>; 1295f757f3fSDimitry Andric 1305f757f3fSDimitry Andricdef SDT_X86AESENCDECKL : SDTypeProfile<2, 2, [SDTCisVT<0, v2i64>, 1315f757f3fSDimitry Andric SDTCisVT<1, i32>, 1325f757f3fSDimitry Andric SDTCisVT<2, v2i64>, 1335f757f3fSDimitry Andric SDTCisPtrTy<3>]>; 1345f757f3fSDimitry Andric 1355f757f3fSDimitry Andricdef SDTX86Cmpccxadd : SDTypeProfile<1, 4, [SDTCisSameAs<0, 2>, 1365f757f3fSDimitry Andric SDTCisPtrTy<1>, SDTCisSameAs<2, 3>, 1375f757f3fSDimitry Andric SDTCisVT<4, i8>]>; 1385f757f3fSDimitry Andric 1395f757f3fSDimitry Andricdef X86MFence : SDNode<"X86ISD::MFENCE", SDTNone, [SDNPHasChain]>; 1405f757f3fSDimitry Andric 1415f757f3fSDimitry Andric 1425f757f3fSDimitry Andricdef X86bsf : SDNode<"X86ISD::BSF", SDTUnaryArithWithFlags>; 1435f757f3fSDimitry Andricdef X86bsr : SDNode<"X86ISD::BSR", SDTUnaryArithWithFlags>; 1445f757f3fSDimitry Andricdef X86fshl : SDNode<"X86ISD::FSHL", SDTIntShiftDOp>; 1455f757f3fSDimitry Andricdef X86fshr : SDNode<"X86ISD::FSHR", SDTIntShiftDOp>; 1465f757f3fSDimitry Andric 1475f757f3fSDimitry Andricdef X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest>; 1485f757f3fSDimitry Andricdef X86fcmp : SDNode<"X86ISD::FCMP", SDTX86FCmp>; 1495f757f3fSDimitry Andricdef X86strict_fcmp : SDNode<"X86ISD::STRICT_FCMP", SDTX86FCmp, [SDNPHasChain]>; 1505f757f3fSDimitry Andricdef X86strict_fcmps : SDNode<"X86ISD::STRICT_FCMPS", SDTX86FCmp, [SDNPHasChain]>; 1515f757f3fSDimitry Andricdef X86bt : SDNode<"X86ISD::BT", SDTX86CmpTest>; 1525f757f3fSDimitry Andric 153*0fca6ea1SDimitry Andricdef X86ccmp : SDNode<"X86ISD::CCMP", SDTX86Ccmp>; 154*0fca6ea1SDimitry Andricdef X86ctest : SDNode<"X86ISD::CTEST", SDTX86Ccmp>; 155*0fca6ea1SDimitry Andric 156*0fca6ea1SDimitry Andricdef X86cload : SDNode<"X86ISD::CLOAD", SDTX86Cload, [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 157*0fca6ea1SDimitry Andricdef X86cstore : SDNode<"X86ISD::CSTORE", SDTX86Cstore, [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 158*0fca6ea1SDimitry Andric 1595f757f3fSDimitry Andricdef X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov>; 1605f757f3fSDimitry Andricdef X86brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, 1615f757f3fSDimitry Andric [SDNPHasChain]>; 1625f757f3fSDimitry Andricdef X86setcc : SDNode<"X86ISD::SETCC", SDTX86SetCC>; 1635f757f3fSDimitry Andricdef X86setcc_c : SDNode<"X86ISD::SETCC_CARRY", SDTX86SetCC_C>; 1645f757f3fSDimitry Andric 1655f757f3fSDimitry Andricdef X86rdrand : SDNode<"X86ISD::RDRAND", SDTX86rdrand, 1665f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 1675f757f3fSDimitry Andric 1685f757f3fSDimitry Andricdef X86rdseed : SDNode<"X86ISD::RDSEED", SDTX86rdrand, 1695f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 1705f757f3fSDimitry Andric 1715f757f3fSDimitry Andricdef X86rdpkru : SDNode<"X86ISD::RDPKRU", SDTX86rdpkru, 1725f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 1735f757f3fSDimitry Andricdef X86wrpkru : SDNode<"X86ISD::WRPKRU", SDTX86wrpkru, 1745f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 1755f757f3fSDimitry Andric 1765f757f3fSDimitry Andricdef X86cas : SDNode<"X86ISD::LCMPXCHG_DAG", SDTX86cas, 1775f757f3fSDimitry Andric [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 1785f757f3fSDimitry Andric SDNPMayLoad, SDNPMemOperand]>; 1795f757f3fSDimitry Andricdef X86cas8 : SDNode<"X86ISD::LCMPXCHG8_DAG", SDTX86cas8pair, 1805f757f3fSDimitry Andric [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 1815f757f3fSDimitry Andric SDNPMayLoad, SDNPMemOperand]>; 1825f757f3fSDimitry Andricdef X86cas16 : SDNode<"X86ISD::LCMPXCHG16_DAG", SDTX86cas16pair, 1835f757f3fSDimitry Andric [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 1845f757f3fSDimitry Andric SDNPMayLoad, SDNPMemOperand]>; 1855f757f3fSDimitry Andric 1865f757f3fSDimitry Andricdef X86retglue : SDNode<"X86ISD::RET_GLUE", SDTX86Ret, 1875f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 1885f757f3fSDimitry Andricdef X86iret : SDNode<"X86ISD::IRET", SDTX86Ret, 1895f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue]>; 1905f757f3fSDimitry Andric 1915f757f3fSDimitry Andricdef X86vastart_save_xmm_regs : 1925f757f3fSDimitry Andric SDNode<"X86ISD::VASTART_SAVE_XMM_REGS", 1935f757f3fSDimitry Andric SDT_X86VASTART_SAVE_XMM_REGS, 1945f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPVariadic]>; 1955f757f3fSDimitry Andricdef X86vaarg64 : 1965f757f3fSDimitry Andric SDNode<"X86ISD::VAARG_64", SDT_X86VAARG, 1975f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 1985f757f3fSDimitry Andric SDNPMemOperand]>; 1995f757f3fSDimitry Andricdef X86vaargx32 : 2005f757f3fSDimitry Andric SDNode<"X86ISD::VAARG_X32", SDT_X86VAARG, 2015f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 2025f757f3fSDimitry Andric SDNPMemOperand]>; 2035f757f3fSDimitry Andricdef X86callseq_start : 2045f757f3fSDimitry Andric SDNode<"ISD::CALLSEQ_START", SDT_X86CallSeqStart, 2055f757f3fSDimitry Andric [SDNPHasChain, SDNPOutGlue]>; 2065f757f3fSDimitry Andricdef X86callseq_end : 2075f757f3fSDimitry Andric SDNode<"ISD::CALLSEQ_END", SDT_X86CallSeqEnd, 2085f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 2095f757f3fSDimitry Andric 2105f757f3fSDimitry Andricdef X86call : SDNode<"X86ISD::CALL", SDT_X86Call, 2115f757f3fSDimitry Andric [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 2125f757f3fSDimitry Andric SDNPVariadic]>; 2135f757f3fSDimitry Andric 2145f757f3fSDimitry Andricdef X86call_rvmarker : SDNode<"X86ISD::CALL_RVMARKER", SDT_X86Call, 2155f757f3fSDimitry Andric [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 2165f757f3fSDimitry Andric SDNPVariadic]>; 2175f757f3fSDimitry Andric 2185f757f3fSDimitry Andric 2195f757f3fSDimitry Andricdef X86NoTrackCall : SDNode<"X86ISD::NT_CALL", SDT_X86Call, 2205f757f3fSDimitry Andric [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 2215f757f3fSDimitry Andric SDNPVariadic]>; 2225f757f3fSDimitry Andricdef X86NoTrackBrind : SDNode<"X86ISD::NT_BRIND", SDT_X86NtBrind, 2235f757f3fSDimitry Andric [SDNPHasChain]>; 2245f757f3fSDimitry Andric 2255f757f3fSDimitry Andricdef X86rep_stos: SDNode<"X86ISD::REP_STOS", SDTX86RepStr, 2265f757f3fSDimitry Andric [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore]>; 2275f757f3fSDimitry Andricdef X86rep_movs: SDNode<"X86ISD::REP_MOVS", SDTX86RepStr, 2285f757f3fSDimitry Andric [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, 2295f757f3fSDimitry Andric SDNPMayLoad]>; 2305f757f3fSDimitry Andric 2315f757f3fSDimitry Andricdef X86Wrapper : SDNode<"X86ISD::Wrapper", SDTX86Wrapper>; 2325f757f3fSDimitry Andricdef X86WrapperRIP : SDNode<"X86ISD::WrapperRIP", SDTX86Wrapper>; 2335f757f3fSDimitry Andric 2345f757f3fSDimitry Andricdef X86RecoverFrameAlloc : SDNode<"ISD::LOCAL_RECOVER", 2355f757f3fSDimitry Andric SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, 2365f757f3fSDimitry Andric SDTCisInt<1>]>>; 2375f757f3fSDimitry Andric 2385f757f3fSDimitry Andricdef X86tlsaddr : SDNode<"X86ISD::TLSADDR", SDT_X86TLSADDR, 2395f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 2405f757f3fSDimitry Andric 2415f757f3fSDimitry Andricdef X86tlsbaseaddr : SDNode<"X86ISD::TLSBASEADDR", SDT_X86TLSBASEADDR, 2425f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 2435f757f3fSDimitry Andric 244*0fca6ea1SDimitry Andricdef X86tlsdesc : SDNode<"X86ISD::TLSDESC", SDT_X86TLSADDR, 245*0fca6ea1SDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 246*0fca6ea1SDimitry Andric 2475f757f3fSDimitry Andricdef X86ehret : SDNode<"X86ISD::EH_RETURN", SDT_X86EHRET, 2485f757f3fSDimitry Andric [SDNPHasChain]>; 2495f757f3fSDimitry Andric 2505f757f3fSDimitry Andricdef X86eh_sjlj_setjmp : SDNode<"X86ISD::EH_SJLJ_SETJMP", 2515f757f3fSDimitry Andric SDTypeProfile<1, 1, [SDTCisInt<0>, 2525f757f3fSDimitry Andric SDTCisPtrTy<1>]>, 2535f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 2545f757f3fSDimitry Andricdef X86eh_sjlj_longjmp : SDNode<"X86ISD::EH_SJLJ_LONGJMP", 2555f757f3fSDimitry Andric SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>, 2565f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 2575f757f3fSDimitry Andricdef X86eh_sjlj_setup_dispatch : SDNode<"X86ISD::EH_SJLJ_SETUP_DISPATCH", 2585f757f3fSDimitry Andric SDTypeProfile<0, 0, []>, 2595f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 2605f757f3fSDimitry Andric 2615f757f3fSDimitry Andricdef X86tcret : SDNode<"X86ISD::TC_RETURN", SDT_X86TCRET, 2625f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 2635f757f3fSDimitry Andric 2645f757f3fSDimitry Andricdef X86add_flag : SDNode<"X86ISD::ADD", SDTBinaryArithWithFlags, 2655f757f3fSDimitry Andric [SDNPCommutative]>; 2665f757f3fSDimitry Andricdef X86sub_flag : SDNode<"X86ISD::SUB", SDTBinaryArithWithFlags>; 2675f757f3fSDimitry Andricdef X86smul_flag : SDNode<"X86ISD::SMUL", SDTBinaryArithWithFlags, 2685f757f3fSDimitry Andric [SDNPCommutative]>; 2695f757f3fSDimitry Andricdef X86umul_flag : SDNode<"X86ISD::UMUL", SDT2ResultBinaryArithWithFlags, 2705f757f3fSDimitry Andric [SDNPCommutative]>; 2715f757f3fSDimitry Andricdef X86adc_flag : SDNode<"X86ISD::ADC", SDTBinaryArithWithFlagsInOut>; 2725f757f3fSDimitry Andricdef X86sbb_flag : SDNode<"X86ISD::SBB", SDTBinaryArithWithFlagsInOut>; 2735f757f3fSDimitry Andric 2745f757f3fSDimitry Andricdef X86or_flag : SDNode<"X86ISD::OR", SDTBinaryArithWithFlags, 2755f757f3fSDimitry Andric [SDNPCommutative]>; 2765f757f3fSDimitry Andricdef X86xor_flag : SDNode<"X86ISD::XOR", SDTBinaryArithWithFlags, 2775f757f3fSDimitry Andric [SDNPCommutative]>; 2785f757f3fSDimitry Andricdef X86and_flag : SDNode<"X86ISD::AND", SDTBinaryArithWithFlags, 2795f757f3fSDimitry Andric [SDNPCommutative]>; 2805f757f3fSDimitry Andric 2815f757f3fSDimitry Andricdef X86lock_add : SDNode<"X86ISD::LADD", SDTLockBinaryArithWithFlags, 2825f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 2835f757f3fSDimitry Andric SDNPMemOperand]>; 2845f757f3fSDimitry Andricdef X86lock_sub : SDNode<"X86ISD::LSUB", SDTLockBinaryArithWithFlags, 2855f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 2865f757f3fSDimitry Andric SDNPMemOperand]>; 2875f757f3fSDimitry Andricdef X86lock_or : SDNode<"X86ISD::LOR", SDTLockBinaryArithWithFlags, 2885f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 2895f757f3fSDimitry Andric SDNPMemOperand]>; 2905f757f3fSDimitry Andricdef X86lock_xor : SDNode<"X86ISD::LXOR", SDTLockBinaryArithWithFlags, 2915f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 2925f757f3fSDimitry Andric SDNPMemOperand]>; 2935f757f3fSDimitry Andricdef X86lock_and : SDNode<"X86ISD::LAND", SDTLockBinaryArithWithFlags, 2945f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, 2955f757f3fSDimitry Andric SDNPMemOperand]>; 2965f757f3fSDimitry Andric 2975f757f3fSDimitry Andricdef X86bextr : SDNode<"X86ISD::BEXTR", SDTIntBinOp>; 2985f757f3fSDimitry Andricdef X86bextri : SDNode<"X86ISD::BEXTRI", SDTIntBinOp>; 2995f757f3fSDimitry Andric 3005f757f3fSDimitry Andricdef X86bzhi : SDNode<"X86ISD::BZHI", SDTIntBinOp>; 3015f757f3fSDimitry Andric 3025f757f3fSDimitry Andricdef X86pdep : SDNode<"X86ISD::PDEP", SDTIntBinOp>; 3035f757f3fSDimitry Andricdef X86pext : SDNode<"X86ISD::PEXT", SDTIntBinOp>; 3045f757f3fSDimitry Andric 3055f757f3fSDimitry Andricdef X86mul_imm : SDNode<"X86ISD::MUL_IMM", SDTIntBinOp>; 3065f757f3fSDimitry Andric 3075f757f3fSDimitry Andricdef X86DynAlloca : SDNode<"X86ISD::DYN_ALLOCA", SDT_X86DYN_ALLOCA, 3085f757f3fSDimitry Andric [SDNPHasChain, SDNPOutGlue]>; 3095f757f3fSDimitry Andric 3105f757f3fSDimitry Andricdef X86SegAlloca : SDNode<"X86ISD::SEG_ALLOCA", SDT_X86SEG_ALLOCA, 3115f757f3fSDimitry Andric [SDNPHasChain]>; 3125f757f3fSDimitry Andric 3135f757f3fSDimitry Andricdef X86ProbedAlloca : SDNode<"X86ISD::PROBED_ALLOCA", SDT_X86PROBED_ALLOCA, 3145f757f3fSDimitry Andric [SDNPHasChain]>; 3155f757f3fSDimitry Andric 3165f757f3fSDimitry Andricdef X86TLSCall : SDNode<"X86ISD::TLSCALL", SDT_X86TLSCALL, 3175f757f3fSDimitry Andric [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 3185f757f3fSDimitry Andric 3195f757f3fSDimitry Andricdef X86lwpins : SDNode<"X86ISD::LWPINS", 3205f757f3fSDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 3215f757f3fSDimitry Andric SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 3225f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPSideEffect]>; 3235f757f3fSDimitry Andric 3245f757f3fSDimitry Andricdef X86umwait : SDNode<"X86ISD::UMWAIT", 3255f757f3fSDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 3265f757f3fSDimitry Andric SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 3275f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 3285f757f3fSDimitry Andric 3295f757f3fSDimitry Andricdef X86tpause : SDNode<"X86ISD::TPAUSE", 3305f757f3fSDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisInt<1>, 3315f757f3fSDimitry Andric SDTCisVT<2, i32>, SDTCisVT<3, i32>]>, 3325f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 3335f757f3fSDimitry Andric 3345f757f3fSDimitry Andricdef X86enqcmd : SDNode<"X86ISD::ENQCMD", SDT_X86ENQCMD, 3355f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 3365f757f3fSDimitry Andricdef X86enqcmds : SDNode<"X86ISD::ENQCMDS", SDT_X86ENQCMD, 3375f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 3385f757f3fSDimitry Andricdef X86testui : SDNode<"X86ISD::TESTUI", 3395f757f3fSDimitry Andric SDTypeProfile<1, 0, [SDTCisVT<0, i32>]>, 3405f757f3fSDimitry Andric [SDNPHasChain, SDNPSideEffect]>; 3415f757f3fSDimitry Andric 3425f757f3fSDimitry Andricdef X86aesenc128kl : SDNode<"X86ISD::AESENC128KL", SDT_X86AESENCDECKL, 3435f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 3445f757f3fSDimitry Andric SDNPMemOperand]>; 3455f757f3fSDimitry Andricdef X86aesdec128kl : SDNode<"X86ISD::AESDEC128KL", SDT_X86AESENCDECKL, 3465f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 3475f757f3fSDimitry Andric SDNPMemOperand]>; 3485f757f3fSDimitry Andricdef X86aesenc256kl : SDNode<"X86ISD::AESENC256KL", SDT_X86AESENCDECKL, 3495f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 3505f757f3fSDimitry Andric SDNPMemOperand]>; 3515f757f3fSDimitry Andricdef X86aesdec256kl : SDNode<"X86ISD::AESDEC256KL", SDT_X86AESENCDECKL, 3525f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 3535f757f3fSDimitry Andric SDNPMemOperand]>; 3545f757f3fSDimitry Andric 3555f757f3fSDimitry Andricdef X86cmpccxadd : SDNode<"X86ISD::CMPCCXADD", SDTX86Cmpccxadd, 3565f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMayStore, 3575f757f3fSDimitry Andric SDNPMemOperand]>; 3585f757f3fSDimitry Andric 3595f757f3fSDimitry Andric// Define X86-specific addressing mode. 3605f757f3fSDimitry Andricdef addr : ComplexPattern<iPTR, 5, "selectAddr", [], [SDNPWantParent]>; 3615f757f3fSDimitry Andricdef lea32addr : ComplexPattern<i32, 5, "selectLEAAddr", 3625f757f3fSDimitry Andric [add, sub, mul, X86mul_imm, shl, or, xor, frameindex], 3635f757f3fSDimitry Andric []>; 3645f757f3fSDimitry Andric// In 64-bit mode 32-bit LEAs can use RIP-relative addressing. 3655f757f3fSDimitry Andricdef lea64_32addr : ComplexPattern<i32, 5, "selectLEA64_32Addr", 3665f757f3fSDimitry Andric [add, sub, mul, X86mul_imm, shl, or, xor, 3675f757f3fSDimitry Andric frameindex, X86WrapperRIP], 3685f757f3fSDimitry Andric []>; 3695f757f3fSDimitry Andric 3705f757f3fSDimitry Andricdef tls32addr : ComplexPattern<i32, 5, "selectTLSADDRAddr", 3715f757f3fSDimitry Andric [tglobaltlsaddr], []>; 3725f757f3fSDimitry Andric 3735f757f3fSDimitry Andricdef tls32baseaddr : ComplexPattern<i32, 5, "selectTLSADDRAddr", 3745f757f3fSDimitry Andric [tglobaltlsaddr], []>; 3755f757f3fSDimitry Andric 3765f757f3fSDimitry Andricdef lea64addr : ComplexPattern<i64, 5, "selectLEAAddr", 3775f757f3fSDimitry Andric [add, sub, mul, X86mul_imm, shl, or, xor, frameindex, 3785f757f3fSDimitry Andric X86WrapperRIP], []>; 3795f757f3fSDimitry Andric 3805f757f3fSDimitry Andricdef tls64addr : ComplexPattern<i64, 5, "selectTLSADDRAddr", 3815f757f3fSDimitry Andric [tglobaltlsaddr], []>; 3825f757f3fSDimitry Andric 3835f757f3fSDimitry Andricdef tls64baseaddr : ComplexPattern<i64, 5, "selectTLSADDRAddr", 3845f757f3fSDimitry Andric [tglobaltlsaddr], []>; 3855f757f3fSDimitry Andric 3865f757f3fSDimitry Andricdef vectoraddr : ComplexPattern<iPTR, 5, "selectVectorAddr", [],[SDNPWantParent]>; 3875f757f3fSDimitry Andric 3885f757f3fSDimitry Andric// A relocatable immediate is an operand that can be relocated by the linker to 3895f757f3fSDimitry Andric// an immediate, such as a regular symbol in non-PIC code. 3905f757f3fSDimitry Andricdef relocImm : ComplexPattern<iAny, 1, "selectRelocImm", 3915f757f3fSDimitry Andric [X86Wrapper], [], 0>; 3925f757f3fSDimitry Andric 3935f757f3fSDimitry Andric// X86 specific condition code. These correspond to CondCode in 3945f757f3fSDimitry Andric// X86InstrInfo.h. They must be kept in synch. 3955f757f3fSDimitry Andricdef X86_COND_O : PatLeaf<(i8 0)>; 3965f757f3fSDimitry Andricdef X86_COND_NO : PatLeaf<(i8 1)>; 3975f757f3fSDimitry Andricdef X86_COND_B : PatLeaf<(i8 2)>; // alt. COND_C 3985f757f3fSDimitry Andricdef X86_COND_AE : PatLeaf<(i8 3)>; // alt. COND_NC 3995f757f3fSDimitry Andricdef X86_COND_E : PatLeaf<(i8 4)>; // alt. COND_Z 4005f757f3fSDimitry Andricdef X86_COND_NE : PatLeaf<(i8 5)>; // alt. COND_NZ 4015f757f3fSDimitry Andricdef X86_COND_BE : PatLeaf<(i8 6)>; // alt. COND_NA 4025f757f3fSDimitry Andricdef X86_COND_A : PatLeaf<(i8 7)>; // alt. COND_NBE 4035f757f3fSDimitry Andricdef X86_COND_S : PatLeaf<(i8 8)>; 4045f757f3fSDimitry Andricdef X86_COND_NS : PatLeaf<(i8 9)>; 4055f757f3fSDimitry Andricdef X86_COND_P : PatLeaf<(i8 10)>; // alt. COND_PE 4065f757f3fSDimitry Andricdef X86_COND_NP : PatLeaf<(i8 11)>; // alt. COND_PO 4075f757f3fSDimitry Andricdef X86_COND_L : PatLeaf<(i8 12)>; // alt. COND_NGE 4085f757f3fSDimitry Andricdef X86_COND_GE : PatLeaf<(i8 13)>; // alt. COND_NL 4095f757f3fSDimitry Andricdef X86_COND_LE : PatLeaf<(i8 14)>; // alt. COND_NG 4105f757f3fSDimitry Andricdef X86_COND_G : PatLeaf<(i8 15)>; // alt. COND_NLE 4115f757f3fSDimitry Andric 4125f757f3fSDimitry Andricdef i16immSExt8 : ImmLeaf<i16, [{ return isInt<8>(Imm); }]>; 4135f757f3fSDimitry Andricdef i32immSExt8 : ImmLeaf<i32, [{ return isInt<8>(Imm); }]>; 4145f757f3fSDimitry Andricdef i64immSExt8 : ImmLeaf<i64, [{ return isInt<8>(Imm); }]>; 4155f757f3fSDimitry Andricdef i64immSExt32 : ImmLeaf<i64, [{ return isInt<32>(Imm); }]>; 4165f757f3fSDimitry Andricdef i64timmSExt32 : TImmLeaf<i64, [{ return isInt<32>(Imm); }]>; 4175f757f3fSDimitry Andric 4185f757f3fSDimitry Andricdef i16relocImmSExt8 : PatLeaf<(i16 relocImm), [{ 4195f757f3fSDimitry Andric return isSExtAbsoluteSymbolRef(8, N); 4205f757f3fSDimitry Andric}]>; 4215f757f3fSDimitry Andricdef i32relocImmSExt8 : PatLeaf<(i32 relocImm), [{ 4225f757f3fSDimitry Andric return isSExtAbsoluteSymbolRef(8, N); 4235f757f3fSDimitry Andric}]>; 4245f757f3fSDimitry Andricdef i64relocImmSExt8 : PatLeaf<(i64 relocImm), [{ 4255f757f3fSDimitry Andric return isSExtAbsoluteSymbolRef(8, N); 4265f757f3fSDimitry Andric}]>; 4275f757f3fSDimitry Andricdef i64relocImmSExt32 : PatLeaf<(i64 relocImm), [{ 4285f757f3fSDimitry Andric return isSExtAbsoluteSymbolRef(32, N); 4295f757f3fSDimitry Andric}]>; 4305f757f3fSDimitry Andric 4315f757f3fSDimitry Andric// If we have multiple users of an immediate, it's much smaller to reuse 4325f757f3fSDimitry Andric// the register, rather than encode the immediate in every instruction. 4335f757f3fSDimitry Andric// This has the risk of increasing register pressure from stretched live 4345f757f3fSDimitry Andric// ranges, however, the immediates should be trivial to rematerialize by 4355f757f3fSDimitry Andric// the RA in the event of high register pressure. 4365f757f3fSDimitry Andric// TODO : This is currently enabled for stores and binary ops. There are more 4375f757f3fSDimitry Andric// cases for which this can be enabled, though this catches the bulk of the 4385f757f3fSDimitry Andric// issues. 4395f757f3fSDimitry Andric// TODO2 : This should really also be enabled under O2, but there's currently 4405f757f3fSDimitry Andric// an issue with RA where we don't pull the constants into their users 4415f757f3fSDimitry Andric// when we rematerialize them. I'll follow-up on enabling O2 after we fix that 4425f757f3fSDimitry Andric// issue. 4435f757f3fSDimitry Andric// TODO3 : This is currently limited to single basic blocks (DAG creation 4445f757f3fSDimitry Andric// pulls block immediates to the top and merges them if necessary). 4455f757f3fSDimitry Andric// Eventually, it would be nice to allow ConstantHoisting to merge constants 4465f757f3fSDimitry Andric// globally for potentially added savings. 4475f757f3fSDimitry Andric// 4485f757f3fSDimitry Andricdef imm_su : PatLeaf<(imm), [{ 4495f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4505f757f3fSDimitry Andric}]>; 4515f757f3fSDimitry Andricdef i64immSExt32_su : PatLeaf<(i64immSExt32), [{ 4525f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4535f757f3fSDimitry Andric}]>; 4545f757f3fSDimitry Andric 4555f757f3fSDimitry Andricdef relocImm8_su : PatLeaf<(i8 relocImm), [{ 4565f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4575f757f3fSDimitry Andric}]>; 4585f757f3fSDimitry Andricdef relocImm16_su : PatLeaf<(i16 relocImm), [{ 4595f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4605f757f3fSDimitry Andric}]>; 4615f757f3fSDimitry Andricdef relocImm32_su : PatLeaf<(i32 relocImm), [{ 4625f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4635f757f3fSDimitry Andric}]>; 4645f757f3fSDimitry Andric 4655f757f3fSDimitry Andricdef i16relocImmSExt8_su : PatLeaf<(i16relocImmSExt8), [{ 4665f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4675f757f3fSDimitry Andric}]>; 4685f757f3fSDimitry Andricdef i32relocImmSExt8_su : PatLeaf<(i32relocImmSExt8), [{ 4695f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4705f757f3fSDimitry Andric}]>; 4715f757f3fSDimitry Andricdef i64relocImmSExt8_su : PatLeaf<(i64relocImmSExt8), [{ 4725f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4735f757f3fSDimitry Andric}]>; 4745f757f3fSDimitry Andricdef i64relocImmSExt32_su : PatLeaf<(i64relocImmSExt32), [{ 4755f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4765f757f3fSDimitry Andric}]>; 4775f757f3fSDimitry Andric 4785f757f3fSDimitry Andricdef i16immSExt8_su : PatLeaf<(i16immSExt8), [{ 4795f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4805f757f3fSDimitry Andric}]>; 4815f757f3fSDimitry Andricdef i32immSExt8_su : PatLeaf<(i32immSExt8), [{ 4825f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4835f757f3fSDimitry Andric}]>; 4845f757f3fSDimitry Andricdef i64immSExt8_su : PatLeaf<(i64immSExt8), [{ 4855f757f3fSDimitry Andric return !shouldAvoidImmediateInstFormsForSize(N); 4865f757f3fSDimitry Andric}]>; 4875f757f3fSDimitry Andric 4885f757f3fSDimitry Andric// i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit 4895f757f3fSDimitry Andric// unsigned field. 4905f757f3fSDimitry Andricdef i64immZExt32 : ImmLeaf<i64, [{ return isUInt<32>(Imm); }]>; 4915f757f3fSDimitry Andric 4925f757f3fSDimitry Andricdef i64immZExt32SExt8 : ImmLeaf<i64, [{ 4935f757f3fSDimitry Andric return isUInt<32>(Imm) && isInt<8>(static_cast<int32_t>(Imm)); 4945f757f3fSDimitry Andric}]>; 4955f757f3fSDimitry Andric 4965f757f3fSDimitry Andric// Helper fragments for loads. 4975f757f3fSDimitry Andric 4985f757f3fSDimitry Andric// It's safe to fold a zextload/extload from i1 as a regular i8 load. The 4995f757f3fSDimitry Andric// upper bits are guaranteed to be zero and we were going to emit a MOV8rm 5005f757f3fSDimitry Andric// which might get folded during peephole anyway. 5015f757f3fSDimitry Andricdef loadi8 : PatFrag<(ops node:$ptr), (i8 (unindexedload node:$ptr)), [{ 5025f757f3fSDimitry Andric LoadSDNode *LD = cast<LoadSDNode>(N); 5035f757f3fSDimitry Andric ISD::LoadExtType ExtType = LD->getExtensionType(); 5045f757f3fSDimitry Andric return ExtType == ISD::NON_EXTLOAD || ExtType == ISD::EXTLOAD || 5055f757f3fSDimitry Andric ExtType == ISD::ZEXTLOAD; 5065f757f3fSDimitry Andric}]>; 5075f757f3fSDimitry Andric 5085f757f3fSDimitry Andric// It's always safe to treat a anyext i16 load as a i32 load if the i16 is 5095f757f3fSDimitry Andric// known to be 32-bit aligned or better. Ditto for i8 to i16. 5105f757f3fSDimitry Andricdef loadi16 : PatFrag<(ops node:$ptr), (i16 (unindexedload node:$ptr)), [{ 5115f757f3fSDimitry Andric LoadSDNode *LD = cast<LoadSDNode>(N); 5125f757f3fSDimitry Andric ISD::LoadExtType ExtType = LD->getExtensionType(); 5135f757f3fSDimitry Andric if (ExtType == ISD::NON_EXTLOAD) 5145f757f3fSDimitry Andric return true; 5155f757f3fSDimitry Andric if (ExtType == ISD::EXTLOAD && EnablePromoteAnyextLoad) 5165f757f3fSDimitry Andric return LD->getAlign() >= 2 && LD->isSimple(); 5175f757f3fSDimitry Andric return false; 5185f757f3fSDimitry Andric}]>; 5195f757f3fSDimitry Andric 5205f757f3fSDimitry Andricdef loadi32 : PatFrag<(ops node:$ptr), (i32 (unindexedload node:$ptr)), [{ 5215f757f3fSDimitry Andric LoadSDNode *LD = cast<LoadSDNode>(N); 5225f757f3fSDimitry Andric ISD::LoadExtType ExtType = LD->getExtensionType(); 5235f757f3fSDimitry Andric if (ExtType == ISD::NON_EXTLOAD) 5245f757f3fSDimitry Andric return true; 5255f757f3fSDimitry Andric if (ExtType == ISD::EXTLOAD && EnablePromoteAnyextLoad) 5265f757f3fSDimitry Andric return LD->getAlign() >= 4 && LD->isSimple(); 5275f757f3fSDimitry Andric return false; 5285f757f3fSDimitry Andric}]>; 5295f757f3fSDimitry Andric 5305f757f3fSDimitry Andricdef loadi64 : PatFrag<(ops node:$ptr), (i64 (load node:$ptr))>; 5315f757f3fSDimitry Andricdef loadf16 : PatFrag<(ops node:$ptr), (f16 (load node:$ptr))>; 5325f757f3fSDimitry Andricdef loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>; 5335f757f3fSDimitry Andricdef loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>; 5345f757f3fSDimitry Andricdef loadf80 : PatFrag<(ops node:$ptr), (f80 (load node:$ptr))>; 5355f757f3fSDimitry Andricdef loadf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr))>; 5365f757f3fSDimitry Andricdef alignedloadf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr)), [{ 5375f757f3fSDimitry Andric LoadSDNode *Ld = cast<LoadSDNode>(N); 5385f757f3fSDimitry Andric return Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 5395f757f3fSDimitry Andric}]>; 5405f757f3fSDimitry Andricdef memopf128 : PatFrag<(ops node:$ptr), (f128 (load node:$ptr)), [{ 5415f757f3fSDimitry Andric LoadSDNode *Ld = cast<LoadSDNode>(N); 5425f757f3fSDimitry Andric return Subtarget->hasSSEUnalignedMem() || 5435f757f3fSDimitry Andric Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 5445f757f3fSDimitry Andric}]>; 5455f757f3fSDimitry Andric 5465f757f3fSDimitry Andricdef sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>; 5475f757f3fSDimitry Andricdef sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>; 5485f757f3fSDimitry Andricdef sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>; 5495f757f3fSDimitry Andricdef sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>; 5505f757f3fSDimitry Andricdef sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>; 5515f757f3fSDimitry Andricdef sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>; 5525f757f3fSDimitry Andric 5535f757f3fSDimitry Andricdef zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>; 5545f757f3fSDimitry Andricdef zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>; 5555f757f3fSDimitry Andricdef zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>; 5565f757f3fSDimitry Andricdef zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>; 5575f757f3fSDimitry Andricdef zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>; 5585f757f3fSDimitry Andricdef zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>; 5595f757f3fSDimitry Andricdef zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>; 5605f757f3fSDimitry Andricdef zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>; 5615f757f3fSDimitry Andricdef zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>; 5625f757f3fSDimitry Andricdef zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>; 5635f757f3fSDimitry Andric 5645f757f3fSDimitry Andricdef extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>; 5655f757f3fSDimitry Andricdef extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>; 5665f757f3fSDimitry Andricdef extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>; 5675f757f3fSDimitry Andricdef extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>; 5685f757f3fSDimitry Andricdef extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>; 5695f757f3fSDimitry Andricdef extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>; 5705f757f3fSDimitry Andricdef extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>; 5715f757f3fSDimitry Andricdef extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>; 5725f757f3fSDimitry Andricdef extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>; 5735f757f3fSDimitry Andric 5745f757f3fSDimitry Andric// We can treat an i8/i16 extending load to i64 as a 32 bit load if its known 5755f757f3fSDimitry Andric// to be 4 byte aligned or better. 5765f757f3fSDimitry Andricdef extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (unindexedload node:$ptr)), [{ 5775f757f3fSDimitry Andric LoadSDNode *LD = cast<LoadSDNode>(N); 5785f757f3fSDimitry Andric ISD::LoadExtType ExtType = LD->getExtensionType(); 5795f757f3fSDimitry Andric if (ExtType != ISD::EXTLOAD) 5805f757f3fSDimitry Andric return false; 5815f757f3fSDimitry Andric if (LD->getMemoryVT() == MVT::i32) 5825f757f3fSDimitry Andric return true; 5835f757f3fSDimitry Andric 5845f757f3fSDimitry Andric return LD->getAlign() >= 4 && LD->isSimple(); 5855f757f3fSDimitry Andric}]>; 5865f757f3fSDimitry Andric 5875f757f3fSDimitry Andric// binary op with only one user 5885f757f3fSDimitry Andricclass binop_oneuse<SDPatternOperator operator> 5895f757f3fSDimitry Andric : PatFrag<(ops node:$A, node:$B), 5905f757f3fSDimitry Andric (operator node:$A, node:$B), [{ 5915f757f3fSDimitry Andric return N->hasOneUse(); 5925f757f3fSDimitry Andric}]>; 5935f757f3fSDimitry Andric 5945f757f3fSDimitry Andricdef add_su : binop_oneuse<add>; 5955f757f3fSDimitry Andricdef and_su : binop_oneuse<and>; 5965f757f3fSDimitry Andricdef srl_su : binop_oneuse<srl>; 5975f757f3fSDimitry Andric 598*0fca6ea1SDimitry Andricclass binop_twouses<SDPatternOperator operator> 599*0fca6ea1SDimitry Andric : PatFrag<(ops node:$A, node:$B), 600*0fca6ea1SDimitry Andric (operator node:$A, node:$B), [{ 601*0fca6ea1SDimitry Andric return N->hasNUsesOfValue(2, 0); 602*0fca6ea1SDimitry Andric}]>; 603*0fca6ea1SDimitry Andric 604*0fca6ea1SDimitry Andricdef and_du : binop_twouses<and>; 605*0fca6ea1SDimitry Andric 6065f757f3fSDimitry Andric// unary op with only one user 6075f757f3fSDimitry Andricclass unop_oneuse<SDPatternOperator operator> 6085f757f3fSDimitry Andric : PatFrag<(ops node:$A), 6095f757f3fSDimitry Andric (operator node:$A), [{ 6105f757f3fSDimitry Andric return N->hasOneUse(); 6115f757f3fSDimitry Andric}]>; 6125f757f3fSDimitry Andric 6135f757f3fSDimitry Andric 6145f757f3fSDimitry Andricdef ineg_su : unop_oneuse<ineg>; 6155f757f3fSDimitry Andricdef trunc_su : unop_oneuse<trunc>; 6165f757f3fSDimitry Andric 6175f757f3fSDimitry Andricdef X86add_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 6185f757f3fSDimitry Andric (X86add_flag node:$lhs, node:$rhs), [{ 6195f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 1)); 6205f757f3fSDimitry Andric}]>; 6215f757f3fSDimitry Andric 6225f757f3fSDimitry Andricdef X86sub_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 6235f757f3fSDimitry Andric (X86sub_flag node:$lhs, node:$rhs), [{ 6245f757f3fSDimitry Andric // Only use DEC if the result is used. 6255f757f3fSDimitry Andric return !SDValue(N, 0).use_empty() && hasNoCarryFlagUses(SDValue(N, 1)); 6265f757f3fSDimitry Andric}]>; 6275f757f3fSDimitry Andric 6285f757f3fSDimitry Andricdef X86testpat : PatFrag<(ops node:$lhs, node:$rhs), 6295f757f3fSDimitry Andric (X86cmp (and_su node:$lhs, node:$rhs), 0)>; 630*0fca6ea1SDimitry Andricdef X86ctestpat : PatFrag<(ops node:$lhs, node:$rhs, node:$dcf, node:$cond), 631*0fca6ea1SDimitry Andric (X86ctest (and_du node:$lhs, node:$rhs), 632*0fca6ea1SDimitry Andric (and_du node:$lhs, node:$rhs), node:$dcf, 633*0fca6ea1SDimitry Andric node:$cond, EFLAGS)>; 6345f757f3fSDimitry Andric 6355f757f3fSDimitry Andricdef X86any_fcmp : PatFrags<(ops node:$lhs, node:$rhs), 6365f757f3fSDimitry Andric [(X86strict_fcmp node:$lhs, node:$rhs), 6375f757f3fSDimitry Andric (X86fcmp node:$lhs, node:$rhs)]>; 6385f757f3fSDimitry Andric 6395f757f3fSDimitry Andricdef PrefetchWLevel : PatFrag<(ops), (i32 timm), [{ 640*0fca6ea1SDimitry Andric return N->getSExtValue() <= 3; 6415f757f3fSDimitry Andric}]>; 6425f757f3fSDimitry Andric 6435f757f3fSDimitry Andricdef X86lock_add_nocf : PatFrag<(ops node:$lhs, node:$rhs), 6445f757f3fSDimitry Andric (X86lock_add node:$lhs, node:$rhs), [{ 6455f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 0)); 6465f757f3fSDimitry Andric}]>; 6475f757f3fSDimitry Andric 6485f757f3fSDimitry Andricdef X86lock_sub_nocf : PatFrag<(ops node:$lhs, node:$rhs), 6495f757f3fSDimitry Andric (X86lock_sub node:$lhs, node:$rhs), [{ 6505f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 0)); 6515f757f3fSDimitry Andric}]>; 6525f757f3fSDimitry Andric 6535f757f3fSDimitry Andricdef X86tcret_6regs : PatFrag<(ops node:$ptr, node:$off), 6545f757f3fSDimitry Andric (X86tcret node:$ptr, node:$off), [{ 6555f757f3fSDimitry Andric // X86tcret args: (*chain, ptr, imm, regs..., glue) 6565f757f3fSDimitry Andric unsigned NumRegs = 0; 6575f757f3fSDimitry Andric for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i) 6585f757f3fSDimitry Andric if (isa<RegisterSDNode>(N->getOperand(i)) && ++NumRegs > 6) 6595f757f3fSDimitry Andric return false; 6605f757f3fSDimitry Andric return true; 6615f757f3fSDimitry Andric}]>; 6625f757f3fSDimitry Andric 6635f757f3fSDimitry Andricdef X86tcret_1reg : PatFrag<(ops node:$ptr, node:$off), 6645f757f3fSDimitry Andric (X86tcret node:$ptr, node:$off), [{ 6655f757f3fSDimitry Andric // X86tcret args: (*chain, ptr, imm, regs..., glue) 6665f757f3fSDimitry Andric unsigned NumRegs = 1; 6675f757f3fSDimitry Andric const SDValue& BasePtr = cast<LoadSDNode>(N->getOperand(1))->getBasePtr(); 6685f757f3fSDimitry Andric if (isa<FrameIndexSDNode>(BasePtr)) 6695f757f3fSDimitry Andric NumRegs = 3; 6705f757f3fSDimitry Andric else if (BasePtr->getNumOperands() && isa<GlobalAddressSDNode>(BasePtr->getOperand(0))) 6715f757f3fSDimitry Andric NumRegs = 3; 6725f757f3fSDimitry Andric for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i) 6735f757f3fSDimitry Andric if (isa<RegisterSDNode>(N->getOperand(i)) && ( NumRegs-- == 0)) 6745f757f3fSDimitry Andric return false; 6755f757f3fSDimitry Andric return true; 6765f757f3fSDimitry Andric}]>; 6775f757f3fSDimitry Andric 6785f757f3fSDimitry Andric// If this is an anyext of the remainder of an 8-bit sdivrem, use a MOVSX 6795f757f3fSDimitry Andric// instead of a MOVZX. The sdivrem lowering will emit emit a MOVSX to move 6805f757f3fSDimitry Andric// %ah to the lower byte of a register. By using a MOVSX here we allow a 6815f757f3fSDimitry Andric// post-isel peephole to merge the two MOVSX instructions into one. 6825f757f3fSDimitry Andricdef anyext_sdiv : PatFrag<(ops node:$lhs), (anyext node:$lhs),[{ 6835f757f3fSDimitry Andric return (N->getOperand(0).getOpcode() == ISD::SDIVREM && 6845f757f3fSDimitry Andric N->getOperand(0).getResNo() == 1); 6855f757f3fSDimitry Andric}]>; 6865f757f3fSDimitry Andric 6875f757f3fSDimitry Andric// Any instruction that defines a 32-bit result leaves the high half of the 6885f757f3fSDimitry Andric// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may 6895f757f3fSDimitry Andric// be copying from a truncate. AssertSext/AssertZext/AssertAlign aren't saying 6905f757f3fSDimitry Andric// anything about the upper 32 bits, they're probably just qualifying a 6915f757f3fSDimitry Andric// CopyFromReg. FREEZE may be coming from a a truncate. Any other 32-bit 6925f757f3fSDimitry Andric// operation will zero-extend up to 64 bits. 6935f757f3fSDimitry Andricdef def32 : PatLeaf<(i32 GR32:$src), [{ 6945f757f3fSDimitry Andric return N->getOpcode() != ISD::TRUNCATE && 6955f757f3fSDimitry Andric N->getOpcode() != TargetOpcode::EXTRACT_SUBREG && 6965f757f3fSDimitry Andric N->getOpcode() != ISD::CopyFromReg && 6975f757f3fSDimitry Andric N->getOpcode() != ISD::AssertSext && 6985f757f3fSDimitry Andric N->getOpcode() != ISD::AssertZext && 6995f757f3fSDimitry Andric N->getOpcode() != ISD::AssertAlign && 7005f757f3fSDimitry Andric N->getOpcode() != ISD::FREEZE; 7015f757f3fSDimitry Andric}]>; 7025f757f3fSDimitry Andric 7035f757f3fSDimitry Andric// Treat an 'or' node is as an 'add' if the or'ed bits are known to be zero. 7045f757f3fSDimitry Andricdef or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{ 7055f757f3fSDimitry Andric if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1))) 7065f757f3fSDimitry Andric return CurDAG->MaskedValueIsZero(N->getOperand(0), CN->getAPIntValue()); 7075f757f3fSDimitry Andric 7085f757f3fSDimitry Andric KnownBits Known0 = CurDAG->computeKnownBits(N->getOperand(0), 0); 7095f757f3fSDimitry Andric KnownBits Known1 = CurDAG->computeKnownBits(N->getOperand(1), 0); 7105f757f3fSDimitry Andric return (~Known0.Zero & ~Known1.Zero) == 0; 7115f757f3fSDimitry Andric}]>; 7125f757f3fSDimitry Andric 7135f757f3fSDimitry Andricdef shiftMask8 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 7145f757f3fSDimitry Andric return isUnneededShiftMask(N, 3); 7155f757f3fSDimitry Andric}]>; 7165f757f3fSDimitry Andric 7175f757f3fSDimitry Andricdef shiftMask16 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 7185f757f3fSDimitry Andric return isUnneededShiftMask(N, 4); 7195f757f3fSDimitry Andric}]>; 7205f757f3fSDimitry Andric 7215f757f3fSDimitry Andricdef shiftMask32 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 7225f757f3fSDimitry Andric return isUnneededShiftMask(N, 5); 7235f757f3fSDimitry Andric}]>; 7245f757f3fSDimitry Andric 7255f757f3fSDimitry Andricdef shiftMask64 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ 7265f757f3fSDimitry Andric return isUnneededShiftMask(N, 6); 7275f757f3fSDimitry Andric}]>; 7285f757f3fSDimitry Andric 7295f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 7305f757f3fSDimitry Andric// Pattern fragments to auto generate BMI instructions. 7315f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 7325f757f3fSDimitry Andric 7335f757f3fSDimitry Andricdef or_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 7345f757f3fSDimitry Andric (X86or_flag node:$lhs, node:$rhs), [{ 7355f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 1)); 7365f757f3fSDimitry Andric}]>; 7375f757f3fSDimitry Andric 7385f757f3fSDimitry Andricdef xor_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 7395f757f3fSDimitry Andric (X86xor_flag node:$lhs, node:$rhs), [{ 7405f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 1)); 7415f757f3fSDimitry Andric}]>; 7425f757f3fSDimitry Andric 7435f757f3fSDimitry Andricdef and_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs), 7445f757f3fSDimitry Andric (X86and_flag node:$lhs, node:$rhs), [{ 7455f757f3fSDimitry Andric return hasNoCarryFlagUses(SDValue(N, 1)); 7465f757f3fSDimitry Andric}]>; 7475f757f3fSDimitry Andric 7485f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 7495f757f3fSDimitry Andric// FPStack specific DAG Nodes. 7505f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 7515f757f3fSDimitry Andric 7525f757f3fSDimitry Andricdef SDTX86Fld : SDTypeProfile<1, 1, [SDTCisFP<0>, 7535f757f3fSDimitry Andric SDTCisPtrTy<1>]>; 7545f757f3fSDimitry Andricdef SDTX86Fst : SDTypeProfile<0, 2, [SDTCisFP<0>, 7555f757f3fSDimitry Andric SDTCisPtrTy<1>]>; 7565f757f3fSDimitry Andricdef SDTX86Fild : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisPtrTy<1>]>; 7575f757f3fSDimitry Andricdef SDTX86Fist : SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisPtrTy<1>]>; 7585f757f3fSDimitry Andric 7595f757f3fSDimitry Andricdef SDTX86CwdStore : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 7605f757f3fSDimitry Andricdef SDTX86CwdLoad : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 7615f757f3fSDimitry Andricdef SDTX86FPEnv : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; 7625f757f3fSDimitry Andric 7635f757f3fSDimitry Andricdef X86fp80_add : SDNode<"X86ISD::FP80_ADD", SDTFPBinOp, [SDNPCommutative]>; 7645f757f3fSDimitry Andricdef X86strict_fp80_add : SDNode<"X86ISD::STRICT_FP80_ADD", SDTFPBinOp, 7655f757f3fSDimitry Andric [SDNPHasChain,SDNPCommutative]>; 7665f757f3fSDimitry Andricdef any_X86fp80_add : PatFrags<(ops node:$lhs, node:$rhs), 7675f757f3fSDimitry Andric [(X86strict_fp80_add node:$lhs, node:$rhs), 7685f757f3fSDimitry Andric (X86fp80_add node:$lhs, node:$rhs)]>; 7695f757f3fSDimitry Andric 7705f757f3fSDimitry Andricdef X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, 7715f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 7725f757f3fSDimitry Andricdef X86fst : SDNode<"X86ISD::FST", SDTX86Fst, 7735f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 7745f757f3fSDimitry Andricdef X86fild : SDNode<"X86ISD::FILD", SDTX86Fild, 7755f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 7765f757f3fSDimitry Andricdef X86fist : SDNode<"X86ISD::FIST", SDTX86Fist, 7775f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 7785f757f3fSDimitry Andricdef X86fp_to_mem : SDNode<"X86ISD::FP_TO_INT_IN_MEM", SDTX86Fst, 7795f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 7805f757f3fSDimitry Andricdef X86fp_cwd_get16 : SDNode<"X86ISD::FNSTCW16m", SDTX86CwdStore, 7815f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPSideEffect, 7825f757f3fSDimitry Andric SDNPMemOperand]>; 7835f757f3fSDimitry Andricdef X86fp_cwd_set16 : SDNode<"X86ISD::FLDCW16m", SDTX86CwdLoad, 7845f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 7855f757f3fSDimitry Andric SDNPMemOperand]>; 7865f757f3fSDimitry Andricdef X86fpenv_get : SDNode<"X86ISD::FNSTENVm", SDTX86FPEnv, 7875f757f3fSDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPSideEffect, 7885f757f3fSDimitry Andric SDNPMemOperand]>; 7895f757f3fSDimitry Andricdef X86fpenv_set : SDNode<"X86ISD::FLDENVm", SDTX86FPEnv, 7905f757f3fSDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPSideEffect, 7915f757f3fSDimitry Andric SDNPMemOperand]>; 7925f757f3fSDimitry Andric 7935f757f3fSDimitry Andricdef X86fstf32 : PatFrag<(ops node:$val, node:$ptr), 7945f757f3fSDimitry Andric (X86fst node:$val, node:$ptr), [{ 7955f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32; 7965f757f3fSDimitry Andric}]>; 7975f757f3fSDimitry Andricdef X86fstf64 : PatFrag<(ops node:$val, node:$ptr), 7985f757f3fSDimitry Andric (X86fst node:$val, node:$ptr), [{ 7995f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64; 8005f757f3fSDimitry Andric}]>; 8015f757f3fSDimitry Andricdef X86fstf80 : PatFrag<(ops node:$val, node:$ptr), 8025f757f3fSDimitry Andric (X86fst node:$val, node:$ptr), [{ 8035f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80; 8045f757f3fSDimitry Andric}]>; 8055f757f3fSDimitry Andric 8065f757f3fSDimitry Andricdef X86fldf32 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 8075f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32; 8085f757f3fSDimitry Andric}]>; 8095f757f3fSDimitry Andricdef X86fldf64 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 8105f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64; 8115f757f3fSDimitry Andric}]>; 8125f757f3fSDimitry Andricdef X86fldf80 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{ 8135f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80; 8145f757f3fSDimitry Andric}]>; 8155f757f3fSDimitry Andric 8165f757f3fSDimitry Andricdef X86fild16 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 8175f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 8185f757f3fSDimitry Andric}]>; 8195f757f3fSDimitry Andricdef X86fild32 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 8205f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 8215f757f3fSDimitry Andric}]>; 8225f757f3fSDimitry Andricdef X86fild64 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{ 8235f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 8245f757f3fSDimitry Andric}]>; 8255f757f3fSDimitry Andric 8265f757f3fSDimitry Andricdef X86fist32 : PatFrag<(ops node:$val, node:$ptr), 8275f757f3fSDimitry Andric (X86fist node:$val, node:$ptr), [{ 8285f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 8295f757f3fSDimitry Andric}]>; 8305f757f3fSDimitry Andric 8315f757f3fSDimitry Andricdef X86fist64 : PatFrag<(ops node:$val, node:$ptr), 8325f757f3fSDimitry Andric (X86fist node:$val, node:$ptr), [{ 8335f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 8345f757f3fSDimitry Andric}]>; 8355f757f3fSDimitry Andric 8365f757f3fSDimitry Andricdef X86fp_to_i16mem : PatFrag<(ops node:$val, node:$ptr), 8375f757f3fSDimitry Andric (X86fp_to_mem node:$val, node:$ptr), [{ 8385f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16; 8395f757f3fSDimitry Andric}]>; 8405f757f3fSDimitry Andricdef X86fp_to_i32mem : PatFrag<(ops node:$val, node:$ptr), 8415f757f3fSDimitry Andric (X86fp_to_mem node:$val, node:$ptr), [{ 8425f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32; 8435f757f3fSDimitry Andric}]>; 8445f757f3fSDimitry Andricdef X86fp_to_i64mem : PatFrag<(ops node:$val, node:$ptr), 8455f757f3fSDimitry Andric (X86fp_to_mem node:$val, node:$ptr), [{ 8465f757f3fSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64; 8475f757f3fSDimitry Andric}]>; 8485f757f3fSDimitry Andric 8495f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 8505f757f3fSDimitry Andric// FPStack pattern fragments 8515f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 8525f757f3fSDimitry Andric 8535f757f3fSDimitry Andricdef fpimm0 : FPImmLeaf<fAny, [{ 8545f757f3fSDimitry Andric return Imm.isExactlyValue(+0.0); 8555f757f3fSDimitry Andric}]>; 8565f757f3fSDimitry Andric 8575f757f3fSDimitry Andricdef fpimmneg0 : FPImmLeaf<fAny, [{ 8585f757f3fSDimitry Andric return Imm.isExactlyValue(-0.0); 8595f757f3fSDimitry Andric}]>; 8605f757f3fSDimitry Andric 8615f757f3fSDimitry Andricdef fpimm1 : FPImmLeaf<fAny, [{ 8625f757f3fSDimitry Andric return Imm.isExactlyValue(+1.0); 8635f757f3fSDimitry Andric}]>; 8645f757f3fSDimitry Andric 8655f757f3fSDimitry Andricdef fpimmneg1 : FPImmLeaf<fAny, [{ 8665f757f3fSDimitry Andric return Imm.isExactlyValue(-1.0); 8675f757f3fSDimitry Andric}]>; 868