Mouarf. Je distribue ce code sous GPL avec pour exception : interdiction de modification par Kevin

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