@@ -197,29 +197,32 @@ end
197197 return tupexpr(i -> :(rand(V)), N)
198198end
199199
200- @generated function scale_tuple(tup:: NTuple{N} , x) where N
201- return tupexpr(i -> :(tup[$ i] * x), N)
202- end
203-
204- @generated function div_tuple_by_scalar(tup:: NTuple{N} , x) where N
205- return tupexpr(i -> :(tup[$ i] / x), N)
206- end
207-
208- @generated function add_tuples(a:: NTuple{N} , b:: NTuple{N} ) where N
209- return tupexpr(i -> :(a[$ i] + b[$ i]), N)
210- end
211200
212- @generated function sub_tuples(a:: NTuple{N} , b:: NTuple{N} ) where N
213- return tupexpr(i -> :(a[$ i] - b[$ i]), N)
214- end
215-
216- @generated function minus_tuple(tup:: NTuple{N} ) where N
217- return tupexpr(i -> :(- tup[$ i]), N)
218- end
219-
220- @generated function mul_tuples(a:: NTuple{N} , b:: NTuple{N} , afactor, bfactor) where N
221- return tupexpr(i -> :((afactor * a[$ i]) + (bfactor * b[$ i])), N)
222- end
201+ const SIMDFloat = Union{Float64, Float32}
202+ const SIMDInt = Union{
203+ Int128, Int64, Int32, Int16, Int8,
204+ UInt128, UInt64, UInt32, UInt16, UInt8,
205+ }
206+ const SIMDType = Union{SIMDFloat, SIMDInt}
207+ const NT{N,T} = NTuple{N,T}
208+ using SIMD
209+
210+ # SIMD implementation
211+ add_tuples(a:: NT{N,T} , b:: NT{N,T} ) where {N, T<: SIMDType } = Tuple(Vec(a) + Vec(b))
212+ sub_tuples(a:: NT{N,T} , b:: NT{N,T} ) where {N, T<: SIMDType } = Tuple(Vec(a) - Vec(b))
213+ scale_tuple(tup:: NT{N,T} , x:: T ) where {N, T<: SIMDType } = Tuple(Vec(tup) * x)
214+ div_tuple_by_scalar(tup:: NT{N,T} , x:: T ) where {N, T<: SIMDFloat } = Tuple(Vec(tup) / x)
215+ minus_tuple(tup:: NT{N,T} ) where {N, T<: SIMDType } = Tuple(- Vec(tup))
216+ mul_tuples(a:: NT{N,T} , b:: NT{N,T} , af:: T , bf:: T ) where {N, T<: SIMDType } = Tuple(muladd(Vec{N,T}(af), Vec(a), Vec{N,T}(bf) * Vec(b)))
217+
218+
219+ # Fallback implementations
220+ @generated add_tuples(a:: NT{N} , b:: NT{N} ) where N = tupexpr(i -> :(a[$ i] + b[$ i]), N)
221+ @generated sub_tuples(a:: NT{N} , b:: NT{N} ) where N = tupexpr(i -> :(a[$ i] - b[$ i]), N)
222+ @generated scale_tuple(tup:: NT{N} , x) where N = tupexpr(i -> :(tup[$ i] * x), N)
223+ @generated div_tuple_by_scalar(tup:: NT{N} , x) where N = tupexpr(i -> :(tup[$ i] / x), N)
224+ @generated minus_tuple(tup:: NT{N} ) where N = tupexpr(i -> :(- tup[$ i]), N)
225+ @generated mul_tuples(a:: NT{N} , b:: NT{N} , af, bf) where N = tupexpr(i -> :((af * a[$ i]) + (bf * b[$ i])), N)
223226
224227# ##################
225228# Pretty Printing #
0 commit comments