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;
Которую, компилятор, собственно, и использует. Когда второй операнд переменная.
А первую, получается - не сможет, даже если захочет.
Хотите верьте, хотите - нет ...