better Singeli abs & absu definitions

This commit is contained in:
dzaima 2023-04-08 19:23:50 +03:00
parent c3fe3c5b42
commit 6a0385b44b
2 changed files with 8 additions and 8 deletions

View File

@ -70,10 +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 & w256u{a}} = ty_u{abs{a}}
def abs{a:T & w256i{T,8 }} = emit{[32]i8 , '_mm256_abs_epi8', a}
def abs{a:T & w256i{T,16}} = emit{[16]i16, '_mm256_abs_epi16', a}
def abs{a:T & w256i{T,32}} = emit{[ 8]i32, '_mm256_abs_epi32', a}
def absu{a:T & w256i{T}} = 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

@ -138,10 +138,10 @@ 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}}
def abs{a:T & w128i{T,8 }} = { def U=[16]u8; ty_s{min{U~~a, U**0 - U~~a}} }
def abs{a:T & w128i{T,16}} = max{a, [8]i16**0 - a}
def abs{a:T & w128i{T,32}} = { t:= a>>31; (t^a) - t }
def absu{a:T & w128i{T}} = 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}