Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit d9124f0

Browse files
authored
Merge pull request #3056 from thewilsonator/ldc-rt-trace
[rt.trace] AArch64 implementation and LDC reposition merged-on-behalf-of: Nicholas Wilson <thewilsonator@users.noreply.github.com>
2 parents 0d455a4 + b4ebaa8 commit d9124f0

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

src/rt/trace.d

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,29 @@ version (Windows)
875875
export int QueryPerformanceFrequency(timer_t *);
876876
}
877877
}
878+
else version (AArch64)
879+
{
880+
// We cannot use ldc.intrinsics.llvm_readcyclecounter because that is not an accurate
881+
// time counter (it is a counter of CPU cycles, where here we want a time clock).
882+
// Also, priviledged execution rights are needed to enable correct counting with
883+
// ldc.intrinsics.llvm_readcyclecounter on AArch64.
884+
extern (D) void QueryPerformanceCounter(timer_t* ctr)
885+
{
886+
asm { "mrs %0, cntvct_el0" : "=r" (*ctr); }
887+
}
888+
extern (D) void QueryPerformanceFrequency(timer_t* freq)
889+
{
890+
asm { "mrs %0, cntfrq_el0" : "=r" (*freq); }
891+
}
892+
}
893+
else version (LDC)
894+
{
895+
extern (D) void QueryPerformanceCounter(timer_t* ctr)
896+
{
897+
import ldc.intrinsics: llvm_readcyclecounter;
898+
*ctr = llvm_readcyclecounter();
899+
}
900+
}
878901
else
879902
{
880903
extern (D) void QueryPerformanceCounter(timer_t* ctr)
@@ -906,11 +929,6 @@ else
906929
ret ;
907930
}
908931
}
909-
else version (LDC)
910-
{
911-
import ldc.intrinsics: llvm_readcyclecounter;
912-
*ctr = llvm_readcyclecounter();
913-
}
914932
else
915933
{
916934
static assert(0);

0 commit comments

Comments
 (0)