From 0e2e315e512993584c46fd868a615d9f7fe9ca05 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 20 Mar 2023 21:43:34 -0400 Subject: [PATCH] Allow an 8x8 row for 2-byte transpose --- src/builtins/sfns.c | 2 +- src/singeli/src/transpose.singeli | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index a9ecab2b..4c177d11 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -1340,7 +1340,7 @@ B transp_c1(B t, B x) { case el_i8: case el_c8: { u8* xp=tyany_ptr(x); u8* rp = m_tyarrp(&r,1,ia,el2t(xe)); PLAINLOOP for(usz y=0;y=8 && h>=16) { u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,4,ia,el2t(xe)); simd_transpose_i16(rp, xp, w, h); break; } + if (w>=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;yload{*VT~~(xpo+i*w), 0}, iota{k}} def rvs = vtranspose{xvs} each{{i,v}=>store{*VT~~(rpo+i*h), 0, v}, iota{k}, rvs} - } + } } } else { # Result rows are aligned with each other so it's possible to @@ -132,12 +132,22 @@ fn transpose2{T, k & T < i32}(r0:*void, x0:*void, w:u64, h:u64) : void = { def xvs = each{{i}=>{p:=xpo+i*w; load2{p, p+k*w}}, iota{k}} def rvs = vtranspose2{xvs} each{{i,v}=>store{*VT~~(rpo+i*h), 0, v}, iota{k}, rvs} - } + } + } + if ((h & k) != 0) { y := h-h%d + @for_mult{k} (x to w) { + xpo:= xp + y*w + x + rpo:= rp + x*h + y + def lw = k*width{T} + def xvs = each{{i}=>loadLow{*VT~~(xpo+i*w), lw}, iota{k}} + def rvs = vtranspose2{xvs} + each{{i,v}=>storeLow{*VT~~(rpo+i*h), lw, v}, iota{k}, rvs} + } } def base = 'base_transpose_i16' if (w%k) emit{void, base, rp+h*(w-w%k), xp+ (w-w%k), w%k, h, w, h} - if (h%d) emit{void, base, rp+ (h-h%d), xp+w*(h-h%d), w-w%k, h%d, w, h} + if (h%k) emit{void, base, rp+ (h-h%k), xp+w*(h-h%k), w-w%k, h%k, w, h} } export{'simd_transpose_i16', transpose2{i16, 8}}