Allow an 8x8 row for 2-byte transpose
This commit is contained in:
parent
239c765998
commit
0e2e315e51
@ -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<h;y++) NOVECTORIZE for(usz x=0;x<w;x++) rp[x*h+y] = xp[xi++]; break; }
|
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<h;y++) NOVECTORIZE for(usz x=0;x<w;x++) rp[x*h+y] = xp[xi++]; break; }
|
||||||
case el_i16:case el_c16:
|
case el_i16:case el_c16:
|
||||||
#if SINGELI_X86_64
|
#if SINGELI_X86_64
|
||||||
if (w>=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
|
#endif
|
||||||
{ u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,2,ia,el2t(xe)); PLAINLOOP for(usz y=0;y<h;y++) NOVECTORIZE for(usz x=0;x<w;x++) rp[x*h+y] = xp[xi++]; break; }
|
{ u16* xp=tyany_ptr(x); u16* rp = m_tyarrp(&r,2,ia,el2t(xe)); PLAINLOOP for(usz y=0;y<h;y++) NOVECTORIZE for(usz x=0;x<w;x++) rp[x*h+y] = xp[xi++]; break; }
|
||||||
case el_i32:case el_c32:
|
case el_i32:case el_c32:
|
||||||
|
|||||||
@ -134,10 +134,20 @@ fn transpose2{T, k & T < i32}(r0:*void, x0:*void, w:u64, h:u64) : void = {
|
|||||||
each{{i,v}=>store{*VT~~(rpo+i*h), 0, v}, iota{k}, rvs}
|
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'
|
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 (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}}
|
export{'simd_transpose_i16', transpose2{i16, 8}}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user