Add __builtin_readcyclecounter() to produce the @llvm.readcyclecounter() intrinsic.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hal Finkel 2012-08-05 22:03:08 +00:00
Родитель 65263b4ec1
Коммит a841c19f78
4 изменённых файлов: 48 добавлений и 0 удалений

Просмотреть файл

@ -98,6 +98,7 @@
<li><a href="#complex-list-init">Initializer lists for complex numbers in C</a></li>
<li><a href="#builtins">Builtin Functions</a>
<ul>
<li><a href="#__builtin_readcyclecounter">__builtin_readcyclecounter</a></li>
<li><a href="#__builtin_shufflevector">__builtin_shufflevector</a></li>
<li><a href="#__builtin_unreachable">__builtin_unreachable</a></li>
<li><a href="#__sync_swap">__sync_swap</a></li>
@ -1366,6 +1367,42 @@ functions are implemented directly in terms of <a href="#vectors">extended
vector support</a> instead of builtins, in order to reduce the number of
builtins that we need to implement.</p>
<!-- ======================================================================= -->
<h3><a name="__builtin_readcyclecounter">__builtin_readcyclecounter</a></h3>
<!-- ======================================================================= -->
<p><tt>__builtin_readcyclecounter</tt> is used to access the cycle counter
register (or a similar low-latency, high-accuracy clock) on those targets that
support it.
</p>
<p><b>Syntax:</b></p>
<pre>
__builtin_readcyclecounter()
</pre>
<p><b>Example of Use:</b></p>
<pre>
unsigned long long t0 = __builtin_readcyclecounter();
do_something();
unsigned long long t1 = __builtin_readcyclecounter();
unsigned long long cycles_to_do_something = t1 - t0; // assuming no overflow
</pre>
<p><b>Description:</b></p>
<p>The __builtin_readcyclecounter() builtin returns the cycle counter value,
which may be either global or process/thread-specific depending on the target.
As the backing counters often overflow quickly (on the order of
seconds) this should only be used for timing small intervals. When not
supported by the target, the return value is always zero. This builtin
takes no arguments and produces an unsigned long long result.
</p>
<p>Query for this feature with __has_builtin(__builtin_readcyclecounter).</p>
<!-- ======================================================================= -->
<h3><a name="__builtin_shufflevector">__builtin_shufflevector</a></h3>
<!-- ======================================================================= -->

Просмотреть файл

@ -476,6 +476,7 @@ BUILTIN(__builtin___vprintf_chk, "iicC*a", "FP:1:")
BUILTIN(__builtin_expect, "LiLiLi" , "nc")
BUILTIN(__builtin_prefetch, "vvC*.", "nc")
BUILTIN(__builtin_readcyclecounter, "ULLi", "n")
BUILTIN(__builtin_trap, "v", "nr")
BUILTIN(__builtin_unreachable, "v", "nr")
BUILTIN(__builtin_shufflevector, "v." , "nc")

Просмотреть файл

@ -365,6 +365,10 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
return RValue::get(Builder.CreateCall4(F, Address, RW, Locality, Data));
}
case Builtin::BI__builtin_readcyclecounter: {
Value *F = CGM.getIntrinsic(Intrinsic::readcyclecounter);
return RValue::get(Builder.CreateCall(F));
}
case Builtin::BI__builtin_trap: {
Value *F = CGM.getIntrinsic(Intrinsic::trap);
return RValue::get(Builder.CreateCall(F));

Просмотреть файл

@ -203,3 +203,9 @@ void test_builtin_longjmp(void **buffer) {
__builtin_longjmp(buffer, 1);
// CHECK-NEXT: unreachable
}
// CHECK: define i64 @test_builtin_readcyclecounter
long long test_builtin_readcyclecounter() {
// CHECK: call i64 @llvm.readcyclecounter()
return __builtin_readcyclecounter();
}