Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2017-02-02 10:24:00 ЛС | профиль | цитата
Netspirit писал(а):

В чем прикол - я так и не понял

Здорово смахивает на то, что он "реагирует" на то, что второй операнд константа, а не переменная.
В кодах ror64 тоже ведь есть shr ...
Вот так ведь - тоже "правильно" работает:
function Gamma0(x: Int64): Int64;
var b:byte;
begin
b := 7;
Result := (ror64(x, 1) xor ror64(x, 8) xor (x shr b));
end;

И еще одно интересное наблюдение ...
В кодах System.pas (которые я стащил когда-то из какой-то семерки)
Есть две процедуры для правых 64-битных сдвигов:
// ------------------------------------------------------------------------------
// 64-bit signed shift right
// ------------------------------------------------------------------------------
// target (EAX:EDX) count (ECX)

procedure __llshr;
asm
cmp cl, 32
jl @__llshr@below32
cmp cl, 64
jl @__llshr@below64
sar edx, 1fh
mov eax,edx
ret

@__llshr@below64:
mov eax, edx
cdq
sar eax,cl
ret

@__llshr@below32:
shrd eax, edx, cl
sar edx, cl
ret
end;

// ------------------------------------------------------------------------------
// 64-bit unsigned shift right
// ------------------------------------------------------------------------------

// target (EAX:EDX) count (ECX)
procedure __llushr;
asm
cmp cl, 32
jl @__llushr@below32
cmp cl, 64
jl @__llushr@below64
xor edx, edx
xor eax, eax
ret

@__llushr@below64:
mov eax, edx
xor edx, edx
shr eax, cl
ret

@__llushr@below32:
shrd eax, edx, cl
shr edx, cl
ret
end;
НО, в интерфейсной части определена лишь одна - вторая
Которую, компилятор, собственно, и использует. Когда второй операнд переменная.
А первую, получается - не сможет, даже если захочет.
Хотите верьте, хотите - нет ...
карма: 9

0
Редактировалось 5 раз(а), последний 2017-02-02 20:17:57