mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 19:29:09 +02:00
Add assembler implementation of Move.
git-svn-id: trunk@42155 -
(cherry picked from commit 009c87156a
)
This commit is contained in:
parent
18ba7fc23a
commit
915e48c675
@ -32,37 +32,43 @@ procedure fpc_cpuinit;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|||||||
|
|
||||||
|
|
||||||
{$define FPC_SYSTEM_HAS_MOVE}
|
{$define FPC_SYSTEM_HAS_MOVE}
|
||||||
procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];
|
procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE']; assembler; nostackframe;
|
||||||
var
|
asm
|
||||||
pdest,psrc,pend : pbyte;
|
push r28
|
||||||
begin
|
push r29
|
||||||
if (@dest=@source) or (count<=0) then
|
|
||||||
exit;
|
movw r26, r24 // Src=X
|
||||||
if (@dest<@source) or (@source+count<@dest) then
|
movw r28, r22 // Dest=Y
|
||||||
begin
|
movw r30, r20 // Count=Z
|
||||||
{ Forward Move }
|
cp r1, r30
|
||||||
psrc:=@source;
|
cpc r1, r31
|
||||||
pdest:=@dest;
|
brge .Lexit // if 0 >= Count
|
||||||
pend:=psrc+count;
|
cp r28, r26
|
||||||
while psrc<pend do
|
cpc r29, r27
|
||||||
begin
|
breq .Lexit // if dest = source
|
||||||
pdest^:=psrc^;
|
brlo .LForwardMove // if dest < source
|
||||||
inc(pdest);
|
|
||||||
inc(psrc);
|
// Add count to both pointers
|
||||||
end;
|
add r26, r30
|
||||||
end
|
adc r27, r31
|
||||||
else
|
add r28, r30
|
||||||
begin
|
adc r29, r31
|
||||||
{ Backward Move }
|
.LBackwardMove:
|
||||||
psrc:=@source+count;
|
ld r18, -X
|
||||||
pdest:=@dest+count;
|
st -Y, r18
|
||||||
while psrc>@source do
|
sbiw Z, 1
|
||||||
begin
|
brne .LBackwardMove
|
||||||
dec(pdest);
|
rjmp .Lexit
|
||||||
dec(psrc);
|
|
||||||
pdest^:=psrc^;
|
.LForwardMove:
|
||||||
end;
|
ld r18, X+
|
||||||
end;
|
st Y+, r18
|
||||||
|
sbiw Z, 1
|
||||||
|
brne .LForwardMove
|
||||||
|
.Lexit:
|
||||||
|
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user