OSDN Git Service

[Intrinsic] Signed Fixed Point Multiplication Intrinsic
[android-x86/external-llvm.git] / include / llvm / IR / Intrinsics.td
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
14 include "llvm/CodeGen/ValueTypes.td"
15 include "llvm/CodeGen/SDNodeProperties.td"
16
17 //===----------------------------------------------------------------------===//
18 //  Properties we keep track of for intrinsics.
19 //===----------------------------------------------------------------------===//
20
21 class IntrinsicProperty;
22
23 // Intr*Mem - Memory properties.  If no property is set, the worst case
24 // is assumed (it may read and write any memory it can get access to and it may
25 // have other side effects).
26
27 // IntrNoMem - The intrinsic does not access memory or have any other side
28 // effects.  It may be CSE'd deleted if dead, etc.
29 def IntrNoMem : IntrinsicProperty;
30
31 // IntrReadMem - This intrinsic only reads from memory. It does not write to
32 // memory and has no other side effects. Therefore, it cannot be moved across
33 // potentially aliasing stores. However, it can be reordered otherwise and can
34 // be deleted if dead.
35 def IntrReadMem : IntrinsicProperty;
36
37 // IntrWriteMem - This intrinsic only writes to memory, but does not read from
38 // memory, and has no other side effects. This means dead stores before calls
39 // to this intrinsics may be removed.
40 def IntrWriteMem : IntrinsicProperty;
41
42 // IntrArgMemOnly - This intrinsic only accesses memory that its pointer-typed
43 // argument(s) points to, but may access an unspecified amount. Other than
44 // reads from and (possibly volatile) writes to memory, it has no side effects.
45 def IntrArgMemOnly : IntrinsicProperty;
46
47 // IntrInaccessibleMemOnly -- This intrinsic only accesses memory that is not
48 // accessible by the module being compiled. This is a weaker form of IntrNoMem.
49 def IntrInaccessibleMemOnly : IntrinsicProperty;
50
51 // IntrInaccessibleMemOrArgMemOnly -- This intrinsic only accesses memory that
52 // its pointer-typed arguments point to or memory that is not accessible
53 // by the module being compiled. This is a weaker form of IntrArgMemOnly.
54 def IntrInaccessibleMemOrArgMemOnly : IntrinsicProperty;
55
56 // Commutative - This intrinsic is commutative: X op Y == Y op X.
57 def Commutative : IntrinsicProperty;
58
59 // Throws - This intrinsic can throw.
60 def Throws : IntrinsicProperty;
61
62 // NoCapture - The specified argument pointer is not captured by the intrinsic.
63 class NoCapture<int argNo> : IntrinsicProperty {
64   int ArgNo = argNo;
65 }
66
67 // Returned - The specified argument is always the return value of the
68 // intrinsic.
69 class Returned<int argNo> : IntrinsicProperty {
70   int ArgNo = argNo;
71 }
72
73 // ReadOnly - The specified argument pointer is not written to through the
74 // pointer by the intrinsic.
75 class ReadOnly<int argNo> : IntrinsicProperty {
76   int ArgNo = argNo;
77 }
78
79 // WriteOnly - The intrinsic does not read memory through the specified
80 // argument pointer.
81 class WriteOnly<int argNo> : IntrinsicProperty {
82   int ArgNo = argNo;
83 }
84
85 // ReadNone - The specified argument pointer is not dereferenced by the
86 // intrinsic.
87 class ReadNone<int argNo> : IntrinsicProperty {
88   int ArgNo = argNo;
89 }
90
91 def IntrNoReturn : IntrinsicProperty;
92
93 // IntrCold - Calls to this intrinsic are cold.
94 // Parallels the cold attribute on LLVM IR functions.
95 def IntrCold : IntrinsicProperty;
96
97 // IntrNoduplicate - Calls to this intrinsic cannot be duplicated.
98 // Parallels the noduplicate attribute on LLVM IR functions.
99 def IntrNoDuplicate : IntrinsicProperty;
100
101 // IntrConvergent - Calls to this intrinsic are convergent and may not be made
102 // control-dependent on any additional values.
103 // Parallels the convergent attribute on LLVM IR functions.
104 def IntrConvergent : IntrinsicProperty;
105
106 // This property indicates that the intrinsic is safe to speculate.
107 def IntrSpeculatable : IntrinsicProperty;
108
109 // This property can be used to override the 'has no other side effects'
110 // language of the IntrNoMem, IntrReadMem, IntrWriteMem, and IntrArgMemOnly
111 // intrinsic properties.  By default, intrinsics are assumed to have side
112 // effects, so this property is only necessary if you have defined one of
113 // the memory properties listed above.
114 // For this property, 'side effects' has the same meaning as 'side effects'
115 // defined by the hasSideEffects property of the TableGen Instruction class.
116 def IntrHasSideEffects : IntrinsicProperty;
117
118 //===----------------------------------------------------------------------===//
119 // Types used by intrinsics.
120 //===----------------------------------------------------------------------===//
121
122 class LLVMType<ValueType vt> {
123   ValueType VT = vt;
124   int isAny = 0;
125 }
126
127 class LLVMQualPointerType<LLVMType elty, int addrspace>
128   : LLVMType<iPTR>{
129   LLVMType ElTy = elty;
130   int AddrSpace = addrspace;
131 }
132
133 class LLVMPointerType<LLVMType elty>
134   : LLVMQualPointerType<elty, 0>;
135
136 class LLVMAnyPointerType<LLVMType elty>
137   : LLVMType<iPTRAny>{
138   LLVMType ElTy = elty;
139
140   let isAny = 1;
141 }
142
143 // Match the type of another intrinsic parameter.  Number is an index into the
144 // list of overloaded types for the intrinsic, excluding all the fixed types.
145 // The Number value must refer to a previously listed type.  For example:
146 //   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_anyfloat_ty, LLVMMatchType<0>]>
147 // has two overloaded types, the 2nd and 3rd arguments.  LLVMMatchType<0>
148 // refers to the first overloaded type, which is the 2nd argument.
149 class LLVMMatchType<int num>
150   : LLVMType<OtherVT>{
151   int Number = num;
152 }
153
154 // Match the type of another intrinsic parameter that is expected to be based on
155 // an integral type (i.e. either iN or <N x iM>), but change the scalar size to
156 // be twice as wide or half as wide as the other type.  This is only useful when
157 // the intrinsic is overloaded, so the matched type should be declared as iAny.
158 class LLVMExtendedType<int num> : LLVMMatchType<num>;
159 class LLVMTruncatedType<int num> : LLVMMatchType<num>;
160 class LLVMVectorSameWidth<int num, LLVMType elty>
161   : LLVMMatchType<num> {
162   ValueType ElTy = elty.VT;
163 }
164 class LLVMPointerTo<int num> : LLVMMatchType<num>;
165 class LLVMPointerToElt<int num> : LLVMMatchType<num>;
166 class LLVMVectorOfAnyPointersToElt<int num> : LLVMMatchType<num>;
167
168 // Match the type of another intrinsic parameter that is expected to be a
169 // vector type, but change the element count to be half as many
170 class LLVMHalfElementsVectorType<int num> : LLVMMatchType<num>;
171
172 def llvm_void_ty       : LLVMType<isVoid>;
173 let isAny = 1 in {
174   def llvm_any_ty        : LLVMType<Any>;
175   def llvm_anyint_ty     : LLVMType<iAny>;
176   def llvm_anyfloat_ty   : LLVMType<fAny>;
177   def llvm_anyvector_ty  : LLVMType<vAny>;
178 }
179 def llvm_i1_ty         : LLVMType<i1>;
180 def llvm_i8_ty         : LLVMType<i8>;
181 def llvm_i16_ty        : LLVMType<i16>;
182 def llvm_i32_ty        : LLVMType<i32>;
183 def llvm_i64_ty        : LLVMType<i64>;
184 def llvm_half_ty       : LLVMType<f16>;
185 def llvm_float_ty      : LLVMType<f32>;
186 def llvm_double_ty     : LLVMType<f64>;
187 def llvm_f80_ty        : LLVMType<f80>;
188 def llvm_f128_ty       : LLVMType<f128>;
189 def llvm_ppcf128_ty    : LLVMType<ppcf128>;
190 def llvm_ptr_ty        : LLVMPointerType<llvm_i8_ty>;             // i8*
191 def llvm_ptrptr_ty     : LLVMPointerType<llvm_ptr_ty>;            // i8**
192 def llvm_anyptr_ty     : LLVMAnyPointerType<llvm_i8_ty>;          // (space)i8*
193 def llvm_empty_ty      : LLVMType<OtherVT>;                       // { }
194 def llvm_descriptor_ty : LLVMPointerType<llvm_empty_ty>;          // { }*
195 def llvm_metadata_ty   : LLVMType<MetadataVT>;                    // !{...}
196 def llvm_token_ty      : LLVMType<token>;                         // token
197
198 def llvm_x86mmx_ty     : LLVMType<x86mmx>;
199 def llvm_ptrx86mmx_ty  : LLVMPointerType<llvm_x86mmx_ty>;         // <1 x i64>*
200
201 def llvm_v2i1_ty       : LLVMType<v2i1>;     //   2 x i1
202 def llvm_v4i1_ty       : LLVMType<v4i1>;     //   4 x i1
203 def llvm_v8i1_ty       : LLVMType<v8i1>;     //   8 x i1
204 def llvm_v16i1_ty      : LLVMType<v16i1>;    //  16 x i1
205 def llvm_v32i1_ty      : LLVMType<v32i1>;    //  32 x i1
206 def llvm_v64i1_ty      : LLVMType<v64i1>;    //  64 x i1
207 def llvm_v512i1_ty     : LLVMType<v512i1>;   // 512 x i1
208 def llvm_v1024i1_ty    : LLVMType<v1024i1>;  //1024 x i1
209
210 def llvm_v1i8_ty       : LLVMType<v1i8>;     //  1 x i8
211 def llvm_v2i8_ty       : LLVMType<v2i8>;     //  2 x i8
212 def llvm_v4i8_ty       : LLVMType<v4i8>;     //  4 x i8
213 def llvm_v8i8_ty       : LLVMType<v8i8>;     //  8 x i8
214 def llvm_v16i8_ty      : LLVMType<v16i8>;    // 16 x i8
215 def llvm_v32i8_ty      : LLVMType<v32i8>;    // 32 x i8
216 def llvm_v64i8_ty      : LLVMType<v64i8>;    // 64 x i8
217 def llvm_v128i8_ty     : LLVMType<v128i8>;   //128 x i8
218 def llvm_v256i8_ty     : LLVMType<v256i8>;   //256 x i8
219
220 def llvm_v1i16_ty      : LLVMType<v1i16>;    //  1 x i16
221 def llvm_v2i16_ty      : LLVMType<v2i16>;    //  2 x i16
222 def llvm_v4i16_ty      : LLVMType<v4i16>;    //  4 x i16
223 def llvm_v8i16_ty      : LLVMType<v8i16>;    //  8 x i16
224 def llvm_v16i16_ty     : LLVMType<v16i16>;   // 16 x i16
225 def llvm_v32i16_ty     : LLVMType<v32i16>;   // 32 x i16
226 def llvm_v64i16_ty     : LLVMType<v64i16>;   // 64 x i16
227 def llvm_v128i16_ty    : LLVMType<v128i16>;  //128 x i16
228
229 def llvm_v1i32_ty      : LLVMType<v1i32>;    //  1 x i32
230 def llvm_v2i32_ty      : LLVMType<v2i32>;    //  2 x i32
231 def llvm_v4i32_ty      : LLVMType<v4i32>;    //  4 x i32
232 def llvm_v8i32_ty      : LLVMType<v8i32>;    //  8 x i32
233 def llvm_v16i32_ty     : LLVMType<v16i32>;   // 16 x i32
234 def llvm_v32i32_ty     : LLVMType<v32i32>;   // 32 x i32
235 def llvm_v64i32_ty     : LLVMType<v64i32>;   // 64 x i32
236
237 def llvm_v1i64_ty      : LLVMType<v1i64>;    //  1 x i64
238 def llvm_v2i64_ty      : LLVMType<v2i64>;    //  2 x i64
239 def llvm_v4i64_ty      : LLVMType<v4i64>;    //  4 x i64
240 def llvm_v8i64_ty      : LLVMType<v8i64>;    //  8 x i64
241 def llvm_v16i64_ty     : LLVMType<v16i64>;   // 16 x i64
242 def llvm_v32i64_ty     : LLVMType<v32i64>;   // 32 x i64
243
244 def llvm_v1i128_ty     : LLVMType<v1i128>;   //  1 x i128
245
246 def llvm_v2f16_ty      : LLVMType<v2f16>;    //  2 x half (__fp16)
247 def llvm_v4f16_ty      : LLVMType<v4f16>;    //  4 x half (__fp16)
248 def llvm_v8f16_ty      : LLVMType<v8f16>;    //  8 x half (__fp16)
249 def llvm_v1f32_ty      : LLVMType<v1f32>;    //  1 x float
250 def llvm_v2f32_ty      : LLVMType<v2f32>;    //  2 x float
251 def llvm_v4f32_ty      : LLVMType<v4f32>;    //  4 x float
252 def llvm_v8f32_ty      : LLVMType<v8f32>;    //  8 x float
253 def llvm_v16f32_ty     : LLVMType<v16f32>;   // 16 x float
254 def llvm_v1f64_ty      : LLVMType<v1f64>;    //  1 x double
255 def llvm_v2f64_ty      : LLVMType<v2f64>;    //  2 x double
256 def llvm_v4f64_ty      : LLVMType<v4f64>;    //  4 x double
257 def llvm_v8f64_ty      : LLVMType<v8f64>;    //  8 x double
258
259 def llvm_vararg_ty     : LLVMType<isVoid>;   // this means vararg here
260
261 //===----------------------------------------------------------------------===//
262 // Intrinsic Definitions.
263 //===----------------------------------------------------------------------===//
264
265 // Intrinsic class - This is used to define one LLVM intrinsic.  The name of the
266 // intrinsic definition should start with "int_", then match the LLVM intrinsic
267 // name with the "llvm." prefix removed, and all "."s turned into "_"s.  For
268 // example, llvm.bswap.i16 -> int_bswap_i16.
269 //
270 //  * RetTypes is a list containing the return types expected for the
271 //    intrinsic.
272 //  * ParamTypes is a list containing the parameter types expected for the
273 //    intrinsic.
274 //  * Properties can be set to describe the behavior of the intrinsic.
275 //
276 class Intrinsic<list<LLVMType> ret_types,
277                 list<LLVMType> param_types = [],
278                 list<IntrinsicProperty> intr_properties = [],
279                 string name = "",
280                 list<SDNodeProperty> sd_properties = []> : SDPatternOperator {
281   string LLVMName = name;
282   string TargetPrefix = "";   // Set to a prefix for target-specific intrinsics.
283   list<LLVMType> RetTypes = ret_types;
284   list<LLVMType> ParamTypes = param_types;
285   list<IntrinsicProperty> IntrProperties = intr_properties;
286   let Properties = sd_properties;
287
288   bit isTarget = 0;
289 }
290
291 /// GCCBuiltin - If this intrinsic exactly corresponds to a GCC builtin, this
292 /// specifies the name of the builtin.  This provides automatic CBE and CFE
293 /// support.
294 class GCCBuiltin<string name> {
295   string GCCBuiltinName = name;
296 }
297
298 class MSBuiltin<string name> {
299   string MSBuiltinName = name;
300 }
301
302
303 //===--------------- Variable Argument Handling Intrinsics ----------------===//
304 //
305
306 def int_vastart : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_start">;
307 def int_vacopy  : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], [],
308                             "llvm.va_copy">;
309 def int_vaend   : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_end">;
310
311 //===------------------- Garbage Collection Intrinsics --------------------===//
312 //
313 def int_gcroot  : Intrinsic<[],
314                             [llvm_ptrptr_ty, llvm_ptr_ty]>;
315 def int_gcread  : Intrinsic<[llvm_ptr_ty],
316                             [llvm_ptr_ty, llvm_ptrptr_ty],
317                             [IntrReadMem, IntrArgMemOnly]>;
318 def int_gcwrite : Intrinsic<[],
319                             [llvm_ptr_ty, llvm_ptr_ty, llvm_ptrptr_ty],
320                             [IntrArgMemOnly, NoCapture<1>, NoCapture<2>]>;
321
322 //===------------------- ObjC ARC runtime Intrinsics --------------------===//
323 //
324 // Note these are to support the Objective-C ARC optimizer which wants to
325 // eliminate retain and releases where possible.
326
327 def int_objc_autorelease                    : Intrinsic<[llvm_ptr_ty],
328                                                         [llvm_ptr_ty]>;
329 def int_objc_autoreleasePoolPop             : Intrinsic<[], [llvm_ptr_ty]>;
330 def int_objc_autoreleasePoolPush            : Intrinsic<[llvm_ptr_ty], []>;
331 def int_objc_autoreleaseReturnValue         : Intrinsic<[llvm_ptr_ty],
332                                                         [llvm_ptr_ty]>;
333 def int_objc_copyWeak                       : Intrinsic<[],
334                                                         [llvm_ptrptr_ty,
335                                                          llvm_ptrptr_ty]>;
336 def int_objc_destroyWeak                    : Intrinsic<[], [llvm_ptrptr_ty]>;
337 def int_objc_initWeak                       : Intrinsic<[llvm_ptr_ty],
338                                                         [llvm_ptrptr_ty,
339                                                          llvm_ptr_ty]>;
340 def int_objc_loadWeak                       : Intrinsic<[llvm_ptr_ty],
341                                                         [llvm_ptrptr_ty]>;
342 def int_objc_loadWeakRetained               : Intrinsic<[llvm_ptr_ty],
343                                                         [llvm_ptrptr_ty]>;
344 def int_objc_moveWeak                       : Intrinsic<[],
345                                                         [llvm_ptrptr_ty,
346                                                          llvm_ptrptr_ty]>;
347 def int_objc_release                        : Intrinsic<[], [llvm_ptr_ty]>;
348 def int_objc_retain                         : Intrinsic<[llvm_ptr_ty],
349                                                         [llvm_ptr_ty]>;
350 def int_objc_retainAutorelease              : Intrinsic<[llvm_ptr_ty],
351                                                         [llvm_ptr_ty]>;
352 def int_objc_retainAutoreleaseReturnValue   : Intrinsic<[llvm_ptr_ty],
353                                                         [llvm_ptr_ty]>;
354 def int_objc_retainAutoreleasedReturnValue  : Intrinsic<[llvm_ptr_ty],
355                                                         [llvm_ptr_ty]>;
356 def int_objc_retainBlock                    : Intrinsic<[llvm_ptr_ty],
357                                                         [llvm_ptr_ty]>;
358 def int_objc_storeStrong                    : Intrinsic<[],
359                                                         [llvm_ptrptr_ty,
360                                                          llvm_ptr_ty]>;
361 def int_objc_storeWeak                      : Intrinsic<[llvm_ptr_ty],
362                                                         [llvm_ptrptr_ty,
363                                                          llvm_ptr_ty]>;
364 def int_objc_clang_arc_use                  : Intrinsic<[],
365                                                         [llvm_vararg_ty]>;
366 def int_objc_unsafeClaimAutoreleasedReturnValue : Intrinsic<[llvm_ptr_ty],
367                                                             [llvm_ptr_ty]>;
368 def int_objc_retainedObject                 : Intrinsic<[llvm_ptr_ty],
369                                                         [llvm_ptr_ty]>;
370 def int_objc_unretainedObject               : Intrinsic<[llvm_ptr_ty],
371                                                         [llvm_ptr_ty]>;
372 def int_objc_unretainedPointer              : Intrinsic<[llvm_ptr_ty],
373                                                         [llvm_ptr_ty]>;
374 def int_objc_retain_autorelease             : Intrinsic<[llvm_ptr_ty],
375                                                         [llvm_ptr_ty]>;
376 def int_objc_sync_enter                     : Intrinsic<[llvm_i32_ty],
377                                                         [llvm_ptr_ty]>;
378 def int_objc_sync_exit                      : Intrinsic<[llvm_i32_ty],
379                                                         [llvm_ptr_ty]>;
380 def int_objc_arc_annotation_topdown_bbstart : Intrinsic<[],
381                                                         [llvm_ptrptr_ty,
382                                                          llvm_ptrptr_ty]>;
383 def int_objc_arc_annotation_topdown_bbend   : Intrinsic<[],
384                                                         [llvm_ptrptr_ty,
385                                                          llvm_ptrptr_ty]>;
386 def int_objc_arc_annotation_bottomup_bbstart  : Intrinsic<[],
387                                                           [llvm_ptrptr_ty,
388                                                            llvm_ptrptr_ty]>;
389 def int_objc_arc_annotation_bottomup_bbend  : Intrinsic<[],
390                                                         [llvm_ptrptr_ty,
391                                                          llvm_ptrptr_ty]>;
392
393
394 //===--------------------- Code Generator Intrinsics ----------------------===//
395 //
396 def int_returnaddress : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty], [IntrNoMem]>;
397 def int_addressofreturnaddress : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
398 def int_frameaddress  : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty], [IntrNoMem]>;
399 def int_sponentry  : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
400 def int_read_register  : Intrinsic<[llvm_anyint_ty], [llvm_metadata_ty],
401                                    [IntrReadMem], "llvm.read_register">;
402 def int_write_register : Intrinsic<[], [llvm_metadata_ty, llvm_anyint_ty],
403                                    [], "llvm.write_register">;
404
405 // Gets the address of the local variable area. This is typically a copy of the
406 // stack, frame, or base pointer depending on the type of prologue.
407 def int_localaddress : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
408
409 // Escapes local variables to allow access from other functions.
410 def int_localescape : Intrinsic<[], [llvm_vararg_ty]>;
411
412 // Given a function and the localaddress of a parent frame, returns a pointer
413 // to an escaped allocation indicated by the index.
414 def int_localrecover : Intrinsic<[llvm_ptr_ty],
415                                  [llvm_ptr_ty, llvm_ptr_ty, llvm_i32_ty],
416                                  [IntrNoMem]>;
417 // Note: we treat stacksave/stackrestore as writemem because we don't otherwise
418 // model their dependencies on allocas.
419 def int_stacksave     : Intrinsic<[llvm_ptr_ty]>,
420                         GCCBuiltin<"__builtin_stack_save">;
421 def int_stackrestore  : Intrinsic<[], [llvm_ptr_ty]>,
422                         GCCBuiltin<"__builtin_stack_restore">;
423
424 def int_get_dynamic_area_offset : Intrinsic<[llvm_anyint_ty]>;
425
426 def int_thread_pointer : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>,
427                          GCCBuiltin<"__builtin_thread_pointer">;
428
429 // IntrInaccessibleMemOrArgMemOnly is a little more pessimistic than strictly
430 // necessary for prefetch, however it does conveniently prevent the prefetch
431 // from being reordered overly much with respect to nearby access to the same
432 // memory while not impeding optimization.
433 def int_prefetch
434     : Intrinsic<[], [ llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty ],
435                 [ IntrInaccessibleMemOrArgMemOnly, ReadOnly<0>, NoCapture<0> ]>;
436 def int_pcmarker      : Intrinsic<[], [llvm_i32_ty]>;
437
438 def int_readcyclecounter : Intrinsic<[llvm_i64_ty]>;
439
440 // The assume intrinsic is marked as arbitrarily writing so that proper
441 // control dependencies will be maintained.
442 def int_assume        : Intrinsic<[], [llvm_i1_ty], []>;
443
444 // Stack Protector Intrinsic - The stackprotector intrinsic writes the stack
445 // guard to the correct place on the stack frame.
446 def int_stackprotector : Intrinsic<[], [llvm_ptr_ty, llvm_ptrptr_ty], []>;
447 def int_stackguard : Intrinsic<[llvm_ptr_ty], [], []>;
448
449 // A counter increment for instrumentation based profiling.
450 def int_instrprof_increment : Intrinsic<[],
451                                         [llvm_ptr_ty, llvm_i64_ty,
452                                          llvm_i32_ty, llvm_i32_ty],
453                                         []>;
454
455 // A counter increment with step for instrumentation based profiling.
456 def int_instrprof_increment_step : Intrinsic<[],
457                                         [llvm_ptr_ty, llvm_i64_ty,
458                                          llvm_i32_ty, llvm_i32_ty, llvm_i64_ty],
459                                         []>;
460
461 // A call to profile runtime for value profiling of target expressions
462 // through instrumentation based profiling.
463 def int_instrprof_value_profile : Intrinsic<[],
464                                             [llvm_ptr_ty, llvm_i64_ty,
465                                              llvm_i64_ty, llvm_i32_ty,
466                                              llvm_i32_ty],
467                                             []>;
468
469 //===------------------- Standard C Library Intrinsics --------------------===//
470 //
471
472 def int_memcpy  : Intrinsic<[],
473                              [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
474                               llvm_i1_ty],
475                             [IntrArgMemOnly, NoCapture<0>, NoCapture<1>,
476                              WriteOnly<0>, ReadOnly<1>]>;
477 def int_memmove : Intrinsic<[],
478                             [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
479                              llvm_i1_ty],
480                             [IntrArgMemOnly, NoCapture<0>, NoCapture<1>,
481                              ReadOnly<1>]>;
482 def int_memset  : Intrinsic<[],
483                             [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty,
484                              llvm_i1_ty],
485                             [IntrArgMemOnly, NoCapture<0>, WriteOnly<0>]>;
486
487 // FIXME: Add version of these floating point intrinsics which allow non-default
488 // rounding modes and FP exception handling.
489
490 let IntrProperties = [IntrNoMem, IntrSpeculatable] in {
491   def int_fma  : Intrinsic<[llvm_anyfloat_ty],
492                            [LLVMMatchType<0>, LLVMMatchType<0>,
493                             LLVMMatchType<0>]>;
494   def int_fmuladd : Intrinsic<[llvm_anyfloat_ty],
495                               [LLVMMatchType<0>, LLVMMatchType<0>,
496                                LLVMMatchType<0>]>;
497
498   // These functions do not read memory, but are sensitive to the
499   // rounding mode. LLVM purposely does not model changes to the FP
500   // environment so they can be treated as readnone.
501   def int_sqrt : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
502   def int_powi : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, llvm_i32_ty]>;
503   def int_sin  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
504   def int_cos  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
505   def int_pow  : Intrinsic<[llvm_anyfloat_ty],
506                            [LLVMMatchType<0>, LLVMMatchType<0>]>;
507   def int_log  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
508   def int_log10: Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
509   def int_log2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
510   def int_exp  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
511   def int_exp2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
512   def int_fabs : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
513   def int_copysign : Intrinsic<[llvm_anyfloat_ty],
514                                [LLVMMatchType<0>, LLVMMatchType<0>]>;
515   def int_floor : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
516   def int_ceil  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
517   def int_trunc : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
518   def int_rint  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
519   def int_nearbyint : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
520   def int_round : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
521   def int_canonicalize : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>],
522                                    [IntrNoMem]>;
523 }
524
525 def int_minnum : Intrinsic<[llvm_anyfloat_ty],
526   [LLVMMatchType<0>, LLVMMatchType<0>],
527   [IntrNoMem, IntrSpeculatable, Commutative]
528 >;
529 def int_maxnum : Intrinsic<[llvm_anyfloat_ty],
530   [LLVMMatchType<0>, LLVMMatchType<0>],
531   [IntrNoMem, IntrSpeculatable, Commutative]
532 >;
533 def int_minimum : Intrinsic<[llvm_anyfloat_ty],
534   [LLVMMatchType<0>, LLVMMatchType<0>],
535   [IntrNoMem, IntrSpeculatable, Commutative]
536 >;
537 def int_maximum : Intrinsic<[llvm_anyfloat_ty],
538   [LLVMMatchType<0>, LLVMMatchType<0>],
539   [IntrNoMem, IntrSpeculatable, Commutative]
540 >;
541
542 // NOTE: these are internal interfaces.
543 def int_setjmp     : Intrinsic<[llvm_i32_ty],  [llvm_ptr_ty]>;
544 def int_longjmp    : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrNoReturn]>;
545 def int_sigsetjmp  : Intrinsic<[llvm_i32_ty] , [llvm_ptr_ty, llvm_i32_ty]>;
546 def int_siglongjmp : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrNoReturn]>;
547
548 // Internal interface for object size checking
549 def int_objectsize : Intrinsic<[llvm_anyint_ty],
550                                [llvm_anyptr_ty, llvm_i1_ty, llvm_i1_ty],
551                                [IntrNoMem, IntrSpeculatable]>,
552                                GCCBuiltin<"__builtin_object_size">;
553
554 //===--------------- Constrained Floating Point Intrinsics ----------------===//
555 //
556
557 let IntrProperties = [IntrInaccessibleMemOnly] in {
558   def int_experimental_constrained_fadd : Intrinsic<[ llvm_anyfloat_ty ],
559                                                     [ LLVMMatchType<0>,
560                                                       LLVMMatchType<0>,
561                                                       llvm_metadata_ty,
562                                                       llvm_metadata_ty ]>;
563   def int_experimental_constrained_fsub : Intrinsic<[ llvm_anyfloat_ty ],
564                                                     [ LLVMMatchType<0>,
565                                                       LLVMMatchType<0>,
566                                                       llvm_metadata_ty,
567                                                       llvm_metadata_ty ]>;
568   def int_experimental_constrained_fmul : Intrinsic<[ llvm_anyfloat_ty ],
569                                                     [ LLVMMatchType<0>,
570                                                       LLVMMatchType<0>,
571                                                       llvm_metadata_ty,
572                                                       llvm_metadata_ty ]>;
573   def int_experimental_constrained_fdiv : Intrinsic<[ llvm_anyfloat_ty ],
574                                                     [ LLVMMatchType<0>,
575                                                       LLVMMatchType<0>,
576                                                       llvm_metadata_ty,
577                                                       llvm_metadata_ty ]>;
578   def int_experimental_constrained_frem : Intrinsic<[ llvm_anyfloat_ty ],
579                                                     [ LLVMMatchType<0>,
580                                                       LLVMMatchType<0>,
581                                                       llvm_metadata_ty,
582                                                       llvm_metadata_ty ]>;
583
584   def int_experimental_constrained_fma : Intrinsic<[ llvm_anyfloat_ty ],
585                                                     [ LLVMMatchType<0>,
586                                                       LLVMMatchType<0>,
587                                                       LLVMMatchType<0>,
588                                                       llvm_metadata_ty,
589                                                       llvm_metadata_ty ]>;
590
591   // These intrinsics are sensitive to the rounding mode so we need constrained
592   // versions of each of them.  When strict rounding and exception control are
593   // not required the non-constrained versions of these intrinsics should be
594   // used.
595   def int_experimental_constrained_sqrt : Intrinsic<[ llvm_anyfloat_ty ],
596                                                     [ LLVMMatchType<0>,
597                                                       llvm_metadata_ty,
598                                                       llvm_metadata_ty ]>;
599   def int_experimental_constrained_powi : Intrinsic<[ llvm_anyfloat_ty ],
600                                                     [ LLVMMatchType<0>,
601                                                       llvm_i32_ty,
602                                                       llvm_metadata_ty,
603                                                       llvm_metadata_ty ]>;
604   def int_experimental_constrained_sin  : Intrinsic<[ llvm_anyfloat_ty ],
605                                                     [ LLVMMatchType<0>,
606                                                       llvm_metadata_ty,
607                                                       llvm_metadata_ty ]>;
608   def int_experimental_constrained_cos  : Intrinsic<[ llvm_anyfloat_ty ],
609                                                     [ LLVMMatchType<0>,
610                                                       llvm_metadata_ty,
611                                                       llvm_metadata_ty ]>;
612   def int_experimental_constrained_pow  : Intrinsic<[ llvm_anyfloat_ty ],
613                                                     [ LLVMMatchType<0>,
614                                                       LLVMMatchType<0>,
615                                                       llvm_metadata_ty,
616                                                       llvm_metadata_ty ]>;
617   def int_experimental_constrained_log  : Intrinsic<[ llvm_anyfloat_ty ],
618                                                     [ LLVMMatchType<0>,
619                                                       llvm_metadata_ty,
620                                                       llvm_metadata_ty ]>;
621   def int_experimental_constrained_log10: Intrinsic<[ llvm_anyfloat_ty ],
622                                                     [ LLVMMatchType<0>,
623                                                       llvm_metadata_ty,
624                                                       llvm_metadata_ty ]>;
625   def int_experimental_constrained_log2 : Intrinsic<[ llvm_anyfloat_ty ],
626                                                     [ LLVMMatchType<0>,
627                                                       llvm_metadata_ty,
628                                                       llvm_metadata_ty ]>;
629   def int_experimental_constrained_exp  : Intrinsic<[ llvm_anyfloat_ty ],
630                                                     [ LLVMMatchType<0>,
631                                                       llvm_metadata_ty,
632                                                       llvm_metadata_ty ]>;
633   def int_experimental_constrained_exp2 : Intrinsic<[ llvm_anyfloat_ty ],
634                                                     [ LLVMMatchType<0>,
635                                                       llvm_metadata_ty,
636                                                       llvm_metadata_ty ]>;
637   def int_experimental_constrained_rint  : Intrinsic<[ llvm_anyfloat_ty ],
638                                                      [ LLVMMatchType<0>,
639                                                        llvm_metadata_ty,
640                                                        llvm_metadata_ty ]>;
641   def int_experimental_constrained_nearbyint : Intrinsic<[ llvm_anyfloat_ty ],
642                                                          [ LLVMMatchType<0>,
643                                                            llvm_metadata_ty,
644                                                            llvm_metadata_ty ]>;
645   def int_experimental_constrained_maxnum : Intrinsic<[ llvm_anyfloat_ty ],
646                                                       [ LLVMMatchType<0>,
647                                                         LLVMMatchType<0>,
648                                                         llvm_metadata_ty,
649                                                         llvm_metadata_ty ]>;
650   def int_experimental_constrained_minnum : Intrinsic<[ llvm_anyfloat_ty ],
651                                                       [ LLVMMatchType<0>,
652                                                         LLVMMatchType<0>,
653                                                         llvm_metadata_ty,
654                                                         llvm_metadata_ty ]>;
655   def int_experimental_constrained_ceil : Intrinsic<[ llvm_anyfloat_ty ],
656                                                     [ LLVMMatchType<0>,
657                                                       llvm_metadata_ty,
658                                                       llvm_metadata_ty ]>;
659   def int_experimental_constrained_floor : Intrinsic<[ llvm_anyfloat_ty ],
660                                                      [ LLVMMatchType<0>,
661                                                        llvm_metadata_ty,
662                                                        llvm_metadata_ty ]>;
663   def int_experimental_constrained_round : Intrinsic<[ llvm_anyfloat_ty ],
664                                                      [ LLVMMatchType<0>,
665                                                       llvm_metadata_ty,
666                                                       llvm_metadata_ty ]>;
667   def int_experimental_constrained_trunc : Intrinsic<[ llvm_anyfloat_ty ],
668                                                      [ LLVMMatchType<0>,
669                                                        llvm_metadata_ty,
670                                                        llvm_metadata_ty ]>;
671 }
672 // FIXME: Add intrinsics for fcmp, fptrunc, fpext, fptoui and fptosi.
673 // FIXME: Add intrinsics for fabs and copysign? 
674
675
676 //===------------------------- Expect Intrinsics --------------------------===//
677 //
678 def int_expect : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
679                                               LLVMMatchType<0>], [IntrNoMem]>;
680
681 //===-------------------- Bit Manipulation Intrinsics ---------------------===//
682 //
683
684 // None of these intrinsics accesses memory at all.
685 let IntrProperties = [IntrNoMem, IntrSpeculatable] in {
686   def int_bswap: Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>]>;
687   def int_ctpop: Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>]>;
688   def int_ctlz : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, llvm_i1_ty]>;
689   def int_cttz : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, llvm_i1_ty]>;
690   def int_bitreverse : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>]>;
691   def int_fshl : Intrinsic<[llvm_anyint_ty],
692       [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
693   def int_fshr : Intrinsic<[llvm_anyint_ty],
694       [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
695 }
696
697 //===------------------------ Debugger Intrinsics -------------------------===//
698 //
699
700 // None of these intrinsics accesses memory at all...but that doesn't
701 // mean the optimizers can change them aggressively.  Special handling
702 // needed in a few places. These synthetic intrinsics have no
703 // side-effects and just mark information about their operands.
704 let IntrProperties = [IntrNoMem, IntrSpeculatable] in {
705   def int_dbg_declare      : Intrinsic<[],
706                                        [llvm_metadata_ty,
707                                         llvm_metadata_ty,
708                                         llvm_metadata_ty]>;
709   def int_dbg_value        : Intrinsic<[],
710                                        [llvm_metadata_ty,
711                                         llvm_metadata_ty,
712                                         llvm_metadata_ty]>;
713   def int_dbg_addr         : Intrinsic<[],
714                                        [llvm_metadata_ty,
715                                         llvm_metadata_ty,
716                                         llvm_metadata_ty]>;
717   def int_dbg_label        : Intrinsic<[],
718                                        [llvm_metadata_ty]>;
719 }
720
721 //===------------------ Exception Handling Intrinsics----------------------===//
722 //
723
724 // The result of eh.typeid.for depends on the enclosing function, but inside a
725 // given function it is 'const' and may be CSE'd etc.
726 def int_eh_typeid_for : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
727
728 def int_eh_return_i32 : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty]>;
729 def int_eh_return_i64 : Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty]>;
730
731 // eh.exceptionpointer returns the pointer to the exception caught by
732 // the given `catchpad`.
733 def int_eh_exceptionpointer : Intrinsic<[llvm_anyptr_ty], [llvm_token_ty],
734                                         [IntrNoMem]>;
735
736 // Gets the exception code from a catchpad token. Only used on some platforms.
737 def int_eh_exceptioncode : Intrinsic<[llvm_i32_ty], [llvm_token_ty], [IntrNoMem]>;
738
739 // __builtin_unwind_init is an undocumented GCC intrinsic that causes all
740 // callee-saved registers to be saved and restored (regardless of whether they
741 // are used) in the calling function. It is used by libgcc_eh.
742 def int_eh_unwind_init: Intrinsic<[]>,
743                         GCCBuiltin<"__builtin_unwind_init">;
744
745 def int_eh_dwarf_cfa  : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty]>;
746
747 let IntrProperties = [IntrNoMem] in {
748   def int_eh_sjlj_lsda             : Intrinsic<[llvm_ptr_ty]>;
749   def int_eh_sjlj_callsite         : Intrinsic<[], [llvm_i32_ty]>;
750 }
751 def int_eh_sjlj_functioncontext : Intrinsic<[], [llvm_ptr_ty]>;
752 def int_eh_sjlj_setjmp          : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
753 def int_eh_sjlj_longjmp         : Intrinsic<[], [llvm_ptr_ty], [IntrNoReturn]>;
754 def int_eh_sjlj_setup_dispatch  : Intrinsic<[], []>;
755
756 //===---------------- Generic Variable Attribute Intrinsics----------------===//
757 //
758 def int_var_annotation : Intrinsic<[],
759                                    [llvm_ptr_ty, llvm_ptr_ty,
760                                     llvm_ptr_ty, llvm_i32_ty],
761                                    [], "llvm.var.annotation">;
762 def int_ptr_annotation : Intrinsic<[LLVMAnyPointerType<llvm_anyint_ty>],
763                                    [LLVMMatchType<0>, llvm_ptr_ty, llvm_ptr_ty,
764                                     llvm_i32_ty],
765                                    [], "llvm.ptr.annotation">;
766 def int_annotation : Intrinsic<[llvm_anyint_ty],
767                                [LLVMMatchType<0>, llvm_ptr_ty,
768                                 llvm_ptr_ty, llvm_i32_ty],
769                                [], "llvm.annotation">;
770
771 // Annotates the current program point with metadata strings which are emitted
772 // as CodeView debug info records. This is expensive, as it disables inlining
773 // and is modelled as having side effects.
774 def int_codeview_annotation : Intrinsic<[], [llvm_metadata_ty],
775                                         [IntrInaccessibleMemOnly, IntrNoDuplicate],
776                                         "llvm.codeview.annotation">;
777
778 //===------------------------ Trampoline Intrinsics -----------------------===//
779 //
780 def int_init_trampoline : Intrinsic<[],
781                                     [llvm_ptr_ty, llvm_ptr_ty, llvm_ptr_ty],
782                                     [IntrArgMemOnly, NoCapture<0>]>,
783                                    GCCBuiltin<"__builtin_init_trampoline">;
784
785 def int_adjust_trampoline : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty],
786                                       [IntrReadMem, IntrArgMemOnly]>,
787                                      GCCBuiltin<"__builtin_adjust_trampoline">;
788
789 //===------------------------ Overflow Intrinsics -------------------------===//
790 //
791
792 // Expose the carry flag from add operations on two integrals.
793 def int_sadd_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
794                                        [LLVMMatchType<0>, LLVMMatchType<0>],
795                                        [IntrNoMem, IntrSpeculatable]>;
796 def int_uadd_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
797                                        [LLVMMatchType<0>, LLVMMatchType<0>],
798                                        [IntrNoMem, IntrSpeculatable]>;
799
800 def int_ssub_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
801                                        [LLVMMatchType<0>, LLVMMatchType<0>],
802                                        [IntrNoMem, IntrSpeculatable]>;
803 def int_usub_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
804                                        [LLVMMatchType<0>, LLVMMatchType<0>],
805                                        [IntrNoMem, IntrSpeculatable]>;
806
807 def int_smul_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
808                                        [LLVMMatchType<0>, LLVMMatchType<0>],
809                                        [IntrNoMem, IntrSpeculatable]>;
810 def int_umul_with_overflow : Intrinsic<[llvm_anyint_ty, llvm_i1_ty],
811                                        [LLVMMatchType<0>, LLVMMatchType<0>],
812                                        [IntrNoMem, IntrSpeculatable]>;
813
814 //===------------------------- Saturation Arithmetic Intrinsics ---------------------===//
815 //
816 def int_sadd_sat : Intrinsic<[llvm_anyint_ty],
817                              [LLVMMatchType<0>, LLVMMatchType<0>],
818                              [IntrNoMem, IntrSpeculatable, Commutative]>;
819 def int_uadd_sat : Intrinsic<[llvm_anyint_ty],
820                              [LLVMMatchType<0>, LLVMMatchType<0>],
821                              [IntrNoMem, IntrSpeculatable, Commutative]>;
822 def int_ssub_sat : Intrinsic<[llvm_anyint_ty],
823                              [LLVMMatchType<0>, LLVMMatchType<0>],
824                              [IntrNoMem, IntrSpeculatable]>;
825 def int_usub_sat : Intrinsic<[llvm_anyint_ty],
826                              [LLVMMatchType<0>, LLVMMatchType<0>],
827                              [IntrNoMem, IntrSpeculatable]>;
828
829 //===------------------------- Fixed Point Arithmetic Intrinsics ---------------------===//
830 //
831 def int_smul_fix : Intrinsic<[llvm_anyint_ty],
832                              [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty],
833                              [IntrNoMem, IntrSpeculatable, Commutative]>;
834
835 //===------------------------- Memory Use Markers -------------------------===//
836 //
837 def int_lifetime_start  : Intrinsic<[],
838                                     [llvm_i64_ty, llvm_anyptr_ty],
839                                     [IntrArgMemOnly, NoCapture<1>]>;
840 def int_lifetime_end    : Intrinsic<[],
841                                     [llvm_i64_ty, llvm_anyptr_ty],
842                                     [IntrArgMemOnly, NoCapture<1>]>;
843 def int_invariant_start : Intrinsic<[llvm_descriptor_ty],
844                                     [llvm_i64_ty, llvm_anyptr_ty],
845                                     [IntrArgMemOnly, NoCapture<1>]>;
846 def int_invariant_end   : Intrinsic<[],
847                                     [llvm_descriptor_ty, llvm_i64_ty,
848                                      llvm_anyptr_ty],
849                                     [IntrArgMemOnly, NoCapture<2>]>;
850
851 // launder.invariant.group can't be marked with 'readnone' (IntrNoMem),
852 // because it would cause CSE of two barriers with the same argument.
853 // Inaccessiblememonly says that the barrier doesn't read the argument,
854 // but it changes state not accessible to this module. This way
855 // we can DSE through the barrier because it doesn't read the value
856 // after store. Although the barrier doesn't modify any memory it
857 // can't be marked as readonly, because it would be possible to
858 // CSE 2 barriers with store in between.
859 // The argument also can't be marked with 'returned' attribute, because
860 // it would remove barrier.
861 // Note that it is still experimental, which means that its semantics
862 // might change in the future.
863 def int_launder_invariant_group : Intrinsic<[llvm_anyptr_ty],
864                                             [LLVMMatchType<0>],
865                                             [IntrInaccessibleMemOnly, IntrSpeculatable]>;
866
867
868 def int_strip_invariant_group : Intrinsic<[llvm_anyptr_ty],
869                                           [LLVMMatchType<0>],
870                                           [IntrSpeculatable, IntrNoMem]>;
871
872 //===------------------------ Stackmap Intrinsics -------------------------===//
873 //
874 def int_experimental_stackmap : Intrinsic<[],
875                                   [llvm_i64_ty, llvm_i32_ty, llvm_vararg_ty],
876                                   [Throws]>;
877 def int_experimental_patchpoint_void : Intrinsic<[],
878                                                  [llvm_i64_ty, llvm_i32_ty,
879                                                   llvm_ptr_ty, llvm_i32_ty,
880                                                   llvm_vararg_ty],
881                                                   [Throws]>;
882 def int_experimental_patchpoint_i64 : Intrinsic<[llvm_i64_ty],
883                                                 [llvm_i64_ty, llvm_i32_ty,
884                                                  llvm_ptr_ty, llvm_i32_ty,
885                                                  llvm_vararg_ty],
886                                                  [Throws]>;
887
888
889 //===------------------------ Garbage Collection Intrinsics ---------------===//
890 // These are documented in docs/Statepoint.rst
891
892 def int_experimental_gc_statepoint : Intrinsic<[llvm_token_ty],
893                                [llvm_i64_ty, llvm_i32_ty,
894                                 llvm_anyptr_ty, llvm_i32_ty,
895                                 llvm_i32_ty, llvm_vararg_ty],
896                                 [Throws]>;
897
898 def int_experimental_gc_result   : Intrinsic<[llvm_any_ty], [llvm_token_ty],
899                                              [IntrReadMem]>;
900 def int_experimental_gc_relocate : Intrinsic<[llvm_any_ty],
901                                 [llvm_token_ty, llvm_i32_ty, llvm_i32_ty],
902                                 [IntrReadMem]>;
903
904 //===------------------------ Coroutine Intrinsics ---------------===//
905 // These are documented in docs/Coroutines.rst
906
907 // Coroutine Structure Intrinsics.
908
909 def int_coro_id : Intrinsic<[llvm_token_ty], [llvm_i32_ty, llvm_ptr_ty,
910                              llvm_ptr_ty, llvm_ptr_ty],
911                             [IntrArgMemOnly, IntrReadMem,
912                              ReadNone<1>, ReadOnly<2>, NoCapture<2>]>;
913 def int_coro_alloc : Intrinsic<[llvm_i1_ty], [llvm_token_ty], []>;
914 def int_coro_begin : Intrinsic<[llvm_ptr_ty], [llvm_token_ty, llvm_ptr_ty],
915                                [WriteOnly<1>]>;
916
917 def int_coro_free : Intrinsic<[llvm_ptr_ty], [llvm_token_ty, llvm_ptr_ty],
918                               [IntrReadMem, IntrArgMemOnly, ReadOnly<1>,
919                                NoCapture<1>]>;
920 def int_coro_end : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_i1_ty], []>;
921
922 def int_coro_frame : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
923 def int_coro_noop : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
924 def int_coro_size : Intrinsic<[llvm_anyint_ty], [], [IntrNoMem]>;
925
926 def int_coro_save : Intrinsic<[llvm_token_ty], [llvm_ptr_ty], []>;
927 def int_coro_suspend : Intrinsic<[llvm_i8_ty], [llvm_token_ty, llvm_i1_ty], []>;
928
929 def int_coro_param : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_ptr_ty],
930                                [IntrNoMem, ReadNone<0>, ReadNone<1>]>;
931
932 // Coroutine Manipulation Intrinsics.
933
934 def int_coro_resume : Intrinsic<[], [llvm_ptr_ty], [Throws]>;
935 def int_coro_destroy : Intrinsic<[], [llvm_ptr_ty], [Throws]>;
936 def int_coro_done : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty],
937                               [IntrArgMemOnly, ReadOnly<0>, NoCapture<0>]>;
938 def int_coro_promise : Intrinsic<[llvm_ptr_ty],
939                                  [llvm_ptr_ty, llvm_i32_ty, llvm_i1_ty],
940                                  [IntrNoMem, NoCapture<0>]>;
941
942 // Coroutine Lowering Intrinsics. Used internally by coroutine passes.
943
944 def int_coro_subfn_addr : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_i8_ty],
945                                     [IntrReadMem, IntrArgMemOnly, ReadOnly<0>,
946                                      NoCapture<0>]>;
947
948 ///===-------------------------- Other Intrinsics --------------------------===//
949 //
950 def int_flt_rounds : Intrinsic<[llvm_i32_ty]>,
951                      GCCBuiltin<"__builtin_flt_rounds">;
952 def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>,
953                GCCBuiltin<"__builtin_trap">;
954 def int_debugtrap : Intrinsic<[]>,
955                     GCCBuiltin<"__builtin_debugtrap">;
956
957 // Support for dynamic deoptimization (or de-specialization)
958 def int_experimental_deoptimize : Intrinsic<[llvm_any_ty], [llvm_vararg_ty],
959                                             [Throws]>;
960
961 // Support for speculative runtime guards
962 def int_experimental_guard : Intrinsic<[], [llvm_i1_ty, llvm_vararg_ty],
963                                        [Throws]>;
964
965 // Supports widenable conditions for guards represented as explicit branches.
966 def int_experimental_widenable_condition : Intrinsic<[llvm_i1_ty], [],
967                                            [IntrInaccessibleMemOnly]>;
968
969 // NOP: calls/invokes to this intrinsic are removed by codegen
970 def int_donothing : Intrinsic<[], [], [IntrNoMem]>;
971
972 // This instruction has no actual effect, though it is treated by the optimizer
973 // has having opaque side effects. This may be inserted into loops to ensure
974 // that they are not removed even if they turn out to be empty, for languages
975 // which specify that infinite loops must be preserved.
976 def int_sideeffect : Intrinsic<[], [], [IntrInaccessibleMemOnly]>;
977
978 // Intrisics to support half precision floating point format
979 let IntrProperties = [IntrNoMem] in {
980 def int_convert_to_fp16   : Intrinsic<[llvm_i16_ty], [llvm_anyfloat_ty]>;
981 def int_convert_from_fp16 : Intrinsic<[llvm_anyfloat_ty], [llvm_i16_ty]>;
982 }
983
984 // Clear cache intrinsic, default to ignore (ie. emit nothing)
985 // maps to void __clear_cache() on supporting platforms
986 def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
987                                 [], "llvm.clear_cache">;
988
989 // Intrinsic to detect whether its argument is a constant.
990 def int_is_constant : Intrinsic<[llvm_i1_ty], [llvm_any_ty], [IntrNoMem], "llvm.is.constant">;
991
992
993 //===-------------------------- Masked Intrinsics -------------------------===//
994 //
995 def int_masked_store : Intrinsic<[], [llvm_anyvector_ty,
996                                       LLVMAnyPointerType<LLVMMatchType<0>>,
997                                       llvm_i32_ty,
998                                       LLVMVectorSameWidth<0, llvm_i1_ty>],
999                                  [IntrArgMemOnly]>;
1000
1001 def int_masked_load  : Intrinsic<[llvm_anyvector_ty],
1002                                  [LLVMAnyPointerType<LLVMMatchType<0>>, llvm_i32_ty,
1003                                   LLVMVectorSameWidth<0, llvm_i1_ty>, LLVMMatchType<0>],
1004                                  [IntrReadMem, IntrArgMemOnly]>;
1005
1006 def int_masked_gather: Intrinsic<[llvm_anyvector_ty],
1007                                  [LLVMVectorOfAnyPointersToElt<0>, llvm_i32_ty,
1008                                   LLVMVectorSameWidth<0, llvm_i1_ty>,
1009                                   LLVMMatchType<0>],
1010                                  [IntrReadMem]>;
1011
1012 def int_masked_scatter: Intrinsic<[],
1013                                   [llvm_anyvector_ty,
1014                                    LLVMVectorOfAnyPointersToElt<0>, llvm_i32_ty,
1015                                    LLVMVectorSameWidth<0, llvm_i1_ty>]>;
1016
1017 def int_masked_expandload: Intrinsic<[llvm_anyvector_ty],
1018                                      [LLVMPointerToElt<0>,
1019                                       LLVMVectorSameWidth<0, llvm_i1_ty>,
1020                                       LLVMMatchType<0>],
1021                                      [IntrReadMem]>;
1022
1023 def int_masked_compressstore: Intrinsic<[],
1024                                      [llvm_anyvector_ty,
1025                                       LLVMPointerToElt<0>,
1026                                       LLVMVectorSameWidth<0, llvm_i1_ty>],
1027                                      [IntrArgMemOnly]>;
1028
1029 // Test whether a pointer is associated with a type metadata identifier.
1030 def int_type_test : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_metadata_ty],
1031                               [IntrNoMem]>;
1032
1033 // Safely loads a function pointer from a virtual table pointer using type metadata.
1034 def int_type_checked_load : Intrinsic<[llvm_ptr_ty, llvm_i1_ty],
1035                                       [llvm_ptr_ty, llvm_i32_ty, llvm_metadata_ty],
1036                                       [IntrNoMem]>;
1037
1038 // Create a branch funnel that implements an indirect call to a limited set of
1039 // callees. This needs to be a musttail call.
1040 def int_icall_branch_funnel : Intrinsic<[], [llvm_vararg_ty], []>;
1041
1042 def int_load_relative: Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_anyint_ty],
1043                                  [IntrReadMem, IntrArgMemOnly]>;
1044
1045 // Xray intrinsics
1046 //===----------------------------------------------------------------------===//
1047 // Custom event logging for x-ray.
1048 // Takes a pointer to a string and the length of the string.
1049 def int_xray_customevent : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
1050                                      [NoCapture<0>, ReadOnly<0>, IntrWriteMem]>;
1051 // Typed event logging for x-ray.
1052 // Takes a numeric type tag, a pointer to a string and the length of the string.
1053 def int_xray_typedevent : Intrinsic<[], [llvm_i16_ty, llvm_ptr_ty, llvm_i32_ty],
1054                                         [NoCapture<1>, ReadOnly<1>, IntrWriteMem]>;
1055 //===----------------------------------------------------------------------===//
1056
1057 //===------ Memory intrinsics with element-wise atomicity guarantees ------===//
1058 //
1059
1060 // @llvm.memcpy.element.unordered.atomic.*(dest, src, length, elementsize)
1061 def int_memcpy_element_unordered_atomic
1062     : Intrinsic<[],
1063                 [
1064                   llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty
1065                 ],
1066                 [
1067                   IntrArgMemOnly, NoCapture<0>, NoCapture<1>, WriteOnly<0>,
1068                   ReadOnly<1>
1069                 ]>;
1070
1071 // @llvm.memmove.element.unordered.atomic.*(dest, src, length, elementsize)
1072 def int_memmove_element_unordered_atomic
1073     : Intrinsic<[],
1074                 [
1075                   llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty
1076                 ],
1077                 [
1078                   IntrArgMemOnly, NoCapture<0>, NoCapture<1>, WriteOnly<0>,
1079                   ReadOnly<1>
1080                 ]>;
1081
1082 // @llvm.memset.element.unordered.atomic.*(dest, value, length, elementsize)
1083 def int_memset_element_unordered_atomic
1084     : Intrinsic<[], [ llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i32_ty ],
1085                 [ IntrArgMemOnly, NoCapture<0>, WriteOnly<0> ]>;
1086
1087 //===------------------------ Reduction Intrinsics ------------------------===//
1088 //
1089 def int_experimental_vector_reduce_fadd : Intrinsic<[llvm_anyfloat_ty],
1090                                                     [llvm_anyfloat_ty,
1091                                                      llvm_anyvector_ty],
1092                                                     [IntrNoMem]>;
1093 def int_experimental_vector_reduce_fmul : Intrinsic<[llvm_anyfloat_ty],
1094                                                     [llvm_anyfloat_ty,
1095                                                      llvm_anyvector_ty],
1096                                                     [IntrNoMem]>;
1097 def int_experimental_vector_reduce_add : Intrinsic<[llvm_anyint_ty],
1098                                                    [llvm_anyvector_ty],
1099                                                    [IntrNoMem]>;
1100 def int_experimental_vector_reduce_mul : Intrinsic<[llvm_anyint_ty],
1101                                                    [llvm_anyvector_ty],
1102                                                    [IntrNoMem]>;
1103 def int_experimental_vector_reduce_and : Intrinsic<[llvm_anyint_ty],
1104                                                    [llvm_anyvector_ty],
1105                                                    [IntrNoMem]>;
1106 def int_experimental_vector_reduce_or : Intrinsic<[llvm_anyint_ty],
1107                                                   [llvm_anyvector_ty],
1108                                                   [IntrNoMem]>;
1109 def int_experimental_vector_reduce_xor : Intrinsic<[llvm_anyint_ty],
1110                                                    [llvm_anyvector_ty],
1111                                                    [IntrNoMem]>;
1112 def int_experimental_vector_reduce_smax : Intrinsic<[llvm_anyint_ty],
1113                                                     [llvm_anyvector_ty],
1114                                                     [IntrNoMem]>;
1115 def int_experimental_vector_reduce_smin : Intrinsic<[llvm_anyint_ty],
1116                                                     [llvm_anyvector_ty],
1117                                                     [IntrNoMem]>;
1118 def int_experimental_vector_reduce_umax : Intrinsic<[llvm_anyint_ty],
1119                                                     [llvm_anyvector_ty],
1120                                                     [IntrNoMem]>;
1121 def int_experimental_vector_reduce_umin : Intrinsic<[llvm_anyint_ty],
1122                                                     [llvm_anyvector_ty],
1123                                                     [IntrNoMem]>;
1124 def int_experimental_vector_reduce_fmax : Intrinsic<[llvm_anyfloat_ty],
1125                                                     [llvm_anyvector_ty],
1126                                                     [IntrNoMem]>;
1127 def int_experimental_vector_reduce_fmin : Intrinsic<[llvm_anyfloat_ty],
1128                                                     [llvm_anyvector_ty],
1129                                                     [IntrNoMem]>;
1130
1131 //===----- Intrinsics that are used to provide predicate information -----===//
1132
1133 def int_ssa_copy : Intrinsic<[llvm_any_ty], [LLVMMatchType<0>],
1134                              [IntrNoMem, Returned<0>]>;
1135 //===----------------------------------------------------------------------===//
1136 // Target-specific intrinsics
1137 //===----------------------------------------------------------------------===//
1138
1139 include "llvm/IR/IntrinsicsPowerPC.td"
1140 include "llvm/IR/IntrinsicsX86.td"
1141 include "llvm/IR/IntrinsicsARM.td"
1142 include "llvm/IR/IntrinsicsAArch64.td"
1143 include "llvm/IR/IntrinsicsXCore.td"
1144 include "llvm/IR/IntrinsicsHexagon.td"
1145 include "llvm/IR/IntrinsicsNVVM.td"
1146 include "llvm/IR/IntrinsicsMips.td"
1147 include "llvm/IR/IntrinsicsAMDGPU.td"
1148 include "llvm/IR/IntrinsicsBPF.td"
1149 include "llvm/IR/IntrinsicsSystemZ.td"
1150 include "llvm/IR/IntrinsicsWebAssembly.td"
1151 include "llvm/IR/IntrinsicsRISCV.td"