Changeset: b1e2c0cdde88 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b1e2c0cdde88
Modified Files:
        common/utils/copybinary.h
Branch: copybinary
Log Message:

Finish byte swapping COPY BINARY input


diffs (68 lines):

diff --git a/common/utils/copybinary.h b/common/utils/copybinary.h
--- a/common/utils/copybinary.h
+++ b/common/utils/copybinary.h
@@ -23,27 +23,43 @@ typedef struct {
 } copy_binary_timestamp; // natural size: 96, natural alignment: 32
 
 
-// These code sequences are recognized by gcc and clang
-#define COPY_BINARY_BYTESWAP16(u) ( \
-                 ((uint8_t)(u) << 8) \
-               | ((uint8_t)(u>>8)) \
-       )
-#define COPY_BINARY_BYTESWAP32(u) ( \
-                 ((uint8_t)(u) << 24) \
-               | ((uint8_t)(u>>8) << 16) \
-               | ((uint8_t)(u>>16) << 8) \
-               | ((uint8_t)(u>>24)) \
-       )
-#define COPY_BINARY_BYTESWAP64(u) ( \
-                 ((uint8_t)(u>>0) << 56) \
-               | ((uint8_t)(u>>8) << 48) \
-               | ((uint8_t)(u>>16) << 40) \
-               | ((uint8_t)(u>>24) << 32) \
-               | ((uint8_t)(u>>32) << 24) \
-               | ((uint8_t)(u>>40) << 16) \
-               | ((uint8_t)(u>>48) << 8) \
-               | ((uint8_t)(u>>56)) \
-       )
+// According to Godbolt, these code sequences are recognized by
+// GCC at least back to 6.2 and Clang at least back to 6.0.0.
+// I didn't check earlier ones.
+// They properly use byte swapping instructions.
+// MSVC doesn't recognize it but that's no problem because we will
+// not ever use it for big endian platforms.
+
+
+#define COPY_BINARY_BYTESWAP16(value) ( \
+      (((*(uint16_t*)&value) & 0xFF00u) >>  8u) | \
+      (((*(uint16_t*)&value) & 0x00FFu) <<  8u) \
+    )
+
+
+#define COPY_BINARY_BYTESWAP32(value) ( \
+      (((*(uint32_t*)&value) & 0xFF000000u) >> 24u) | \
+      (((*(uint32_t*)&value) & 0x00FF0000u) >>  8u) | \
+      (((*(uint32_t*)&value) & 0x0000FF00u) <<  8u) | \
+      (((*(uint32_t*)&value) & 0x000000FFu) << 24u) \
+    )
+
+
+#define COPY_BINARY_BYTESWAP64(value) ( \
+      (((*(uint64_t*)&value) & 0xFF00000000000000u) >> 56u) | \
+      (((*(uint64_t*)&value) & 0x00FF000000000000u) >> 40u) | \
+      (((*(uint64_t*)&value) & 0x0000FF0000000000u) >> 24u) | \
+      (((*(uint64_t*)&value) & 0x000000FF00000000u) >>  8u) | \
+      (((*(uint64_t*)&value) & 0x00000000FF000000u) <<  8u) | \
+      (((*(uint64_t*)&value) & 0x0000000000FF0000u) << 24u) | \
+      (((*(uint64_t*)&value) & 0x000000000000FF00u) << 40u) | \
+      (((*(uint64_t*)&value) & 0x00000000000000FFu) << 56u) \
+    )
+
+#define COPY_BINARY_BYTESWAP128(value) ( \
+    ( (uint128_t)COPY_BINARY_BYTESWAP64(   ((uint64_t*)&value)[0]   )  << 64 ) 
\
+    | ( (uint128_t)COPY_BINARY_BYTESWAP64(   ((uint64_t*)&value)[1]   )   ) \
+)
 
 
 #ifdef WORDS_BIGENDIAN
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to