2003-05-08 05:33:54 +02:00
|
|
|
//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===//
|
2005-04-21 22:19:05 +02:00
|
|
|
//
|
2003-10-20 22:19:47 +02:00
|
|
|
// 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.
|
2005-04-21 22:19:05 +02:00
|
|
|
//
|
2003-10-20 22:19:47 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
2003-05-08 05:33:54 +02:00
|
|
|
//
|
|
|
|
// This file defines a set of enums which allow processing of intrinsic
|
|
|
|
// functions. Values of these enum types are returned by
|
|
|
|
// Function::getIntrinsicID.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_INTRINSICS_H
|
|
|
|
#define LLVM_INTRINSICS_H
|
|
|
|
|
2003-11-11 23:41:34 +01:00
|
|
|
namespace llvm {
|
|
|
|
|
|
|
|
/// Intrinsic Namespace - This namespace contains an enum with a value for
|
2003-06-03 17:30:13 +02:00
|
|
|
/// every intrinsic/builtin function known by LLVM. These enum values are
|
|
|
|
/// returned by Function::getIntrinsicID().
|
|
|
|
///
|
2003-11-11 23:41:34 +01:00
|
|
|
namespace Intrinsic {
|
2003-05-08 05:33:54 +02:00
|
|
|
enum ID {
|
|
|
|
not_intrinsic = 0, // Must be zero
|
2003-05-18 00:26:33 +02:00
|
|
|
|
2004-05-23 23:16:33 +02:00
|
|
|
// Varargs handling intrinsics.
|
2004-03-13 01:24:00 +01:00
|
|
|
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
|
2003-05-18 00:26:33 +02:00
|
|
|
|
2004-05-23 23:16:33 +02:00
|
|
|
// Code generator intrinsics.
|
Add support for a cycle counter intrinsic. As basically all processors have
this and have it in about the same form, I think this makes sense.
on X86, you do a RDTSC (64bit result, from any ring since the P5MMX)
on Alpha, you do a RDCC
on PPC, there is a sequence which may or may not work depending on how things
are setup by the OS. Or something like that. Maybe someone who knows PPC
can add support. Something about the time base register.
on Sparc, you read %tick, which in some solaris versions (>=8) is readable by
userspace
on IA64 read ar.itc
So I think the ulong is justified since all of those are 64bit.
Support is slighly flaky on old chips (P5 and lower) and sometimes
depends on OS (PPC, Sparc). But for modern OS/Hardware (aka this decade),
we should be ok.
I am still not sure what to do about lowering. I can either see a lower to 0, to
gettimeofday (or the target os equivalent), or loudly complaining and refusing to
continue.
I am commiting an Alpha implementation. I will add the X86 implementation if I
have to (I have use of it in the near future), but if someone who knows that
backend (and the funky multi-register results) better wants to add it, it would
take them a lot less time ;)
TODO: better lowering and legalizing, and support more platforms
llvm-svn: 24299
2005-11-11 17:45:18 +01:00
|
|
|
returnaddress, // Yields the return address of a dynamic call frame
|
|
|
|
frameaddress, // Yields the frame address of a dynamic call frame
|
2006-01-13 03:15:02 +01:00
|
|
|
stacksave, // Save the stack pointer
|
|
|
|
stackrestore, // Restore the stack pointer
|
Add support for a cycle counter intrinsic. As basically all processors have
this and have it in about the same form, I think this makes sense.
on X86, you do a RDTSC (64bit result, from any ring since the P5MMX)
on Alpha, you do a RDCC
on PPC, there is a sequence which may or may not work depending on how things
are setup by the OS. Or something like that. Maybe someone who knows PPC
can add support. Something about the time base register.
on Sparc, you read %tick, which in some solaris versions (>=8) is readable by
userspace
on IA64 read ar.itc
So I think the ulong is justified since all of those are 64bit.
Support is slighly flaky on old chips (P5 and lower) and sometimes
depends on OS (PPC, Sparc). But for modern OS/Hardware (aka this decade),
we should be ok.
I am still not sure what to do about lowering. I can either see a lower to 0, to
gettimeofday (or the target os equivalent), or loudly complaining and refusing to
continue.
I am commiting an Alpha implementation. I will add the X86 implementation if I
have to (I have use of it in the near future), but if someone who knows that
backend (and the funky multi-register results) better wants to add it, it would
take them a lot less time ;)
TODO: better lowering and legalizing, and support more platforms
llvm-svn: 24299
2005-11-11 17:45:18 +01:00
|
|
|
prefetch, // Prefetch a value into the cache
|
|
|
|
pcmarker, // Export a PC from near the marker
|
|
|
|
readcyclecounter, // Read cycle counter register
|
2004-02-14 03:47:17 +01:00
|
|
|
|
2004-05-23 23:16:33 +02:00
|
|
|
// setjmp/longjmp intrinsics.
|
2003-07-28 23:18:21 +02:00
|
|
|
setjmp, // Used to represent a setjmp call in C
|
|
|
|
longjmp, // Used to represent a longjmp call in C
|
2003-08-18 17:41:24 +02:00
|
|
|
sigsetjmp, // Used to represent a sigsetjmp call in C
|
|
|
|
siglongjmp, // Used to represent a siglongjmp call in C
|
2003-07-28 23:18:21 +02:00
|
|
|
|
2004-05-23 23:16:33 +02:00
|
|
|
// 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)
|
|
|
|
|
|
|
|
// Debugging intrinsics.
|
2004-01-05 06:35:34 +01:00
|
|
|
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
|
2004-01-06 06:32:17 +01:00
|
|
|
dbg_declare, // Declare a local object
|
2004-01-05 06:35:34 +01:00
|
|
|
|
2006-01-14 02:25:24 +01:00
|
|
|
// Standard C library intrinsics.
|
2004-05-23 23:16:33 +02:00
|
|
|
memcpy, // Copy non-overlapping memory blocks
|
|
|
|
memmove, // Copy potentially overlapping memory blocks
|
|
|
|
memset, // Fill memory with a byte value
|
For PR411:
This patch is an incremental step towards supporting a flat symbol table.
It de-overloads the intrinsic functions by providing type-specific intrinsics
and arranging for automatically upgrading from the old overloaded name to
the new non-overloaded name. Specifically:
llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64
llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64
llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64
llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64
llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64
New code should not use the overloaded intrinsic names. Warnings will be
emitted if they are used.
llvm-svn: 25366
2006-01-16 22:12:35 +01:00
|
|
|
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
|
2006-01-14 02:25:24 +01:00
|
|
|
|
|
|
|
// Bit manipulation instrinsics.
|
|
|
|
bswap_i16, // Byteswap 16 bits
|
|
|
|
bswap_i32, // Byteswap 32 bits
|
|
|
|
bswap_i64, // Byteswap 64 bits
|
For PR411:
This patch is an incremental step towards supporting a flat symbol table.
It de-overloads the intrinsic functions by providing type-specific intrinsics
and arranging for automatically upgrading from the old overloaded name to
the new non-overloaded name. Specifically:
llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64
llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64
llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64
llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64
llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64
New code should not use the overloaded intrinsic names. Warnings will be
emitted if they are used.
llvm-svn: 25366
2006-01-16 22:12:35 +01:00
|
|
|
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
|
2006-01-14 02:25:24 +01:00
|
|
|
|
2004-05-23 23:16:33 +02:00
|
|
|
// Input/Output intrinsics.
|
2004-04-08 22:26:21 +02:00
|
|
|
readport,
|
|
|
|
writeport,
|
2004-04-14 04:22:54 +02:00
|
|
|
readio,
|
2004-10-29 20:43:43 +02:00
|
|
|
writeio
|
2005-05-03 19:19:30 +02:00
|
|
|
|
2003-05-08 05:33:54 +02:00
|
|
|
};
|
2003-11-11 23:41:34 +01:00
|
|
|
|
|
|
|
} // End Intrinsic namespace
|
|
|
|
|
|
|
|
} // End llvm namespace
|
2003-05-08 05:33:54 +02:00
|
|
|
|
|
|
|
#endif
|