Помогите, пожалуйста, переписать в функцию в 64-х разрядную версию:
function GetCPUTick :Int64;
asm
RDTSC
end;
RDTSC в FPC 64
Модератор: Модераторы
в чём естественно проблемы
а вообще как написано здесь http://en.wikipedia.org/wiki/Time_Stamp_Counter
пользуйтесь функциями ОС для которой пишите.
Код: Выделить всё
function GetCPUTick: Int64; register;
asm
rdtsc
end;а вообще как написано здесь http://en.wikipedia.org/wiki/Time_Stamp_Counter
Under Windows platforms, Microsoft strongly discourages using the TSC for high-resolution timing for exactly these reasons, providing instead the Windows APIs QueryPerformanceCounter and QueryPerformanceFrequency. Even when using these functions, Microsoft recommends the code to be locked to a single CPU. Under Linux, similar functionality is provided by reading the value of CLOCK_MONOTONIC clock using POSIX clock_gettime function.
пользуйтесь функциями ОС для которой пишите.
Mr.Smart писал(а):в чём естественно проблемы
Проблема в том, что так не работает. Полагаю, что дело в способе возврата результата. RDTSC помещает результат в EDX:EAX, а в 64-х разрядных программах результат, наверное, возвращается иначе - через 64-х разрядные регистры. Я с этим пока не разбирался, вот прошу помощи. А QeryPerformanceCounter меня не устраивает.
Добавлено спустя 7 часов 12 минут 12 секунд:
Вроде, получилось.
Код: Выделить всё
function GetCPUTick :TInt64;
asm
RDTSC
movslq %eax,%rax
movslq %edx,%rdx
shl $0x20,%rdx
add %rdx,%rax
end;
Странно, что assembler по синтаксису не совместим с Delphi, хотя у меня стоят соответствующие опции. Понятно, что пока нет 64-х разрядного Delphi о совместимости говорить некорректно, но все таки...
Max Rusov писал(а):Странно, что assembler по синтаксису не совместим с Delphi, хотя у меня стоят соответствующие опции. Понятно, что пока нет 64-х разрядного Delphi о совместимости говорить некорректно, но все таки...
-Rintel
