From 8c7c0227a55d88877508abf76c8716eb2f40691b Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 3 Feb 2025 17:31:44 +0200 Subject: [PATCH] first_hom, try_first_hom, popc_hom --- src/singeli/src/base.singeli | 14 ++++++++++++++ src/singeli/src/search.singeli | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index fa421d77..2bf1d6ae 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -197,6 +197,20 @@ def hom_to_int{...vs if length{vs}>1} = { (hi << (h*k)) | lo } def hom_to_int{x if ktup{x}} = hom_to_int{...x} +def first_hom{x:[_]_} = ctz_ext{hom_to_int_ext{x}} +def popc_hom{x:[_]_} = { + def {n,v} = hom_to_int_ext{x} + popc{v} / n +} +def try_first_hom{x:[_]_} = { + def ex = hom_to_int_ext{x} + val:ux = 0 + ok:u1 = 0 + if (select{ex,1} != 0) { + ok = 1 + val = ctz_ext{ex} + } +} def load{V=[k]E, ptr:*E } = load{*V~~ptr, 0} def load{V=[k]E, ptr:*E, k} = load{*V~~ptr, 0} diff --git a/src/singeli/src/search.singeli b/src/singeli/src/search.singeli index c647a38d..745be650 100644 --- a/src/singeli/src/search.singeli +++ b/src/singeli/src/search.singeli @@ -3,7 +3,7 @@ include './mask' include './vecfold' include './hashtab' -def findFirst{C, M, F, ...v1} = { +def find_first{C, M, F, ...v1} = { def exit = makelabel{} def args = undef{M{...each{select{., 0}, v1}}} def am = length{select{v1,0}} @@ -23,12 +23,12 @@ def search{E, x, n:(u64), OP} = { def VT = [bulk]E def end = make_branch{ tup{u64, ty_u{VT}}, - {i,c} => return{i*bulk + promote{u64, ctz_ext{hom_to_int_ext{c}}}} + {i,c} => return{i*bulk + promote{u64, first_hom{c}}} } @for_mu{bulk, tern{arch_defvw>=256, 1, 2}}(x in tup{VT,*E~~x}, M in 'm' over is to n) { eq:= each{OP, x} if (any_hom{M{tree_fold{|, eq}}}) { - findFirst{ + find_first{ {i,c} => any_hom{c}, {i,c} => tup{i,c}, end,