Code:
function sar(Value,Shift:integer):integer; {$IFDEF CPU386}assembler; register;{$ELSE}{$IFDEF FPC}inline;{$ELSE}register;{$ENDIF}{$ENDIF}
{$IFDEF CPU386}
asm
 mov ecx,edx
 sar eax,cl
end;
{$ELSE}
begin
 result&#58;=&#40;Value shr Shift&#41; or &#40;&#40;$ffffffff+&#40;1-&#40;&#40;Value and &#40;1 shl 31&#41;&#41; shr 31&#41; and ord&#40;Shift<>0&#41;&#41;&#41; shl &#40;32-Shift&#41;&#41;;
end;
&#123;$ENDIF&#125;
But Delphi does also optimize DIV (2^n) terms to signed shift SAR opcodes.