From 2a32f52f8d0442d0c8debe43039098bacbbd7b9d Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 18 Dec 2022 02:49:42 +0200 Subject: [PATCH] blend renaming --- src/singeli/src/avx.singeli | 7 ++++--- src/singeli/src/avx2.singeli | 11 ++++------- src/singeli/src/bits.singeli | 2 +- src/singeli/src/equal.singeli | 15 ++++++++------- src/singeli/src/neon.singeli | 6 +++--- src/singeli/src/select.singeli | 2 +- src/singeli/src/sse3.singeli | 11 +++++------ 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/singeli/src/avx.singeli b/src/singeli/src/avx.singeli index 2b6f9945..315d35ec 100644 --- a/src/singeli/src/avx.singeli +++ b/src/singeli/src/avx.singeli @@ -120,9 +120,10 @@ def insert{x:T, i, v & w256i{T,16} & knum{i}} = emit{T, '_mm256_insert_epi16', x def insert{x:T, i, v & w256i{T,32} & knum{i}} = emit{T, '_mm256_insert_epi32', x, v, i} def insert{x:T, i, v & w256i{T,64} & knum{i}} = emit{T, '_mm256_insert_epi64', x, v, i} -# blend by sign bit -def blend{f:T, t:T, m:M & w256{T} & w256i{M,32}} = T ~~ emit{[8]f32, '_mm256_blendv_ps', v2f{f}, v2f{t}, v2f{m}} -def blend{f:T, t:T, m:M & w256{T} & w256i{M,64}} = T ~~ emit{[4]f64, '_mm256_blendv_pd', v2d{f}, v2d{t}, v2d{m}} +def topBlend{f:T, t:T, m:M & w256{T} & w256i{M,32}} = T ~~ emit{[8]f32, '_mm256_blendv_ps', v2f{f}, v2f{t}, v2f{m}} +def topBlend{f:T, t:T, m:M & w256{T} & w256i{M,64}} = T ~~ emit{[4]f64, '_mm256_blendv_pd', v2d{f}, v2d{t}, v2d{m}} +def homBlend{f:T, t:T, m:M & w256{T}} = topBlend{f, t, m} + # mask stuff def andAllZero{x:T, y:T & w256i{T}} = emit{u1, '_mm256_testz_si256', x, y} diff --git a/src/singeli/src/avx2.singeli b/src/singeli/src/avx2.singeli index ec85a7aa..7a3cfd8c 100644 --- a/src/singeli/src/avx2.singeli +++ b/src/singeli/src/avx2.singeli @@ -104,7 +104,7 @@ def maskstore{a:T, m:M, v & w256{eltype{T}, 32} & w256i{M, 32}} = emit{void, '_m def maskstore{a:T, m:M, v & w256{eltype{T}, 64} & w256i{M, 64}} = emit{void, '_mm256_maskstore_pd', *f64~~a, m, [4]f64~~v} # maskstore with all cases defined, at the cost of not being a single instruction -def maskstoreF{p, m, x:T} = store{p, 0, blendF{load{p}, x, m}} +def maskstoreF{p, m, x:T} = store{p, 0, homBlend{load{p}, x, m}} def maskstoreF{p, m, x:T & elwidth{T}>=32} = maskstore{p,m,x} def shl{S==[16]u8, x:T, n & w256{T} & knum{n}} = T ~~ emit{T, '_mm256_bslli_epi128', x, n} @@ -114,12 +114,9 @@ def blend{L==[8]u16, a:T, b:T, m & w256{T} & knum{m}} = T ~~ emit{[16]i16, '_mm2 def blend{L==[8]u32, a:T, b:T, m & w256{T} & knum{m}} = T ~~ emit{[ 8]i32, '_mm256_blend_epi32', v2i{a}, v2i{b}, m} def blend{L==[4]u64, a:T, b:T, m & w256{T} & knum{m}} = T ~~ emit{[ 4]f64, '_mm256_blend_pd', v2d{a}, v2d{b}, m} -# blend by sign bit; still no 16-bit case -def blend{f:T, t:T, m:M & w256{T} & w256i{M, 8}} = T ~~ emit{[32]i8, '_mm256_blendv_epi8', v2i{f}, v2i{t}, v2i{m}} - -# assumes all bits are the same in each mask item -def blendF{f:T, t:T, m:M & w256{T} & w256{M} & elwidth{M}!=16} = blend{f, t, m} -def blendF{f:T, t:T, m:M & w256{T} & w256{M,16}} = blend{f, t, [32]i8 ~~ m} +def topBlend{f:T, t:T, m:M & w256{T} & w256i{M, 8}} = T ~~ emit{[32]i8, '_mm256_blendv_epi8', v2i{f}, v2i{t}, v2i{m}} +def homBlend{f:T, t:T, m:M & w256{T} & w256i{M, 8}} = topBlend{f, t, m} +def homBlend{f:T, t:T, m:M & w256{T} & w256i{M,16}} = topBlend{f, t, [32]i8~~m} def shuf{L, x:T, n & lvec{L,4,32} & w256{T} & knum{n}} = T ~~ emit{[8]i32, '_mm256_shuffle_epi32', v2i{x}, n} def shuf{L, x:T, n & lvec{L,4,64} & w256{T} & knum{n}} = T ~~ emit{[4]f64, '_mm256_permute4x64_pd', v2d{x}, n} diff --git a/src/singeli/src/bits.singeli b/src/singeli/src/bits.singeli index 9f9c34e3..f4a06b6d 100644 --- a/src/singeli/src/bits.singeli +++ b/src/singeli/src/bits.singeli @@ -16,7 +16,7 @@ def bitsel{VL, T, r, bits, e0, e1, len} = { maskedLoop{bulk, len, {i, M} => { cb:= loadBatchBit{VT, bits, i} - storeBatch{r, i, blendF{e0v, e1v, cb}, M} + storeBatch{r, i, homBlend{e0v, e1v, cb}, M} }} } diff --git a/src/singeli/src/equal.singeli b/src/singeli/src/equal.singeli index 06e8a9d0..3e42cfc6 100644 --- a/src/singeli/src/equal.singeli +++ b/src/singeli/src/equal.singeli @@ -21,19 +21,20 @@ equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { if (W==u1) { if (X==u1) { # bitarr ≡ bitarr maskedLoop{vw, l, {i, M} => { - cw:= load{*[32]u8 ~~ w, i} - cx:= load{*[32]u8 ~~ x, i} + cw:= load{*[vw/8]u8 ~~ w, i} + cx:= load{*[vw/8]u8 ~~ x, i} if (anyneBit{cw,cx,M}) return{0} }} } else if (X==f64) { # bitarr ≡ f64arr - def T = [4]f64 + def TF = [vw/64]f64 + def TU = [vw/64]u64 def bulk = 4 - f0:= T**0.0 - f1:= T**1.0 + f0:= TF**0.0 + f1:= TF**1.0 maskedLoopPositive{bulk, l, {i, M} => { cw:= load{*u8 ~~ w, i>>1} >> cast_i{u8, 4*(i&1)} - cx:= load{*T ~~ x, i} - wu:= blend{f0, f1, [4]u64**cw << make{[4]u64,63,62,61,60}} + cx:= load{*TF ~~ x, i} + wu:= topBlend{f0, f1, TU**cw << make{TU,63,62,61,60}} if (anynePositive{wu, cx, M}) return{0} }} } else { # bitarr ≡ i8/i16/i32arr diff --git a/src/singeli/src/neon.singeli b/src/singeli/src/neon.singeli index 53dcde18..f3080723 100644 --- a/src/singeli/src/neon.singeli +++ b/src/singeli/src/neon.singeli @@ -45,8 +45,8 @@ def __shl{a:T,b:S & nveci{T} & nveci{S} & elwidth{T}==elwidth{S}} = emit{T, nty def __shl{a:T,b & nveci{T} & knum{b}} = emit{T, ntyp{'vshl', '_n', T}, a, b}; def __shl{a:T,b==0 & nveci{T}} = a def __shr{a:T,b & nveci{T} & knum{b}} = emit{T, ntyp{'vshr', '_n', T}, a, b}; def __shr{a:T,b==0 & nveci{T}} = a -def bblend{f:T, t:T, m:M & nvec{T} & nvecu{M} & width{T}==width{M} & elwidth{T}==elwidth{M}} = emit{T, ntyp{'vbsl', T}, m, t, f} -def blendF{f:T, t:T, m:M & nvec{M}} = bblend{f, t, m} +def bitBlend{f:T, t:T, m:M & nvec{T} & nvecu{M} & width{T}==width{M} & elwidth{T}==elwidth{M}} = emit{T, ntyp{'vbsl', T}, m, t, f} +def homBlend{f:T, t:T, m:M & nvec{M}} = bitBlend{f, t, m} def __neg{a:T & (nvecs{T}|nvecf{T})} = emit{T, ntyp{'vneg', T}, a} def addpw{a:T & nveci{T} & elwidth{T}<=32} = emit{ty_dbl{T}, ntyp{'vpaddl', T}, a} @@ -133,5 +133,5 @@ def getmask{x:T & nvecu{T} & T==[16]u8} = { } def andAllZero{x:T, y:T & nveci{T}} = ~bitAny{x&y} -def maskstore{p:P, m:M, x:T & eltype{P}==T & nvec{T}} = store{p, 0, bblend{load{p}, x, m}} +def maskstore{p:P, m:M, x:T & eltype{P}==T & nvec{T}} = store{p, 0, bitBlend{load{p}, x, m}} def maskstoreF{p:P, m:M, x:T & nvec{T}} = maskstore{p, m, x} \ No newline at end of file diff --git a/src/singeli/src/select.singeli b/src/singeli/src/select.singeli index 587433aa..86f856ab 100644 --- a/src/singeli/src/select.singeli +++ b/src/singeli/src/select.singeli @@ -68,7 +68,7 @@ def perm_select{ri, rd, TI, w, r, wl, xl, selx} = { } def makeselx{VI, VD, nsel, xd, logv, cshuf} = { - def bblend {m}{ft} = blend{tupsel{0,ft}, tupsel{1,ft}, m} + def bblend {m}{ft} = topBlend{tupsel{0,ft}, tupsel{1,ft}, m} def bblendn{m}{tf} = bblend{m}{reverse{tf}} def bb{c}{f, v} = (if (f) bblendn{c