diff options
author | Bobby Bingham <koorogi@koorogi.info> | 2014-07-31 21:08:39 -0500 |
---|---|---|
committer | Bobby Bingham <koorogi@koorogi.info> | 2014-07-31 21:08:39 -0500 |
commit | a3d41b3ca19c8dfc306ac16f0b659961f1bd6255 (patch) | |
tree | 232424ac032133e0a0f8dac68f82b66342532c39 /common.h | |
parent | ab27fe8c3edda02a2bd6088b07aa8c13a561a24d (diff) |
Optimize swap for larger swaps
Diffstat (limited to 'common.h')
-rw-r--r-- | common.h | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -7,6 +7,20 @@ size_t binary_search(const char *needle, char *haystack, size_t nmel, size_t wid static void swap(char *a, char *b, size_t width) { +#ifdef __GNUC__ + typedef uint32_t __attribute__((__may_alias__)) u32; + + if ((uintptr_t)a % 4 == 0 && (uintptr_t)b % 4 == 0) { + for (; width >= 4; width -= 4) { + uint32_t tmp = *((u32*)a); + *((u32*)a) = *((u32*)b); + *((u32*)b) = tmp; + a += 4; + b += 4; + } + } +#endif + while (width--) { char tmp = *a; *a++ = *b; |