mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 09:46:20 +00:00
Base: New 'memcpy' implementation
Added CPU specific memcpy function ('memcpy_cpu'), which is tried first in default 'memcpy'. Improved default 'memcpy' to copy eight byte chunks.
This commit is contained in:
parent
ae88dc233c
commit
88ac32e3bb
56
base/include/arm/cpu/string.h
Normal file
56
base/include/arm/cpu/string.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* \brief Cpu specifi memcpy
|
||||
* \author Sebastian Sumpf
|
||||
* \author Stefan Kalkowski
|
||||
* \date 2012-08-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__ARM__CPU__STRING_H_
|
||||
#define _INCLUDE__ARM__CPU__STRING_H_
|
||||
|
||||
namespace Genode
|
||||
{
|
||||
/**
|
||||
* Copy memory block
|
||||
*
|
||||
* \param dst destination memory block
|
||||
* \param src source memory block
|
||||
* \param size number of bytes to copy
|
||||
*
|
||||
* \return Number of bytes not copied
|
||||
*/
|
||||
inline size_t memcpy_cpu(void *dst, const void *src, size_t size)
|
||||
{
|
||||
unsigned char *d = (unsigned char *)dst, *s = (unsigned char *)src;
|
||||
|
||||
/* check 4 byte; alignment */
|
||||
size_t d_align = (size_t)d & 0x3;
|
||||
size_t s_align = (size_t)s & 0x3;
|
||||
|
||||
/* at least 32 bytes, 4 byte aligned, same alignment */
|
||||
if (size < 32 || (d_align | s_align) || (d_align ^ s_align))
|
||||
return size;
|
||||
|
||||
/* copy to 4 byte alignment */
|
||||
for (size_t i = 0; i < s_align; i++, *d++ = *s++, size--);
|
||||
|
||||
/* copy 32 byte chunks */
|
||||
for (; size >= 32; size -= 32) {
|
||||
asm volatile ("ldmia %0!, {r3 - r10} \n\t"
|
||||
"stmia %1!, {r3 - r10} \n\t"
|
||||
: "+r" (s), "+r" (d)
|
||||
:: "r3","r4","r5","r6","r7","r8","r9","r10");
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__ARM__CPU__STRING_H_ */
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* \brief String utility functions
|
||||
* \author Norman Feske
|
||||
* \author Sebastian Sumpf
|
||||
* \date 2006-05-10
|
||||
*/
|
||||
|
||||
@ -16,6 +17,7 @@
|
||||
|
||||
#include <base/stdint.h>
|
||||
#include <util/misc_math.h>
|
||||
#include <cpu/string.h>
|
||||
|
||||
namespace Genode {
|
||||
|
||||
@ -61,10 +63,24 @@ namespace Genode {
|
||||
char *d = (char *)dst, *s = (char *)src;
|
||||
size_t i;
|
||||
|
||||
if (s > d)
|
||||
for (i = 0; i < size; i++, *d++ = *s++);
|
||||
else
|
||||
for (d += size, s += size, i = size; i-- > 0; *(--d) = *(--s));
|
||||
/* try cpu specific version first */
|
||||
if ((i = size - memcpy_cpu(dst, src, size)) == size)
|
||||
return dst;
|
||||
|
||||
d += i; s += i; size -= i;
|
||||
|
||||
/* copy eight byte chunks */
|
||||
for (i = size >> 3; i > 0; i--, *d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++,
|
||||
*d++ = *s++);
|
||||
|
||||
/* copy left over */
|
||||
for (i = 0; i < (size & 0x7); i++, *d++ = *s++);
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
32
base/include/x86/cpu/string.h
Normal file
32
base/include/x86/cpu/string.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* \brief Cpu specifi memcpy
|
||||
* \author Sebastian Sumpf
|
||||
* \date 2012-08-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__X86__CPU__STRING_H_
|
||||
#define _INCLUDE__X86__CPU__STRING_H_
|
||||
|
||||
namespace Genode
|
||||
{
|
||||
/**
|
||||
* Copy memory block
|
||||
*
|
||||
* \param dst destination memory block
|
||||
* \param src source memory block
|
||||
* \param size number of bytes to copy
|
||||
*
|
||||
* \return Number of bytes not copied
|
||||
*/
|
||||
inline size_t memcpy_cpu(void *dst, const void *src, size_t size) {
|
||||
return size; }
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__X86__CPU__STRING_H_ */
|
Loading…
x
Reference in New Issue
Block a user