|
141 | 141 | @inline _mul_partials(a::Partials{0,A}, b::Partials{N,B}, afactor, bfactor) where {N,A,B} = bfactor * b |
142 | 142 | @inline _mul_partials(a::Partials{N,A}, b::Partials{0,B}, afactor, bfactor) where {N,A,B} = afactor * a |
143 | 143 |
|
144 | | -const SIMDFloat = Union{Float64, Float32} |
145 | | -const SIMDInt = Union{ |
146 | | - Int128, Int64, Int32, Int16, Int8, |
147 | | - UInt128, UInt64, UInt32, UInt16, UInt8, |
148 | | - } |
149 | | -const SIMDType = Union{SIMDFloat, SIMDInt} |
150 | | - |
151 | 144 | ################################## |
152 | 145 | # Generated Functions on NTuples # |
153 | 146 | ################################## |
|
171 | 164 | @inline rand_tuple(::AbstractRNG, ::Type{Tuple{}}) = tuple() |
172 | 165 | @inline rand_tuple(::Type{Tuple{}}) = tuple() |
173 | 166 |
|
174 | | -iszero_tuple(tup::NTuple{N,V}) where {N, V<:SIMDType} = sum(Vec(tup) != zero(V)) == 0 |
175 | 167 | @generated function iszero_tuple(tup::NTuple{N,V}) where {N,V} |
176 | 168 | ex = Expr(:&&, [:(z == tup[$i]) for i=1:N]...) |
177 | 169 | return quote |
@@ -205,24 +197,29 @@ end |
205 | 197 | return tupexpr(i -> :(rand(V)), N) |
206 | 198 | end |
207 | 199 |
|
208 | | -const NT{N,T} = NTuple{N,T} |
| 200 | +@generated function scale_tuple(tup::NTuple{N}, x) where N |
| 201 | + return tupexpr(i -> :(tup[$i] * x), N) |
| 202 | +end |
209 | 203 |
|
210 | | -# SIMD implementation |
211 | | -@inline add_tuples(a::NT{N,T}, b::NT{N,T}) where {N, T<:SIMDType} = Tuple(Vec(a) + Vec(b)) |
212 | | -@inline sub_tuples(a::NT{N,T}, b::NT{N,T}) where {N, T<:SIMDType} = Tuple(Vec(a) - Vec(b)) |
213 | | -@inline scale_tuple(tup::NT{N,T}, x::T) where {N, T<:SIMDType} = Tuple(Vec(tup) * x) |
214 | | -@inline div_tuple_by_scalar(tup::NT{N,T}, x::T) where {N, T<:SIMDFloat} = Tuple(Vec(tup) / x) |
215 | | -@inline minus_tuple(tup::NT{N,T}) where {N, T<:SIMDType} = Tuple(-Vec(tup)) |
216 | | -@inline mul_tuples(a::NT{N,T}, b::NT{N,T}, af::T, bf::T) where {N, T<:SIMDType} = Tuple(muladd(af, Vec(a), bf * Vec(b))) |
| 204 | +@generated function div_tuple_by_scalar(tup::NTuple{N}, x) where N |
| 205 | + return tupexpr(i -> :(tup[$i] / x), N) |
| 206 | +end |
217 | 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 |
218 | 211 |
|
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 -> :(muladd(af, a[$i], bf * b[$i])), N) |
| 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 |
226 | 223 |
|
227 | 224 | ################### |
228 | 225 | # Pretty Printing # |
|
0 commit comments