update Singeli submodule, use destructuring parameters

This commit is contained in:
dzaima 2023-06-28 00:40:16 +03:00
parent 3ae9b14d64
commit 4ee8dfbbda
9 changed files with 23 additions and 26 deletions

@ -1 +1 @@
Subproject commit 642b1bc73113a1c86480d1292f6a607858619972
Subproject commit 3b1f6937bce4243aa511c8efa621c26f4778d24d

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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