diff --git a/build/singeliSubmodule b/build/singeliSubmodule index 0bc519cc..e6d3b11e 160000 --- a/build/singeliSubmodule +++ b/build/singeliSubmodule @@ -1 +1 @@ -Subproject commit 0bc519ccbbe4051204d40bfc861a5bed7132e95f +Subproject commit e6d3b11e59eea7614307a37b27e7f10f4d3d04b8 diff --git a/src/singeli/src/avx.singeli b/src/singeli/src/avx.singeli index 171526c9..4a580745 100644 --- a/src/singeli/src/avx.singeli +++ b/src/singeli/src/avx.singeli @@ -77,7 +77,8 @@ def __mul{a:T,b:T & T==[8]f32} = emit{T, '_mm256_mul_ps', a, b} def __div{a:T,b:T & T==[8]f32} = emit{T, '_mm256_div_ps', a, b} def max{a:T,b:T & T==[8]f32} = emit{T, '_mm256_max_ps', a, b} def min{a:T,b:T & T==[8]f32} = emit{T, '_mm256_min_ps', a, b} -def sqrt{a:T,b:T & T==[8]f32} = emit{T, '_mm256_sqrt_ps', a, b} +def sqrt{a:[8]f32} = emit{[8]f32, '_mm256_sqrt_ps', a} +def rsqrt{a:[8]f32} = emit{[8]f32, '_mm256_rsqrt_ps', a} def abs{a:[8]f32} = emit{[8]f32, '_mm256_and_ps', a, v2f{[8]u32 ** 0x7FFFFFFF}} def floor{a:[8]f32} = emit{[8]f32, '_mm256_floor_ps', a} def ceil{a:[8]f32} = emit{[8]f32, '_mm256_ceil_ps', a} @@ -89,7 +90,8 @@ def __mul{a:T,b:T & T==[4]f64} = emit{T, '_mm256_mul_pd', a, b} def __div{a:T,b:T & T==[4]f64} = emit{T, '_mm256_div_pd', a, b} def max{a:T,b:T & T==[4]f64} = emit{T, '_mm256_max_pd', a, b} def min{a:T,b:T & T==[4]f64} = emit{T, '_mm256_min_pd', a, b} -def sqrt{a:T,b:T & T==[4]f64} = emit{T, '_mm256_sqrt_pd', a, b} +def sqrt{a:[4]f64} = emit{[4]f64, '_mm256_sqrt_pd', a} +def rsqrt{a:[4]f64} = emit{[4]f64, '_mm256_rsqrt_pd', a} def abs{a:[4]f64} = emit{[4]f64, '_mm256_and_pd', a, v2d{[4]u64 ** ((cast{u64,1}<<63)-1)}} def floor{a:[4]f64} = emit{[4]f64, '_mm256_floor_pd', a} def ceil{a:[4]f64} = emit{[4]f64, '_mm256_ceil_pd', a} diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 93832ee4..b9e8074a 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -188,3 +188,4 @@ def eachx{F, ...args} = { } def makeregs{v, n} = @collect(n) { reg:=v } +def makeregs{T, n & istype{T}} = @collect(n) { reg:=undefined{T} } diff --git a/src/singeli/src/sse3.singeli b/src/singeli/src/sse3.singeli index 92812403..744919ef 100644 --- a/src/singeli/src/sse3.singeli +++ b/src/singeli/src/sse3.singeli @@ -122,6 +122,32 @@ def __sub{a:T,b:T & w128i{T, 32}} = emit{T, '_mm_sub_epi32', a, b} def __sub{a:T,b:T & w128i{T, 64}} = emit{T, '_mm_sub_epi64', a, b} + +# f32 arith +def __add{a:T,b:T & T==[4]f32} = emit{T, '_mm_add_ps', a, b} +def __sub{a:T,b:T & T==[4]f32} = emit{T, '_mm_sub_ps', a, b} +def __mul{a:T,b:T & T==[4]f32} = emit{T, '_mm_mul_ps', a, b} +def __div{a:T,b:T & T==[4]f32} = emit{T, '_mm_div_ps', a, b} +def max{a:T,b:T & T==[4]f32} = emit{T, '_mm_max_ps', a, b} +def min{a:T,b:T & T==[4]f32} = emit{T, '_mm_min_ps', a, b} +def sqrt{a:[4]f32} = emit{[4]f32, '_mm_sqrt_ps', a} +def rsqrt{a:[4]f32} = emit{[4]f32, '_mm_rsqrt_ps', a} +def abs{a:[4]f32} = emit{[4]f32, '_mm_and_ps', a, v2f{[2]u32 ** 0x7FFFFFFF}} + +# f64 arith +def __add{a:T,b:T & T==[2]f64} = emit{T, '_mm_add_pd', a, b} +def __sub{a:T,b:T & T==[2]f64} = emit{T, '_mm_sub_pd', a, b} +def __mul{a:T,b:T & T==[2]f64} = emit{T, '_mm_mul_pd', a, b} +def __div{a:T,b:T & T==[2]f64} = emit{T, '_mm_div_pd', a, b} +def max{a:T,b:T & T==[2]f64} = emit{T, '_mm_max_pd', a, b} +def min{a:T,b:T & T==[2]f64} = emit{T, '_mm_min_pd', a, b} +def sqrt{a:[2]f64} = emit{[2]f64, '_mm_sqrt_pd', a} +def rsqrt{a:[2]f64} = emit{[2]f64, '_mm_rsqrt_pd', a} +def abs{a:[2]f64} = emit{[2]f64, '_mm_and_pd', a, v2d{[2]u64 ** ((cast{u64,1}<<63)-1)}} + + + + # mask stuff def andAllZero{x:T, y:T & w128i{T}} = emit{u1, '_mm_testz_si128', x, y} @@ -152,6 +178,12 @@ def extract{x:T, i & w128i{T, 8} & knum{i}} = emit{eltype{T}, '_mm_extract_epi8' def extract{x:T, i & w128i{T,32} & knum{i}} = emit{eltype{T}, '_mm_extract_epi32', x, i} def extract{x:T, i & w128i{T,64} & knum{i}} = emit{eltype{T}, '_mm_extract_epi64', x, i} +# float +def floor{a:[4]f32} = emit{[4]f32, '_mm_floor_ps', a} +def ceil{a:[4]f32} = emit{[4]f32, '_mm_ceil_ps', a} +def floor{a:[2]f64} = emit{[2]f64, '_mm_floor_pd', a} +def ceil{a:[2]f64} = emit{[2]f64, '_mm_ceil_pd', a} + # conversion def widen{T==[8]u16, x:X & X==[16]u8} = emit{T, '_mm_cvtepu8_epi16', x}; def widen{T==[8]i16, x:X & X==[16]i8} = emit{T, '_mm_cvtepi8_epi16', x} def widen{T==[4]u32, x:X & X==[16]u8} = emit{T, '_mm_cvtepu8_epi32', x}; def widen{T==[4]i32, x:X & X==[16]i8} = emit{T, '_mm_cvtepi8_epi32', x}