2009-03-27 14:25:21 +01:00
/*
* Copyright ( C ) 2008 - 2009 Michal Simek < monstr @ monstr . eu >
* Copyright ( C ) 2008 - 2009 PetaLogix
* Copyright ( C ) 2007 John Williams
*
* Reasonably optimised generic C - code for memset on Microblaze
* This is generic C code to do efficient , alignment - aware memcpy .
*
* It is based on demo code originally Copyright 2001 by Intel Corp , taken from
* http : //www.embedded.com/showArticle.jhtml?articleID=19205567
*
tree-wide: fix assorted typos all over the place
That is "success", "unknown", "through", "performance", "[re|un]mapping"
, "access", "default", "reasonable", "[con]currently", "temperature"
, "channel", "[un]used", "application", "example","hierarchy", "therefore"
, "[over|under]flow", "contiguous", "threshold", "enough" and others.
Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2009-11-14 13:09:05 -02:00
* Attempts were made , unsuccessfully , to contact the original
2009-03-27 14:25:21 +01:00
* author of this code ( Michael Morrow , Intel ) . Below is the original
* copyright notice .
*
* This software has been developed by Intel Corporation .
* Intel specifically disclaims all warranties , express or
* implied , and all liability , including consequential and
* other indirect damages , for the use of this program , including
* liability for infringement of any proprietary rights ,
* and including the warranties of merchantability and fitness
* for a particular purpose . Intel does not assume any
* responsibility for and errors which may appear in this program
* not any responsibility to update it .
*/
2013-02-01 13:10:35 +01:00
# include <linux/export.h>
2009-03-27 14:25:21 +01:00
# include <linux/types.h>
# include <linux/stddef.h>
# include <linux/compiler.h>
# include <linux/string.h>
# ifdef __HAVE_ARCH_MEMSET
2010-10-09 13:58:24 +10:00
# ifndef CONFIG_OPT_LIB_FUNCTION
void * memset ( void * v_src , int c , __kernel_size_t n )
{
char * src = v_src ;
/* Truncate c to 8 bits */
c = ( c & 0xFF ) ;
/* Simple, byte oriented memset or the rest of count. */
while ( n - - )
* src + + = c ;
return v_src ;
}
# else /* CONFIG_OPT_LIB_FUNCTION */
2009-03-27 14:25:21 +01:00
void * memset ( void * v_src , int c , __kernel_size_t n )
{
char * src = v_src ;
uint32_t * i_src ;
2010-03-23 15:37:02 +01:00
uint32_t w32 = 0 ;
2010-10-09 13:58:24 +10:00
2009-03-27 14:25:21 +01:00
/* Truncate c to 8 bits */
c = ( c & 0xFF ) ;
2010-03-23 15:37:02 +01:00
if ( unlikely ( c ) ) {
/* Make a repeating word out of it */
w32 = c ;
w32 | = w32 < < 8 ;
w32 | = w32 < < 16 ;
}
2009-03-27 14:25:21 +01:00
2010-03-23 15:37:02 +01:00
if ( likely ( n > = 4 ) ) {
2009-03-27 14:25:21 +01:00
/* Align the destination to a word boundary */
2011-03-30 22:57:33 -03:00
/* This is done in an endian independent manner */
2009-03-27 14:25:21 +01:00
switch ( ( unsigned ) src & 3 ) {
case 1 :
* src + + = c ;
- - n ;
case 2 :
* src + + = c ;
- - n ;
case 3 :
* src + + = c ;
- - n ;
}
i_src = ( void * ) src ;
/* Do as many full-word copies as we can */
for ( ; n > = 4 ; n - = 4 )
* i_src + + = w32 ;
src = ( void * ) i_src ;
}
2010-10-09 13:58:24 +10:00
2009-03-27 14:25:21 +01:00
/* Simple, byte oriented memset or the rest of count. */
while ( n - - )
* src + + = c ;
return v_src ;
}
2010-10-09 13:58:24 +10:00
# endif /* CONFIG_OPT_LIB_FUNCTION */
2009-03-27 14:25:21 +01:00
EXPORT_SYMBOL ( memset ) ;
# endif /* __HAVE_ARCH_MEMSET */