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 & 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 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{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]i32} = emit{T, '_mm256_cvtepi32_pd', x}
def widen{T==[4]f64, x:X & X==[4]f32} = emit{T, '_mm256_cvtps_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} 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 # 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: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 # arith

View File

@ -49,12 +49,11 @@ def unreachable{} = emit{void, 'si_unreachable'}
def assert{x:u1} = { if (not x) emit{void, 'si_unreachable'} } def assert{x:u1} = { if (not x) emit{void, 'si_unreachable'} }
# various checks # various checks
def oneType{vs} = { def oneType{{h:H, ...t}} = {
def T = type{tupsel{0,vs}} each{{c:C} => assert{C==H}, t}
each{{x:C} => assert{C==T}, vs} H
T
} }
def oneType{vs & tuplen{vs}==0} = 1 def oneType{{}} = {}
def isreg = kreg def isreg = kreg
def isconst = kcon def isconst = kcon
@ -202,7 +201,7 @@ oper &~ andnot infix none 35
def widen{T, x:X & T==X} = x def widen{T, x:X & T==X} = x
def narrow{T, x:X & T==eltype{X}} = x def narrow{T, x:X & T==eltype{X}} = x
def undefPromote{T, x:X & T==X} = T~~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 cvt{T, x:X & T==eltype{X}} = x
def min{a, b & anyNum{a} & anyNum{b}} = tern{a<b, a, b} 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}}} 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 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 inRangeLen{x:TS, start, count & issigned{eltype{TS}}} = { # ∊ [start;start+count)
def TU = ty_u{TS} def TU = ty_u{TS}
@ -319,7 +318,7 @@ def tree_fold{F, x} = {
def h = tuplen{x}>>1 def h = tuplen{x}>>1
F{tree_fold{F, slice{x,0,h}}, tree_fold{F, slice{x,h,tuplen{x}}}} 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 eachx{F, ...args} = {
def l = tree_fold{max, each{{x} => {if(ktup{x}) tuplen{x}; else 0}, 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} => { # def bad = each{{v} => {
# ((T2~~v + T2**0x80000000) ^ T2**(cast{i64,1}<<63)) > T2**cast_i{i64, (cast{u64,1}<<63) | 0xFFFFFFFF} # ((T2~~v + T2**0x80000000) ^ T2**(cast{i64,1}<<63)) > T2**cast_i{i64, (cast{u64,1}<<63) | 0xFFFFFFFF}
# }, rp} # }, 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'}} = { 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=='none', vals, M} = 0
def runChecks{type=='~andAllZero', vals, M & ~M{0}} = ~tree_fold{&, each{andAllZero, ...slice{flip{vals}, 1}}} def runChecks{type=='~andAllZero', vals, M & ~M{0}} = ~tree_fold{&, each{andAllZero, ...slice{flip{vals}, 1}}}
def runChecks{type=='anyne', vals, M} = { def runChecks{type=='anyne', vals, M} = {
def {_, xs, ys} = flip{vals} def i{vals} = {
if (tuplen{vals}==1) { def {_,xs,ys} = flip{vals}
anyne{...xs, ...ys, M}
} else {
assert{M{0} == 0} assert{M{0} == 0}
~homAll{tree_fold{&, each{==, xs, ys}}} ~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} = { 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 sign bits'} = maskOf{X,n}
def mask{X, mode=='to homogeneous bits'} = maskOf{X,n} def mask{X, mode=='to homogeneous bits'} = maskOf{X,n}
def mask{mode=='count'} = 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 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 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 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 packLo{{x, y}} = packLo{x, y}
def packHi{x} = packHi{tupsel{0,x}, tupsel{1,x}} def packHi{{x, y}} = packHi{x, y}
def trn1{x:T, y:T & nvec{T}} = emit{T, ntyp{'vtrn1', T}, 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} 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 s0 = each{scan_plus, cx}
def s1 = { def s1{v0} = tup{v0}
if (tuplen{s0}==1) s0 def s1{v0,v1} = tup{v0,v1+toLast{v0}}
else { def {v0,v1}=s0; 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}} cv = toLast{tupsel{-1, cr}}
assert{type{cv} == oneType{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 makeselx{VI, VD, nsel, xd, logv, cshuf} = {
def bblend {m}{ft} = {def {f,t} = ft; homBlend{f, t, type{f} ~~ m}} def bblend {m}{{f,t}} = homBlend{f, t, type{f} ~~ m}
def bblendn{m}{tf} = bblend{m}{reverse{tf}} 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 bb{c}{f, v} = (if (f) bblendn{c<v}; else bblend{(c&v)==v})
def bs{b, c, x} = cshuf{x, c} def bs{b, c, x} = cshuf{x, c}