2011-03-28 16:53:37 +10:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file COPYING in the main directory of this archive
* for more details .
*/
2005-04-16 15:20:36 -07:00
2011-03-28 16:53:37 +10:00
# include <linux/module.h>
# include <linux/string.h>
2005-04-16 15:20:36 -07:00
2011-03-28 16:53:37 +10:00
void * memcpy ( void * to , const void * from , size_t n )
2005-04-16 15:20:36 -07:00
{
2011-03-28 16:53:37 +10:00
void * xto = to ;
2012-10-29 16:15:43 +10:00
size_t temp ;
2005-04-16 15:20:36 -07:00
2011-03-28 16:53:37 +10:00
if ( ! n )
return xto ;
if ( ( long ) to & 1 ) {
char * cto = to ;
const char * cfrom = from ;
* cto + + = * cfrom + + ;
to = cto ;
from = cfrom ;
n - - ;
}
2011-08-05 14:41:29 +10:00
# if defined(CONFIG_M68000)
if ( ( long ) from & 1 ) {
char * cto = to ;
const char * cfrom = from ;
for ( ; n ; n - - )
* cto + + = * cfrom + + ;
return xto ;
}
# endif
2011-03-28 16:53:37 +10:00
if ( n > 2 & & ( long ) to & 2 ) {
short * sto = to ;
const short * sfrom = from ;
* sto + + = * sfrom + + ;
to = sto ;
from = sfrom ;
n - = 2 ;
}
temp = n > > 2 ;
if ( temp ) {
long * lto = to ;
const long * lfrom = from ;
2011-06-02 16:07:33 +10:00
# if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
for ( ; temp ; temp - - )
* lto + + = * lfrom + + ;
# else
2012-10-29 16:15:43 +10:00
size_t temp1 ;
2011-03-28 16:53:37 +10:00
asm volatile (
" movel %2,%3 \n "
" andw #7,%3 \n "
" lsrl #3,%2 \n "
" negw %3 \n "
" jmp %%pc@(1f,%3:w:2) \n "
" 4: movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" movel %0@+,%1@+ \n "
" 1: dbra %2,4b \n "
" clrw %2 \n "
" subql #1,%2 \n "
" jpl 4b "
: " =a " ( lfrom ) , " =a " ( lto ) , " =d " ( temp ) , " =&d " ( temp1 )
: " 0 " ( lfrom ) , " 1 " ( lto ) , " 2 " ( temp ) ) ;
2005-04-16 15:20:36 -07:00
# endif
2011-03-28 16:53:37 +10:00
to = lto ;
from = lfrom ;
}
if ( n & 2 ) {
short * sto = to ;
const short * sfrom = from ;
* sto + + = * sfrom + + ;
to = sto ;
from = sfrom ;
}
if ( n & 1 ) {
char * cto = to ;
const char * cfrom = from ;
* cto = * cfrom ;
}
return xto ;
2005-04-16 15:20:36 -07:00
}
2011-03-28 16:53:37 +10:00
EXPORT_SYMBOL ( memcpy ) ;