$OpenBSD: patch-src_utils_small_compare_hh,v 1.1 2021/01/15 20:21:51 jasper Exp $

https://github.com/openMSX/openMSX/commit/316828d56ca23529512164ee7892e3346f79b594

Index: src/utils/small_compare.hh
--- src/utils/small_compare.hh.orig
+++ src/utils/small_compare.hh
@@ -70,18 +70,18 @@ template<typename T, T v, T m, T s> struct ScValLeImpl
 	static const T mask  = m;
 };
 template<typename T, T v, T m, T s, char N0, char ...Ns> struct ScValLeImpl<T, v, m, s, N0, Ns...>
-	: ScValLeImpl<T, v + (T(N0 & 255) << s), (m << 8) + 255, s + 8, Ns...> {};
+	: ScValLeImpl<T, v + (T(N0 & 255) << s), m + (T(255) << s), T(s + 8), Ns...> {};
 template<typename T, char ...Ns> struct ScValLe : ScValLeImpl<T, 0, 0, 0, Ns...> {};
 
 // ScVal-big-endian
-template<typename T, T v, T m, char ...Ns> struct ScValBeImpl;
-template<typename T, T v, T m> struct ScValBeImpl<T, v, m> {
+template<typename T, T v, T m, T s, char ...Ns> struct ScValBeImpl;
+template<typename T, T v, T m, T s> struct ScValBeImpl<T, v, m, s> {
 	static const T value = v;
-	static const T mask  = ~m;
+	static const T mask  = m;
 };
-template<typename T, T v, T m, char N0, char ...Ns> struct ScValBeImpl<T, v, m, N0, Ns...>
-	: ScValBeImpl<T, (v << 8) + T(N0 & 255), (m >> 8), Ns...> {};
-template<typename T, char ...Ns> struct ScValBe : ScValBeImpl<T, 0, -1, Ns...> {};
+template<typename T, T v, T m, T s, char N0, char ...Ns> struct ScValBeImpl<T, v, m, s, N0, Ns...>
+	: ScValBeImpl<T, v + (T(N0 & 255) << s), m + (T(255) << s), T(s - 8), Ns...> {};
+template<typename T, char ...Ns> struct ScValBe : ScValBeImpl<T, 0, 0, 8 * (sizeof(T) - 1), Ns...> {};
 
 // ScVal: combines all given characters in one value of type T, also computes a
 // mask-value with 1-bits in the 'used' positions.
