Singeli compile-time cdiv & low-stack @collect

This commit is contained in:
dzaima 2023-04-09 15:03:44 +03:00
parent b66f628cff
commit 1db746ea77

View File

@ -16,6 +16,7 @@ def elwidth{T} = width{eltype{T}}
# more arith # more arith
def cdiv{a,b} = (a+b-1)/b # ceiling divide def cdiv{a,b} = (a+b-1)/b # ceiling divide
def cdiv{a,b & knum{a} & knum{b}} = ((a+b-1)/b)>>0
def popc{x:T & isint{T} & width{T}==64} = emit{u8, '__builtin_popcountll', x} def popc{x:T & isint{T} & width{T}==64} = emit{u8, '__builtin_popcountll', x}
def popc{x:T & isint{T} & width{T}<=32} = emit{u8, '__builtin_popcount', x} def popc{x:T & isint{T} & width{T}<=32} = emit{u8, '__builtin_popcount', x}
def ctz{x:T & isint{T} & width{T}==64} = emit{u8, '__builtin_ctzll', x} def ctz{x:T & isint{T} & width{T}==64} = emit{u8, '__builtin_ctzll', x}
@ -205,11 +206,13 @@ def unroll{vars,begin,end,block & knum{begin} & knum{end}} = {
f{begin,end} f{begin,end}
} }
def collect{vars,begin,end,block & knum{begin} & knum{end}} = { def collect{vars,begin,end,block & knum{begin} & knum{end}} = {
def f{i,l & i==l} = tup{} def f{s,e & s==e} = tup{}
def f{i,l & i!=l} = { def f{s,e & s<e} = {
def r = exec{i, vars, block} def m = s + ((e-s)>>1)
merge{tup{r}, f{i+1, l}} def r0 = f{s, m}
merge{r0, f{m, e}}
} }
def f{s,e & s+1==e} = tup{exec{s, vars, block}}
f{begin,end} f{begin,end}
} }
def for{vars,begin,end,block} = { def for{vars,begin,end,block} = {