enable Singeli monadic arith & comparisons on SSE2
This commit is contained in:
parent
3a45eac1aa
commit
96ee73f644
@ -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",
|
||||
|
||||
@ -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); \
|
||||
|
||||
@ -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) { }
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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'
|
||||
}
|
||||
|
||||
@ -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'
|
||||
}
|
||||
|
||||
@ -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}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user