Signed-off-by: Guillaume Charifi <guillaume.charifi@sfr.fr>

---

 dlls/msvcrt/string.c | 63 ++++++++++++++++++++++++++++++++++++++++++++

 1 file changed, 63 insertions(+)


diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c

index 4d09405094d..6d1500cb194 100644

--- a/dlls/msvcrt/string.c

+++ b/dlls/msvcrt/string.c

@@ -2527,6 +2527,7 @@ int __cdecl memcmp(const void *ptr1, const void *ptr2,

size_t n) __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t") \

     "popq " SRC_REG "\n\t" \

     __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")

+

 #endif


 void * __cdecl sse2_memmove(void *dst, const void *src, size_t n);

@@ -2732,6 +2733,64 @@ __ASM_GLOBAL_FUNC( sse2_memmove,

         MEMMOVE_CLEANUP

         "ret" )


+#undef DEST_REG

+#undef SRC_REG

+#undef LEN_REG

+#undef TMP_REG

+

+#ifdef __i386__

+

+#define DEST_REG "%edi"

+#define SRC_REG "%eax"

+#define LEN_REG "%ecx"

+#define TMP_REG

+

+#define MEMSET_INIT \

+    "pushl " DEST_REG "\n\t" \

+    __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") \

+    "movl 8(%esp), " DEST_REG "\n\t" \

+    "movl 12(%esp), " SRC_REG "\n\t" \

+    "movl 16(%esp), " LEN_REG "\n\t"

+

+#define MEMSET_CLEANUP \

+    "movl 8(%esp), %eax\n\t" \

+    "popl " DEST_REG "\n\t" \

+    __ASM_CFI(".cfi_adjust_cfa_offset -4\n\t")

+

+#else

+

+#define DEST_REG "%rdi"

+#define SRC_REG "%rax"

+#define LEN_REG "%rcx"

+#define TMP_REG "%r9"

+

+#define MEMSET_INIT \

+    "pushq " DEST_REG "\n\t" \

+    __ASM_CFI(".cfi_adjust_cfa_offset 8\n\t") \

+    "movq %rcx, " DEST_REG "\n\t" \

+    "movq %rdx, " SRC_REG "\n\t" \

+    "movq %r8, " LEN_REG "\n\t" \

+    "movq " DEST_REG ", " TMP_REG "\n\t"

+

+#define MEMSET_CLEANUP \

+    "movq " TMP_REG ", %rax\n\t" \

+    "popq " DEST_REG "\n\t" \

+    __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")

+

+#endif

+

+void * __cdecl ermsb_memset(void *dst, int c, size_t n);

+__ASM_GLOBAL_FUNC( ermsb_memset,

+        MEMSET_INIT

+        "rep stosb\n\t"

+        MEMSET_CLEANUP

+        "ret" )

+

+#undef DEST_REG

+#undef SRC_REG

+#undef LEN_REG

+#undef TMP_REG

+

 #endif


 /*********************************************************************

@@ -2860,9 +2919,13 @@ void * __cdecl memcpy(void *dst, const void *src,

size_t n) */

 void* __cdecl memset(void *dst, int c, size_t n)

 {

+#if defined(__i386__) || defined(__x86_64__)

+    return ermsb_memset(dst, c, n);

+#else

     volatile unsigned char *d = dst;  /* avoid gcc optimizations */

     while (n--) *d++ = c;

     return dst;

+#endif

 }


 /*********************************************************************