1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /*
- * 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
- *
- * Attempts were made, unsuccessfully, to contact the original
- * 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.
- */
- #include <linux/export.h>
- #include <linux/types.h>
- #include <linux/stddef.h>
- #include <linux/compiler.h>
- #include <linux/string.h>
- #ifdef __HAVE_ARCH_MEMSET
- #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 */
- void *memset(void *v_src, int c, __kernel_size_t n)
- {
- char *src = v_src;
- uint32_t *i_src;
- uint32_t w32 = 0;
- /* Truncate c to 8 bits */
- c = (c & 0xFF);
- if (unlikely(c)) {
- /* Make a repeating word out of it */
- w32 = c;
- w32 |= w32 << 8;
- w32 |= w32 << 16;
- }
- if (likely(n >= 4)) {
- /* Align the destination to a word boundary */
- /* This is done in an endian independent manner */
- 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;
- }
- /* Simple, byte oriented memset or the rest of count. */
- while (n--)
- *src++ = c;
- return v_src;
- }
- #endif /* CONFIG_OPT_LIB_FUNCTION */
- EXPORT_SYMBOL(memset);
- #endif /* __HAVE_ARCH_MEMSET */
|