From 4ee8dfbbdae622e25a57a86fca6dc7dee3d227eb Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 28 Jun 2023 00:40:16 +0300 Subject: [PATCH] update Singeli submodule, use destructuring parameters --- build/singeliSubmodule | 2 +- src/singeli/src/avx.singeli | 2 +- src/singeli/src/avx2.singeli | 2 +- src/singeli/src/base.singeli | 15 +++++++-------- src/singeli/src/dyarith.singeli | 10 +++++----- src/singeli/src/mask.singeli | 2 +- src/singeli/src/neon.singeli | 4 ++-- src/singeli/src/scan.singeli | 8 +++----- src/singeli/src/select.singeli | 4 ++-- 9 files changed, 23 insertions(+), 26 deletions(-) diff --git a/build/singeliSubmodule b/build/singeliSubmodule index 642b1bc7..3b1f6937 160000 --- a/build/singeliSubmodule +++ b/build/singeliSubmodule @@ -1 +1 @@ -Subproject commit 642b1bc73113a1c86480d1292f6a607858619972 +Subproject commit 3b1f6937bce4243aa511c8efa621c26f4778d24d diff --git a/src/singeli/src/avx.singeli b/src/singeli/src/avx.singeli index 7e00347d..c88a7070 100644 --- a/src/singeli/src/avx.singeli +++ b/src/singeli/src/avx.singeli @@ -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} diff --git a/src/singeli/src/avx2.singeli b/src/singeli/src/avx2.singeli index aa45ed54..00c245a2 100644 --- a/src/singeli/src/avx2.singeli +++ b/src/singeli/src/avx2.singeli @@ -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 diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 1dd0eb06..a41c577d 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -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{a1} = { 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}} diff --git a/src/singeli/src/dyarith.singeli b/src/singeli/src/dyarith.singeli index ffed5120..ea73f7be 100644 --- a/src/singeli/src/dyarith.singeli +++ b/src/singeli/src/dyarith.singeli @@ -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} = { diff --git a/src/singeli/src/mask.singeli b/src/singeli/src/mask.singeli index ad47420c..687d63a4 100644 --- a/src/singeli/src/mask.singeli +++ b/src/singeli/src/mask.singeli @@ -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 } diff --git a/src/singeli/src/neon.singeli b/src/singeli/src/neon.singeli index 1e1e2d0b..550535e5 100644 --- a/src/singeli/src/neon.singeli +++ b/src/singeli/src/neon.singeli @@ -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} diff --git a/src/singeli/src/scan.singeli b/src/singeli/src/scan.singeli index a948f2fd..5cabacf3 100644 --- a/src/singeli/src/scan.singeli +++ b/src/singeli/src/scan.singeli @@ -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}} diff --git a/src/singeli/src/select.singeli b/src/singeli/src/select.singeli index e7ec9b2d..2cba92db 100644 --- a/src/singeli/src/select.singeli +++ b/src/singeli/src/select.singeli @@ -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