xref: /NextBSD/contrib/llvm/include/llvm/IR/Intrinsics.td (revision 84d351007654069f9643c8e4b4802a7f5f08ee42)
1//===- Intrinsics.td - Defines all LLVM intrinsics ---------*- 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 defines properties of all LLVM intrinsics.
11//
12//===----------------------------------------------------------------------===//
13
14include "llvm/CodeGen/ValueTypes.td"
15
16//===----------------------------------------------------------------------===//
17//  Properties we keep track of for intrinsics.
18//===----------------------------------------------------------------------===//
19
20class IntrinsicProperty;
21
22// Intr*Mem - Memory properties.  An intrinsic is allowed to have at most one of
23// these properties set.  They are listed from the most aggressive (best to use
24// if correct) to the least aggressive.  If no property is set, the worst case
25// is assumed (it may read and write any memory it can get access to and it may
26// have other side effects).
27
28// IntrNoMem - The intrinsic does not access memory or have any other side
29// effects.  It may be CSE'd deleted if dead, etc.
30def IntrNoMem : IntrinsicProperty;
31
32// IntrReadArgMem - This intrinsic reads only from memory that one of its
33// pointer-typed arguments points to, but may read an unspecified amount.
34def IntrReadArgMem : IntrinsicProperty;
35
36// IntrReadMem - This intrinsic reads from unspecified memory, so it cannot be
37// moved across stores.  However, it can be reordered otherwise and can be
38// deleted if dead.
39def IntrReadMem : IntrinsicProperty;
40
41// IntrReadWriteArgMem - This intrinsic reads and writes only from memory that
42// one of its arguments points to, but may access an unspecified amount.  The
43// reads and writes may be volatile, but except for this it has no other side
44// effects.
45def IntrReadWriteArgMem : IntrinsicProperty;
46
47// Commutative - This intrinsic is commutative: X op Y == Y op X.
48def Commutative : IntrinsicProperty;
49
50// Throws - This intrinsic can throw.
51def Throws : IntrinsicProperty;
52
53// NoCapture - The specified argument pointer is not captured by the intrinsic.
54class NoCapture<int argNo> : IntrinsicProperty {
55  int ArgNo = argNo;
56}
57
58// ReadOnly - The specified argument pointer is not written to through the
59// pointer by the intrinsic.
60class ReadOnly<int argNo> : IntrinsicProperty {
61  int ArgNo = argNo;
62}
63
64// ReadNone - The specified argument pointer is not dereferenced by the
65// intrinsic.
66class ReadNone<int argNo> : IntrinsicProperty {
67  int ArgNo = argNo;
68}
69
70def IntrNoReturn : IntrinsicProperty;
71
72// IntrNoduplicate - Calls to this intrinsic cannot be duplicated.
73// Parallels the noduplicate attribute on LLVM IR functions.
74def IntrNoDuplicate : IntrinsicProperty;
75
76// IntrConvergent - Calls to this intrinsic are convergent and may only be
77// moved to control equivalent blocks.
78// Parallels the convergent attribute on LLVM IR functions.
79def IntrConvergent : IntrinsicProperty;
80
81//===----------------------------------------------------------------------===//
82// Types used by intrinsics.
83//===----------------------------------------------------------------------===//
84
85class LLVMType<ValueType vt> {
86  ValueType VT = vt;
87}
88
89class LLVMQualPointerType<LLVMType elty, int addrspace>
90  : LLVMType<iPTR>{
91  LLVMType ElTy = elty;
92  int AddrSpace = addrspace;
93}
94
95class LLVMPointerType<LLVMType elty>
96  : LLVMQualPointerType<elty, 0>;
97
98class LLVMAnyPointerType<LLVMType elty>
99  : LLVMType<iPTRAny>{
100  LLVMType ElTy = elty;
101}
102
103// Match the type of another intrinsic parameter.  Number is an index into the
104// list of overloaded types for the intrinsic, excluding all the fixed types.
105// The Number value must refer to a previously listed type.  For example:
106//   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_anyfloat_ty, LLVMMatchType<0>]>
107// has two overloaded types, the 2nd and 3rd arguments.  LLVMMatchType<0>
108// refers to the first overloaded type, which is the 2nd argument.
109class LLVMMatchType<int num>
110  : LLVMType<OtherVT>{
111  int Number = num;
112}
113
114// Match the type of another intrinsic parameter that is expected to be based on
115// an integral type (i.e. either iN or <N x iM>), but change the scalar size to
116// be twice as wide or half as wide as the other type.  This is only useful when
117// the intrinsic is overloaded, so the matched type should be declared as iAny.
118class LLVMExtendedType<int num> : LLVMMatchType<num>;
119class LLVMTruncatedType<int num> : LLVMMatchType<num>;
120class LLVMVectorSameWidth<int num, LLVMType elty>
121  : LLVMMatchType<num> {
122  ValueType ElTy = elty.VT;
123}
124class LLVMPointerTo<int num> : LLVMMatchType<num>;
125class LLVMVectorOfPointersToElt<int num> : LLVMMatchType<num>;
126
127// Match the type of another intrinsic parameter that is expected to be a
128// vector type, but change the element count to be half as many
129class LLVMHalfElementsVectorType<int num> : LLVMMatchType<num>;
130
131def llvm_void_ty       : LLVMType<isVoid>;
132def llvm_any_ty        : LLVMType<Any>;
133def llvm_anyint_ty     : LLVMType<iAny>;
134def llvm_anyfloat_ty   : LLVMType<fAny>;
135def llvm_anyvector_ty  : LLVMType<vAny>;
136def llvm_i1_ty         : LLVMType<i1>;
137def llvm_i8_ty         : LLVMType<i8>;
138def llvm_i16_ty        : LLVMType<i16>;
139def llvm_i32_ty        : LLVMType<i32>;
140def llvm_i64_ty        : LLVMType<i64>;
141def llvm_half_ty       : LLVMType<f16>;
142def llvm_float_ty      : LLVMType<f32>;
143def llvm_double_ty     : LLVMType<f64>;
144def llvm_f80_ty        : LLVMType<f80>;
145def llvm_f128_ty       : LLVMType<f128>;
146def llvm_ppcf128_ty    : LLVMType<ppcf128>;
147def llvm_ptr_ty        : LLVMPointerType<llvm_i8_ty>;             // i8*
148def llvm_ptrptr_ty     : LLVMPointerType<llvm_ptr_ty>;            // i8**
149def llvm_anyptr_ty     : LLVMAnyPointerType<llvm_i8_ty>;          // (space)i8*
150def llvm_empty_ty      : LLVMType<OtherVT>;                       // { }
151def llvm_descriptor_ty : LLVMPointerType<llvm_empty_ty>;          // { }*
152def llvm_metadata_ty   : LLVMType<MetadataVT>;                    // !{...}
153
154def llvm_x86mmx_ty     : LLVMType<x86mmx>;
155def llvm_ptrx86mmx_ty  : LLVMPointerType<llvm_x86mmx_ty>;         // <1 x i64>*
156
157def llvm_v2i1_ty       : LLVMType<v2i1>;     //  2 x i1
158def llvm_v4i1_ty       : LLVMType<v4i1>;     //  4 x i1
159def llvm_v8i1_ty       : LLVMType<v8i1>;     //  8 x i1
160def llvm_v16i1_ty      : LLVMType<v16i1>;    // 16 x i1
161def llvm_v32i1_ty      : LLVMType<v32i1>;    // 32 x i1
162def llvm_v64i1_ty      : LLVMType<v64i1>;    // 64 x i1
163def llvm_v1i8_ty       : LLVMType<v1i8>;     //  1 x i8
164def llvm_v2i8_ty       : LLVMType<v2i8>;     //  2 x i8
165def llvm_v4i8_ty       : LLVMType<v4i8>;     //  4 x i8
166def llvm_v8i8_ty       : LLVMType<v8i8>;     //  8 x i8
167def llvm_v16i8_ty      : LLVMType<v16i8>;    // 16 x i8
168def llvm_v32i8_ty      : LLVMType<v32i8>;    // 32 x i8
169def llvm_v64i8_ty      : LLVMType<v64i8>;    // 64 x i8
170
171def llvm_v1i16_ty      : LLVMType<v1i16>;    //  1 x i16
172def llvm_v2i16_ty      : LLVMType<v2i16>;    //  2 x i16
173def llvm_v4i16_ty      : LLVMType<v4i16>;    //  4 x i16
174def llvm_v8i16_ty      : LLVMType<v8i16>;    //  8 x i16
175def llvm_v16i16_ty     : LLVMType<v16i16>;   // 16 x i16
176def llvm_v32i16_ty     : LLVMType<v32i16>;   // 32 x i16
177
178def llvm_v1i32_ty      : LLVMType<v1i32>;    //  1 x i32
179def llvm_v2i32_ty      : LLVMType<v2i32>;    //  2 x i32
180def llvm_v4i32_ty      : LLVMType<v4i32>;    //  4 x i32
181def llvm_v8i32_ty      : LLVMType<v8i32>;    //  8 x i32
182def llvm_v16i32_ty     : LLVMType<v16i32>;   // 16 x i32
183def llvm_v1i64_ty      : LLVMType<v1i64>;    //  1 x i64
184def llvm_v2i64_ty      : LLVMType<v2i64>;    //  2 x i64
185def llvm_v4i64_ty      : LLVMType<v4i64>;    //  4 x i64
186def llvm_v8i64_ty      : LLVMType<v8i64>;    //  8 x i64
187def llvm_v16i64_ty     : LLVMType<v16i64>;   // 16 x i64
188
189def llvm_v1i128_ty     : LLVMType<v1i128>;   //  1 x i128
190
191def llvm_v2f16_ty      : LLVMType<v2f16>;    //  2 x half (__fp16)
192def llvm_v4f16_ty      : LLVMType<v4f16>;    //  4 x half (__fp16)
193def llvm_v8f16_ty      : LLVMType<v8f16>;    //  8 x half (__fp16)
194def llvm_v1f32_ty      : LLVMType<v1f32>;    //  1 x float
195def llvm_v2f32_ty      : LLVMType<v2f32>;    //  2 x float
196def llvm_v4f32_ty      : LLVMType<v4f32>;    //  4 x float
197def llvm_v8f32_ty      : LLVMType<v8f32>;    //  8 x float
198def llvm_v16f32_ty     : LLVMType<v16f32>;   // 16 x float
199def llvm_v1f64_ty      : LLVMType<v1f64>;    //  1 x double
200def llvm_v2f64_ty      : LLVMType<v2f64>;    //  2 x double
201def llvm_v4f64_ty      : LLVMType<v4f64>;    //  4 x double
202def llvm_v8f64_ty      : LLVMType<v8f64>;    //  8 x double
203
204def llvm_vararg_ty     : LLVMType<isVoid>;   // this means vararg here
205
206
207//===----------------------------------------------------------------------===//
208// Intrinsic Definitions.
209//===----------------------------------------------------------------------===//
210
211// Intrinsic class - This is used to define one LLVM intrinsic.  The name of the
212// intrinsic definition should start with "int_", then match the LLVM intrinsic
213// name with the "llvm." prefix removed, and all "."s turned into "_"s.  For
214// example, llvm.bswap.i16 -> int_bswap_i16.
215//
216//  * RetTypes is a list containing the return types expected for the
217//    intrinsic.
218//  * ParamTypes is a list containing the parameter types expected for the
219//    intrinsic.
220//  * Properties can be set to describe the behavior of the intrinsic.
221//
222class SDPatternOperator;
223class Intrinsic<list<LLVMType> ret_types,
224                list<LLVMType> param_types = [],
225                list<IntrinsicProperty> properties = [],
226                string name = ""> : SDPatternOperator {
227  string LLVMName = name;
228  string TargetPrefix = "";   // Set to a prefix for target-specific intrinsics.
229  list<LLVMType> RetTypes = ret_types;
230  list<LLVMType> ParamTypes = param_types;
231  list<IntrinsicProperty> Properties = properties;
232
233  bit isTarget = 0;
234}
235
236/// GCCBuiltin - If this intrinsic exactly corresponds to a GCC builtin, this
237/// specifies the name of the builtin.  This provides automatic CBE and CFE
238/// support.
239class GCCBuiltin<string name> {
240  string GCCBuiltinName = name;
241}
242
243class MSBuiltin<string name> {
244  string MSBuiltinName = name;
245}
246
247
248//===--------------- Variable Argument Handling Intrinsics ----------------===//
249//
250
251def int_vastart : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_start">;
252def int_vacopy  : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], [],
253                            "llvm.va_copy">;
254def int_vaend   : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_end">;
255
256//===------------------- Garbage Collection Intrinsics --------------------===//
257//
258def int_gcroot  : Intrinsic<[],
259                            [llvm_ptrptr_ty, llvm_ptr_ty]>;
260def int_gcread  : Intrinsic<[llvm_ptr_ty],
261                            [llvm_ptr_ty, llvm_ptrptr_ty],
262                            [IntrReadArgMem]>;
263def int_gcwrite : Intrinsic<[],
264                            [llvm_ptr_ty, llvm_ptr_ty, llvm_ptrptr_ty],
265                            [IntrReadWriteArgMem, NoCapture<1>, NoCapture<2>]>;
266
267//===--------------------- Code Generator Intrinsics ----------------------===//
268//
269def int_returnaddress : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty], [IntrNoMem]>;
270def int_frameaddress  : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty], [IntrNoMem]>;
271def int_read_register  : Intrinsic<[llvm_anyint_ty], [llvm_metadata_ty],
272                                   [IntrReadMem], "llvm.read_register">;
273def int_write_register : Intrinsic<[], [llvm_metadata_ty, llvm_anyint_ty],
274                                   [], "llvm.write_register">;
275
276// Gets the address of the local variable area. This is typically a copy of the
277// stack, frame, or base pointer depending on the type of prologue.
278def int_localaddress : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
279
280// Escapes local variables to allow access from other functions.
281def int_localescape : Intrinsic<[], [llvm_vararg_ty]>;
282
283// Given a function and the localaddress of a parent frame, returns a pointer
284// to an escaped allocation indicated by the index.
285def int_localrecover : Intrinsic<[llvm_ptr_ty],
286                                 [llvm_ptr_ty, llvm_ptr_ty, llvm_i32_ty],
287                                 [IntrNoMem]>;
288// Note: we treat stacksave/stackrestore as writemem because we don't otherwise
289// model their dependencies on allocas.
290def int_stacksave     : Intrinsic<[llvm_ptr_ty]>,
291                        GCCBuiltin<"__builtin_stack_save">;
292def int_stackrestore  : Intrinsic<[], [llvm_ptr_ty]>,
293                        GCCBuiltin<"__builtin_stack_restore">;
294
295// IntrReadWriteArgMem is more pessimistic than strictly necessary for prefetch,
296// however it does conveniently prevent the prefetch from being reordered
297// with respect to nearby accesses to the same memory.
298def int_prefetch      : Intrinsic<[],
299                                  [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty,
300                                   llvm_i32_ty],
301                                  [IntrReadWriteArgMem, NoCapture<0>]>;
302def int_pcmarker      : Intrinsic<[], [llvm_i32_ty]>;
303
304def int_readcyclecounter : Intrinsic<[llvm_i64_ty]>;
305
306// The assume intrinsic is marked as arbitrarily writing so that proper
307// control dependencies will be maintained.
308def int_assume        : Intrinsic<[], [llvm_i1_ty], []>;
309
310// Stack Protector Intrinsic - The stackprotector intrinsic writes the stack
311// guard to the correct place on the stack frame.
312def int_stackprotector : Intrinsic<[], [llvm_ptr_ty, llvm_ptrptr_ty], []>;
313def int_stackprotectorcheck : Intrinsic<[], [llvm_ptrptr_ty],
314                                        [IntrReadWriteArgMem]>;
315
316// A counter increment for instrumentation based profiling.
317def int_instrprof_increment : Intrinsic<[],
318                                        [llvm_ptr_ty, llvm_i64_ty,
319                                         llvm_i32_ty, llvm_i32_ty],
320                                        []>;
321
322//===------------------- Standard C Library Intrinsics --------------------===//
323//
324
325def int_memcpy  : Intrinsic<[],
326                             [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
327                              llvm_i32_ty, llvm_i1_ty],
328                            [IntrReadWriteArgMem, NoCapture<0>, NoCapture<1>,
329                             ReadOnly<1>]>;
330def int_memmove : Intrinsic<[],
331                            [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
332                             llvm_i32_ty, llvm_i1_ty],
333                            [IntrReadWriteArgMem, NoCapture<0>, NoCapture<1>,
334                             ReadOnly<1>]>;
335def int_memset  : Intrinsic<[],
336                            [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty,
337                             llvm_i32_ty, llvm_i1_ty],
338                            [IntrReadWriteArgMem, NoCapture<0>]>;
339
340let Properties = [IntrNoMem] in {
341  def int_fma  : Intrinsic<[llvm_anyfloat_ty],
342                           [LLVMMatchType<0>, LLVMMatchType<0>,
343                            LLVMMatchType<0>]>;
344  def int_fmuladd : Intrinsic<[llvm_anyfloat_ty],
345                              [LLVMMatchType<0>, LLVMMatchType<0>,
346                               LLVMMatchType<0>]>;
347
348  // These functions do not read memory, but are sensitive to the
349  // rounding mode. LLVM purposely does not model changes to the FP
350  // environment so they can be treated as readnone.
351  def int_sqrt : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
352  def int_powi : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, llvm_i32_ty]>;
353  def int_sin  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
354  def int_cos  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
355  def int_pow  : Intrinsic<[llvm_anyfloat_ty],
356                           [LLVMMatchType<0>, LLVMMatchType<0>]>;
357  def int_log  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
358  def int_log10: Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
359  def int_log2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
360  def int_exp  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
361  def int_exp2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
362  def int_fabs : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
363  def int_minnum : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>]>;
364  def int_maxnum : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>]>;
365  def int_copysign : Intrinsic<[llvm_anyfloat_ty],
366                               [LLVMMatchType<0>, LLVMMatchType<0>]>;
367  def int_floor : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
368  def int_ceil  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
369  def int_trunc : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
370  def int_rint  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
371  def int_nearbyint : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
372  def int_round : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
373  def int_canonicalize : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>],
374                                   [IntrNoMem]>;
375}
376
377// NOTE: these are internal interfaces.
378def int_setjmp     : Intrinsic<[llvm_i32_ty],  [llvm_ptr_ty]>;
379def int_longjmp    : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrNoReturn]>;
380def int_sigsetjmp  : Intrinsic<[llvm_i32_ty] , [llvm_ptr_ty, llvm_i32_ty]>;
381def int_siglongjmp : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrNoReturn]>;
382
383// Internal interface for object size checking
384def int_objectsize : Intrinsic<[llvm_anyint_ty], [llvm_anyptr_ty, llvm_i1_ty],
385                               [IntrNoMem]>,
386                               GCCBuiltin<"__builtin_object_size">;
387
388//===------------------------- Expect Intrinsics --------------------------===//
389//
390def int_expect : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
391                                              LLVMMatchType<0>], [IntrNoMem]>;
392
393//===-------------------- Bit Manipulation Intrinsics ---------------------===//
394//
395
396// None of these intrinsics accesses memory at all.
397let Properties = [IntrNoMem] in {
398  def int_bswap: Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>]>;
399  def int_ctpop: Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>]>;
400  def int_ctlz : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, llvm_i1_ty]>;
401  def int_cttz : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, llvm_i1_ty]>;
402}
403
404//===------------------------ Debugger Intrinsics -------------------------===//
405//
406
407// None of these intrinsics accesses memory at all...but that doesn't mean the
408// optimizers can change them aggressively.  Special handling needed in a few
409// places.
410let Properties = [IntrNoMem] in {
411  def int_dbg_declare      : Intrinsic<[],
412                                       [llvm_metadata_ty,
413                                       llvm_metadata_ty,
414                                       llvm_metadata_ty]>;
415  def int_dbg_value        : Intrinsic<[],
416                                       [llvm_metadata_ty, llvm_i64_ty,
417                                        llvm_metadata_ty,
418                                        llvm_metadata_ty]>;
419}
420
421//===------------------ Exception Handling Intrinsics----------------------===//
422//
423
424// The result of eh.typeid.for depends on the enclosing function, but inside a
425// given function it is 'const' and may be CSE'd etc.
426def int_eh_typeid_for : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
427
428def int_eh_return_i32 : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty]>;
429def int_eh_return_i64 : Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty]>;
430
431// eh.begincatch takes a pointer returned by a landingpad instruction and
432// copies the exception object into the memory pointed to by the second
433// parameter. If the second parameter is null, no copy occurs.
434def int_eh_begincatch : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
435                                  [NoCapture<0>, NoCapture<1>]>;
436def int_eh_endcatch : Intrinsic<[], []>;
437
438// Represents the list of actions to take when an exception is thrown.
439def int_eh_actions : Intrinsic<[llvm_ptr_ty], [llvm_vararg_ty], []>;
440
441def int_eh_exceptioncode : Intrinsic<[llvm_i32_ty], [], [IntrReadMem]>;
442
443// __builtin_unwind_init is an undocumented GCC intrinsic that causes all
444// callee-saved registers to be saved and restored (regardless of whether they
445// are used) in the calling function. It is used by libgcc_eh.
446def int_eh_unwind_init: Intrinsic<[]>,
447                        GCCBuiltin<"__builtin_unwind_init">;
448
449def int_eh_dwarf_cfa  : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty]>;
450
451let Properties = [IntrNoMem] in {
452  def int_eh_sjlj_lsda             : Intrinsic<[llvm_ptr_ty]>;
453  def int_eh_sjlj_callsite         : Intrinsic<[], [llvm_i32_ty]>;
454}
455def int_eh_sjlj_functioncontext : Intrinsic<[], [llvm_ptr_ty]>;
456def int_eh_sjlj_setjmp          : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
457def int_eh_sjlj_longjmp         : Intrinsic<[], [llvm_ptr_ty], [IntrNoReturn]>;
458
459//===---------------- Generic Variable Attribute Intrinsics----------------===//
460//
461def int_var_annotation : Intrinsic<[],
462                                   [llvm_ptr_ty, llvm_ptr_ty,
463                                    llvm_ptr_ty, llvm_i32_ty],
464                                   [], "llvm.var.annotation">;
465def int_ptr_annotation : Intrinsic<[LLVMAnyPointerType<llvm_anyint_ty>],
466                                   [LLVMMatchType<0>, llvm_ptr_ty, llvm_ptr_ty,
467                                    llvm_i32_ty],
468                                   [], "llvm.ptr.annotation">;
469def int_annotation : Intrinsic<[llvm_anyint_ty],
470                               [LLVMMatchType<0>, llvm_ptr_ty,
471                                llvm_ptr_ty, llvm_i32_ty],
472                               [], "llvm.annotation">;
473
474//===------------------------ Trampoline Intrinsics -----------------------===//
475//
476def int_init_trampoline : Intrinsic<[],
477                                    [llvm_ptr_ty, llvm_ptr_ty, llvm_ptr_ty],
478                                    [IntrReadWriteArgMem, NoCapture<0>]>,
479                                   GCCBuiltin<"__builtin_init_trampoline">;
480
481def int_adjust_trampoline : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty],
482                                      [IntrReadArgMem]>,
483                                     GCCBuiltin<"__builtin_adjust_trampoline">;
484
485//===------------------------ Overflow Intrinsics -------------------------===//
486//
487
488// Expose the carry flag from add operations on two integrals.
489def int_sadd_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
490                                       [LLVMMatchType<0>, LLVMMatchType<0>],
491                                       [IntrNoMem]>;
492def int_uadd_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
493                                       [LLVMMatchType<0>, LLVMMatchType<0>],
494                                       [IntrNoMem]>;
495
496def int_ssub_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
497                                       [LLVMMatchType<0>, LLVMMatchType<0>],
498                                       [IntrNoMem]>;
499def int_usub_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
500                                       [LLVMMatchType<0>, LLVMMatchType<0>],
501                                       [IntrNoMem]>;
502
503def int_smul_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
504                                       [LLVMMatchType<0>, LLVMMatchType<0>],
505                                       [IntrNoMem]>;
506def int_umul_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
507                                       [LLVMMatchType<0>, LLVMMatchType<0>],
508                                       [IntrNoMem]>;
509
510//===------------------------- Memory Use Markers -------------------------===//
511//
512def int_lifetime_start  : Intrinsic<[],
513                                    [llvm_i64_ty, llvm_ptr_ty],
514                                    [IntrReadWriteArgMem, NoCapture<1>]>;
515def int_lifetime_end    : Intrinsic<[],
516                                    [llvm_i64_ty, llvm_ptr_ty],
517                                    [IntrReadWriteArgMem, NoCapture<1>]>;
518def int_invariant_start : Intrinsic<[llvm_descriptor_ty],
519                                    [llvm_i64_ty, llvm_ptr_ty],
520                                    [IntrReadWriteArgMem, NoCapture<1>]>;
521def int_invariant_end   : Intrinsic<[],
522                                    [llvm_descriptor_ty, llvm_i64_ty,
523                                     llvm_ptr_ty],
524                                    [IntrReadWriteArgMem, NoCapture<2>]>;
525
526//===------------------------ Stackmap Intrinsics -------------------------===//
527//
528def int_experimental_stackmap : Intrinsic<[],
529                                  [llvm_i64_ty, llvm_i32_ty, llvm_vararg_ty],
530                                  [Throws]>;
531def int_experimental_patchpoint_void : Intrinsic<[],
532                                                 [llvm_i64_ty, llvm_i32_ty,
533                                                  llvm_ptr_ty, llvm_i32_ty,
534                                                  llvm_vararg_ty],
535                                                  [Throws]>;
536def int_experimental_patchpoint_i64 : Intrinsic<[llvm_i64_ty],
537                                                [llvm_i64_ty, llvm_i32_ty,
538                                                 llvm_ptr_ty, llvm_i32_ty,
539                                                 llvm_vararg_ty],
540                                                 [Throws]>;
541
542
543//===------------------------ Garbage Collection Intrinsics ---------------===//
544// These are documented in docs/Statepoint.rst
545
546def int_experimental_gc_statepoint : Intrinsic<[llvm_i32_ty],
547                               [llvm_i64_ty, llvm_i32_ty,
548                                llvm_anyptr_ty, llvm_i32_ty,
549                                llvm_i32_ty, llvm_vararg_ty],
550                                [Throws]>;
551
552def int_experimental_gc_result   : Intrinsic<[llvm_any_ty], [llvm_i32_ty]>;
553def int_experimental_gc_relocate : Intrinsic<[llvm_anyptr_ty],
554                                [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
555
556// Deprecated: will be removed in a couple of weeks
557def int_experimental_gc_result_int : Intrinsic<[llvm_anyint_ty], [llvm_i32_ty]>;
558def int_experimental_gc_result_float : Intrinsic<[llvm_anyfloat_ty],
559                                                 [llvm_i32_ty]>;
560def int_experimental_gc_result_ptr : Intrinsic<[llvm_anyptr_ty], [llvm_i32_ty]>;
561
562//===-------------------------- Other Intrinsics --------------------------===//
563//
564def int_flt_rounds : Intrinsic<[llvm_i32_ty]>,
565                     GCCBuiltin<"__builtin_flt_rounds">;
566def int_trap : Intrinsic<[], [], [IntrNoReturn]>,
567               GCCBuiltin<"__builtin_trap">;
568def int_debugtrap : Intrinsic<[]>,
569                    GCCBuiltin<"__builtin_debugtrap">;
570
571// NOP: calls/invokes to this intrinsic are removed by codegen
572def int_donothing : Intrinsic<[], [], [IntrNoMem]>;
573
574// Intrisics to support half precision floating point format
575let Properties = [IntrNoMem] in {
576def int_convert_to_fp16   : Intrinsic<[llvm_i16_ty], [llvm_anyfloat_ty]>;
577def int_convert_from_fp16 : Intrinsic<[llvm_anyfloat_ty], [llvm_i16_ty]>;
578}
579
580// These convert intrinsics are to support various conversions between
581// various types with rounding and saturation. NOTE: avoid using these
582// intrinsics as they might be removed sometime in the future and
583// most targets don't support them.
584def int_convertff  : Intrinsic<[llvm_anyfloat_ty],
585                               [llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
586def int_convertfsi : Intrinsic<[llvm_anyfloat_ty],
587                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
588def int_convertfui : Intrinsic<[llvm_anyfloat_ty],
589                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
590def int_convertsif : Intrinsic<[llvm_anyint_ty],
591                               [llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
592def int_convertuif : Intrinsic<[llvm_anyint_ty],
593                               [llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
594def int_convertss  : Intrinsic<[llvm_anyint_ty],
595                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
596def int_convertsu  : Intrinsic<[llvm_anyint_ty],
597                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
598def int_convertus  : Intrinsic<[llvm_anyint_ty],
599                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
600def int_convertuu  : Intrinsic<[llvm_anyint_ty],
601                               [llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
602
603// Clear cache intrinsic, default to ignore (ie. emit nothing)
604// maps to void __clear_cache() on supporting platforms
605def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
606                                [], "llvm.clear_cache">;
607
608//===-------------------------- Masked Intrinsics -------------------------===//
609//
610def int_masked_store : Intrinsic<[], [llvm_anyvector_ty, LLVMPointerTo<0>,
611                                      llvm_i32_ty,
612                                      LLVMVectorSameWidth<0, llvm_i1_ty>],
613                                 [IntrReadWriteArgMem]>;
614
615def int_masked_load  : Intrinsic<[llvm_anyvector_ty],
616                                 [LLVMPointerTo<0>, llvm_i32_ty,
617                                  LLVMVectorSameWidth<0, llvm_i1_ty>, LLVMMatchType<0>],
618                                 [IntrReadArgMem]>;
619
620def int_masked_gather: Intrinsic<[llvm_anyvector_ty],
621                                 [LLVMVectorOfPointersToElt<0>, llvm_i32_ty,
622                                  LLVMVectorSameWidth<0, llvm_i1_ty>,
623                                  LLVMMatchType<0>],
624                                 [IntrReadArgMem]>;
625
626def int_masked_scatter: Intrinsic<[],
627                                  [llvm_anyvector_ty,
628                                   LLVMVectorOfPointersToElt<0>, llvm_i32_ty,
629                                   LLVMVectorSameWidth<0, llvm_i1_ty>],
630                                  [IntrReadWriteArgMem]>;
631
632// Intrinsics to support bit sets.
633def int_bitset_test : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_metadata_ty],
634                                [IntrNoMem]>;
635
636//===----------------------------------------------------------------------===//
637// Target-specific intrinsics
638//===----------------------------------------------------------------------===//
639
640include "llvm/IR/IntrinsicsPowerPC.td"
641include "llvm/IR/IntrinsicsX86.td"
642include "llvm/IR/IntrinsicsARM.td"
643include "llvm/IR/IntrinsicsAArch64.td"
644include "llvm/IR/IntrinsicsXCore.td"
645include "llvm/IR/IntrinsicsHexagon.td"
646include "llvm/IR/IntrinsicsNVVM.td"
647include "llvm/IR/IntrinsicsMips.td"
648include "llvm/IR/IntrinsicsAMDGPU.td"
649include "llvm/IR/IntrinsicsBPF.td"
650include "llvm/IR/IntrinsicsSystemZ.td"
651include "llvm/IR/IntrinsicsWebAssembly.td"
652