2006-10-06 00:43:55 -07: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 .
*/
# define __IN_STRING_C
2005-09-03 15:57:10 -07:00
# include <linux/module.h>
2006-10-06 00:43:55 -07:00
# include <linux/string.h>
char * strcpy ( char * dest , const char * src )
{
return __kernel_strcpy ( dest , src ) ;
}
EXPORT_SYMBOL ( strcpy ) ;
2005-09-03 15:57:10 -07:00
2008-05-21 06:32:11 +01:00
char * strcat ( char * dest , const char * src )
{
return __kernel_strcpy ( dest + __kernel_strlen ( dest ) , src ) ;
}
EXPORT_SYMBOL ( strcat ) ;
2005-09-03 15:57:10 -07:00
void * memset ( void * s , int c , size_t count )
{
void * xs = s ;
size_t temp , temp1 ;
if ( ! count )
return xs ;
c & = 0xff ;
c | = c < < 8 ;
c | = c < < 16 ;
if ( ( long ) s & 1 ) {
char * cs = s ;
* cs + + = c ;
s = cs ;
count - - ;
}
if ( count > 2 & & ( long ) s & 2 ) {
short * ss = s ;
* ss + + = c ;
s = ss ;
count - = 2 ;
}
temp = count > > 2 ;
if ( temp ) {
long * ls = s ;
asm volatile (
" movel %1,%2 \n "
" andw #7,%2 \n "
" lsrl #3,%1 \n "
" negw %2 \n "
" jmp %%pc@(2f,%2:w:2) \n "
" 1: movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" movel %3,%0@+ \n "
" 2: dbra %1,1b \n "
" clrw %1 \n "
" subql #1,%1 \n "
" jpl 1b "
: " =a " ( ls ) , " =d " ( temp ) , " =&d " ( temp1 )
: " d " ( c ) , " 0 " ( ls ) , " 1 " ( temp ) ) ;
s = ls ;
}
if ( count & 2 ) {
short * ss = s ;
* ss + + = c ;
s = ss ;
}
if ( count & 1 ) {
char * cs = s ;
* cs = c ;
}
return xs ;
}
EXPORT_SYMBOL ( memset ) ;
void * memcpy ( void * to , const void * from , size_t n )
{
void * xto = to ;
size_t temp , temp1 ;
if ( ! n )
return xto ;
if ( ( long ) to & 1 ) {
char * cto = to ;
const char * cfrom = from ;
* cto + + = * cfrom + + ;
to = cto ;
from = cfrom ;
n - - ;
}
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 ;
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 ) ) ;
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 ;
}
EXPORT_SYMBOL ( memcpy ) ;
void * memmove ( void * dest , const void * src , size_t n )
{
void * xdest = dest ;
size_t temp ;
if ( ! n )
return xdest ;
if ( dest < src ) {
if ( ( long ) dest & 1 ) {
char * cdest = dest ;
const char * csrc = src ;
* cdest + + = * csrc + + ;
dest = cdest ;
src = csrc ;
n - - ;
}
if ( n > 2 & & ( long ) dest & 2 ) {
short * sdest = dest ;
const short * ssrc = src ;
* sdest + + = * ssrc + + ;
dest = sdest ;
src = ssrc ;
n - = 2 ;
}
temp = n > > 2 ;
if ( temp ) {
long * ldest = dest ;
const long * lsrc = src ;
temp - - ;
do
* ldest + + = * lsrc + + ;
while ( temp - - ) ;
dest = ldest ;
src = lsrc ;
}
if ( n & 2 ) {
short * sdest = dest ;
const short * ssrc = src ;
* sdest + + = * ssrc + + ;
dest = sdest ;
src = ssrc ;
}
if ( n & 1 ) {
char * cdest = dest ;
const char * csrc = src ;
* cdest = * csrc ;
}
} else {
dest = ( char * ) dest + n ;
src = ( const char * ) src + n ;
if ( ( long ) dest & 1 ) {
char * cdest = dest ;
const char * csrc = src ;
* - - cdest = * - - csrc ;
dest = cdest ;
src = csrc ;
n - - ;
}
if ( n > 2 & & ( long ) dest & 2 ) {
short * sdest = dest ;
const short * ssrc = src ;
* - - sdest = * - - ssrc ;
dest = sdest ;
src = ssrc ;
n - = 2 ;
}
temp = n > > 2 ;
if ( temp ) {
long * ldest = dest ;
const long * lsrc = src ;
temp - - ;
do
* - - ldest = * - - lsrc ;
while ( temp - - ) ;
dest = ldest ;
src = lsrc ;
}
if ( n & 2 ) {
short * sdest = dest ;
const short * ssrc = src ;
* - - sdest = * - - ssrc ;
dest = sdest ;
src = ssrc ;
}
if ( n & 1 ) {
char * cdest = dest ;
const char * csrc = src ;
* - - cdest = * - - csrc ;
}
}
return xdest ;
}
EXPORT_SYMBOL ( memmove ) ;
int memcmp ( const void * cs , const void * ct , size_t count )
{
const unsigned char * su1 , * su2 ;
for ( su1 = cs , su2 = ct ; count > 0 ; + + su1 , + + su2 , count - - )
if ( * su1 ! = * su2 )
return * su1 < * su2 ? - 1 : + 1 ;
return 0 ;
}
EXPORT_SYMBOL ( memcmp ) ;