enable Singeli monadic arith & comparisons on SSE2

This commit is contained in:
dzaima 2023-04-01 19:20:46 +03:00
parent 3a45eac1aa
commit 96ee73f644
7 changed files with 20 additions and 13 deletions

View File

@ -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",

View File

@ -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); \

View File

@ -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) { }

View File

@ -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}

View File

@ -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'
}

View File

@ -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'
}

View File

@ -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}