зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
65263b4ec1
Коммит
a841c19f78
|
@ -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();
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче