update Singeli submodule, use destructuring parameters
This commit is contained in:
parent
3ae9b14d64
commit
4ee8dfbbda
@ -1 +1 @@
|
||||
Subproject commit 642b1bc73113a1c86480d1292f6a607858619972
|
||||
Subproject commit 3b1f6937bce4243aa511c8efa621c26f4778d24d
|
||||
@ -94,7 +94,7 @@ def ceil{a:[4]f64} = emit{[4]f64, '_mm256_ceil_pd', a}
|
||||
def half{x:T, i & w256{T} & knum{i}} = v_half{T} ~~ emit{[8]i16, '_mm256_extracti128_si256', v2i{x}, i}
|
||||
def half{x:T, i==0 & w256{T}} = v_half{T} ~~ emit{[8]i16, '_mm256_castsi256_si128', v2i{x}}
|
||||
def pair{a:T,b:T & width{T}==128} = v_dbl{T} ~~ emit{[8]i32, '_mm256_setr_m128i', a, b}
|
||||
def pair{x & tuplen{x}==2} = pair{tupsel{0,x},tupsel{1,x}}
|
||||
def pair{{a, b}} = pair{a, b}
|
||||
|
||||
def widen{T==[4]f64, x:X & X==[4]i32} = emit{T, '_mm256_cvtepi32_pd', x}
|
||||
def widen{T==[4]f64, x:X & X==[4]f32} = emit{T, '_mm256_cvtps_pd', x}
|
||||
|
||||
@ -65,7 +65,7 @@ def packQ{a:T,b:T & T==[16]u16} = emit{[32]u8, '_mm256_packus_epi16', a, b}
|
||||
def packQ{a:T,b:T & T==[ 8]u32} = emit{[16]u16, '_mm256_packus_epi32', a, b}
|
||||
# super questionable pack - assumes high halves are zero
|
||||
def packQQ{a:T,b:T & T==[4]i64} = emit{[8]i32, '_mm256_shuffle_epi32', a, 4b1120} | emit{[8]i32, '_mm256_shuffle_epi32', b, 4b2011}
|
||||
def packQQ{a} = packQQ{tupsel{0,a}, tupsel{1,a}}
|
||||
def packQQ{{a, b}} = packQQ{a, b}
|
||||
|
||||
|
||||
# arith
|
||||
|
||||
@ -49,12 +49,11 @@ def unreachable{} = emit{void, 'si_unreachable'}
|
||||
def assert{x:u1} = { if (not x) emit{void, 'si_unreachable'} }
|
||||
|
||||
# various checks
|
||||
def oneType{vs} = {
|
||||
def T = type{tupsel{0,vs}}
|
||||
each{{x:C} => assert{C==T}, vs}
|
||||
T
|
||||
def oneType{{h:H, ...t}} = {
|
||||
each{{c:C} => assert{C==H}, t}
|
||||
H
|
||||
}
|
||||
def oneType{vs & tuplen{vs}==0} = 1
|
||||
def oneType{{}} = {}
|
||||
|
||||
def isreg = kreg
|
||||
def isconst = kcon
|
||||
@ -202,7 +201,7 @@ oper &~ andnot infix none 35
|
||||
def widen{T, x:X & T==X} = x
|
||||
def narrow{T, x:X & T==eltype{X}} = x
|
||||
def undefPromote{T, x:X & T==X} = T~~x
|
||||
def packQ{a} = packQ{tupsel{0,a}, tupsel{1,a}}
|
||||
def packQ{{a, b}} = packQ{a, b}
|
||||
def cvt{T, x:X & T==eltype{X}} = x
|
||||
|
||||
def min{a, b & anyNum{a} & anyNum{b}} = tern{a<b, a, b}
|
||||
@ -215,7 +214,7 @@ def homMask{...vs & tuplen{vs}>1} = {
|
||||
tree_fold{|, each{{v,i}=>promote{RT,homMask{v}}<<(i*vcount{T}), vs, iota{n}}}
|
||||
}
|
||||
def homMaskX{a:T} = tup{1, homMask{a}} # tup{n,mask}; mask with each bit repeated n times
|
||||
def ctzX{t} = { def {n,v}=t; ctz{v}/n } # ctz for a result of homMaskX
|
||||
def ctzX{{n,v}} = ctz{v}/n # ctz for a result of homMaskX
|
||||
|
||||
def inRangeLen{x:TS, start, count & issigned{eltype{TS}}} = { # ∊ [start;start+count)
|
||||
def TU = ty_u{TS}
|
||||
@ -319,7 +318,7 @@ def tree_fold{F, x} = {
|
||||
def h = tuplen{x}>>1
|
||||
F{tree_fold{F, slice{x,0,h}}, tree_fold{F, slice{x,h,tuplen{x}}}}
|
||||
}
|
||||
def tree_fold{F, x & tuplen{x}==1} = tupsel{0,x}
|
||||
def tree_fold{F, {x}} = x
|
||||
|
||||
def eachx{F, ...args} = {
|
||||
def l = tree_fold{max, each{{x} => {if(ktup{x}) tuplen{x}; else 0}, args}}
|
||||
|
||||
@ -74,7 +74,7 @@ def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i32==eltype{T} & hasa
|
||||
# def bad = each{{v} => {
|
||||
# ((T2~~v + T2**0x80000000) ^ T2**(cast{i64,1}<<63)) > T2**cast_i{i64, (cast{u64,1}<<63) | 0xFFFFFFFF}
|
||||
# }, rp}
|
||||
# tup{packQQ{each{{v} => v & T2**0xFFFFFFFF, rp}}, tup{'homAny', tupsel{0,bad}|tupsel{1,bad}}} this doesn't use M
|
||||
# tup{packQQ{each{{v} => v & T2**0xFFFFFFFF, rp}}, tup{'homAny', tree_fold{|,bad}}} this doesn't use M
|
||||
}
|
||||
|
||||
def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & hasarch{'AARCH64'}} = {
|
||||
@ -122,13 +122,13 @@ def runChecks{type=='topAny', vals, M} = runChecks_any{topAny, vals}
|
||||
def runChecks{type=='none', vals, M} = 0
|
||||
def runChecks{type=='~andAllZero', vals, M & ~M{0}} = ~tree_fold{&, each{andAllZero, ...slice{flip{vals}, 1}}}
|
||||
def runChecks{type=='anyne', vals, M} = {
|
||||
def {_, xs, ys} = flip{vals}
|
||||
if (tuplen{vals}==1) {
|
||||
anyne{...xs, ...ys, M}
|
||||
} else {
|
||||
def i{vals} = {
|
||||
def {_,xs,ys} = flip{vals}
|
||||
assert{M{0} == 0}
|
||||
~homAll{tree_fold{&, each{==, xs, ys}}}
|
||||
}
|
||||
def i{{{_,x,y}}} = anyne{x, y, M}
|
||||
i{vals}
|
||||
}
|
||||
|
||||
def arithProcess{F, run, overflow, M, is, cw, cx, TY} = {
|
||||
|
||||
@ -36,7 +36,7 @@ def maskAfter{n} = {
|
||||
def mask{X, mode=='to sign bits'} = maskOf{X,n}
|
||||
def mask{X, mode=='to homogeneous bits'} = maskOf{X,n}
|
||||
def mask{mode=='count'} = n
|
||||
def mask{x & istup{x} & tuplen{x}==1} = tup{mask{tupsel{0,x}}}
|
||||
def mask{{x}} = tup{mask{x}}
|
||||
def mask{x==0} = 1
|
||||
}
|
||||
|
||||
|
||||
@ -124,8 +124,8 @@ def zip2{a:T, b:T & nvec{T}} = emit{T, ntyp{'vzip2', T}, a, b}
|
||||
|
||||
def packLo{x:T, y:T & nvec{T}} = { def H=ty_half{T}; emit{H, ntyp{'vuzp1', H}, H~~x, H~~y} }
|
||||
def packHi{x:T, y:T & nvec{T}} = { def H=ty_half{T}; emit{H, ntyp{'vuzp2', H}, H~~x, H~~y} }
|
||||
def packLo{x} = packLo{tupsel{0,x}, tupsel{1,x}}
|
||||
def packHi{x} = packHi{tupsel{0,x}, tupsel{1,x}}
|
||||
def packLo{{x, y}} = packLo{x, y}
|
||||
def packHi{{x, y}} = packHi{x, y}
|
||||
|
||||
def trn1{x:T, y:T & nvec{T}} = emit{T, ntyp{'vtrn1', T}, x, y}
|
||||
def trn2{x:T, y:T & nvec{T}} = emit{T, ntyp{'vtrn2', T}, x, y}
|
||||
|
||||
@ -222,12 +222,10 @@ def simd_plus_scan{X, b, R}{x:*X, c:(R), r:*R, len:u64} = {
|
||||
|
||||
def s0 = each{scan_plus, cx}
|
||||
|
||||
def s1 = {
|
||||
if (tuplen{s0}==1) s0
|
||||
else { def {v0,v1}=s0; tup{v0,v1+toLast{v0}} }
|
||||
}
|
||||
def s1{v0} = tup{v0}
|
||||
def s1{v0,v1} = tup{v0,v1+toLast{v0}}
|
||||
|
||||
def cr = eachx{+, widenFull{R, s1}, cv}
|
||||
def cr = eachx{+, widenFull{R, s1{...s0}}, cv}
|
||||
cv = toLast{tupsel{-1, cr}}
|
||||
|
||||
assert{type{cv} == oneType{cr}}
|
||||
|
||||
@ -66,8 +66,8 @@ def perm_select{ri, rd, TI, w, r, wl, xl, selx} = {
|
||||
}
|
||||
|
||||
def makeselx{VI, VD, nsel, xd, logv, cshuf} = {
|
||||
def bblend {m}{ft} = {def {f,t} = ft; homBlend{f, t, type{f} ~~ m}}
|
||||
def bblendn{m}{tf} = bblend{m}{reverse{tf}}
|
||||
def bblend {m}{{f,t}} = homBlend{f, t, type{f} ~~ m}
|
||||
def bblendn{m}{{t,f}} = bblend{m}{tup{f,t}}
|
||||
def bb{c}{f, v} = (if (f) bblendn{c<v}; else bblend{(c&v)==v})
|
||||
|
||||
def bs{b, c, x} = cshuf{x, c}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user