From d05621f8f49660c10a59aed86b9166e728ee0cc3 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 19 Dec 2022 23:56:07 +0200 Subject: [PATCH] generic vector width calculation for NEON-supported files --- src/singeli/src/base.singeli | 2 ++ src/singeli/src/bits.singeli | 2 +- src/singeli/src/cmp.singeli | 20 ++++++++++---------- src/singeli/src/equal.singeli | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index eb5694b9..1839f5bd 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -163,3 +163,5 @@ def printfType{T} = tern{isfloat{T}, '%.17g', merge{'%', tern{width{T}==64, 'l', def print{x & match{kind{x},'symbol'}} = { emit{void, 'printf', '"%s"', merge{'"', x, '"'}}; x } def print{x:T & anyNum{x}} = { emit{void, 'printf', merge{'"', printfType{T}, '"'}, x}; x } def println{x} = { print{x}; print{'\n'}; x } + +def arch_defvw = tern{hasarch{'X86_64'}, 256, 128} \ No newline at end of file diff --git a/src/singeli/src/bits.singeli b/src/singeli/src/bits.singeli index e085aea9..8cbf8c3b 100644 --- a/src/singeli/src/bits.singeli +++ b/src/singeli/src/bits.singeli @@ -30,4 +30,4 @@ bitsel_i{VL,T}(r:*void, bits:*u64, e0:u64, e1:u64, len:u64) : void = { def table{w} = each{{T} => bitsel_i{w, T}, tup{u8, u16, u32, u64}} -def tup_bitsel = table{256}; v_bitsel:*type{tupsel{0,tup_bitsel}} = tup_bitsel; 'avx2_bitsel'=v_bitsel \ No newline at end of file +def tup_bitsel = table{arch_defvw}; v_bitsel:*type{tupsel{0,tup_bitsel}} = tup_bitsel; 'avx2_bitsel'=v_bitsel \ No newline at end of file diff --git a/src/singeli/src/cmp.singeli b/src/singeli/src/cmp.singeli index e38462bf..5c0f1aa0 100644 --- a/src/singeli/src/cmp.singeli +++ b/src/singeli/src/cmp.singeli @@ -135,14 +135,14 @@ def table{aa, F, w, G_bit, G_vec} = { def tableAA{w, F, F_bit} = table{1, F, w, {} => bitAA{F_bit}, {V, u} => aa2bit{V, u, F}} def tableAS{w, F } = table{0, F, w, {} => bitAS{F}, {V, u} => as2bit{V, u, F}} -def tup_eqAA = tableAA{256, __eq, {a,b}=>a ^ ~b}; v_eqAA:*type{tupsel{0,tup_eqAA}} = tup_eqAA; 'avx2_eqAA'=v_eqAA -def tup_neAA = tableAA{256, __ne, {a,b}=>a ^ b}; v_neAA:*type{tupsel{0,tup_neAA}} = tup_neAA; 'avx2_neAA'=v_neAA -def tup_gtAA = tableAA{256, __gt, {a,b}=>a & ~b}; v_gtAA:*type{tupsel{0,tup_gtAA}} = tup_gtAA; 'avx2_gtAA'=v_gtAA -def tup_geAA = tableAA{256, __ge, {a,b}=>a | ~b}; v_geAA:*type{tupsel{0,tup_geAA}} = tup_geAA; 'avx2_geAA'=v_geAA +def tup_eqAA = tableAA{arch_defvw, __eq, {a,b}=>a ^ ~b}; v_eqAA:*type{tupsel{0,tup_eqAA}} = tup_eqAA; 'avx2_eqAA'=v_eqAA +def tup_neAA = tableAA{arch_defvw, __ne, {a,b}=>a ^ b}; v_neAA:*type{tupsel{0,tup_neAA}} = tup_neAA; 'avx2_neAA'=v_neAA +def tup_gtAA = tableAA{arch_defvw, __gt, {a,b}=>a & ~b}; v_gtAA:*type{tupsel{0,tup_gtAA}} = tup_gtAA; 'avx2_gtAA'=v_gtAA +def tup_geAA = tableAA{arch_defvw, __ge, {a,b}=>a | ~b}; v_geAA:*type{tupsel{0,tup_geAA}} = tup_geAA; 'avx2_geAA'=v_geAA -def tup_eqAS = tableAS{256, __eq}; v_eqAS:*type{tupsel{0,tup_eqAS}} = tup_eqAS; 'avx2_eqAS'=v_eqAS -def tup_neAS = tableAS{256, __ne}; v_neAS:*type{tupsel{0,tup_neAS}} = tup_neAS; 'avx2_neAS'=v_neAS -def tup_gtAS = tableAS{256, __gt}; v_gtAS:*type{tupsel{0,tup_gtAS}} = tup_gtAS; 'avx2_gtAS'=v_gtAS -def tup_geAS = tableAS{256, __ge}; v_geAS:*type{tupsel{0,tup_geAS}} = tup_geAS; 'avx2_geAS'=v_geAS -def tup_ltAS = tableAS{256, __lt}; v_ltAS:*type{tupsel{0,tup_ltAS}} = tup_ltAS; 'avx2_ltAS'=v_ltAS -def tup_leAS = tableAS{256, __le}; v_leAS:*type{tupsel{0,tup_leAS}} = tup_leAS; 'avx2_leAS'=v_leAS +def tup_eqAS = tableAS{arch_defvw, __eq}; v_eqAS:*type{tupsel{0,tup_eqAS}} = tup_eqAS; 'avx2_eqAS'=v_eqAS +def tup_neAS = tableAS{arch_defvw, __ne}; v_neAS:*type{tupsel{0,tup_neAS}} = tup_neAS; 'avx2_neAS'=v_neAS +def tup_gtAS = tableAS{arch_defvw, __gt}; v_gtAS:*type{tupsel{0,tup_gtAS}} = tup_gtAS; 'avx2_gtAS'=v_gtAS +def tup_geAS = tableAS{arch_defvw, __ge}; v_geAS:*type{tupsel{0,tup_geAS}} = tup_geAS; 'avx2_geAS'=v_geAS +def tup_ltAS = tableAS{arch_defvw, __lt}; v_ltAS:*type{tupsel{0,tup_ltAS}} = tup_ltAS; 'avx2_ltAS'=v_ltAS +def tup_leAS = tableAS{arch_defvw, __le}; v_leAS:*type{tupsel{0,tup_leAS}} = tup_leAS; 'avx2_leAS'=v_leAS diff --git a/src/singeli/src/equal.singeli b/src/singeli/src/equal.singeli index e80e15e6..4d45bd2e 100644 --- a/src/singeli/src/equal.singeli +++ b/src/singeli/src/equal.singeli @@ -19,7 +19,7 @@ def swap{w,x} = { # width{W} ≤ width{X} equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { - def vw = 256 + def vw = arch_defvw def bulk = vw / width{X} if (W!=X) if (d!=0) swap{w,x}