diff options
author | Andrew Lenharth <andrewl@lenharth.org> | 2005-11-11 16:45:18 +0000 |
---|---|---|
committer | Andrew Lenharth <andrewl@lenharth.org> | 2005-11-11 16:45:18 +0000 |
commit | aeef8fc5c6124a34bd2a723071a3982b559c26f2 (patch) | |
tree | 6f74f6b95f6289397b1a916693ac09400e857ca8 | |
parent | 25d4f7e67b228eee817eaf9d29b2fa877aba3fd6 (diff) | |
download | external_llvm-aeef8fc5c6124a34bd2a723071a3982b559c26f2.zip external_llvm-aeef8fc5c6124a34bd2a723071a3982b559c26f2.tar.gz external_llvm-aeef8fc5c6124a34bd2a723071a3982b559c26f2.tar.bz2 |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24299 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/SelectionDAGNodes.h | 3 | ||||
-rw-r--r-- | include/llvm/Intrinsics.h | 9 |
2 files changed, 8 insertions, 4 deletions
diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 8088293..94ef5d5 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -307,6 +307,9 @@ namespace ISD { // PCMARKER - This corresponds to the pcmarker intrinsic. PCMARKER, + // READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic. + READCYCLECOUNTER, + // READPORT, WRITEPORT, READIO, WRITEIO - These correspond to the LLVM // intrinsics of the same name. The first operand is a token chain, the // other operands match the intrinsic. These produce a token chain in diff --git a/include/llvm/Intrinsics.h b/include/llvm/Intrinsics.h index bbf2da3..8829b05 100644 --- a/include/llvm/Intrinsics.h +++ b/include/llvm/Intrinsics.h @@ -32,10 +32,11 @@ namespace Intrinsic { 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 - prefetch, // Prefetch a value into the cache - pcmarker, // Export a PC from near the marker + returnaddress, // Yields the return address of a dynamic call frame + frameaddress, // Yields the frame address of a dynamic call frame + 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 |