Примеры использования rdtsc в языках высокого уровня
Внешний вид
#include <intrin.h>
#pragma intrinsic(__rdtsc)
unsigned __int64 rdtsc() {
return __rdtsc();
}
#include <stdint.h>
extern __inline__ uint64_t rdtsc() {
uint64_t x;
__asm__ volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %%rax" : "=a" (x) : : "rdx");
return x;
}
function RDTSC: comp;
var TimeStamp: record case byte of
1: (Whole: comp);
2: (Lo, Hi: cardinal);
end;
begin
asm
db $0F; db $31;
mov [TimeStamp.Lo], eax
mov [TimeStamp.Hi], edx
end;
Result := TimeStamp.Whole;
end;
В более новых версиях Delphi можно реализовать это так:
function RDTSC: UInt64; register;
asm
rdtsc
{$IFDEF WIN64} // В случае 64-битной компиляции результат функции целиком передаётся через RAX
shl rdx, 32
or rax, rdx
{$ENDIF}
end;
Procedure.q RDTSC()
!rdtsc
ProcedureReturn
EndProcedure