Added wine_memcpy_unaligned function to avoid gcc memcpy
optimizations.

diff --git a/include/wine/port.h b/include/wine/port.h
index 8baa5bf..a23ea53 100644
--- a/include/wine/port.h
+++ b/include/wine/port.h
@@ -190,7 +190,7 @@
 #endif /* HAVE_MKSTEMP */
 
 #ifndef HAVE_MEMMOVE
-void *memmove(void *dest, const void *src, unsigned int len);
+void *memmove(void *dest, const void *src, size_t len);
 #endif /* !defined(HAVE_MEMMOVE) */
 
 #ifndef HAVE_PREAD
@@ -229,6 +229,12 @@
 int usleep (unsigned int useconds);
 #endif /* !defined(HAVE_USLEEP) */
 
+#ifdef __i386__
+#define wine_memcpy_unaligned memcpy
+#else
+extern void *wine_memcpy_unaligned( void *dst, const void *src, size_t size );
+#endif /* __i386__ */
+
 /* Interlocked functions */
 
 #if defined(__i386__) && defined(__GNUC__)
diff --git a/library/port.c b/library/port.c
index 0f21e83..25fd4b7 100644
--- a/library/port.c
+++ b/library/port.c
@@ -94,7 +94,7 @@
  *		memmove
  */
 #ifndef HAVE_MEMMOVE
-void *memmove( void *dest, const void *src, unsigned int len )
+void *memmove( void *dest, const void *src, size_t len )
 {
     register char *dst = dest;
 
@@ -666,6 +666,19 @@
 #endif /* HAVE_ECVT */
 
 
+#ifndef wine_memcpy_unaligned
+/***********************************************************************
+ *		wine_memcpy_unaligned
+ *
+ * This is necessary to defeat optimizations of memcpy by gcc.
+ */
+void *wine_memcpy_unaligned( void *dst, const void *src, size_t size )
+{
+    return memcpy( dst, src, size );
+}
+#endif
+
+
 /***********************************************************************
  *		interlocked functions
  */
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 1a48c77..dd236bd 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -277,7 +277,7 @@
 
     while(pTypeInfo->type_id)
     {
-        memcpy( &pTypeInfo->resloader, &DefResourceHandlerProc, sizeof(FARPROC16) );
+        wine_memcpy_unaligned( &pTypeInfo->resloader, &DefResourceHandlerProc, sizeof(FARPROC16) );
 	pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
     }
     return TRUE;
@@ -303,8 +303,8 @@
     {
         if (!(pTypeInfo = NE_FindTypeSection( pResTab, pTypeInfo, typeId )))
             break;
-        memcpy( &prevHandler, &pTypeInfo->resloader, sizeof(FARPROC16) );
-        memcpy( &pTypeInfo->resloader, &resourceHandler, sizeof(FARPROC16) );
+        wine_memcpy_unaligned( &prevHandler, &pTypeInfo->resloader, sizeof(FARPROC16) );
+        wine_memcpy_unaligned( &pTypeInfo->resloader, &resourceHandler, sizeof(FARPROC16) );
         pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
     }
     return prevHandler;
@@ -507,7 +507,7 @@
 	else
 	{
             FARPROC16 resloader;
-            memcpy( &resloader, &pTypeInfo->resloader, sizeof(FARPROC16) );
+            wine_memcpy_unaligned( &resloader, &pTypeInfo->resloader, sizeof(FARPROC16) );
 	    if ( resloader && resloader != DefResourceHandlerProc )
                 pNameInfo->handle = NE_CallTo16_word_www(
                     resloader, pNameInfo->handle, pModule->self, hRsrc );