Add assembler implementation of Move.

git-svn-id: trunk@42155 -
(cherry picked from commit 009c87156a)
This commit is contained in:
Jeppe Johansen 2019-06-01 15:39:09 +00:00 committed by florian
parent 18ba7fc23a
commit 915e48c675

View File

@ -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;