mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 19:09:21 +02:00
+ implemented software shl/shr for 64 bit ints
This commit is contained in:
parent
d7786f6246
commit
8171ad2e10
@ -36,7 +36,20 @@
|
|||||||
{$ifndef FPC_SYSTEM_HAS_SHL_QWORD}
|
{$ifndef FPC_SYSTEM_HAS_SHL_QWORD}
|
||||||
function fpc_shl_qword(value,shift : qword) : qword; [public,alias: 'FPC_SHL_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_shl_qword(value,shift : qword) : qword; [public,alias: 'FPC_SHL_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
begin
|
begin
|
||||||
{!!!!}
|
if shift=0 then
|
||||||
|
result:=value
|
||||||
|
else if shift>63 then
|
||||||
|
result:=0
|
||||||
|
else if shift>31 then
|
||||||
|
begin
|
||||||
|
tqwordrec(result).low:=0;
|
||||||
|
tqwordrec(result).high:=tqwordrec(value).low shl (shift-32);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
tqwordrec(result).low:=tqwordrec(value).low shl shift;
|
||||||
|
tqwordrec(result).high:=(tqwordrec(value).high shl shift) or (tqwordrec(value).low shr (32-shift));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{$endif FPC_SYSTEM_HAS_SHL_QWORD}
|
{$endif FPC_SYSTEM_HAS_SHL_QWORD}
|
||||||
|
|
||||||
@ -44,7 +57,20 @@
|
|||||||
{$ifndef FPC_SYSTEM_HAS_SHR_QWORD}
|
{$ifndef FPC_SYSTEM_HAS_SHR_QWORD}
|
||||||
function fpc_shr_qword(value,shift : qword) : qword; [public,alias: 'FPC_SHR_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_shr_qword(value,shift : qword) : qword; [public,alias: 'FPC_SHR_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
begin
|
begin
|
||||||
{!!!!}
|
if shift=0 then
|
||||||
|
result:=value
|
||||||
|
else if shift>63 then
|
||||||
|
result:=0
|
||||||
|
else if shift>31 then
|
||||||
|
begin
|
||||||
|
tqwordrec(result).high:=0;
|
||||||
|
tqwordrec(result).low:=tqwordrec(value).high shr (shift-32);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
tqwordrec(result).high:=tqwordrec(value).high shr shift;
|
||||||
|
tqwordrec(result).low:=(tqwordrec(value).low shr shift) or (tqwordrec(value).high shl (32-shift));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{$endif FPC_SYSTEM_HAS_SHR_QWORD}
|
{$endif FPC_SYSTEM_HAS_SHR_QWORD}
|
||||||
|
|
||||||
@ -52,7 +78,20 @@
|
|||||||
{$ifndef FPC_SYSTEM_HAS_SHL_INT64}
|
{$ifndef FPC_SYSTEM_HAS_SHL_INT64}
|
||||||
function fpc_shl_int64(value,shift : int64) : int64; [public,alias: 'FPC_SHL_INT64']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_shl_int64(value,shift : int64) : int64; [public,alias: 'FPC_SHL_INT64']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
begin
|
begin
|
||||||
{!!!!}
|
if shift=0 then
|
||||||
|
result:=value
|
||||||
|
else if shift>63 then
|
||||||
|
result:=0
|
||||||
|
else if shift>31 then
|
||||||
|
begin
|
||||||
|
tqwordrec(result).low:=0;
|
||||||
|
tqwordrec(result).high:=tqwordrec(value).low shl (shift-32);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
tqwordrec(result).low:=tqwordrec(value).low shl shift;
|
||||||
|
tqwordrec(result).high:=(tqwordrec(value).high shl shift) or (tqwordrec(value).low shr (32-shift));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{$endif FPC_SYSTEM_HAS_SHL_INT64}
|
{$endif FPC_SYSTEM_HAS_SHL_INT64}
|
||||||
|
|
||||||
@ -60,7 +99,20 @@
|
|||||||
{$ifndef FPC_SYSTEM_HAS_SHR_INT64}
|
{$ifndef FPC_SYSTEM_HAS_SHR_INT64}
|
||||||
function fpc_shr_int64(value,shift : int64) : int64; [public,alias: 'FPC_SHR_INT64']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_shr_int64(value,shift : int64) : int64; [public,alias: 'FPC_SHR_INT64']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
begin
|
begin
|
||||||
{!!!!}
|
if shift=0 then
|
||||||
|
result:=value
|
||||||
|
else if shift>63 then
|
||||||
|
result:=0
|
||||||
|
else if shift>31 then
|
||||||
|
begin
|
||||||
|
tqwordrec(result).high:=0;
|
||||||
|
tqwordrec(result).low:=tqwordrec(value).high shr (shift-32);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
tqwordrec(result).high:=tqwordrec(value).high shr shift;
|
||||||
|
tqwordrec(result).low:=(tqwordrec(value).low shr shift) or (tqwordrec(value).high shl (32-shift));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{$endif FPC_SYSTEM_HAS_SHR_INT64}
|
{$endif FPC_SYSTEM_HAS_SHR_INT64}
|
||||||
|
|
||||||
@ -510,7 +562,10 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.22 2003-09-14 11:34:13 peter
|
Revision 1.23 2004-01-23 15:14:04 florian
|
||||||
|
+ implemented software shl/shr for 64 bit ints
|
||||||
|
|
||||||
|
Revision 1.22 2003/09/14 11:34:13 peter
|
||||||
* moved int64 asm code to int64p.inc
|
* moved int64 asm code to int64p.inc
|
||||||
* save ebx,esi
|
* save ebx,esi
|
||||||
|
|
||||||
@ -542,4 +597,4 @@
|
|||||||
Revision 1.14 2002/07/01 16:29:05 peter
|
Revision 1.14 2002/07/01 16:29:05 peter
|
||||||
* sLineBreak changed to normal constant like Kylix
|
* sLineBreak changed to normal constant like Kylix
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user