338
338
# size of dest determines loops
339
339
# function vmaterialize!(
340
340
@generated function vmaterialize! (
341
- dest:: StridedArray {T,N} , bc:: BC , :: Val{Mod}
341
+ dest:: AbstractArray {T,N} , bc:: BC , :: Val{Mod}
342
342
) where {T <: NativeTypes , N, BC <: Union{Broadcasted,Product} , Mod}
343
343
# we have an N dimensional loop.
344
344
# need to construct the LoopSet
@@ -358,18 +358,23 @@ end
358
358
add_simple_store! (ls, :dest , ArrayReference (:dest , loopsyms), elementbytes)
359
359
resize! (ls. loop_order, num_loops (ls)) # num_loops may be greater than N, eg Product
360
360
# return ls
361
- q = lower (ls)
361
+ q = lower (ls, 0 )
362
362
push! (q. args, :dest )
363
363
# @show q
364
364
# q
365
- q = Expr (:block , ls. prepreamble, Expr (:if , check_args_call (ls), q, :(Base. Broadcast. materialize! (dest, bc))))
366
- isone (N) && pushfirst! (q. args, Expr (:meta ,:inline ))
365
+ q = Expr (
366
+ :block ,
367
+ ls. prepreamble,
368
+ # Expr(:if, check_args_call(ls), Expr(:block, :(println("Primary code path!")), q), Expr(:block, :(println("Back up code path!")), :(Base.Broadcast.materialize!(dest, bc))))
369
+ Expr (:if , check_args_call (ls), q, :(Base. Broadcast. materialize! (dest, bc)))
370
+ )
371
+ # isone(N) && pushfirst!(q.args, Expr(:meta,:inline))
367
372
q
368
373
# ls
369
374
end
370
375
@generated function vmaterialize! (
371
376
dest′:: Union{Adjoint{T,A},Transpose{T,A}} , bc:: BC , :: Val{Mod}
372
- ) where {T <: NativeTypes , N, A <: StridedArray {T,N} , BC <: Union{Broadcasted,Product} , Mod}
377
+ ) where {T <: NativeTypes , N, A <: AbstractArray {T,N} , BC <: Union{Broadcasted,Product} , Mod}
373
378
# we have an N dimensional loop.
374
379
# need to construct the LoopSet
375
380
loopsyms = [gensym (:n ) for n ∈ 1 : N]
@@ -387,25 +392,30 @@ end
387
392
add_broadcast! (ls, :dest , :bc , loopsyms, BC, elementbytes)
388
393
add_simple_store! (ls, :dest , ArrayReference (:dest , reverse (loopsyms)), elementbytes)
389
394
resize! (ls. loop_order, num_loops (ls)) # num_loops may be greater than N, eg Product
390
- q = lower (ls)
395
+ q = lower (ls, 0 )
391
396
push! (q. args, :dest′ )
392
- q = Expr (:block , ls. prepreamble, Expr (:if , check_args_call (ls), q, :(Base. Broadcast. materialize! (dest′, bc))))
393
- isone (N) && pushfirst! (q. args, Expr (:meta ,:inline ))
397
+ q = Expr (
398
+ :block ,
399
+ ls. prepreamble,
400
+ Expr (:if , check_args_call (ls), q, :(Base. Broadcast. materialize! (dest′, bc)))
401
+ )
402
+ # isone(N) && pushfirst!(q.args, Expr(:meta,:inline))
394
403
q
395
404
# ls
396
405
end
397
- function vmaterialize! (
398
- dest:: StridedArray{T,N} , bc:: Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}} , :: Val{Mod}
406
+ # these are marked `@inline` so the `@avx` itself can choose whether or not to inline.
407
+ @inline function vmaterialize! (
408
+ dest:: AbstractArray{T,N} , bc:: Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}} , :: Val{Mod}
399
409
) where {T <: NativeTypes , N, T2 <: Number , Mod}
400
410
arg = T (first (bc. args))
401
411
@avx for i ∈ eachindex (dest)
402
412
dest[i] = arg
403
413
end
404
414
dest
405
415
end
406
- function vmaterialize! (
416
+ @inline function vmaterialize! (
407
417
dest′:: Union{Adjoint{T,A},Transpose{T,A}} , bc:: Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}} , :: Val{Mod}
408
- ) where {T <: NativeTypes , N, A <: StridedArray {T,N} , T2 <: Number , Mod}
418
+ ) where {T <: NativeTypes , N, A <: AbstractArray {T,N} , T2 <: NativeTypes , Mod}
409
419
arg = T (first (bc. args))
410
420
dest = parent (dest′)
411
421
@avx for i ∈ eachindex (dest)
0 commit comments