[Scummvm-git-logs] scummvm master -> f873a0ac02354dd2b1c49e513eb45b877bed9188

lephilousophe noreply at scummvm.org
Sun Mar 22 15:27:47 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
f873a0ac02 COMMON: Update memset16/32/64 functions


Commit: f873a0ac02354dd2b1c49e513eb45b877bed9188
    https://github.com/scummvm/scummvm/commit/f873a0ac02354dd2b1c49e513eb45b877bed9188
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2026-03-22T16:27:18+01:00

Commit Message:
COMMON: Update memset16/32/64 functions

The functions don't respect strict aliasing so this creates bugs in LTO
builds.
Use an alternative implementation which should be equivalent in terms of
performance.

Changed paths:
    common/memory.cpp


diff --git a/common/memory.cpp b/common/memory.cpp
index 09397ee7b24..7de116dba4e 100644
--- a/common/memory.cpp
+++ b/common/memory.cpp
@@ -24,50 +24,57 @@
 
 namespace Common {
 
-void memset64(uint64 *dst, uint64 val, size_t count) {
-	if (!count)
-		return;
-
-	int n = (count + 7) >> 3;
-	switch (count % 8) {
-	default:
-	case 0:	do {
-	       		*dst++ = val; // fall through
-	case 7:		*dst++ = val; // fall through
-	case 6:		*dst++ = val; // fall through
-	case 5:		*dst++ = val; // fall through
-	case 4:		*dst++ = val; // fall through
-	case 3:		*dst++ = val; // fall through
-	case 2:		*dst++ = val; // fall through
-	case 1:		*dst++ = val;
-	       	} while (--n > 0);
+template<typename T>
+static inline void memsetXX(T *dst, T val, size_t count) {
+	while(count >= 8) {
+		dst[0] = val;
+		dst[1] = val;
+		dst[2] = val;
+		dst[3] = val;
+		dst[4] = val;
+		dst[5] = val;
+		dst[6] = val;
+		dst[7] = val;
+		dst += 8;
+		count -= 8;
 	}
-}
-
-void memset32(uint32 *dst, uint32 val, size_t count) {
-	if (!IS_ALIGNED(dst, 8) && count) {
-		*dst++ = val;
-		count -= 1;
+	switch(count) {
+	case 7:
+		*(dst++) = val;
+		/* fall through */
+	case 6:
+		*(dst++) = val;
+		/* fall through */
+	case 5:
+		*(dst++) = val;
+		/* fall through */
+	case 4:
+		*(dst++) = val;
+		/* fall through */
+	case 3:
+		*(dst++) = val;
+		/* fall through */
+	case 2:
+		*(dst++) = val;
+		/* fall through */
+	case 1:
+		*(dst++) = val;
+		/* fall through */
+	case 0:
+		break;
 	}
+}
 
-	memset64((uint64 *)dst, val | ((uint64)val << 32), count >> 1);
+void memset64(uint64 *dst, uint64 val, size_t count) {
+	memsetXX<uint64>(dst, val, count);
+}
 
-	if (count & 1) {
-		dst[count & ~1] = val;
-	}
+void memset32(uint32 *dst, uint32 val, size_t count) {
+	memsetXX<uint32>(dst, val, count);
 }
 
 void memset16(uint16 *dst, uint16 val, size_t count) {
-	if (!IS_ALIGNED(dst, 4) && count) {
-		*dst++ = val;
-		count -= 1;
-	}
-
-	memset32((uint32 *)dst, val | ((uint32)val << 16), count >> 1);
-
-	if (count & 1) {
-		dst[count & ~1] = val;
-	}
+	memsetXX<uint16>(dst, val, count);
 }
 
 } // End of namespace Common




More information about the Scummvm-git-logs mailing list