From 1d3413f6ea1b85d9999fb1cb9428dd65b15eb0e1 Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 1 May 2025 16:15:41 +0300 Subject: [PATCH] full vector broadcasting via broadcast{[k*n]E, v:[k]E} --- src/singeli/src/base.singeli | 1 + src/singeli/src/bins.singeli | 2 +- src/singeli/src/lut.singeli | 4 +--- src/singeli/src/replicate.singeli | 3 +-- src/singeli/src/x86.singeli | 3 +++ 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 3aec6583..a2cffea4 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -291,6 +291,7 @@ def fold_addw{x:[k]E if k <= (1<>b) -def broadcast{[(n*2)]E, x:[n]E} = pair{x, x} def pow2_up{v, least} = __max{least, 1<=u16} = 0 def lut_gen{mode, E, nt, ni if hasarch{'AARCH64'} and mode=='i' and E==u64 and nt>16} = 0 -def lut16{tab:([16]u8), idxs:([16]u8)} = shuf{[16]u8, tab, idxs} -def lut16{tab:([16]u8), idxs:([32]u8) if hasarch{'X86_64'}} = shuf{[16]u8, pair{tab, tab}, idxs} +def lut16{tab:([16]u8), idxs:IV} = shuf{[16]u8, IV**tab, idxs} def shuf_u8bits{inds:(*u8), ni} = 0 def shuf_u8bits{inds:(*u8), ni if has_sel} = { diff --git a/src/singeli/src/replicate.singeli b/src/singeli/src/replicate.singeli index 37b45956..734bdc03 100644 --- a/src/singeli/src/replicate.singeli +++ b/src/singeli/src/replicate.singeli @@ -431,8 +431,7 @@ def rep_const_bool_div8{wv, x, r, nw if has_simd} = { } def run8{rep_bytes} = { i:usz = 0; while (1) { check_done{} - xh := load{*[16]u8~~(*ty_u{vl}~~x + i)}; ++i - xv := if (avx2) pair{xh, xh} else xh + xv := V**load{*[16]u8 ~~ (*ty_u{vl}~~x + i)}; ++i xe := rep_bytes{xv} output{(xe & mkV{1 << (iV % 8)}) > V**0} } diff --git a/src/singeli/src/x86.singeli b/src/singeli/src/x86.singeli index 6e74e36f..8ef697c6 100644 --- a/src/singeli/src/x86.singeli +++ b/src/singeli/src/x86.singeli @@ -80,6 +80,9 @@ def extract{D=[kd]E, x:X=[ks]E, i if kd