diff --git a/build/src/build.bqn b/build/src/build.bqn index a6306709..d39b4124 100755 --- a/build/src/build.bqn +++ b/build/src/build.bqn @@ -576,7 +576,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/transpose.c"‿"transpose" + "xa"‿"src/builtins/transpose.c"‿"transpose" ⟩ objs ← ⟨⟩ diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index 0af9e620..0bd23027 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -35,7 +35,7 @@ #define TRANSPOSE_LOOP( DST, SRC, W, H) PLAINLOOP for(usz y=0,xi=0;y< H;y++) NOVECTORIZE for(usz x=0;x< W;x++) DST[x*H+y] = SRC[xi++] #define TRANSPOSE_BLOCK(DST, SRC, BW, BH, W, H) PLAINLOOP for(usz y=0 ;y=k and h>=k) { + transpose_with_kernel{T, k, kh, call_base, rp, xp, w, h} + } else { + if (h==2) @for (x0 in xp, x1 in xp+w over i to w) { store{rp, i*2, x0}; store{rp, i*2+1, x1} } + else if (w==2) @for (r0 in rp, r1 in rp+h over i to h) { r0 = load{xp, i*2}; r1 = load{xp, i*2+1} } + else call_base{rp, xp, w, h} + } +} + def transpose{T, k} = transpose{T, k, k} export{'simd_transpose_i8', transpose{i8 , 16}}