git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 5/5] bswap.h: Provide a built-in based version of bswap32/64 if possible

From
Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Date
Jul 15, 2025, 19:12 UTC
Message-ID
<20250715191230.12081-6-sebastian@breakpoint.cc>
In-Reply-To
<20250715191230.12081-1-sebastian@breakpoint.cc>

The compiler is in general able to recognize the endian shift and replace it with an optimized opcode if possible. On certain architectures such as RiscV or MIPS the situation can get complicated. They don't provide an optimized opcode and masking the "higher" bits may required loading a constant which needs shifting. This causes the compiler to emit a lot of instructions for the operation.

The provided builtin directive on these architecture calls a function which does the operation instead of emitting the code for operation.

Bring back the change from commit 6547d1c9 (bswap.h: add support for built-in bswap functions, 2025-04-23). The bswap32/64 macro can now be defined unconditionally so it won't regress on big endian architectures.

Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
 compat/bswap.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)
diff --git a/compat/bswap.h b/compat/bswap.h
index ed00f6d1d53f3..28635ebc690e3 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -32,6 +32,14 @@ static inline uint64_t default_bswap64(uint64_t val)
 		((val & (uint64_t)0xff00000000000000ULL) >> 56));
 }
 
+/*
+ * __has_builtin is available since Clang 10 and GCC 10.
+ * Below is a fallback for older compilers.
+ */
+#ifndef __has_builtin
+# define __has_builtin(x) 0
+#endif
+
 #undef bswap32
 #undef bswap64
 
@@ -46,6 +54,11 @@ static inline uint64_t default_bswap64(uint64_t val)
 #define GIT_BIG_ENDIAN 4321
 #define GIT_BYTE_ORDER GIT_LITTLE_ENDIAN
 
+#elif __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64)
+
+#define bswap32(x) __builtin_bswap32((x))
+#define bswap64(x) __builtin_bswap64((x))
+
 #endif
 
 #if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
-- 
2.50.0
Previous: Sebastian Andrzej SiewiorNext: Sebastian Andrzej Siewior
Message 4 of 9 in “bswap.h: Rework ntohl handling”
  1. 0/5 bswap.h: Rework ntohl handlingSebastian Andrzej Siewior, Jul 15, 2025
  2. 1/5 bswap.h: Add support for __BYTE_ORDER__Sebastian Andrzej Siewior, Jul 15, 2025
  3. 4/5 bswap.h: Remove optimized x86 version of bswap32/64Sebastian Andrzej Siewior, Jul 15, 2025
  4. 5/5 bswap.h: Provide a built-in based version of bswap32/64 if possibleSebastian Andrzej Siewior, Jul 15, 2025
  5. 2/5 bswap.h: Define GIT_LITTLE_ENDIAN on msvc as little endianSebastian Andrzej Siewior, Jul 15, 2025
  6. 3/5 bswap.h: Always overwrite ntohl/ ntohll macrosSebastian Andrzej Siewior, Jul 15, 2025
  7. Junio C HamanoJul 15, 2025
  8. brian m. carlsonJul 15, 2025
  9. Sebastian Andrzej SiewiorJul 16, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.