Move height/width 2 transposes to Singeli
This commit is contained in:
parent
37f481ea0d
commit
ebbddf9dcf
@ -52,27 +52,11 @@
|
||||
|
||||
static void transpose_move(void* rv, void* xv, u8 xe, usz w, usz h) {
|
||||
assert(xe!=el_bit); assert(xe!=el_B);
|
||||
if (h==2) {
|
||||
switch(xe) { default: UD;
|
||||
case el_i8: case el_c8: { u8* x0=xv; u8* x1=x0+w; u8* rp=rv; for (usz i=0; i<w; i++) { rp[i*2] = x0[i]; rp[i*2+1] = x1[i]; } } break;
|
||||
case el_i16:case el_c16: { u16* x0=xv; u16* x1=x0+w; u16* rp=rv; for (usz i=0; i<w; i++) { rp[i*2] = x0[i]; rp[i*2+1] = x1[i]; } } break;
|
||||
case el_i32:case el_c32: { u32* x0=xv; u32* x1=x0+w; u32* rp=rv; for (usz i=0; i<w; i++) { rp[i*2] = x0[i]; rp[i*2+1] = x1[i]; } } break;
|
||||
case el_f64: { u64* x0=xv; u64* x1=x0+w; u64* rp=rv; for (usz i=0; i<w; i++) { rp[i*2] = x0[i]; rp[i*2+1] = x1[i]; } } break;
|
||||
}
|
||||
} else if (w==2) {
|
||||
switch(xe) { default: UD;
|
||||
case el_i8: case el_c8: { u8* xp=xv; u8* r0=rv; u8* r1=r0+h; for (usz i=0; i<h; i++) { r0[i] = xp[i*2]; r1[i] = xp[i*2+1]; } } break;
|
||||
case el_i16:case el_c16: { u16* xp=xv; u16* r0=rv; u16* r1=r0+h; for (usz i=0; i<h; i++) { r0[i] = xp[i*2]; r1[i] = xp[i*2+1]; } } break;
|
||||
case el_i32:case el_c32: { u32* xp=xv; u32* r0=rv; u32* r1=r0+h; for (usz i=0; i<h; i++) { r0[i] = xp[i*2]; r1[i] = xp[i*2+1]; } } break;
|
||||
case el_f64: { u64* xp=xv; u64* r0=rv; u64* r1=r0+h; for (usz i=0; i<h; i++) { r0[i] = xp[i*2]; r1[i] = xp[i*2+1]; } } break;
|
||||
}
|
||||
} else {
|
||||
switch(xe) { default: UD;
|
||||
case el_i8: case el_c8: { u8* xp=xv; u8* rp=rv; TRANSPOSE_SIMD( i8, rp, xp, w, h); break; }
|
||||
case el_i16:case el_c16: { u16* xp=xv; u16* rp=rv; TRANSPOSE_SIMD(i16, rp, xp, w, h); break; }
|
||||
case el_i32:case el_c32: { u32* xp=xv; u32* rp=rv; TRANSPOSE_SIMD(i32, rp, xp, w, h); break; }
|
||||
case el_f64: { u64* xp=xv; u64* rp=rv; TRANSPOSE_SIMD(i64, rp, xp, w, h); break; }
|
||||
}
|
||||
switch(xe) { default: UD;
|
||||
case el_i8: case el_c8: { u8* xp=xv; u8* rp=rv; TRANSPOSE_SIMD( i8, rp, xp, w, h); break; }
|
||||
case el_i16:case el_c16: { u16* xp=xv; u16* rp=rv; TRANSPOSE_SIMD(i16, rp, xp, w, h); break; }
|
||||
case el_i32:case el_c32: { u32* xp=xv; u32* rp=rv; TRANSPOSE_SIMD(i32, rp, xp, w, h); break; }
|
||||
case el_f64: { u64* xp=xv; u64* rp=rv; TRANSPOSE_SIMD(i64, rp, xp, w, h); break; }
|
||||
}
|
||||
}
|
||||
// Return an array with data from x transposed as though it's shape h,w
|
||||
|
||||
@ -72,7 +72,12 @@ fn transpose{T, k, kh}(r0:*void, x0:*void, w:u64, h:u64) : void = {
|
||||
|
||||
rp:*T = *T~~r0
|
||||
xp:*T = *T~~x0
|
||||
if (w<k or h<k) { call_base{rp, xp, w, h}; return{} }
|
||||
if (w<k or h<k) {
|
||||
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}
|
||||
return{}
|
||||
}
|
||||
|
||||
def at{x,y} = tup{xp + y*w + x, rp + x*h + y}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user