mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-31 17:10:14 +02:00
* made assembler implementation of move
This commit is contained in:
parent
2629ece80b
commit
0f093b2001
@ -81,10 +81,212 @@ function Sptr:Pointer;assembler;nostackframe;
|
|||||||
mov %sp,%o0
|
mov %sp,%o0
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ $ifdef dummy}
|
||||||
|
{$define FPC_SYSTEM_HAS_MOVE}
|
||||||
|
procedure Move(const source;var dest;count:longint);[public, alias: 'FPC_MOVE'];assembler;
|
||||||
|
{
|
||||||
|
Registers:
|
||||||
|
%l0 temp. to do copying
|
||||||
|
%l1 inc/decrement
|
||||||
|
%l2/l3/l4/l5 qword move
|
||||||
|
}
|
||||||
|
asm
|
||||||
|
// count < 0 ?
|
||||||
|
cmp %g0,%i2
|
||||||
|
bge .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
// possible overlap?
|
||||||
|
cmp %i0,%i1
|
||||||
|
bcc .Lnopossibleoverlap
|
||||||
|
nop
|
||||||
|
// source < dest ....
|
||||||
|
add %i0,%i2,%l0
|
||||||
|
// overlap?
|
||||||
|
cmp %l0,%i1
|
||||||
|
// source+count < dest ?
|
||||||
|
bcs .Lnopossibleoverlap
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lcopybackward:
|
||||||
|
// check alignment of source and dest
|
||||||
|
or %i0,%i1,%l0
|
||||||
|
|
||||||
|
// move src and dest to the end of the blocks
|
||||||
|
// assuming 16 byte block size
|
||||||
|
sub %i2,1,%l1
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
{
|
||||||
|
// everything 16 byte aligned ?
|
||||||
|
andcc %l0,15,%l0
|
||||||
|
be .Lmovetwordwise
|
||||||
|
// load direction in delay slot
|
||||||
|
mov -16,%l1
|
||||||
|
|
||||||
|
// adjust according to block size
|
||||||
|
add %i0,8,%i0
|
||||||
|
add %i1,8,%i1
|
||||||
|
andcc %l0,7,%l0
|
||||||
|
be .Lmoveqwordwise
|
||||||
|
mov -8,%l1
|
||||||
|
|
||||||
|
// adjust according to block size
|
||||||
|
add %i0,4,%i0
|
||||||
|
add %i1,4,%i1
|
||||||
|
andcc %l0,3,%l0
|
||||||
|
be .Lmovedwordwise
|
||||||
|
mov -4,%l1
|
||||||
|
|
||||||
|
// adjust according to block size
|
||||||
|
add %i0,2,%i0
|
||||||
|
add %i1,2,%i1
|
||||||
|
andcc %l0,1,%l0
|
||||||
|
be .Lmovewordwise
|
||||||
|
mov -2,%l1
|
||||||
|
|
||||||
|
// adjust according to block size
|
||||||
|
add %i0,1,%i0
|
||||||
|
add %i1,1,%i1
|
||||||
|
}
|
||||||
|
ba .Lmovebytewise
|
||||||
|
mov -1,%l1
|
||||||
|
|
||||||
|
.Lnopossibleoverlap:
|
||||||
|
// check alignment of source and dest
|
||||||
|
or %i0,%i1,%l0
|
||||||
|
|
||||||
|
// everything 16 byte aligned ?
|
||||||
|
andcc %l0,15,%l0
|
||||||
|
be .Lmovetwordwise
|
||||||
|
// load direction in delay slot
|
||||||
|
mov 16,%l1
|
||||||
|
andcc %l0,7,%l0
|
||||||
|
be .Lmoveqwordwise
|
||||||
|
mov 8,%l1
|
||||||
|
andcc %l0,3,%l0
|
||||||
|
be .Lmovedwordwise
|
||||||
|
mov 4,%l1
|
||||||
|
andcc %l0,1,%l0
|
||||||
|
be .Lmovewordwise
|
||||||
|
mov 2,%l1
|
||||||
|
ba .Lmovebytewise
|
||||||
|
mov 1,%l1
|
||||||
|
|
||||||
|
.Lmovetwordwise:
|
||||||
|
srl %i2,4,%l6
|
||||||
|
cmp %g0,%l6
|
||||||
|
sll %l6,4,%l7
|
||||||
|
be .Lmoveqwordwise_shift
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovetwordwise_loop:
|
||||||
|
ld [%i0],%l2
|
||||||
|
ld [%i0+4],%l3
|
||||||
|
subcc %l6,1,%l6
|
||||||
|
ld [%i0+8],%l4
|
||||||
|
ld [%i0+12],%l5
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
st %l2,[%i1]
|
||||||
|
st %l3,[%i1+4]
|
||||||
|
st %l4,[%i1+8]
|
||||||
|
st %l5,[%i1+12]
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
bne .Lmovetwordwise_loop
|
||||||
|
nop
|
||||||
|
subcc %i2,%l7,%i2
|
||||||
|
be .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmoveqwordwise_shift:
|
||||||
|
sra %l1,1,%l1
|
||||||
|
.Lmoveqwordwise:
|
||||||
|
srl %i2,3,%l6
|
||||||
|
cmp %g0,%l6
|
||||||
|
sll %l6,3,%l7
|
||||||
|
be .Lmovedwordwise_shift
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmoveqwordwise_loop:
|
||||||
|
ld [%i0],%l2
|
||||||
|
ld [%i0+4],%l3
|
||||||
|
subcc %l6,1,%l6
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
st %l2,[%i1]
|
||||||
|
st %l3,[%i1+4]
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
bne .Lmoveqwordwise_loop
|
||||||
|
nop
|
||||||
|
subcc %i2,%l7,%i2
|
||||||
|
be .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovedwordwise_shift:
|
||||||
|
sra %l1,1,%l1
|
||||||
|
.Lmovedwordwise:
|
||||||
|
srl %i2,2,%l6
|
||||||
|
cmp %g0,%l6
|
||||||
|
sll %l6,2,%l7
|
||||||
|
be .Lmovewordwise_shift
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovedwordwise_loop:
|
||||||
|
ld [%i0],%l0
|
||||||
|
subcc %l6,1,%l6
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
st %l0,[%i1]
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
bne .Lmovedwordwise_loop
|
||||||
|
nop
|
||||||
|
subcc %i2,%l7,%i2
|
||||||
|
be .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovewordwise_shift:
|
||||||
|
sra %l1,1,%l1
|
||||||
|
.Lmovewordwise:
|
||||||
|
srl %i2,1,%l6
|
||||||
|
cmp %g0,%l6
|
||||||
|
sll %l6,1,%l7
|
||||||
|
be .Lmovebytewise_shift
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovewordwise_loop:
|
||||||
|
lduh [%i0],%l0
|
||||||
|
subcc %l6,1,%l6
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
sth %l0,[%i1]
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
bne .Lmovewordwise_loop
|
||||||
|
nop
|
||||||
|
subcc %i2,%l7,%i2
|
||||||
|
be .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Lmovebytewise_shift:
|
||||||
|
sra %l1,1,%l1
|
||||||
|
.Lmovebytewise:
|
||||||
|
cmp %g0,%i2
|
||||||
|
be .Lmoveexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
ldub [%i0],%l0
|
||||||
|
subcc %i2,1,%i2
|
||||||
|
add %i0,%l1,%i0
|
||||||
|
stb %l0,[%i1]
|
||||||
|
add %i1,%l1,%i1
|
||||||
|
bne .Lmovebytewise
|
||||||
|
nop
|
||||||
|
.Lmoveexit:
|
||||||
|
end;
|
||||||
|
{ $endif dummy}
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 2004-09-23 11:30:41 florian
|
Revision 1.11 2004-10-02 20:46:20 florian
|
||||||
|
* made assembler implementation of move
|
||||||
|
|
||||||
|
Revision 1.10 2004/09/23 11:30:41 florian
|
||||||
* fixed indention
|
* fixed indention
|
||||||
|
|
||||||
Revision 1.9 2004/09/12 12:04:23 peter
|
Revision 1.9 2004/09/12 12:04:23 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user