From 13a64e4f56f6f23933b32635ad19b5ff09615854 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 30 May 2025 04:29:29 +0300 Subject: [PATCH] AVX-512 masked_mov & compress --- src/singeli/src/avx512.singeli | 28 ++++++++++++++++++++++++++++ src/singeli/src/base.singeli | 1 + 2 files changed, 29 insertions(+) diff --git a/src/singeli/src/avx512.singeli b/src/singeli/src/avx512.singeli index ca3f3138..33dd9d8b 100644 --- a/src/singeli/src/avx512.singeli +++ b/src/singeli/src/avx512.singeli @@ -36,3 +36,31 @@ def multishift{a:[k](u64), i:V=[(k*8)](u8) if has512{V, 'VBMI'}} = emit{V, intri def narrow{DE, x:[k]SE if isint{DE} and quality{DE}==quality{SE} and x86_has512e{[k]SE}} = { emit{x86_vec_low{k,DE}, intrin{[k]SE, 'cvtepi', fmtwidth{SE}, '_epi', fmtwidth{DE}}, x} } + +local def masked_op{name, pattern} = { + def ok{args, k, base} = { + def got = match (...args) { + (pattern) + {..._} => tup{} + } + match (got, k, base) { + {{V=[k]_, ..._}, k, 0 } => 1 + {{V=[k]_, ..._}, k, _:V} => 1 + {..._} => 0 + } + } + def me{...args, m:[k](u1), base if ok{args, k, base}} = { + def {V,...rest} = pattern{...args} + def has_base = not is{base,0} + emit{V, + intrin_i{V, merge{if (has_base) 'mask_' else 'maskz_', name}}, + ...has_base**base, + m, + ...rest + } + } +} + +def masked_op1{name} = masked_op{name, {a:V if has512e{V}} => tup{V,a}} +def masked_mov{...} = masked_op1{'mov'} +def compress{...} = masked_op1{'compress'} diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index eda1dd26..93ed7059 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -178,6 +178,7 @@ def { load_expand_bits,make,mask_to_hom,mulw_split,mulh,narrow,narrow_trunc,narrow_pair, pair,pdep,pext,bzhi,rbit,reverse_units,broadcast_sel,absdiff_sum,mul_sum,mul_sum_sat, unord,unzip,vfold,vec_select,vec_shuffle,widen,widen_upper,multishift,lowelt_mask, + masked_mov,compress, addp,addpw,addpwa, }