summaryrefslogtreecommitdiff
blob: 32d80805f5f7b88367a95f5c55692ef97da95b2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
diff -ur mhash-0.9.9.orig/lib/stdfns.c mhash-0.9.9/lib/stdfns.c
--- mhash-0.9.9.orig/lib/stdfns.c	Wed Apr  4 21:18:42 2007
+++ mhash-0.9.9/lib/stdfns.c	Mon May 28 16:08:38 2007
@@ -152,12 +152,23 @@
 	}
 }
 
+static void
+mutils_memset8(void *s, __const mutils_word8 c, __const mutils_word32 n)
+{
+	mutils_word8 *stmp = s;
+	mutils_word32 i;
+
+	for (i = 0; i < n; i++, stmp++)
+	{
+		*stmp = c;
+	}
+}
+
 WIN32DLL_DEFINE
 void
 mutils_memset(void *s, __const mutils_word8 c, __const mutils_word32 n)
 {
-	mutils_word8 *stmp;
-	mutils_word32 *ltmp = (mutils_word32 *) s;
+	mutils_word32 *ltmp;
 	mutils_word32 lump;
 	mutils_word32 i;
 	mutils_word32 words;
@@ -168,10 +179,22 @@
 		return;
 	}
 
+	if (n < 16)
+	{
+		return mutils_memset8(s, c, n);
+	}
+
+	/* unaligned portion at beginning */
+	remainder = (-(mutils_word32)s) & 0x3;
+	mutils_memset8(s, c, remainder);
+
+	/* aligned words in the middle */
+	ltmp = (mutils_word32 *) (s + remainder);
+
 	lump = (c << 24) + (c << 16) + (c << 8) + c;
 
-	words = n >> 2;
-	remainder = n - (words << 2);
+	words = (n - remainder) >> 2;
+	remainder = n - remainder - (words << 2);
 
 	for (i = 0; i < words; i++, ltmp++)
 	{
@@ -178,12 +201,8 @@
 		*ltmp = lump;
 	}
 
-	stmp = (mutils_word8 *) ltmp;
-
-	for (i = 0; i < remainder; i++, stmp++)
-	{
-		*stmp = c;
-	}
+	/* unaligned portion at end */
+	return mutils_memset8(ltmp, c, remainder);
 }
 
 static void
@@ -275,6 +294,9 @@
 	mutils_word32 *buffer;
 	mutils_word32 *ptrIn;
 	mutils_word32 *ptrOut;
+	mutils_word8 *ptr8In;
+	mutils_word8 *ptr8Out;
+	mutils_word8 tmp8;
 	mutils_word32 count = n * 4;
 
 	if (destructive == MUTILS_FALSE)
@@ -295,10 +317,36 @@
  * data on a little-endian machine.
  */
 
-	for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++)
+	if ((mutils_word32)x & 0x3)
 	{
-		*ptrOut = mutils_lend32(*ptrIn);
+	  ptr8In = (mutils_word8 *) x;
+	  ptr8Out = (mutils_word8 *) buffer;
+	  for (loop = 0; loop < n; loop++)
+	    {
+#ifdef WORDS_BIGENDIAN
+	      tmp8 = ptr8In[0];
+	      ptr8Out[0] = ptr8In[3];
+	      ptr8Out[3] = tmp8;
+	      tmp8 = ptr8In[1];
+	      ptr8Out[1] = ptr8In[2];
+	      ptr8Out[2] = tmp8;
+#else
+	      ptr8Out[0] = ptr8In[0];
+	      ptr8Out[1] = ptr8In[1];
+	      ptr8Out[2] = ptr8In[2];
+	      ptr8Out[3] = ptr8In[3];
+#endif
+	      ptr8Out += 4;
+	      ptr8In += 4;
+	    }
 	}
+	else
+	{
+		for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++)
+		{
+			*ptrOut = mutils_lend32(*ptrIn);
+		}
+	}
 
 	return(buffer);
 }