SSE2 copy.singeli
This commit is contained in:
parent
5018cf9b2e
commit
9209ca5d6d
@ -592,7 +592,7 @@ cachedBin‿linkerCache ← {
|
||||
singeliMap ← 1↓¨ ({∨´ ((po.avx2/"2")∾⊑po.arch) ∊ 𝕩}¨ ⊑¨)⊸/ ⟨
|
||||
"xa."‿"src/builtins/arithm.c"‿"monarith", "xa."‿"src/core/stuff.c"‿"equal",
|
||||
"xa."‿"src/builtins/arithd.c"‿"dyarith", "xa."‿"src/builtins/cmp.c"‿"cmp",
|
||||
"2a."‿"src/builtins/squeeze.c"‿"squeeze", "2a."‿"src/utils/mut.c"‿"copy",
|
||||
"2a."‿"src/builtins/squeeze.c"‿"squeeze", "xa."‿"src/utils/mut.c"‿"copy",
|
||||
"xa."‿"src/utils/bits.c"‿"bits", "xag"‿"src/builtins/transpose.c"‿"transpose",
|
||||
|
||||
"2.."‿"src/builtins/select.c"‿"select", "2.."‿"src/builtins/scan.c"‿"scan",
|
||||
|
||||
@ -152,7 +152,7 @@ def narrow{T, x:X & w256i{X,32} & width{T}==16} = to_el{T, shuf{[4]u64, packQ{x,
|
||||
def narrow{T, x:X & w256i{X,16} & width{T}== 8} = to_el{T, shuf{[4]u64, packQ{x, x}, 4b3120}}
|
||||
|
||||
def narrow{T, x:X & w256f{X,64} & T<i32} = narrow{T, narrow{i32, x}}
|
||||
def narrow{T, x:X & w256f{X,64} & T==i32} = to_el{T, emit{[4]i32, '_mm256_cvtpd_epi32', x}}
|
||||
def narrow{T, x:X & w256f{X,64} & T==i32} = emit{[4]i32, '_mm256_cvtpd_epi32', x}
|
||||
|
||||
def narrow{T, x:X & w256u{X,64} & T==u32} = to_el{T, sel{[8]i32, x, make{[8]i32, 2*iota{8}}}}
|
||||
def narrow{T, x:X & w256u{X,64} & T==u16} = to_el{T, sel{[16]i8, narrow{u32,x}, make{[32]i8, (iota{32}>>1<<2) | (iota{32}&1)}}}
|
||||
|
||||
@ -164,6 +164,7 @@ def homMaskStore{...x} = assert{'homMaskStore not supported', show{...x}}
|
||||
def topMaskStoreF{...x} = assert{'topMaskStoreF not supported', show{...x}}
|
||||
def homMaskStoreF{...x} = assert{'homMaskStoreF not supported', show{...x}}
|
||||
def widen{...x} = assert{'widen not supported', show{...x}}
|
||||
def narrow{...x} = assert{'narrow not supported', show{...x}}
|
||||
|
||||
def widen{T, x:X & T==X} = x
|
||||
def narrow{T, x:X & T==eltype{X}} = x
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
include './base'
|
||||
if (hasarch{'X86_64'}) {
|
||||
if (hasarch{'AVX2'}) {
|
||||
include './sse'
|
||||
include './avx'
|
||||
include './avx2'
|
||||
} else if (hasarch{'X86_64'}) {
|
||||
include './sse2'
|
||||
} else if (hasarch{'AARCH64'}) {
|
||||
include './neon'
|
||||
}
|
||||
|
||||
@ -195,11 +195,27 @@ def shuf{L, x:T, n & w128{T} & lvec{L,4,32} & knum{n}} = T ~~ emit{[4]i32,
|
||||
def shuf16Lo{x:T, n} = T~~emit{[8]i16, '_mm_shufflelo_epi16', x, n}
|
||||
def shuf16Hi{x:T, n} = T~~emit{[8]i16, '_mm_shufflehi_epi16', x, n}
|
||||
|
||||
def widen{T==[2]f64, x:X & X==[4]i32} = emit{T, '_mm_cvtepi32_pd', x}
|
||||
def widen{T==[2]f64, x:X & X==[4]f32} = emit{T, '_mm_cvtps_pd', x}
|
||||
def widen{T, x:X & w128i{T} & w128i{X,elwidth{T}/2}} = unpackLo{x, x} >> elwidth{X}
|
||||
def widen{T, x:X & w128i{T,32} & w128i{X,8} & w128s{T}==w128s{X}} = { def u=unpackLo{x, x}; unpackLo{u, u} >> 24}
|
||||
def widen{T==[2]f64, x:X & w128s{X} & elwidth{X}<32} = widen{T, widen{[4]i32, x}}
|
||||
|
||||
def homBlend{f:T, t:T, m:M & w128{T} & w128i{M,elwidth{T}}} = T ~~ ((M~~t & m) | (M~~f & ~m))
|
||||
def homMaskStoreF{p:P, m:M, v:T & w128i{M} & w128{T,elwidth{M}} & eltype{P}==T} = store{p, 0, homBlend{load{p}, v, m}}
|
||||
|
||||
def widen{T, x:X & w128i{T} & w128i{X} & w128s{T}==w128s{X} & elwidth{T}>elwidth{X}} = {
|
||||
def s{v} = s{unpackLo{v, v}}
|
||||
def s{v:V & V==T} = v
|
||||
s{x} >> (elwidth{T} - elwidth{X})
|
||||
}
|
||||
def widen{T==[2]f64, x:X & w128s{X} & elwidth{X}<32} = widen{T, widen{[4]i32, x}}
|
||||
def widen{T==[2]f64, x:X & X==[4]i32} = emit{T, '_mm_cvtepi32_pd', x}
|
||||
def widen{T==[2]f64, x:X & X==[4]f32} = emit{T, '_mm_cvtps_pd', x}
|
||||
|
||||
def narrow{T==i16, x:[4]i32} = packs{x,x}
|
||||
def narrow{T==i8, x:[8]i16} = packs{x,x}
|
||||
def narrow{T==u8, x:[8]u16} = packs{x,x}
|
||||
def narrow{T==u16, x:[4]u32} = [8]u16~~shuf{[4]i32, shuf16Hi{shuf16Lo{x, 4b3320}, 4b3320}, 4b3320}
|
||||
def narrow{T==i8, x:[4]i32} = narrow{T, narrow{i16, x}}
|
||||
def narrow{T==u8, x:[4]u32} = { def f{v} = narrow{u8, [8]u16~~v}; f{f{x}}}
|
||||
def narrow{T==u8, x:[2]u64} = { def f{v} = narrow{u8, [8]u16~~v}; f{f{f{x}}}}
|
||||
def narrow{T==u16, x:[2]u64} = shuf16Lo{[8]u16~~shuf{[4]i32, x, 4b3320}, 4b3320}
|
||||
def narrow{T==u32, x:[2]u64} = [4]u32~~shuf{[4]i32, x, 4b3320}
|
||||
|
||||
def narrow{T, x:X & w128f{X,64} & T<i32} = narrow{T, narrow{i32, x}}
|
||||
def narrow{T==i32, x:[2]f64} = emit{[4]i32, '_mm_cvtpd_epi32', x}
|
||||
|
||||
@ -167,7 +167,7 @@ DEF_G(void, fill, B , (void* a, usz ms, B x, usz l), ms, x, l) {
|
||||
}
|
||||
|
||||
|
||||
#if SINGELI_SIMD
|
||||
#if SINGELI_SIMD || SINGELI_X86_64
|
||||
#define DEF_COPY(T, BODY) DEF0(void, copy, T, u8 xe=TI(x,elType); u8 ne=el_or(xe,el_##T);, ne==el_##T, ne, (void* a, usz ms, B x, usz xs, usz l), ms, x, xs, l)
|
||||
#else
|
||||
#define DEF_COPY(T, BODY) DEF(void, copy, T, u8 xe=TI(x,elType); u8 ne=el_or(xe,el_##T);, ne==el_##T, ne, (void* a, usz ms, B x, usz xs, usz l), ms, x, xs, l) { u8 xt=TY(x); (void)xt; BODY }
|
||||
@ -253,7 +253,7 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x
|
||||
}
|
||||
}
|
||||
|
||||
#if SINGELI_SIMD
|
||||
#if SINGELI_SIMD || SINGELI_X86_64
|
||||
static u64 loadu_u64(u64* p) { u64 v; memcpy(&v, p, 8); return v; }
|
||||
#define SINGELI_FILE copy
|
||||
#include "./includeSingeli.h"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user