]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
utils: Use words with a defined length in memxor()
authorMartin Willi <martin@revosec.ch>
Thu, 19 Mar 2015 15:55:06 +0000 (16:55 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 15 Apr 2015 09:41:56 +0000 (11:41 +0200)
sizeof(long) == sizeof(int) results in a duplicate switch statement. We use
a 64-bit integer even if sizeof(long) (and probably the maximum native word
size) is 32-bit, and assume the 64-bit emulation is as fast as two 32-bit XORs.

src/libstrongswan/utils/utils.h

index e1dedc356ecf91451665a3bd870dee119ffc729d..9b57315f1cdcdee17f3fd0dd57c01d452f87049b 100644 (file)
@@ -572,29 +572,29 @@ static inline void memxor_inline(u_int8_t dst[], u_int8_t src[], size_t n)
        switch (((uintptr_t)&src[i] % sizeof(MAX_INT_TYPE)))
        {
 #ifdef HAVE_INT128
-               case 0:
+               case sizeof(int128_t) % sizeof(MAX_INT_TYPE):
                        for (m = n - sizeof(int128_t); i <= m; i += sizeof(int128_t))
                        {
                                *(int128_t*)&dst[i] ^= *(int128_t*)&src[i];
                        }
                        break;
 #endif
-               case sizeof(MAX_INT_TYPE) - sizeof(long):
-                       for (m = n - sizeof(long); i <= m; i += sizeof(long))
+               case sizeof(int64_t) % sizeof(MAX_INT_TYPE):
+                       for (m = n - sizeof(int64_t); i <= m; i += sizeof(int64_t))
                        {
-                               *(long*)&dst[i] ^= *(long*)&src[i];
+                               *(int64_t*)&dst[i] ^= *(int64_t*)&src[i];
                        }
                        break;
-               case sizeof(int):
-                       for (m = n - sizeof(int); i <= m; i += sizeof(int))
+               case sizeof(int32_t) % sizeof(MAX_INT_TYPE):
+                       for (m = n - sizeof(int32_t); i <= m; i += sizeof(int32_t))
                        {
-                               *(int*)&dst[i] ^= *(int*)&src[i];
+                               *(int32_t*)&dst[i] ^= *(int32_t*)&src[i];
                        }
                        break;
-               case sizeof(short):
-                       for (m = n - sizeof(short); i <= m; i += sizeof(short))
+               case sizeof(int16_t) % sizeof(MAX_INT_TYPE):
+                       for (m = n - sizeof(int16_t); i <= m; i += sizeof(int16_t))
                        {
-                               *(short*)&dst[i] ^= *(short*)&src[i];
+                               *(int16_t*)&dst[i] ^= *(int16_t*)&src[i];
                        }
                        break;
                default: