xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86InstrFragments.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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