blend renaming

This commit is contained in:
dzaima 2022-12-18 02:49:42 +02:00
parent 09b3279958
commit 2a32f52f8d
7 changed files with 26 additions and 28 deletions

View File

@ -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}

View File

@ -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}

View File

@ -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}
}}
}

View File

@ -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

View File

@ -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}

View File

@ -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<v}; else bblend{(c&v)==v})

View File

@ -165,14 +165,13 @@ def widen{T==[2]f64, x:X & w128i{X} & elwidth{X}<32} = widen{T, widen{[4]i32, x}
def narrow{T, x:X & w128i{X,32} & T==i8} = sel{[16]u8, [16]i8~~x, make{[16]i8, 0,4,8,12, 0,0,0,0, 0,0,0,0, 0,0,0,0}}
def narrow{T, x:X & w128i{X,32} & T==i16} = sel{[16]u8, [8]i16~~x, make{[16]i8, 0,1,4,5, 8,9,12,13, 0,0,0,0, 0,0,0,0}}
# blend by sign bit; no 16-bit case
def blend{f:T, t:T, m:M & w128{T} & w128i{M,32}} = T ~~ emit{[4]f32, '_mm_blendv_ps', v2f{f}, v2f{t}, v2f{m}}
def blend{f:T, t:T, m:M & w128{T} & w128i{M,64}} = T ~~ emit{[2]f64, '_mm_blendv_pd', v2d{f}, v2d{t}, v2d{m}}
def blend{f:T, t:T, m:M & w128{T} & w128i{M, 8}} = T ~~ emit{[16]i8, '_mm_blendv_epi8', v2i{f}, v2i{t}, v2i{m}}
def topBlend{f:T, t:T, m:M & w128{T} & w128i{M,32}} = T ~~ emit{[4]f32, '_mm_blendv_ps', v2f{f}, v2f{t}, v2f{m}}
def topBlend{f:T, t:T, m:M & w128{T} & w128i{M,64}} = T ~~ emit{[2]f64, '_mm_blendv_pd', v2d{f}, v2d{t}, v2d{m}}
def topBlend{f:T, t:T, m:M & w128{T} & w128i{M, 8}} = T ~~ emit{[16]i8, '_mm_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 & w128{T} & w128{M} & elwidth{M}!=16} = blend{f, t, m}
def blendF{f:T, t:T, m:M & w128{T} & w128{M,16}} = blend{f, t, [16]i8,m}
def homBlend{f:T, t:T, m:M & w128{T} & w128{M} & elwidth{M}!=16} = topBlend{f, t, m}
def homBlend{f:T, t:T, m:M & w128{T} & w128{M,16}} = topBlend{f, t, [16]i8~~m}
def min{a:T,b:T & T==[16]i8 } = emit{T, '_mm_min_epi8', a, b}; def max{a:T,b:T & T==[16]i8 } = emit{T, '_mm_max_epi8', a, b}
def min{a:T,b:T & T==[ 4]i32} = emit{T, '_mm_min_epi32', a, b}; def max{a:T,b:T & T==[ 4]i32} = emit{T, '_mm_max_epi32', a, b}