From 722107e4704ee9ab077a38bfb7f20b9389ca06c7 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 15 Apr 2023 12:32:14 +0300 Subject: [PATCH] move makeOptBranch to base.singeli, use in search --- src/singeli/src/base.singeli | 11 +++++++++++ src/singeli/src/search.singeli | 7 ++++++- src/singeli/src/squeeze.singeli | 14 -------------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 99c4c38e..d7f31417 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -255,6 +255,17 @@ def forXUnroll{unr}{vars,begin,end,block} = { } +def makeBranch{Ts, F} = { + def args = undef{Ts} + def skip = makelabel{}; goto{skip} + def start = setlabel{} + F{...args} + setlabel{skip} + {...vs} => { each{=, args, vs}; goto{start} } +} +def makeOptBranch{enable, Ts, F} = if (enable) makeBranch{Ts, F} else 'not defined' + + 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}}}} diff --git a/src/singeli/src/search.singeli b/src/singeli/src/search.singeli index 30758074..99a52839 100644 --- a/src/singeli/src/search.singeli +++ b/src/singeli/src/search.singeli @@ -29,13 +29,18 @@ fn search{A, E}(l:*void, e0:A, n:u64) : u64 = { def e = if (A==E) e0 else cast_i{E, e0} def bulk = arch_defvw/width{E} def VT = [bulk]E + def end = makeBranch{ + tup{u64, ty_u{VT}}, + {i,c} => return{i*bulk + promote{u64, ctz{homMask{c}}}} + } + muLoop{bulk, tern{arch_defvw>=256, 1, 2}, n, {is, M} => { eq:= eachx{==, loadBatch{*E~~l, is, VT}, VT**e} if (homAny{M{tree_fold{|, eq}}}) { findFirst{ {i,c} => homAny{c}, {i,c} => tup{i,c}, - {i,c} => return{i*bulk + promote{u64, ctz{homMask{c}}}}, + end, is, eq } } diff --git a/src/singeli/src/squeeze.singeli b/src/singeli/src/squeeze.singeli index 8c9909d9..302cb064 100644 --- a/src/singeli/src/squeeze.singeli +++ b/src/singeli/src/squeeze.singeli @@ -42,20 +42,6 @@ def anyNonChar{M, x:T & isvec{T} & hasarch{'X86_64'}} = { } - -def makeOptBranch{enable, Ts, F} = { - if (enable) { - def args = undef{Ts} - def skip = makelabel{}; goto{skip} - def start = setlabel{} - F{...args} - setlabel{skip} - {...vs} => { each{=, args, vs}; goto{start} } - } else { - 'not defined' - } -} - def cvtNarrow{T, x:X & width{T}==elwidth{X}} = cvt{T, x} def cvtNarrow{T, x:X & width{T}< elwidth{X}} = narrow{T, x} def cvtWiden{T, x:X & elwidth{T}==elwidth{X}} = cvt{eltype{T}, x}