forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.4 KiB
99 lines
2.4 KiB
/* |
|
* Copyright (C) 2008-2009 Michal Simek <[email protected]> |
|
* 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; |
|
fallthrough; |
|
case 2: |
|
*src++ = c; |
|
--n; |
|
fallthrough; |
|
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 */
|
|
|