diff --git a/build/src/build.bqn b/build/src/build.bqn index ac2fc9b4..c0c133a4 100755 --- a/build/src/build.bqn +++ b/build/src/build.bqn @@ -590,8 +590,8 @@ cachedBin‿linkerCache ← { ⟩ cbqnSrc ↩ cbqnSrc clangd.Files "src" singeliMap ← 1↓¨ ({∨´ ((po.avx2/"X")∾⊑po.arch) ∊ 𝕩}¨ ⊑¨)⊸/ ⟨ - "Xa."‿"src/builtins/arithm.c"‿"monarith", "Xa."‿"src/core/stuff.c"‿"equal", - "xa."‿"src/builtins/arithd.c"‿"dyarith", "Xa."‿"src/builtins/cmp.c"‿"cmp", + "xa."‿"src/builtins/arithm.c"‿"monarith", "Xa."‿"src/core/stuff.c"‿"equal", + "xa."‿"src/builtins/arithd.c"‿"dyarith", "xa."‿"src/builtins/cmp.c"‿"cmp", "Xa."‿"src/builtins/squeeze.c"‿"squeeze", "Xa."‿"src/utils/mut.c"‿"copy", "xa."‿"src/utils/bits.c"‿"bits", "xag"‿"src/builtins/transpose.c"‿"transpose", diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 7737ff53..2922191e 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -29,7 +29,7 @@ B add_c1(B t, B x) { dec(eachm_fn(m_f64(0), inc(x), add_c1)); return x; } -#if SINGELI_SIMD +#if SINGELI_SIMD || SINGELI_X86_64 #define SINGELI_FILE monarith #include "../utils/includeSingeli.h" #endif @@ -60,7 +60,7 @@ B add_c1(B t, B x) { #define SIGN_EXPR(T, C) rp[i] = c>0? 1 : c==0? 0 : -1; #define SIGN_MAIN(FEXPR) LOOP_BODY(i8* rp; B r=m_i8arrc(&rp,x);, SIGN_EXPR,) -#if SINGELI_SIMD +#if SINGELI_SIMD || SINGELI_X86_64 #define STILE_BODY(FEXPR) { usz ia = IA(x); B r; retry:; \ void* rp = m_tyarrlc(&r, elWidth(xe), x, el2t(xe)); \ u64 got = simd_abs[xe-el_i8](rp, tyany_ptr(x), ia); \ diff --git a/src/builtins/cmp.c b/src/builtins/cmp.c index 4741630c..23502f5f 100644 --- a/src/builtins/cmp.c +++ b/src/builtins/cmp.c @@ -54,7 +54,7 @@ CMP_REC(ne, ne, swapped=0;) #define FN_LUT_C(B,A,F,S) FN_LUT_T(B,F,S)[] = {CMPFN(A,F,S,u1), CMPFN(A,F,S,i8), CMPFN(A,F,S,i16), CMPFN(A,F,S,i32), CMPFN(A,F,S,f64), CMPFN(A,F,S,u8), CMPFN(A,F,S,u16), CMPFN(A,F,S,u32)} #define FN_LUT_A(B,F,S) FN_LUT_T(B,F,S)[8] -#if SINGELI_SIMD +#if SINGELI_SIMD || SINGELI_X86_64 #include "../singeli/c/cmp.c" #else void cmpA_init(void) { } diff --git a/src/singeli/src/avx2.singeli b/src/singeli/src/avx2.singeli index bb17ee64..f676d80a 100644 --- a/src/singeli/src/avx2.singeli +++ b/src/singeli/src/avx2.singeli @@ -70,12 +70,10 @@ def __mul {a:T,b:T & [ 8]i32==T} = emit{T, '_mm256_mullo_epi32', a, b} def __mul32{a:T,b:T & [ 4]i64==T} = emit{T, '_mm256_mul_epi32', a, b} # reads only low 32 bits of arguments def __mul32{a:T,b:T & [ 4]u64==T} = emit{T, '_mm256_mul_epu32', a, b} # reads only low 32 bits of arguments -def abs {a:[32]i8 } = emit{[32]i8 , '_mm256_abs_epi8', a} -def abs {a:[16]i16} = emit{[16]i16, '_mm256_abs_epi16', a} -def abs {a:[ 8]i32} = emit{[ 8]i32, '_mm256_abs_epi32', a} -def absu{a:[32]i8 } = emit{[32]u8 , '_mm256_abs_epi8', a} -def absu{a:[16]i16} = emit{[16]u16, '_mm256_abs_epi16', a} -def absu{a:[ 8]i32} = emit{[ 8]u32, '_mm256_abs_epi32', a} +def abs{a:[32]i8 } = emit{[32]i8 , '_mm256_abs_epi8', a} +def abs{a:[16]i16} = emit{[16]i16, '_mm256_abs_epi16', a} +def abs{a:[ 8]i32} = emit{[ 8]i32, '_mm256_abs_epi32', a} +def absu{a & w256u{a}} = ty_u{abs{a}} def __add{a:T,b:T & w256i{T, 8}} = emit{T, '_mm256_add_epi8', a, b}; def __sub{a:T,b:T & w256i{T, 8}} = emit{T, '_mm256_sub_epi8', a, b} def __add{a:T,b:T & w256i{T, 16}} = emit{T, '_mm256_add_epi16', a, b}; def __sub{a:T,b:T & w256i{T, 16}} = emit{T, '_mm256_sub_epi16', a, b} diff --git a/src/singeli/src/cmp.singeli b/src/singeli/src/cmp.singeli index 9ad47b8e..dad85fb9 100644 --- a/src/singeli/src/cmp.singeli +++ b/src/singeli/src/cmp.singeli @@ -1,10 +1,12 @@ include './base' include './cbqnDefs' include './f64' -if (hasarch{'X86_64'}) { +if (hasarch{'AVX2'}) { include './sse' include './avx' include './avx2' +} else if (hasarch{'X86_64'}) { + include './sse2' } else if (hasarch{'AARCH64'}) { include './neon' } diff --git a/src/singeli/src/monarith.singeli b/src/singeli/src/monarith.singeli index 6673b73e..d5b38655 100644 --- a/src/singeli/src/monarith.singeli +++ b/src/singeli/src/monarith.singeli @@ -1,10 +1,12 @@ include './base' include './f64' include './cbqnDefs' -if (hasarch{'X86_64'}) { +if (hasarch{'AVX2'}) { include './sse' include './avx' include './avx2' +} else if (hasarch{'X86_64'}) { + include './sse2' } else if (hasarch{'AARCH64'}) { include './neon' } diff --git a/src/singeli/src/sse2.singeli b/src/singeli/src/sse2.singeli index bbe910fc..627705ec 100644 --- a/src/singeli/src/sse2.singeli +++ b/src/singeli/src/sse2.singeli @@ -134,6 +134,11 @@ def min{a:T,b:T & w128u{T,16}} = a-__subs{a,b} def min{a:T,b:T & T==[ 8]i16} = emit{T, '_mm_min_epi16', a, b}; def max{a:T,b:T & T==[ 8]i16} = emit{T, '_mm_max_epi16', a, b} def min{a:T,b:T & T==[16]u8 } = emit{T, '_mm_min_epu8', a, b}; def max{a:T,b:T & T==[16]u8 } = emit{T, '_mm_max_epu8', a, b} +def abs{a:[16]i8 } = { def U=[16]u8; ty_s{min{U~~a, U**0 - U~~a}} } +def abs{a:[ 8]i16} = max{a, [8]i16**0 - a} +def abs{a:[ 4]i32} = { t:= a>>31; (t^a) - t } +def absu{a & w128u{a}} = ty_u{abs{a}} + # saturating def __adds{a:T,b:T & T==[16]i8 } = emit{T, '_mm_adds_epi8', a, b}; def __adds{a:T,b:T & T==[16]u8 } = emit{T, '_mm_adds_epu8', a, b} def __subs{a:T,b:T & T==[16]i8 } = emit{T, '_mm_subs_epi8', a, b}; def __subs{a:T,b:T & T==[16]u8 } = emit{T, '_mm_subs_epu8', a, b}