diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-11-02 14:41:56 +0100 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-11-02 14:41:56 +0100 |
commit | 29c798fecb9b846b363b0a02fa662ff42fc19426 (patch) | |
tree | e708d6aca8f098e69571780f702325b221b66694 /arch/x86/boot | |
parent | ASoC: fix the building issue of missing codec field in 'struct snd_soc_card' (diff) | |
parent | Linux 2.6.37-rc1 (diff) | |
download | linux-29c798fecb9b846b363b0a02fa662ff42fc19426.tar.xz linux-29c798fecb9b846b363b0a02fa662ff42fc19426.zip |
Merge commit 'v2.6.37-rc1' into for-2.6.37
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/compressed/misc.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 8f7bef8e9fff..23f315c9f215 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -229,18 +229,35 @@ void *memset(void *s, int c, size_t n) ss[i] = c; return s; } - +#ifdef CONFIG_X86_32 void *memcpy(void *dest, const void *src, size_t n) { - int i; - const char *s = src; - char *d = dest; + int d0, d1, d2; + asm volatile( + "rep ; movsl\n\t" + "movl %4,%%ecx\n\t" + "rep ; movsb\n\t" + : "=&c" (d0), "=&D" (d1), "=&S" (d2) + : "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src) + : "memory"); - for (i = 0; i < n; i++) - d[i] = s[i]; return dest; } +#else +void *memcpy(void *dest, const void *src, size_t n) +{ + long d0, d1, d2; + asm volatile( + "rep ; movsq\n\t" + "movq %4,%%rcx\n\t" + "rep ; movsb\n\t" + : "=&c" (d0), "=&D" (d1), "=&S" (d2) + : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src) + : "memory"); + return dest; +} +#endif static void error(char *x) { |