Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2017-01-26 15:23:00 ЛС | профиль | цитата
nesco писал(а):
Есть какие-либо предложения по решению данной проблемы?
Я не специалист в ассемблере, но покопавшись, выяснил, что в названных функциях в последней операции (x shr 6)/(x shr 7) Delphi использует инструкцию SAR. Если вместо неё вручную поставить SHR, то результат получается правильный.
SHR Int64 Debug

Из описания инструкции SAR понятно, что она сохраняет знак числа (последний бит) после сдвига, тогда как SHR - нет. Не нашел в Delphi 4 беззнакового UInt64. Может на беззнаковом типе он не будет применять SAR?

Кто разбирается в ассемблере, нужно просмотреть функции Gamma0 и Gamma1 и попробовать либо заставить Delphi сгенерировать код с использованием в этих местах SHR, либо самому вставить ассемблерный фрагмент, выполняющий что нужно.

--- Добавлено в 2017-01-26 15:52:08

Вот так вроде работает:

{$ifdef VER120}
function shr64(const a: Int64; b: Byte): Int64;
begin
Result := a shr b;
end;
{$endif}

function Gamma0(x: Int64): Int64;
begin
Result := (ror64(x, 1) xor ror64(x, 8) xor {$ifdef VER120}shr64(x, 7){$else}(x shr 7){$endif});
end;

function Gamma1(x: Int64): Int64;
begin
Result := (ror64(x, 19) xor ror64(x, 61) xor {$ifdef VER120}shr64(x, 6){$else}(x shr 6){$endif});
end;
В чем прикол - я так и не понял. Может, можно что-то получше придумать.
карма: 26

1
Голосовали:Galkov
Редактировалось 9 раз(а), последний 2017-01-26 16:46:05