Skip to content

Commit 13c2acd

Browse files
sebastianasgitster
authored andcommitted
bswap.h: remove optimized x86 version of bswap32/64
On x86 the bswap32/64 macro is implemenated based on the x86 opcode wich performs the required shifting in just one opcode. The other CPUs fallback to the generic shifting as implemented by default_swab32() and default_bswap64() if needed. I've been looking at how good a compiler is at recognizing the default shift and emitting an optimized operation: - x86, arm64 msvc v19.20 default_swab32() optimized default_bswap64() shifts _byteswap_uint64() otimized - x86, arm64 msvc v19.37 default_swab32() optimized default_bswap64() optimized _byteswap_uint64() otimized - arm64, gcc-4.9.4: optimized - x86-64, gcc-4.4.7: shifts - x86-64, gcc-4.5.3: optimized - x86-64, clang-3.0: optimized Given that gcc-4.5 and clang-3.0 are fairly old, any recent compiler should recognize the shift. Remove the optimized x86 version and rely on the compiler. Signed-off-by: Sebastian Andrzej Siewior <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7457a13 commit 13c2acd

File tree

1 file changed

+1
-40
lines changed

1 file changed

+1
-40
lines changed

compat/bswap.h

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -35,46 +35,7 @@ static inline uint64_t default_bswap64(uint64_t val)
3535
#undef bswap32
3636
#undef bswap64
3737

38-
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
39-
40-
#define bswap32 git_bswap32
41-
static inline uint32_t git_bswap32(uint32_t x)
42-
{
43-
uint32_t result;
44-
if (__builtin_constant_p(x))
45-
result = default_swab32(x);
46-
else
47-
__asm__("bswap %0" : "=r" (result) : "0" (x));
48-
return result;
49-
}
50-
51-
#define bswap64 git_bswap64
52-
#if defined(__x86_64__)
53-
static inline uint64_t git_bswap64(uint64_t x)
54-
{
55-
uint64_t result;
56-
if (__builtin_constant_p(x))
57-
result = default_bswap64(x);
58-
else
59-
__asm__("bswap %q0" : "=r" (result) : "0" (x));
60-
return result;
61-
}
62-
#else
63-
static inline uint64_t git_bswap64(uint64_t x)
64-
{
65-
union { uint64_t i64; uint32_t i32[2]; } tmp, result;
66-
if (__builtin_constant_p(x))
67-
result.i64 = default_bswap64(x);
68-
else {
69-
tmp.i64 = x;
70-
result.i32[0] = git_bswap32(tmp.i32[1]);
71-
result.i32[1] = git_bswap32(tmp.i32[0]);
72-
}
73-
return result.i64;
74-
}
75-
#endif
76-
77-
#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64))
38+
#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64))
7839

7940
#include <stdlib.h>
8041

0 commit comments

Comments
 (0)