blob: 7442a59e594f1a2b17e0e8980d66bb6bf866c71a [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===-- AMDGPUInstrInfo.td - AMDGPU DAG nodes --------------*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains DAG node defintions for the AMDGPU target.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// AMDGPU DAG Profiles
16//===----------------------------------------------------------------------===//
17
18def AMDGPUDTIntTernaryOp : SDTypeProfile<1, 3, [
19 SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<0>, SDTCisInt<3>
20]>;
21
Matt Arsenaulta0050b02014-06-19 01:19:19 +000022def AMDGPUTrigPreOp : SDTypeProfile<1, 2,
23 [SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisInt<2>]
24>;
25
Matt Arsenault2e7cc482014-08-15 17:30:25 +000026def AMDGPULdExpOp : SDTypeProfile<1, 2,
27 [SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisInt<2>]
28>;
29
Matt Arsenault4831ce52015-01-06 23:00:37 +000030def AMDGPUFPClassOp : SDTypeProfile<1, 2,
31 [SDTCisInt<0>, SDTCisFP<1>, SDTCisInt<2>]
32>;
33
Matt Arsenault1f17c662017-02-22 00:27:34 +000034def AMDGPUFPPackOp : SDTypeProfile<1, 2,
35 [SDTCisFP<1>, SDTCisSameAs<1, 2>]
36>;
37
Marek Olsak13e47412018-01-31 20:18:04 +000038def AMDGPUIntPackOp : SDTypeProfile<1, 2,
39 [SDTCisInt<1>, SDTCisSameAs<1, 2>]
40>;
41
Matt Arsenaulta0050b02014-06-19 01:19:19 +000042def AMDGPUDivScaleOp : SDTypeProfile<2, 3,
43 [SDTCisFP<0>, SDTCisInt<1>, SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisSameAs<0, 4>]
44>;
45
Matt Arsenault1bc9d952015-02-14 04:22:00 +000046// float, float, float, vcc
47def AMDGPUFmasOp : SDTypeProfile<1, 4,
48 [SDTCisFP<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisInt<4>]
49>;
50
Matt Arsenault03006fd2016-07-19 16:27:56 +000051def AMDGPUKillSDT : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
52
Matt Arsenaultc5b641a2017-03-17 20:41:45 +000053def AMDGPUIfOp : SDTypeProfile<1, 2,
54 [SDTCisVT<0, i64>, SDTCisVT<1, i1>, SDTCisVT<2, OtherVT>]
55>;
56
57def AMDGPUElseOp : SDTypeProfile<1, 2,
58 [SDTCisVT<0, i64>, SDTCisVT<1, i64>, SDTCisVT<2, OtherVT>]
59>;
60
61def AMDGPULoopOp : SDTypeProfile<0, 2,
62 [SDTCisVT<0, i64>, SDTCisVT<1, OtherVT>]
63>;
64
65def AMDGPUBreakOp : SDTypeProfile<1, 1,
66 [SDTCisVT<0, i64>, SDTCisVT<1, i64>]
67>;
68
69def AMDGPUIfBreakOp : SDTypeProfile<1, 2,
70 [SDTCisVT<0, i64>, SDTCisVT<1, i1>, SDTCisVT<2, i64>]
71>;
72
73def AMDGPUElseBreakOp : SDTypeProfile<1, 2,
74 [SDTCisVT<0, i64>, SDTCisVT<1, i64>, SDTCisVT<2, i64>]
75>;
76
Stanislav Mekhanoshine3eb42c2017-06-21 22:05:06 +000077def AMDGPUAddeSubeOp : SDTypeProfile<2, 3,
78 [SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisVT<0, i32>, SDTCisVT<1, i1>, SDTCisVT<4, i1>]
79>;
80
Matt Arsenault71bcbd42017-08-11 20:42:08 +000081def SDT_AMDGPUTCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>]>;
82
Tom Stellard75aadc22012-12-11 21:25:42 +000083//===----------------------------------------------------------------------===//
84// AMDGPU DAG Nodes
85//
86
Matt Arsenaultc5b641a2017-03-17 20:41:45 +000087def AMDGPUif : SDNode<"AMDGPUISD::IF", AMDGPUIfOp, [SDNPHasChain]>;
88def AMDGPUelse : SDNode<"AMDGPUISD::ELSE", AMDGPUElseOp, [SDNPHasChain]>;
89def AMDGPUloop : SDNode<"AMDGPUISD::LOOP", AMDGPULoopOp, [SDNPHasChain]>;
90
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +000091def callseq_start : SDNode<"ISD::CALLSEQ_START",
92 SDCallSeqStart<[ SDTCisVT<0, i32>, SDTCisVT<1, i32> ]>,
93 [SDNPHasChain, SDNPOutGlue]
94>;
95
96def callseq_end : SDNode<"ISD::CALLSEQ_END",
97 SDCallSeqEnd<[ SDTCisVT<0, i32>, SDTCisVT<1, i32> ]>,
98 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]
99>;
100
101def AMDGPUcall : SDNode<"AMDGPUISD::CALL",
102 SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>,
103 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
104 SDNPVariadic]
105>;
106
Matt Arsenault71bcbd42017-08-11 20:42:08 +0000107def AMDGPUtc_return: SDNode<"AMDGPUISD::TC_RETURN", SDT_AMDGPUTCRET,
108 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]
109>;
110
Matt Arsenault3e025382017-04-24 17:49:13 +0000111def AMDGPUtrap : SDNode<"AMDGPUISD::TRAP",
112 SDTypeProfile<0, -1, [SDTCisVT<0, i16>]>,
113 [SDNPHasChain, SDNPVariadic, SDNPSideEffect, SDNPInGlue]
114>;
115
Jan Veselyfbcb7542016-05-13 20:39:18 +0000116def AMDGPUconstdata_ptr : SDNode<
117 "AMDGPUISD::CONST_DATA_PTR", SDTypeProfile <1, 1, [SDTCisVT<0, iPTR>,
118 SDTCisVT<0, iPTR>]>
119>;
120
Tom Stellard75aadc22012-12-11 21:25:42 +0000121// This argument to this node is a dword address.
122def AMDGPUdwordaddr : SDNode<"AMDGPUISD::DWORDADDR", SDTIntUnaryOp>;
123
Jan Veselyf1705042017-01-20 21:24:26 +0000124// Force dependencies for vector trunc stores
125def R600dummy_chain : SDNode<"AMDGPUISD::DUMMY_CHAIN", SDTNone, [SDNPHasChain]>;
126
Matt Arsenaultad14ce82014-07-19 18:44:39 +0000127def AMDGPUcos : SDNode<"AMDGPUISD::COS_HW", SDTFPUnaryOp>;
128def AMDGPUsin : SDNode<"AMDGPUISD::SIN_HW", SDTFPUnaryOp>;
129
Tom Stellard75aadc22012-12-11 21:25:42 +0000130// out = a - floor(a)
131def AMDGPUfract : SDNode<"AMDGPUISD::FRACT", SDTFPUnaryOp>;
132
Matt Arsenaulta0050b02014-06-19 01:19:19 +0000133// out = 1.0 / a
134def AMDGPUrcp : SDNode<"AMDGPUISD::RCP", SDTFPUnaryOp>;
135
136// out = 1.0 / sqrt(a)
137def AMDGPUrsq : SDNode<"AMDGPUISD::RSQ", SDTFPUnaryOp>;
138
Matt Arsenault257d48d2014-06-24 22:13:39 +0000139// out = 1.0 / sqrt(a)
Matt Arsenault32fc5272016-07-26 16:45:45 +0000140def AMDGPUrcp_legacy : SDNode<"AMDGPUISD::RCP_LEGACY", SDTFPUnaryOp>;
Matt Arsenault257d48d2014-06-24 22:13:39 +0000141def AMDGPUrsq_legacy : SDNode<"AMDGPUISD::RSQ_LEGACY", SDTFPUnaryOp>;
142
Stanislav Mekhanoshin1a1687f2018-06-27 15:33:33 +0000143def AMDGPUrcp_iflag : SDNode<"AMDGPUISD::RCP_IFLAG", SDTFPUnaryOp>;
144
Matt Arsenault257d48d2014-06-24 22:13:39 +0000145// out = 1.0 / sqrt(a) result clamped to +/- max_float.
Matt Arsenault79963e82016-02-13 01:03:00 +0000146def AMDGPUrsq_clamp : SDNode<"AMDGPUISD::RSQ_CLAMP", SDTFPUnaryOp>;
Matt Arsenault257d48d2014-06-24 22:13:39 +0000147
Matt Arsenault2e7cc482014-08-15 17:30:25 +0000148def AMDGPUldexp : SDNode<"AMDGPUISD::LDEXP", AMDGPULdExpOp>;
149
Matt Arsenault1f17c662017-02-22 00:27:34 +0000150def AMDGPUpkrtz_f16_f32 : SDNode<"AMDGPUISD::CVT_PKRTZ_F16_F32", AMDGPUFPPackOp>;
Marek Olsak13e47412018-01-31 20:18:04 +0000151def AMDGPUpknorm_i16_f32 : SDNode<"AMDGPUISD::CVT_PKNORM_I16_F32", AMDGPUFPPackOp>;
152def AMDGPUpknorm_u16_f32 : SDNode<"AMDGPUISD::CVT_PKNORM_U16_F32", AMDGPUFPPackOp>;
153def AMDGPUpk_i16_i32 : SDNode<"AMDGPUISD::CVT_PK_I16_I32", AMDGPUIntPackOp>;
154def AMDGPUpk_u16_u32 : SDNode<"AMDGPUISD::CVT_PK_U16_U32", AMDGPUIntPackOp>;
Matt Arsenault86e02ce2017-03-15 19:04:26 +0000155def AMDGPUfp_to_f16 : SDNode<"AMDGPUISD::FP_TO_FP16" , SDTFPToIntOp>;
Matt Arsenault8edfaee2017-03-31 19:53:03 +0000156def AMDGPUfp16_zext : SDNode<"AMDGPUISD::FP16_ZEXT" , SDTFPToIntOp>;
Matt Arsenault86e02ce2017-03-15 19:04:26 +0000157
Matt Arsenault1f17c662017-02-22 00:27:34 +0000158
Matt Arsenault4831ce52015-01-06 23:00:37 +0000159def AMDGPUfp_class : SDNode<"AMDGPUISD::FP_CLASS", AMDGPUFPClassOp>;
160
Matt Arsenaultda59f3d2014-11-13 23:03:09 +0000161// out = max(a, b) a and b are floats, where a nan comparison fails.
162// This is not commutative because this gives the second operand:
163// x < nan ? x : nan -> nan
164// nan < x ? nan : x -> x
165def AMDGPUfmax_legacy : SDNode<"AMDGPUISD::FMAX_LEGACY", SDTFPBinOp,
Matt Arsenault145d5712014-12-12 02:30:33 +0000166 []
Tom Stellard75aadc22012-12-11 21:25:42 +0000167>;
168
Matt Arsenault32fc5272016-07-26 16:45:45 +0000169def AMDGPUfmul_legacy : SDNode<"AMDGPUISD::FMUL_LEGACY", SDTFPBinOp,
170 [SDNPCommutative, SDNPAssociative]
171>;
172
Matt Arsenaultda59f3d2014-11-13 23:03:09 +0000173// out = min(a, b) a and b are floats, where a nan comparison fails.
174def AMDGPUfmin_legacy : SDNode<"AMDGPUISD::FMIN_LEGACY", SDTFPBinOp,
Matt Arsenault145d5712014-12-12 02:30:33 +0000175 []
Tom Stellard75aadc22012-12-11 21:25:42 +0000176>;
177
Matt Arsenaultcc3c2b32014-11-14 20:08:52 +0000178// FIXME: TableGen doesn't like commutative instructions with more
179// than 2 operands.
180// out = max(a, b, c) a, b and c are floats
181def AMDGPUfmax3 : SDNode<"AMDGPUISD::FMAX3", SDTFPTernaryOp,
182 [/*SDNPCommutative, SDNPAssociative*/]
183>;
184
185// out = max(a, b, c) a, b, and c are signed ints
186def AMDGPUsmax3 : SDNode<"AMDGPUISD::SMAX3", AMDGPUDTIntTernaryOp,
187 [/*SDNPCommutative, SDNPAssociative*/]
188>;
189
190// out = max(a, b, c) a, b and c are unsigned ints
191def AMDGPUumax3 : SDNode<"AMDGPUISD::UMAX3", AMDGPUDTIntTernaryOp,
192 [/*SDNPCommutative, SDNPAssociative*/]
193>;
194
195// out = min(a, b, c) a, b and c are floats
196def AMDGPUfmin3 : SDNode<"AMDGPUISD::FMIN3", SDTFPTernaryOp,
197 [/*SDNPCommutative, SDNPAssociative*/]
198>;
199
200// out = min(a, b, c) a, b and c are signed ints
201def AMDGPUsmin3 : SDNode<"AMDGPUISD::SMIN3", AMDGPUDTIntTernaryOp,
202 [/*SDNPCommutative, SDNPAssociative*/]
203>;
204
205// out = min(a, b) a and b are unsigned ints
206def AMDGPUumin3 : SDNode<"AMDGPUISD::UMIN3", AMDGPUDTIntTernaryOp,
207 [/*SDNPCommutative, SDNPAssociative*/]
208>;
Matt Arsenault364a6742014-06-11 17:50:44 +0000209
Jan Vesely808fff52015-04-30 17:15:56 +0000210// out = (src0 + src1 > 0xFFFFFFFF) ? 1 : 0
211def AMDGPUcarry : SDNode<"AMDGPUISD::CARRY", SDTIntBinOp, []>;
212
213// out = (src1 > src0) ? 1 : 0
214def AMDGPUborrow : SDNode<"AMDGPUISD::BORROW", SDTIntBinOp, []>;
215
Stanislav Mekhanoshine3eb42c2017-06-21 22:05:06 +0000216// TODO: remove AMDGPUadde/AMDGPUsube when ADDCARRY/SUBCARRY get their own
217// nodes in TargetSelectionDAG.td.
218def AMDGPUadde : SDNode<"ISD::ADDCARRY", AMDGPUAddeSubeOp, []>;
219
220def AMDGPUsube : SDNode<"ISD::SUBCARRY", AMDGPUAddeSubeOp, []>;
221
Wei Ding07e03712016-07-28 16:42:13 +0000222def AMDGPUSetCCOp : SDTypeProfile<1, 3, [ // setcc
223 SDTCisVT<0, i64>, SDTCisSameAs<1, 2>, SDTCisVT<3, OtherVT>
224]>;
225
226def AMDGPUsetcc : SDNode<"AMDGPUISD::SETCC", AMDGPUSetCCOp>;
Jan Vesely808fff52015-04-30 17:15:56 +0000227
Tom Stellard8485fa02016-12-07 02:42:15 +0000228def AMDGPUSetRegOp : SDTypeProfile<0, 2, [
229 SDTCisInt<0>, SDTCisInt<1>
230]>;
231
232def AMDGPUsetreg : SDNode<"AMDGPUISD::SETREG", AMDGPUSetRegOp, [
233 SDNPHasChain, SDNPSideEffect, SDNPOptInGlue, SDNPOutGlue]>;
234
235def AMDGPUfma : SDNode<"AMDGPUISD::FMA_W_CHAIN", SDTFPTernaryOp, [
236 SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
237
238def AMDGPUmul : SDNode<"AMDGPUISD::FMUL_W_CHAIN", SDTFPBinOp, [
239 SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
240
Matt Arsenault364a6742014-06-11 17:50:44 +0000241def AMDGPUcvt_f32_ubyte0 : SDNode<"AMDGPUISD::CVT_F32_UBYTE0",
242 SDTIntToFPOp, []>;
243def AMDGPUcvt_f32_ubyte1 : SDNode<"AMDGPUISD::CVT_F32_UBYTE1",
244 SDTIntToFPOp, []>;
245def AMDGPUcvt_f32_ubyte2 : SDNode<"AMDGPUISD::CVT_F32_UBYTE2",
246 SDTIntToFPOp, []>;
247def AMDGPUcvt_f32_ubyte3 : SDNode<"AMDGPUISD::CVT_F32_UBYTE3",
248 SDTIntToFPOp, []>;
249
250
Tom Stellard75aadc22012-12-11 21:25:42 +0000251// urecip - This operation is a helper for integer division, it returns the
252// result of 1 / a as a fractional unsigned integer.
253// out = (2^32 / a) + e
254// e is rounding error
255def AMDGPUurecip : SDNode<"AMDGPUISD::URECIP", SDTIntUnaryOp>;
256
Matt Arsenaulta0050b02014-06-19 01:19:19 +0000257// Special case divide preop and flags.
258def AMDGPUdiv_scale : SDNode<"AMDGPUISD::DIV_SCALE", AMDGPUDivScaleOp>;
259
260// Special case divide FMA with scale and flags (src0 = Quotient,
261// src1 = Denominator, src2 = Numerator).
Matt Arsenault1bc9d952015-02-14 04:22:00 +0000262def AMDGPUdiv_fmas : SDNode<"AMDGPUISD::DIV_FMAS", AMDGPUFmasOp>;
Matt Arsenaulta0050b02014-06-19 01:19:19 +0000263
264// Single or double precision division fixup.
265// Special case divide fixup and flags(src0 = Quotient, src1 =
266// Denominator, src2 = Numerator).
267def AMDGPUdiv_fixup : SDNode<"AMDGPUISD::DIV_FIXUP", SDTFPTernaryOp>;
268
Wei Ding4d3d4ca2017-02-24 23:00:29 +0000269def AMDGPUfmad_ftz : SDNode<"AMDGPUISD::FMAD_FTZ", SDTFPTernaryOp>;
270
Matt Arsenaulta0050b02014-06-19 01:19:19 +0000271// Look Up 2.0 / pi src0 with segment select src1[4:0]
272def AMDGPUtrig_preop : SDNode<"AMDGPUISD::TRIG_PREOP", AMDGPUTrigPreOp>;
273
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000274def AMDGPUregister_load : SDNode<"AMDGPUISD::REGISTER_LOAD",
275 SDTypeProfile<1, 2, [SDTCisPtrTy<1>, SDTCisInt<2>]>,
276 [SDNPHasChain, SDNPMayLoad]>;
277
278def AMDGPUregister_store : SDNode<"AMDGPUISD::REGISTER_STORE",
279 SDTypeProfile<0, 3, [SDTCisPtrTy<1>, SDTCisInt<2>]>,
280 [SDNPHasChain, SDNPMayStore]>;
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000281
Tom Stellardf3d166a2013-08-26 15:05:49 +0000282// MSKOR instructions are atomic memory instructions used mainly for storing
283// 8-bit and 16-bit values. The definition is:
284//
285// MSKOR(dst, mask, src) MEM[dst] = ((MEM[dst] & ~mask) | src)
286//
287// src0: vec4(src, 0, 0, mask)
Matt Arsenaultda59f3d2014-11-13 23:03:09 +0000288// src1: dst - rat offset (aka pointer) in dwords
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000289def AMDGPUstore_mskor : SDNode<"AMDGPUISD::STORE_MSKOR",
290 SDTypeProfile<0, 2, []>,
291 [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
Tom Stellard4d566b22013-11-27 21:23:20 +0000292
Tom Stellard354a43c2016-04-01 18:27:37 +0000293def AMDGPUatomic_cmp_swap : SDNode<"AMDGPUISD::ATOMIC_CMP_SWAP",
294 SDTypeProfile<1, 2, [SDTCisPtrTy<1>, SDTCisVec<2>]>,
295 [SDNPHasChain, SDNPMayStore, SDNPMayLoad,
296 SDNPMemOperand]>;
297
Tom Stellard4d566b22013-11-27 21:23:20 +0000298def AMDGPUround : SDNode<"ISD::FROUND",
299 SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisSameAs<0,1>]>>;
Matt Arsenaultfae02982014-03-17 18:58:11 +0000300
301def AMDGPUbfe_u32 : SDNode<"AMDGPUISD::BFE_U32", AMDGPUDTIntTernaryOp>;
302def AMDGPUbfe_i32 : SDNode<"AMDGPUISD::BFE_I32", AMDGPUDTIntTernaryOp>;
Matt Arsenaultb3458362014-03-31 18:21:13 +0000303def AMDGPUbfi : SDNode<"AMDGPUISD::BFI", AMDGPUDTIntTernaryOp>;
304def AMDGPUbfm : SDNode<"AMDGPUISD::BFM", SDTIntBinOp>;
Matt Arsenaultfae02982014-03-17 18:58:11 +0000305
Matt Arsenaultde5fbe92016-01-11 17:02:00 +0000306def AMDGPUffbh_u32 : SDNode<"AMDGPUISD::FFBH_U32", SDTIntUnaryOp>;
Matt Arsenaultc96e1de2016-07-18 18:35:05 +0000307def AMDGPUffbh_i32 : SDNode<"AMDGPUISD::FFBH_I32", SDTIntUnaryOp>;
Matt Arsenaultde5fbe92016-01-11 17:02:00 +0000308
Wei Ding5676aca2017-10-12 19:37:14 +0000309def AMDGPUffbl_b32 : SDNode<"AMDGPUISD::FFBL_B32", SDTIntUnaryOp>;
310
Matt Arsenault2712d4a2016-08-27 01:32:27 +0000311// Signed and unsigned 24-bit multiply. The highest 8-bits are ignore
312// when performing the mulitply. The result is a 32-bit value.
Tom Stellard50122a52014-04-07 19:45:41 +0000313def AMDGPUmul_u24 : SDNode<"AMDGPUISD::MUL_U24", SDTIntBinOp,
Matt Arsenault2712d4a2016-08-27 01:32:27 +0000314 [SDNPCommutative, SDNPAssociative]
Tom Stellard50122a52014-04-07 19:45:41 +0000315>;
316def AMDGPUmul_i24 : SDNode<"AMDGPUISD::MUL_I24", SDTIntBinOp,
Matt Arsenault2712d4a2016-08-27 01:32:27 +0000317 [SDNPCommutative, SDNPAssociative]
318>;
319
320def AMDGPUmulhi_u24 : SDNode<"AMDGPUISD::MULHI_U24", SDTIntBinOp,
321 [SDNPCommutative, SDNPAssociative]
322>;
323def AMDGPUmulhi_i24 : SDNode<"AMDGPUISD::MULHI_I24", SDTIntBinOp,
324 [SDNPCommutative, SDNPAssociative]
Tom Stellard50122a52014-04-07 19:45:41 +0000325>;
Matt Arsenaulteb260202014-05-22 18:00:15 +0000326
327def AMDGPUmad_u24 : SDNode<"AMDGPUISD::MAD_U24", AMDGPUDTIntTernaryOp,
328 []
329>;
330def AMDGPUmad_i24 : SDNode<"AMDGPUISD::MAD_I24", AMDGPUDTIntTernaryOp,
331 []
332>;
Tom Stellardbc5b5372014-06-13 16:38:59 +0000333
Matt Arsenaultf639c322016-01-28 20:53:42 +0000334def AMDGPUsmed3 : SDNode<"AMDGPUISD::SMED3", AMDGPUDTIntTernaryOp,
335 []
336>;
337
338def AMDGPUumed3 : SDNode<"AMDGPUISD::UMED3", AMDGPUDTIntTernaryOp,
339 []
340>;
341
342def AMDGPUfmed3 : SDNode<"AMDGPUISD::FMED3", SDTFPTernaryOp, []>;
343
Farhana Aleenc370d7b2018-07-16 18:19:59 +0000344def AMDGPUfdot2 : SDNode<"AMDGPUISD::FDOT2",
Konstantin Zhuravlyovbb30ef72018-08-01 01:31:30 +0000345 SDTypeProfile<1, 4, [SDTCisSameAs<0, 3>, SDTCisSameAs<1, 2>,
346 SDTCisFP<0>, SDTCisVec<1>,
347 SDTCisInt<4>]>,
Farhana Aleenc370d7b2018-07-16 18:19:59 +0000348 []>;
349
Stanislav Mekhanoshin8fd3c4e2018-06-12 23:50:37 +0000350def AMDGPUperm : SDNode<"AMDGPUISD::PERM", AMDGPUDTIntTernaryOp, []>;
351
Marek Olsak2d825902017-04-28 20:21:58 +0000352def AMDGPUinit_exec : SDNode<"AMDGPUISD::INIT_EXEC",
353 SDTypeProfile<0, 1, [SDTCisInt<0>]>,
354 [SDNPHasChain, SDNPInGlue]>;
355
356def AMDGPUinit_exec_from_input : SDNode<"AMDGPUISD::INIT_EXEC_FROM_INPUT",
357 SDTypeProfile<0, 2,
358 [SDTCisInt<0>, SDTCisInt<1>]>,
359 [SDNPHasChain, SDNPInGlue]>;
360
Tom Stellardfc92e772015-05-12 14:18:14 +0000361def AMDGPUsendmsg : SDNode<"AMDGPUISD::SENDMSG",
362 SDTypeProfile<0, 1, [SDTCisInt<0>]>,
363 [SDNPHasChain, SDNPInGlue]>;
364
Jan Veselyd48445d2017-01-04 18:06:55 +0000365def AMDGPUsendmsghalt : SDNode<"AMDGPUISD::SENDMSGHALT",
366 SDTypeProfile<0, 1, [SDTCisInt<0>]>,
367 [SDNPHasChain, SDNPInGlue]>;
368
Tom Stellard2a9d9472015-05-12 15:00:46 +0000369def AMDGPUinterp_mov : SDNode<"AMDGPUISD::INTERP_MOV",
370 SDTypeProfile<1, 3, [SDTCisFP<0>]>,
371 [SDNPInGlue]>;
372
373def AMDGPUinterp_p1 : SDNode<"AMDGPUISD::INTERP_P1",
374 SDTypeProfile<1, 3, [SDTCisFP<0>]>,
375 [SDNPInGlue, SDNPOutGlue]>;
376
377def AMDGPUinterp_p2 : SDNode<"AMDGPUISD::INTERP_P2",
378 SDTypeProfile<1, 4, [SDTCisFP<0>]>,
379 [SDNPInGlue]>;
380
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000381
Matt Arsenault03006fd2016-07-19 16:27:56 +0000382def AMDGPUkill : SDNode<"AMDGPUISD::KILL", AMDGPUKillSDT,
383 [SDNPHasChain, SDNPSideEffect]>;
384
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000385// SI+ export
386def AMDGPUExportOp : SDTypeProfile<0, 8, [
Matt Arsenault4165efd2017-01-17 07:26:53 +0000387 SDTCisInt<0>, // i8 tgt
388 SDTCisInt<1>, // i8 en
389 // i32 or f32 src0
390 SDTCisSameAs<3, 2>, // f32 src1
391 SDTCisSameAs<4, 2>, // f32 src2
392 SDTCisSameAs<5, 2>, // f32 src3
393 SDTCisInt<6>, // i1 compr
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000394 // skip done
Matt Arsenault4165efd2017-01-17 07:26:53 +0000395 SDTCisInt<1> // i1 vm
396
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000397]>;
398
399def AMDGPUexport: SDNode<"AMDGPUISD::EXPORT", AMDGPUExportOp,
400 [SDNPHasChain, SDNPMayStore]>;
401
402def AMDGPUexport_done: SDNode<"AMDGPUISD::EXPORT_DONE", AMDGPUExportOp,
403 [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>;
404
405
406def R600ExportOp : SDTypeProfile<0, 7, [SDTCisFP<0>, SDTCisInt<1>]>;
407
408def R600_EXPORT: SDNode<"AMDGPUISD::R600_EXPORT", R600ExportOp,
409 [SDNPHasChain, SDNPSideEffect]>;
410
Tom Stellardbc5b5372014-06-13 16:38:59 +0000411//===----------------------------------------------------------------------===//
412// Flow Control Profile Types
413//===----------------------------------------------------------------------===//
414// Branch instruction where second and third are basic blocks
415def SDTIL_BRCond : SDTypeProfile<0, 2, [
416 SDTCisVT<0, OtherVT>
417 ]>;
418
419//===----------------------------------------------------------------------===//
420// Flow Control DAG Nodes
421//===----------------------------------------------------------------------===//
422def IL_brcond : SDNode<"AMDGPUISD::BRANCH_COND", SDTIL_BRCond, [SDNPHasChain]>;
423
424//===----------------------------------------------------------------------===//
425// Call/Return DAG Nodes
426//===----------------------------------------------------------------------===//
Matt Arsenault9babdf42016-06-22 20:15:28 +0000427def AMDGPUendpgm : SDNode<"AMDGPUISD::ENDPGM", SDTNone,
428 [SDNPHasChain, SDNPOptInGlue]>;
429
Matt Arsenault5b20fbb2017-03-21 22:18:10 +0000430def AMDGPUreturn_to_epilog : SDNode<"AMDGPUISD::RETURN_TO_EPILOG", SDTNone,
Marek Olsak8a0f3352016-01-13 17:23:04 +0000431 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
Matt Arsenault5b20fbb2017-03-21 22:18:10 +0000432
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000433def AMDGPUret_flag : SDNode<"AMDGPUISD::RET_FLAG", SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>,
Matt Arsenault5b20fbb2017-03-21 22:18:10 +0000434 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]
435>;