diff --git a/src/SIMDMath.jl b/src/SIMDMath.jl index d5b9320..7e5197f 100644 --- a/src/SIMDMath.jl +++ b/src/SIMDMath.jl @@ -11,6 +11,8 @@ module SIMDMath using Base: llvmcall, VecElement +using Base.Cartesian: @ntuple + export horner_simd, pack_poly export horner, pack_horner diff --git a/src/types.jl b/src/types.jl index d860ecf..fc5817d 100644 --- a/src/types.jl +++ b/src/types.jl @@ -49,7 +49,19 @@ end const ComplexOrRealVec{N, T} = Union{Vec{N, T}, ComplexVec{N, T}} ComplexVec(x::NTuple{N, T}, y::NTuple{N, T}) where {N, T <: FloatTypes} = ComplexVec(LVec{N, T}(x), LVec{N, T}(y)) -ComplexVec(z::NTuple{N, Complex{T}}) where {N, T <: FloatTypes} = ComplexVec(real.(z), imag.(z)) + +@inline @generated function ComplexVec(z::NTuple{N, Complex{T}}) where {N, T <: FloatTypes} + len = 2*N + lenm1 = len - 1 + return :( + begin + x = LVec{$len, T}(@ntuple $N i -> (reim(z[i])...)) + b = shufflevector(x, Val(0:2:$lenm1)) + c = shufflevector(x, Val(1:2:$lenm1)) + return ComplexVec{$N, T}(b, c) + end + ) +end Base.convert(::Type{ComplexVec{N, T}}, z::ComplexVec{N, T}) where {N, T <: FloatTypes} = z Base.convert(::Type{ComplexVec{N, T}}, z::Complex{T}) where {N, T <: FloatTypes} = constantvector(z, ComplexVec{N, T})