[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