diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 8b78b522..58466ac5 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -443,7 +443,9 @@ B GRADE_CAT(c2)(B t, B w, B x) { #if SINGELI u8 k = elWidthLogBits(we) - 3; - r = b(si_bins[k*2 + GRADE_UD(0,1)](tyany_ptr(w), wia, tyany_ptr(x), xia, x.u)); + u8 rl = wia<128 ? 0 : wia<(1<<15) ? 1 : wia<(1<<31) ? 2 : 3; + void *rp = m_tyarrc(&r, 1<maxvalue{T}) { ++t; c{...ts} } + def c{T==f64} = {} + c{...rtypes} + t +} +fn write{T,k}(r:*void, i:u64, ...vs:k**u64) : void = { + each{{j,v} => store{*T~~r, i+j, cast_i{T,v}}, iota{k}, vs} +} +def make_wr{k} = { + def w = each{{T} => write{T,k}, rtypes} + a:*(type{tupsel{0,w}}) = w +} +def wr_arrs = each{make_wr, unroll_sizes} + +def bin_search_branchless{up, w, wn, x, n, res, rtype} = { def lt = if (up) <; else > ws := w - 1 l0 := wn + 1 @@ -134,33 +153,24 @@ def bin_search_branchless{up, w, wn, x, n, res} = { each{bin1, ss, xs, each{bind{+,h}, ss}} l -= h } - each{{r,s} => store{res, r, cast_i{i32, s - ws}}, inds, ss} + each{{s} => u64~~(s - ws), ss} } # Unroll by 4 then 1 def search{i, k} = search{each{bind{+,i}, iota{k}}} j:u64 = 0 - def searches{k} = { while (j+k <= n) { search{j, k}; j+=k } } - each{searches, tup{4, 1}} + def searches{k, wr_arr} = { + wr := load{wr_arr, rtype} + while (j+k <= n) { wr(res, j, ...search{j, k}); j+=k } + } + each{searches, unroll_sizes, wr_arrs} } -def B = u64 -fn bins{T, up}(w:*void, wn:u64, x:*void, xn:u64, xb:B) : B = { - def alloc{T,ts} = { - u:*u64 = tup{0} - rpp:* *T = (* *T)~~u - r := emit{B, merge{'m_',ts,'arrc_wrapu'}, rpp, xb} - rp := load{rpp,0} - tup{r, rp} - } - r := undefined{B} +fn bins{T, up}(w:*void, wn:u64, x:*void, xn:u64, rp:*void, rty:u8) : void = { if (T==i8 and wn<128 and xn>=32) { - def {rt, rp} = alloc{i8, 'i8'}; r = rt - bin_search_vec{up, *T~~w, wn, *T~~x, xn, rp} + bin_search_vec{up, *T~~w, wn, *T~~x, xn, *i8~~rp} } else { - def {rt, rp} = alloc{i32, 'i32'}; r = rt - bin_search_branchless{up, *T~~w, wn, *T~~x, xn, rp} + bin_search_branchless{up, *T~~w, wn, *T~~x, xn, rp, rty} } - r } exportT{