76Fermer78
PolluxLe 16/01/2004 à 17:56
Mouarf. Je distribue ce code sous GPL avec pour exception : interdiction de modification par Kevin tongue Je ne pense pas que le surcoût de taille soit de plus de 30 octets, et la vitesse est très supérieure dans pas mal de cas (notamment memmove qui était plus de 5x trop lent dans la moitié des cas, et notamment quand la taille est faible [< 50 octets])

memmove:
	move.l  4(a7),a0	;  Dest
	move.l  8(a7),a1	;  Src
	move.l  12(a7),d0	;  Len
	beq.s	memcpy_rts
memove_reg:		
	cmp.l   a0,a1           ;  Src <= dest
	bhs.s   memcpy_reg
        add.l   d0,a0
	cmp.l   a0,a1           ;  Src >= dest+len
	bls.s   memcpy_reg2
		add.l   d0,a1
		lsr.l	#1,d0
		bcs.s	\Odd2
\SlowLoop2	
			move.b  -(a1),-(a0)
\Odd2
			move.b  -(a1),-(a0)
	                subq.l  #1,d0
	                bne.s   \SlowLoop2
	        rts
memcpy:
	move.l	4(a7),a0	;  Dest
	move.l	8(a7),a1	;  Src
	move.l	12(a7),d0	;  Len
memcpy_reg:	
	beq.s	memcpy_end     ; oh le beau hack ;)
memcpy_reg2:
	move.l	a0,d2
	sub.w	a1,d2
	lsr.w	#1,d2
	bcs.s	memcpy_slow
	move.w	d0,d1
	lsr.l	#4,d0
	subq.w	#1,d0		;  Max 65536*16=1Mo (sufficient)
	beq.s	memcpy_last
	move.l	a0,d2
	lsr.w	#1,d2
	bne.s   \FastLoop
	move.b (a1)+,(a0)+
\FastLoop		
		move.l	(a1)+,(a0)+
		move.l	(a1)+,(a0)+
		move.l	(a1)+,(a0)+
		move.l	(a1)+,(a0)+
		dbf	d0,\FastLoop
memcpy_last
	ror.w #4,d1
	bpl.s	\no8
		move.l	(a1)+,(a0)+
		move.l	(a1)+,(a0)+
\no8
	add.w d1,d1
	bpl.s	\no4
		move.l	(a1)+,(a0)+
\no4
	add.w d1,d1
	bpl.s	\no2
		move.w	(a1)+,(a0)+
\no2
	add.w d1,d1
	bpl.s	\no1
		move.b	(a1)+,(a0)+
\no1
memcpy_end:	
	move.l	4(a7),a0
memcpy_rts
	rts
memcpy_slow:	
	lsr.l	#1,d0
	bcs.s	\Odd
\SlowLoop
		move.b	(a1)+,(a0)+
\Odd
		move.b	(a1)+,(a0)+
		subq.l	#1,d0
		bne.s	\SlowLoop
	bra.s	memcpy_end