@@ -161,12 +161,11 @@ end
161
161
@generated function vmaterialize! (
162
162
dest:: AbstractArray{T,N} , bc:: BC
163
163
) where {T <: Union{Float32,Float64} , N, BC <: Broadcasted }
164
- # ) where {N, T, BC <: Broadcasted}
165
164
# we have an N dimensional loop.
166
165
# need to construct the LoopSet
167
166
loopsyms = [gensym (:n ) for n ∈ 1 : N]
168
167
ls = LoopSet ()
169
- sizes = Expr (:tuple , )
168
+ sizes = Expr (:tuple )
170
169
for (n,itersym) ∈ enumerate (loopsyms)
171
170
Nsym = gensym (:N )
172
171
ls. loops[itersym] = Loop (itersym, Nsym)
183
182
q
184
183
# ls
185
184
end
185
+ @generated function vmaterialize! (
186
+ dest′:: Union{Adjoint{T,A},Transpose{T,A}} , bc:: BC
187
+ ) where {T <: Union{Float32,Float64} , N, A <: AbstractArray{T,N} , BC <: Broadcasted }
188
+ # we have an N dimensional loop.
189
+ # need to construct the LoopSet
190
+ loopsyms = [gensym (:n ) for n ∈ 1 : N]
191
+ ls = LoopSet ()
192
+ pushpreamble! (ls, Expr (:(= ), :dest , Expr (:call , :parent , :dest′ )))
193
+ sizes = Expr (:tuple )
194
+ for (n,itersym) ∈ enumerate (loopsyms)
195
+ Nsym = gensym (:N )
196
+ ls. loops[itersym] = Loop (itersym, Nsym)
197
+ push! (sizes. args, Nsym)
198
+ end
199
+ pushpreamble! (ls, Expr (:(= ), sizes, Expr (:call , :size , :dest′ )))
200
+ elementbytes = sizeof (T)
201
+ add_broadcast! (ls, :dest , :bc , loopsyms, BC, elementbytes)
202
+ add_store! (ls, :dest , ArrayReference (:dest , reverse (loopsyms), Ref {Bool} (false )), elementbytes)
203
+ resize! (ls. loop_order, num_loops (ls)) # num_loops may be greater than N, eg Product
204
+ q = lower (ls)
205
+ push! (q. args, :dest′ )
206
+ pushfirst! (q. args, Expr (:meta ,:inline ))
207
+ q
208
+ # ls
209
+ end
186
210
187
211
function vmaterialize (bc:: Broadcasted )
188
212
ElType = Base. Broadcast. combine_eltypes (bc. f, bc. args)
0 commit comments