X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=include%2Fllvm%2FIntrinsics.h;h=c1fe4c67c44ed591c763a7dfd32b0e3837f8b856;hb=b09c146b116359616f6cbd4c8b3328607e00ff42;hp=62c58f0ba753e33d4fa38a3a2d82c9a083b536c6;hpb=03dd4652158f8a4c1db65f066195342d4a3695a7;p=oota-llvm.git diff --git a/include/llvm/Intrinsics.h b/include/llvm/Intrinsics.h index 62c58f0ba75..c1fe4c67c44 100644 --- a/include/llvm/Intrinsics.h +++ b/include/llvm/Intrinsics.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -16,8 +16,18 @@ #ifndef LLVM_INTRINSICS_H #define LLVM_INTRINSICS_H +#include "llvm/ADT/ArrayRef.h" +#include + namespace llvm { +class Type; +class FunctionType; +class Function; +class LLVMContext; +class Module; +class AttributeSet; + /// Intrinsic Namespace - This namespace contains an enum with a value for /// every intrinsic/builtin function known by LLVM. These enum values are /// returned by Function::getIntrinsicID(). @@ -26,75 +36,91 @@ namespace Intrinsic { enum ID { not_intrinsic = 0, // Must be zero - // Varargs handling intrinsics. - vastart, // Used to implement the va_start macro in C - vaend, // Used to implement the va_end macro in C - vacopy, // Used to implement the va_copy macro in C - - // Code generator intrinsics. - returnaddress, // Yields the return address of a dynamic call frame - frameaddress, // Yields the frame address of a dynamic call frame - stacksave, // Save the stack pointer - stackrestore, // Restore the stack pointer - prefetch, // Prefetch a value into the cache - pcmarker, // Export a PC from near the marker - readcyclecounter, // Read cycle counter register - - // setjmp/longjmp intrinsics. - setjmp, // Used to represent a setjmp call in C - longjmp, // Used to represent a longjmp call in C - sigsetjmp, // Used to represent a sigsetjmp call in C - siglongjmp, // Used to represent a siglongjmp call in C - - // Garbage Collection intrinsics. - gcroot, // Defines a new GC root on the stack - gcread, // Defines a read of a heap object (for read barriers) - gcwrite, // Defines a write to a heap object (for write barriers) + // Get the intrinsic enums generated from Intrinsics.td +#define GET_INTRINSIC_ENUM_VALUES +#include "llvm/Intrinsics.gen" +#undef GET_INTRINSIC_ENUM_VALUES + , num_intrinsics + }; + + /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as + /// "llvm.ppc.altivec.lvx". + std::string getName(ID id, ArrayRef Tys = ArrayRef()); + + /// Intrinsic::getType(ID) - Return the function type for an intrinsic. + /// + FunctionType *getType(LLVMContext &Context, ID id, + ArrayRef Tys = ArrayRef()); - // Debugging intrinsics. - dbg_stoppoint, // Represents source lines and breakpointable places - dbg_region_start, // Start of a region - dbg_region_end, // End of a region - dbg_func_start, // Start of a function - dbg_declare, // Declare a local object + /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be + /// overloaded. + bool isOverloaded(ID id); - // Standard C library intrinsics. - memcpy_i32, // Copy non-overlapping memory blocks. i32 size. - memcpy_i64, // Copy non-overlapping memory blocks. i64 size. - memmove_i32, // Copy potentially overlapping memory blocks. i32 size. - memmove_i64, // Copy potentially overlapping memory blocks. i64 size. - memset_i32, // Fill memory with a byte value. i32 size. - memset_i64, // Fill memory with a byte value. i64 size. - isunordered_f32, // Return true if either float argument is a NaN - isunordered_f64, // Return true if either double argument is a NaN - sqrt_f32, // Square root of float - sqrt_f64, // Square root of double + /// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic. + /// + AttributeSet getAttributes(LLVMContext &C, ID id); - // Bit manipulation instrinsics. - bswap_i16, // Byteswap 16 bits - bswap_i32, // Byteswap 32 bits - bswap_i64, // Byteswap 64 bits - ctpop_i8, // Count population of sbyte - ctpop_i16, // Count population of short - ctpop_i32, // Count population of int - ctpop_i64, // Count population of long - ctlz_i8, // Count leading zeros of sbyte - ctlz_i16, // Count leading zeros of short - ctlz_i32, // Count leading zeros of int - ctlz_i64, // Count leading zeros of long - cttz_i8, // Count trailing zeros of sbyte - cttz_i16, // Count trailing zeros of short - cttz_i32, // Count trailing zeros of int - cttz_i64, // Count trailing zeros of long + /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function + /// declaration for an intrinsic, and return it. + /// + /// The Tys and numTys parameters are for intrinsics with overloaded types + /// (e.g., those using iAny, fAny, vAny, or iPTRAny). For a declaration for an + /// overloaded intrinsic, Tys should point to an array of numTys pointers to + /// Type, and must provide exactly one type for each overloaded type in the + /// intrinsic. + Function *getDeclaration(Module *M, ID id, + ArrayRef Tys = ArrayRef()); + + /// Map a GCC builtin name to an intrinsic ID. + ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); + + /// IITDescriptor - This is a type descriptor which explains the type + /// requirements of an intrinsic. This is returned by + /// getIntrinsicInfoTableEntries. + struct IITDescriptor { + enum IITDescriptorKind { + Void, MMX, Metadata, Float, Double, + Integer, Vector, Pointer, Struct, + Argument, ExtendVecArgument, TruncVecArgument + } Kind; - // Input/Output intrinsics. - readport, - writeport, - readio, - writeio - + union { + unsigned Integer_Width; + unsigned Float_Width; + unsigned Vector_Width; + unsigned Pointer_AddressSpace; + unsigned Struct_NumElements; + unsigned Argument_Info; + }; + + enum ArgKind { + AK_AnyInteger, + AK_AnyFloat, + AK_AnyVector, + AK_AnyPointer + }; + unsigned getArgumentNumber() const { + assert(Kind == Argument || Kind == ExtendVecArgument || + Kind == TruncVecArgument); + return Argument_Info >> 2; + } + ArgKind getArgumentKind() const { + assert(Kind == Argument || Kind == ExtendVecArgument || + Kind == TruncVecArgument); + return (ArgKind)(Argument_Info&3); + } + + static IITDescriptor get(IITDescriptorKind K, unsigned Field) { + IITDescriptor Result = { K, { Field } }; + return Result; + } }; - + + /// getIntrinsicInfoTableEntries - Return the IIT table descriptor for the + /// specified intrinsic into an array of IITDescriptors. + /// + void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl &T); + } // End Intrinsic namespace } // End llvm namespace