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