From ff6361e36394870e90bb4a12c9f4baccd8fcd820 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 21 Mar 2023 11:01:09 -0400 Subject: [PATCH] Move tranpose to its own file --- build/src/build.bqn | 4 +- makefile | 2 +- src/builtins/sfns.c | 157 ------------------------------------- src/builtins/transpose.c | 165 +++++++++++++++++++++++++++++++++++++++ src/load.c | 2 +- src/opt/single.c | 1 + 6 files changed, 170 insertions(+), 161 deletions(-) create mode 100644 src/builtins/transpose.c diff --git a/build/src/build.bqn b/build/src/build.bqn index aa554f4c..ce035fe7 100755 --- a/build/src/build.bqn +++ b/build/src/build.bqn @@ -549,7 +549,7 @@ MakeLinkerInv ← { 𝕊 GetArgs‿cache‿name‿srcs: cachedBin‿linkerCache ← { Shorten ← {po.clangd? 𝕩; r ← {𝕩↓˜¯1-⊑'.'⊐˜⌽𝕩}¨ •file.Name¨ 𝕩 ⋄ ! ∧´ ∊r ⋄ r} cbqnSrc ← ∾{⌽(⊑𝕩)⊸•file.At¨ 1↓𝕩}¨ ⌽⟨ - ⟨"src/builtins/", "arithd.c", "arithm.c", "cmp.c", "sfns.c", "squeeze.c", "select.c", "slash.c", "group.c", "sort.c", "search.c", "selfsearch.c", "fold.c", "scan.c", "md1.c", "md2.c", "fns.c", "sysfn.c", "internal.c", "inverse.c"⟩ + ⟨"src/builtins/", "arithd.c", "arithm.c", "cmp.c", "sfns.c", "squeeze.c", "select.c", "slash.c", "group.c", "sort.c", "search.c", "selfsearch.c", "transpose.c", "fold.c", "scan.c", "md1.c", "md2.c", "fns.c", "sysfn.c", "internal.c", "inverse.c"⟩ ⟨"src/core/", "tyarr.c", "harr.c", "fillarr.c", "stuff.c", "derv.c", "mm.c", "heap.c"⟩ ⟨"src/", "load.c", "main.c", "rtwrap.c", "vm.c", "ns.c", "nfns.c", "ffi.c"⟩ ⟨"src/jit/", "nvm.c"⟩ @@ -562,7 +562,7 @@ cachedBin‿linkerCache ← { "xa"‿"src/builtins/arithd.c"‿"dyarith", "xa"‿"src/builtins/cmp.c"‿"cmp", "xa"‿"src/builtins/squeeze.c"‿"squeeze" "x."‿"src/builtins/select.c"‿"select", "x."‿"src/builtins/fold.c"‿"fold", "x."‿"src/builtins/scan.c"‿"scan" "x."‿"src/builtins/scan.c"‿"neq", "x."‿"src/builtins/slash.c"‿"slash", "x."‿"src/builtins/slash.c"‿"constrep" - "x."‿"src/builtins/sfns.c"‿"transpose" + "x."‿"src/builtins/transpose.c"‿"transpose" ⟩ objs ← ⟨⟩ diff --git a/makefile b/makefile index c57a422f..dd07b8c9 100644 --- a/makefile +++ b/makefile @@ -283,7 +283,7 @@ ${bd}/%.o: src/jit/%.c @echo $< | cut -c 5- @$(CC_INC) $@.d -o $@ -c $< -builtins: ${addprefix ${bd}/, arithm.o arithd.o cmp.o sfns.o squeeze.o select.o slash.o group.o sort.o search.o selfsearch.o fold.o scan.o md1.o md2.o fns.o sysfn.o internal.o inverse.o} +builtins: ${addprefix ${bd}/, arithm.o arithd.o cmp.o sfns.o squeeze.o select.o slash.o group.o sort.o search.o selfsearch.o tranpose.o fold.o scan.o md1.o md2.o fns.o sysfn.o internal.o inverse.o} ${bd}/%.o: src/builtins/%.c @echo $< | cut -c 5- @$(CC_INC) $@.d -o $@ -c $< diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 4c177d11..af3c092d 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -1237,160 +1237,6 @@ B reverse_c2(B t, B w, B x) { return withFill(mut_fcd(r, x), xf); } -#ifdef __BMI2__ - #include - #if USE_VALGRIND - #define _pdep_u64 vg_pdep_u64 - #endif -#endif - -#if SINGELI_X86_64 - static NOINLINE void base_transpose_i16(i16* rp, i16* xp, u64 w, u64 h, u64 xo, u64 ro) { PLAINLOOP for(usz y=0;ya, xsh+1, xr-1); - sh->a[xr-1] = h; - arr_shReplace(r, xr, sh); - return taga(r); - } - usz w = xsh[1] * shProd(xsh, 2, xr); - if (w==1) goto no_reorder; - - Arr* r; - usz xi = 0; - u8 xe = TI(x,elType); - bool toBit = false; - if (h==2) { - if (xe==el_B) { - B* xp = TO_BPTR(x); - B* x0 = xp; B* x1 = x0+w; - HArr_p rp = m_harrUp(ia); - for (usz i=0; ia; - for (usz i=0; i=8 && h>=8) { u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,4,ia,el2t(xe)); simd_transpose_i16(rp, xp, w, h); break; } - #endif - { u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,2,ia,el2t(xe)); PLAINLOOP for(usz y=0;y=8 && h>=8) { u32* xp=tyany_ptr(x); u32* rp = m_tyarrp(&r,4,ia,el2t(xe)); simd_transpose_i32(rp, xp, w, h); break; } - #endif - { u32* xp=tyany_ptr(x); u32* rp = m_tyarrp(&r,4,ia,el2t(xe)); PLAINLOOP for(usz y=0;y=4 && h>=4) { f64* xp=f64any_ptr(x); f64* rp; r=m_f64arrp(&rp,ia); simd_transpose_i64(rp, xp, w, h); break; } - #endif - { f64* xp=f64any_ptr(x); f64* rp; r=m_f64arrp(&rp,ia); PLAINLOOP for(usz y=0;yucw = pick_ucw; c(BFn,bi_select)->ucw = select_ucw; // TODO move to new init fn c(BFn,bi_shape)->uc1 = shape_uc1; - c(BFn,bi_transp)->uc1 = transp_uc1; - c(BFn,bi_transp)->im = transp_im; c(BFn,bi_take)->ucw = take_ucw; c(BFn,bi_drop)->ucw = drop_ucw; c(BFn,bi_lt)->im = enclose_im; diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c new file mode 100644 index 00000000..02a8df8c --- /dev/null +++ b/src/builtins/transpose.c @@ -0,0 +1,165 @@ +#include "../core.h" +#include "../utils/each.h" +#include "../utils/talloc.h" +#include "../builtins.h" + +#ifdef __BMI2__ + #include + #if USE_VALGRIND + #define _pdep_u64 vg_pdep_u64 + #endif +#endif + +#if SINGELI_X86_64 + static NOINLINE void base_transpose_i16(i16* rp, i16* xp, u64 w, u64 h, u64 xo, u64 ro) { PLAINLOOP for(usz y=0;ya, xsh+1, xr-1); + sh->a[xr-1] = h; + arr_shReplace(r, xr, sh); + return taga(r); + } + usz w = xsh[1] * shProd(xsh, 2, xr); + if (w==1) goto no_reorder; + + Arr* r; + usz xi = 0; + u8 xe = TI(x,elType); + bool toBit = false; + if (h==2) { + if (xe==el_B) { + B* xp = TO_BPTR(x); + B* x0 = xp; B* x1 = x0+w; + HArr_p rp = m_harrUp(ia); + for (usz i=0; ia; + for (usz i=0; i=8 && h>=8) { u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,4,ia,el2t(xe)); simd_transpose_i16(rp, xp, w, h); break; } + #endif + { u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,2,ia,el2t(xe)); PLAINLOOP for(usz y=0;y=8 && h>=8) { u32* xp=tyany_ptr(x); u32* rp = m_tyarrp(&r,4,ia,el2t(xe)); simd_transpose_i32(rp, xp, w, h); break; } + #endif + { u32* xp=tyany_ptr(x); u32* rp = m_tyarrp(&r,4,ia,el2t(xe)); PLAINLOOP for(usz y=0;y=4 && h>=4) { f64* xp=f64any_ptr(x); f64* rp; r=m_f64arrp(&rp,ia); simd_transpose_i64(rp, xp, w, h); break; } + #endif + { f64* xp=f64any_ptr(x); f64* rp; r=m_f64arrp(&rp,ia); PLAINLOOP for(usz y=0;yuc1 = transp_uc1; + c(BFn,bi_transp)->im = transp_im; +} diff --git a/src/load.c b/src/load.c index d569dc90..f6485267 100644 --- a/src/load.c +++ b/src/load.c @@ -8,7 +8,7 @@ #define PRECOMPILED_FILE1(X) PRECOMPILED_FILE0(X) #define PRECOMPILED_FILE(END) PRECOMPILED_FILE1(../build/BYTECODE_DIR/gen/END) -#define FOR_INIT(F) F(base) F(harr) F(mutF) F(cmpA) F(fillarr) F(tyarr) F(hash) F(sfns) F(fns) F(arith) F(md1) F(md2) F(derv) F(comp) F(rtWrap) F(ns) F(nfn) F(sysfn) F(inverse) F(slash) F(search) F(load) F(sysfnPost) F(dervPost) F(ryu) F(ffi) F(mmap) F(typesFinished) +#define FOR_INIT(F) F(base) F(harr) F(mutF) F(cmpA) F(fillarr) F(tyarr) F(hash) F(sfns) F(fns) F(arith) F(md1) F(md2) F(derv) F(comp) F(rtWrap) F(ns) F(nfn) F(sysfn) F(inverse) F(slash) F(search) F(transp) F(load) F(sysfnPost) F(dervPost) F(ryu) F(ffi) F(mmap) F(typesFinished) #define F(X) NOINLINE void X##_init(void); FOR_INIT(F) #undef F diff --git a/src/opt/single.c b/src/opt/single.c index 36f62ddf..382eb099 100644 --- a/src/opt/single.c +++ b/src/opt/single.c @@ -25,6 +25,7 @@ #include "../builtins/sort.c" #include "../builtins/search.c" #include "../builtins/selfsearch.c" +#include "../builtins/transpose.c" #include "../builtins/fold.c" #include "../builtins/scan.c" #include "../builtins/arithm.c"