Messages in this thread | | | From | Rasmus Villemoes <> | Subject | Re: [PATCH v1] lib/sort: Add 64 bit swap function | Date | Fri, 15 May 2015 09:22:12 +0200 |
| |
On Wed, May 13 2015, Daniel Wagner <daniel.wagner@bmw-carit.de> wrote:
> > - if (!swap_func) > - swap_func = (size == 4 ? u32_swap : generic_swap); > + if (!swap_func) { > +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) > + switch (size) { > + case 4: > + swap_func = u32_swap; > + break; > + case 8: > + swap_func = u64_swap; > + break; > + } > +#else > + switch (size) { > + case 4: > + if (((unsigned long)base & 3) == 0) > + swap_func = u32_swap; > + break; > + case 8: > + if (((unsigned long)base & 7) == 0) > + swap_func = u64_swap; > + break; > + } > +#endif /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */ > + > + if (!swap_func) > + swap_func = generic_swap; > + }
I was more thinking of something like
static int alignment_ok(const void *base, int align) { return IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) || ((unsigned long)base & (align - 1)) == 0; }
...
if (!swap_func) { if (size == 4 && alignment_ok(base, 4)) swap_func = u32_swap; else if (size == 8 && alignment_ok(base, 8)) swap_func = u64_swap; else swap_func = generic_swap; }
It seems to generate the same code (I usually worry about how gcc messes up switches), so this is just a readability thing.
Rasmus
| |