s390/string: provide asm lib functions for memcpy and memcmp

Our memcpy and memcmp variants were implemented by calling the corresponding
gcc builtin variants.
However gcc is free to replace a call to __builtin_memcmp with a call to memcmp
which, when called, will result in an endless recursion within memcmp.
So let's provide asm variants and also fix the variants that are used for
uncompressing the kernel image.
In addition remove all other occurences of builtin function calls.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Heiko Carstens
2012-08-14 13:20:20 +02:00
committed by Martin Schwidefsky
parent 68d9884dbc
commit 535c611ddd
7 changed files with 212 additions and 80 deletions

View File

@@ -71,34 +71,37 @@ void *memset(void *s, int c, size_t n)
{
char *xs;
if (c == 0)
return __builtin_memset(s, 0, n);
xs = (char *) s;
if (n > 0)
do {
*xs++ = c;
} while (--n > 0);
xs = s;
while (n--)
*xs++ = c;
return s;
}
void *memcpy(void *__dest, __const void *__src, size_t __n)
void *memcpy(void *dest, const void *src, size_t n)
{
return __builtin_memcpy(__dest, __src, __n);
const char *s = src;
char *d = dest;
while (n--)
*d++ = *s++;
return dest;
}
void *memmove(void *__dest, __const void *__src, size_t __n)
void *memmove(void *dest, const void *src, size_t n)
{
char *d;
const char *s;
const char *s = src;
char *d = dest;
if (__dest <= __src)
return __builtin_memcpy(__dest, __src, __n);
d = __dest + __n;
s = __src + __n;
while (__n--)
*--d = *--s;
return __dest;
if (d <= s) {
while (n--)
*d++ = *s++;
} else {
d += n;
s += n;
while (n--)
*--d = *--s;
}
return dest;
}
static void error(char *x)