From 1db746ea7757defc4179f6fc454935fbe6b63a1a Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 9 Apr 2023 15:03:44 +0300 Subject: [PATCH] Singeli compile-time cdiv & low-stack @collect --- src/singeli/src/base.singeli | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 8e2a7325..99c4c38e 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -16,6 +16,7 @@ def elwidth{T} = width{eltype{T}} # more arith 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}<=32} = emit{u8, '__builtin_popcount', 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} } def collect{vars,begin,end,block & knum{begin} & knum{end}} = { - def f{i,l & i==l} = tup{} - def f{i,l & i!=l} = { - def r = exec{i, vars, block} - merge{tup{r}, f{i+1, l}} + def f{s,e & s==e} = tup{} + def f{s,e & s>1) + 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} } def for{vars,begin,end,block} = {