This incidentally fixes the fact that wrapping of the s_1 functions was not done for aarch64 without ifunc.
For aarch64, this removes the hand-written resolver functions & dispatch functions and replaces them with invocations of a macro called MULTI_FUN:
MULTI_FUN(uint64_t, bt_pext_u64, (uint64_t a, uint64_t b), (a, b))
MULTI_FUN(uint32_t, bt_pext_u32, (uint32_t a, uint32_t b), (a, b))
// etc
The macro itself is defined in different ways according to whether _BT_IFUNC_ATTR is defined, but basically it expands to a function which checks for each possible implementation in turn, taking the one indicated by bt_best_impl.
Although it is not tested, this should work correctly if fewer than all variants are compile-time enabled.
x86_64 could be handled similarly, if desired.
Diff is better viewed locally with git show --patience 04fd924da8
With any luck this should not conflict with #10, which problem I discovered while working on this.