mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:39:40 +01: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