From f5206ea8daa394ac566d1fdbfa8e068a98af032c Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 18 Apr 2025 03:01:09 +0100 Subject: [PATCH] Shellsort. --- sqlite3/libc/build.sh | 4 +- sqlite3/libc/libc.wasm | Bin 2199 -> 2767 bytes sqlite3/libc/libc.wat | 458 ++++++++++++++++++++++++++++++++++++++++- sqlite3/libc/stdlib.h | 50 +++++ 4 files changed, 509 insertions(+), 3 deletions(-) create mode 100644 sqlite3/libc/stdlib.h diff --git a/sqlite3/libc/build.sh b/sqlite3/libc/build.sh index 855a393..cff8387 100755 --- a/sqlite3/libc/build.sh +++ b/sqlite3/libc/build.sh @@ -11,6 +11,7 @@ SRCS="${1:-libc.c}" trap 'rm -f libc.c libc.tmp' EXIT echo '#include ' > libc.c +echo '#include ' >> libc.c "$WASI_SDK/clang" --target=wasm32-wasi -std=c23 -g0 -O2 \ -o libc.wasm -I. "$SRCS" \ @@ -32,7 +33,8 @@ echo '#include ' > libc.c -Wl,--export=strcspn \ -Wl,--export=strlen \ -Wl,--export=strncmp \ - -Wl,--export=strspn + -Wl,--export=strspn \ + -Wl,--export=qsort "$BINARYEN/wasm-ctor-eval" -g -c _initialize libc.wasm -o libc.tmp "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ diff --git a/sqlite3/libc/libc.wasm b/sqlite3/libc/libc.wasm index 995c28efdf41a68a282b7cfd0a1b088f7c183730..4358642cd04b0811aab12e95c397af6fdd6fee9a 100755 GIT binary patch delta 687 zcmY*X%Wl*#6uq{ulSv#mnQ7U;=GuE$v0_6!RV$64;tP;kP#0vT&`=~$c{oe9RTuCF zY+wOD!dLJamAKA~K$C^fJTQnnv0KfGko)cvOC@e(XmNKaO7qr$*z3q zjB0ryL*>$IGLI~%*s`tmRp*hA%8uvN6d=H3Dtnu^Y8)-&W( zxQxT#4FI@3o*Zo^iQX6hn$X^e7@E!@WuaO6%z~ksv&%@up_P>|glr{UW>_JXJgD9y zwp@JZ#|84c?7vGnX)YeHv8LS-c%vL9PmmLGvq!c!LGeLyu(1!f`Y`pS29GhhPB^n3 z>BbsqvX)4e{8wyP`t?ttwiFw-rNER+2L{c%!S(J9pJuv+hg2P_Yh tlQe5gAs`F`8X@2vzC1ZQg|b+^c=r6>+w>$)tLtC+)7-2d)^$Dk{1<;CWDfuU delta 114 zcmX>vI$h9&A+b1@k%57MQJ6V_xxT)hu|9zbOfmwQ%skvcDF!A+21X!YWnpA!U}7)g zndn@|&cn#a^^BK$ +#include + +#include_next // the system stdlib.h + +#ifdef __cplusplus +extern "C" { +#endif + +// Shellsort with Gonnet & Baeza-Yates gap sequence. +// Simple, no recursion, doesn't use the C stack. +// Clang auto-vectorizes the inner loop. + +void qsort(void *base, size_t nel, size_t width, + int (*comp)(const void *, const void *)) { + if (width == 0) return; + + size_t wnel = width * nel; + size_t gap = nel; + while (gap > 1) { + gap = (5ull * gap - 1) / 11; + if (gap == 0) gap = 1; + + size_t wgap = width * gap; + __builtin_assume(wgap < wnel); + for (size_t i = wgap; i < wnel; i += width) { + for (size_t j = i; !__builtin_sub_overflow(j, wgap, &j);) { + char *a = j + (char *)base; + char *b = a + wgap; + if (comp(a, b) <= 0) break; + + size_t s = width; + do { + char tmp = *a; + *a++ = *b; + *b++ = tmp; + } while (--s); + } + } + } +} + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // _WASM_SIMD128_STDLIB_H \ No newline at end of file