[llvm-commits] CVS: llvm/include/llvm/Intrinsics.td
Chris Lattner
lattner at cs.uiuc.edu
Thu Mar 2 18:33:27 PST 2006
Changes in directory llvm/include/llvm:
Intrinsics.td added (r1.1)
---
Log message:
initial checkin of the intrinsic description file
---
Diffs of the changes: (+188 -0)
Intrinsics.td | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 188 insertions(+)
Index: llvm/include/llvm/Intrinsics.td
diff -c /dev/null llvm/include/llvm/Intrinsics.td:1.1
*** /dev/null Thu Mar 2 20:33:25 2006
--- llvm/include/llvm/Intrinsics.td Thu Mar 2 20:33:15 2006
***************
*** 0 ****
--- 1,188 ----
+ //===- Intrinsics.td - Defines all LLVM intrinsics ---------*- tablegen -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under the
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file defines properties of all LLVM intrinsics.
+ //
+ //===----------------------------------------------------------------------===//
+
+ //===----------------------------------------------------------------------===//
+ // Properties we keep track of for intrinsics.
+ //===----------------------------------------------------------------------===//
+
+ class IntrinsicProperty;
+
+ // Intr*Mem - Memory properties. An intrinsic is allowed to have exactly one of
+ // these properties set. They are listed from the most aggressive (best to use
+ // if correct) to the least aggressive. If no property is set, the worst case
+ // is assumed (IntrWriteMem).
+
+ // InstrNoMem - The intrinsic does not access memory or have any other side
+ // effects. It may be CSE'd deleted if dead, etc.
+ def InstrNoMem : IntrinsicProperty;
+
+ // InstrReadArgMem - This intrinsic reads only from memory that one of its
+ // arguments points to, but may read an unspecified amount.
+ def InstrReadArgMem : IntrinsicProperty;
+
+ // IntrReadMem - This intrinsic reads from unspecified memory, so it cannot be
+ // moved across stores. However, it can be reordered otherwise and can be
+ // deleted if dead.
+ def IntrReadMem : IntrinsicProperty;
+
+ // InstrWriteArgMem - This intrinsic reads and writes only from memory that one
+ // of its arguments points to, but may access an unspecified amount. It has no
+ // other side effects. This may only be used if the intrinsic doesn't "capture"
+ // the argument pointer (e.g. storing it someplace).
+ def InstrWriteArgMem : IntrinsicProperty;
+
+ // IntrWriteMem - This intrinsic may read or modify unspecified memory or has
+ // other side effects. It cannot be modified by the optimizer. This is the
+ // default if the intrinsic has no other Intr*Mem property.
+ def IntrWriteMem : IntrinsicProperty;
+
+ //===----------------------------------------------------------------------===//
+ // Types used by intrinsics.
+ //===----------------------------------------------------------------------===//
+
+ class LLVMType<string typeval> {
+ string TypeVal = typeval;
+ }
+
+ def llvm_void_ty : LLVMType<"Type::VoidTyID">;
+ def llvm_bool_ty : LLVMType<"Type::BoolTyID">;
+ def llvm_sbyte_ty : LLVMType<"Type::SByteTyID">;
+ def llvm_short_ty : LLVMType<"Type::ShortTyID">;
+ def llvm_int_ty : LLVMType<"Type::IntTyID">;
+ def llvm_long_ty : LLVMType<"Type::LongTyID">;
+ def llvm_ubyte_ty : LLVMType<"Type::UByteTyID">;
+ def llvm_ushort_ty : LLVMType<"Type::UShortTyID">;
+ def llvm_uint_ty : LLVMType<"Type::UIntTyID">;
+ def llvm_ulong_ty : LLVMType<"Type::ULongTyID">;
+ def llvm_float_ty : LLVMType<"Type::FloatTyID">;
+ def llvm_double_ty : LLVMType<"Type::DoubleTyID">;
+ def llvm_ptr_ty : LLVMType<"Type::PointerTyID">; // sbyte*
+ def llvm_ptrptr_ty : LLVMType<"Type::PointerTyID">; // sbyte**
+ def llvm_anchor_ty : LLVMType<"Type::PointerTyID">; // {}*
+ def llvm_descriptor_ty : LLVMType<"Type::PointerTyID">; // global*
+
+ //===----------------------------------------------------------------------===//
+ // Intrinsic Definitions.
+ //===----------------------------------------------------------------------===//
+
+ // Intrinsic class - This is used to define one LLVM intrinsic. The name of the
+ // intrinsic definition should start with "int_", then match the LLVM intrinsic
+ // name with the "llvm." prefix removed, and all "."s turned into "_"s. For
+ // example, llvm.bswap.i16 -> int_bswap_i16.
+ //
+ // * Types is a list containing the return type and the argument types
+ // expected for the intrinsic.
+ // * Properties can be set to describe the behavior of the intrinsic.
+ //
+ class Intrinsic<list<LLVMType> types,
+ list<IntrinsicProperty> properties = [],
+ string name = ""> {
+ string LLVMName = name;
+ list<LLVMType> Types = types;
+ list<IntrinsicProperty> Properties = properties;
+ }
+
+
+ //===--------------- Variable Argument Handling Intrinsics ----------------===//
+ //
+
+ def int_vastart : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty], [], "llvm.va_start">;
+ def int_vacopy : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty, llvm_ptrptr_ty], [],
+ "llvm.va_copy">;
+ def int_vaend : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty], [], "llvm.va_end">;
+
+ //===------------------- Garbage Collection Intrinsics --------------------===//
+ //
+ def int_gcroot : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty, llvm_ptr_ty]>;
+ def int_gcread : Intrinsic<[llvm_ptr_ty, llvm_ptrptr_ty], [InstrReadArgMem]>;
+ def int_gcwrite : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptrptr_ty],
+ [InstrWriteArgMem]>;
+
+ //===--------------------- Code Generator Intrinsics ----------------------===//
+ //
+ def int_returnaddress : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [InstrNoMem]>;
+ def int_frameaddress : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [InstrNoMem]>;
+ def int_stacksave : Intrinsic<[llvm_ptr_ty]>;
+ def int_stackrestore : Intrinsic<[llvm_ptr_ty]>;
+ def int_prefetch : Intrinsic<[llvm_void_ty, llvm_ptr_ty,
+ llvm_uint_ty, llvm_uint_ty]>;
+ def int_pcmarker : Intrinsic<[llvm_void_ty, llvm_uint_ty]>;
+
+ def int_readcyclecounter : Intrinsic<[llvm_ulong_ty]>;
+
+ //===------------------- Standard C Library Intrinsics --------------------===//
+ //
+
+ let Properties = [InstrWriteArgMem] in {
+ def int_memcpy_i32 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
+ llvm_uint_ty, llvm_uint_ty]>;
+ def int_memcpy_i64 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
+ llvm_ulong_ty, llvm_uint_ty]>;
+ def int_memmove_i32 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
+ llvm_uint_ty, llvm_uint_ty]>;
+ def int_memmove_i64 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
+ llvm_ulong_ty, llvm_uint_ty]>;
+ def int_memset_i32 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ubyte_ty,
+ llvm_uint_ty, llvm_uint_ty]>;
+ def int_memset_i64 : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ubyte_ty,
+ llvm_ulong_ty, llvm_uint_ty]>;
+ }
+
+ let Properties = [InstrNoMem] in {
+ def int_isunordered_f32 : Intrinsic<[llvm_float_ty, llvm_float_ty]>;
+ def int_isunordered_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty]>;
+ def int_sqrt_f32 : Intrinsic<[llvm_float_ty , llvm_float_ty]>;
+ def int_sqrt_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty]>;
+ }
+
+ // NOTE: these are internal interfaces.
+ def int_setjmp : Intrinsic<[llvm_int_ty , llvm_ptr_ty]>;
+ def int_longjmp : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_int_ty]>;
+ def int_sigsetjmp : Intrinsic<[llvm_int_ty , llvm_ptr_ty]>;
+ def int_siglongjmp : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_int_ty]>;
+
+ //===-------------------- Bit Manipulation Intrinsics ---------------------===//
+ //
+
+ // None of these intrinsics accesses memory at all.
+ let Properties = [InstrNoMem] in {
+ def int_bswap_i16 : Intrinsic<[llvm_ushort_ty, llvm_ushort_ty]>;
+ def int_bswap_i32 : Intrinsic<[llvm_uint_ty, llvm_uint_ty]>;
+ def int_bswap_i64 : Intrinsic<[llvm_ulong_ty, llvm_ulong_ty]>;
+
+ def int_ctpop_i8 : Intrinsic<[llvm_ubyte_ty, llvm_ubyte_ty]>;
+ def int_ctpop_i16 : Intrinsic<[llvm_ushort_ty, llvm_ushort_ty]>;
+ def int_ctpop_i32 : Intrinsic<[llvm_uint_ty, llvm_uint_ty]>;
+ def int_ctpop_i64 : Intrinsic<[llvm_ulong_ty, llvm_ulong_ty]>;
+
+ def int_ctlz_i8 : Intrinsic<[llvm_ubyte_ty, llvm_ubyte_ty]>;
+ def int_ctlz_i16 : Intrinsic<[llvm_ushort_ty, llvm_ushort_ty]>;
+ def int_ctlz_i32 : Intrinsic<[llvm_uint_ty, llvm_uint_ty]>;
+ def int_ctlz_i64 : Intrinsic<[llvm_ulong_ty, llvm_ulong_ty]>;
+
+ def int_cttz_i8 : Intrinsic<[llvm_ubyte_ty, llvm_ubyte_ty]>;
+ def int_cttz_i16 : Intrinsic<[llvm_ushort_ty, llvm_ushort_ty]>;
+ def int_cttz_i32 : Intrinsic<[llvm_uint_ty, llvm_uint_ty]>;
+ def int_cttz_i64 : Intrinsic<[llvm_ulong_ty, llvm_ulong_ty]>;
+ }
+
+ //===------------------------ Debugger Intrinsics -------------------------===//
+ //
+
+ def int_dbg_stoppoint : Intrinsic<[llvm_anchor_ty, llvm_uint_ty,
+ llvm_uint_ty, llvm_descriptor_ty]>;
+ def int_dbg_region_start : Intrinsic<[llvm_anchor_ty, llvm_anchor_ty]>;
+ def int_dbg_region_end : Intrinsic<[llvm_anchor_ty, llvm_anchor_ty]>;
+ def int_dbg_func_start : Intrinsic<[llvm_anchor_ty, llvm_descriptor_ty]>;
+ // dbg_declare, // Declare a local object
+
More information about the llvm-commits
mailing list