1
- function Loop (ls:: LoopSet , l:: Int , :: Type{UnitRange{Int}} )
2
- start = gensym (:loopstart ) ; stop = gensym (:loopstop )
1
+ function Loop (ls:: LoopSet , l:: Int , sym :: Symbol , :: Type{UnitRange{Int}} )
2
+ start = gensym (String (sym) * " _loopstart " ) ; stop = gensym (String (sym) * " _loopstop " )
3
3
pushpreamble! (ls, Expr (:(= ), start, Expr (:macrocall , Symbol (" @inbounds" ), LineNumberNode (@__LINE__ , Symbol (@__FILE__ )), Expr (:(.), Expr (:ref , :lb , l), QuoteNode (:start )))))
4
4
pushpreamble! (ls, Expr (:(= ), stop, Expr (:macrocall , Symbol (" @inbounds" ), LineNumberNode (@__LINE__ , Symbol (@__FILE__ )), Expr (:(.), Expr (:ref , :lb , l), QuoteNode (:stop )))))
5
- Loop (gensym ( :n ) , 0 , 1024 , start, stop, false , false ):: Loop
5
+ Loop (sym , 0 , 1024 , start, stop, false , false ):: Loop
6
6
end
7
- function Loop (ls:: LoopSet , l:: Int , :: Type{StaticUpperUnitRange{U}} ) where {U}
8
- start = gensym (:loopstart )
7
+ function Loop (ls:: LoopSet , l:: Int , sym :: Symbol , :: Type{StaticUpperUnitRange{U}} ) where {U}
8
+ start = gensym (String (sym) * " _loopstart " )
9
9
pushpreamble! (ls, Expr (:(= ), start, Expr (:macrocall , Symbol (" @inbounds" ), LineNumberNode (@__LINE__ , Symbol (@__FILE__ )), Expr (:(.), Expr (:ref , :lb , l), QuoteNode (:L )))))
10
- Loop (gensym ( :n ) , U - 1024 , U, start, Symbol (" " ), false , true ):: Loop
10
+ Loop (sym , U - 1024 , U, start, Symbol (" " ), false , true ):: Loop
11
11
end
12
- function Loop (ls:: LoopSet , l:: Int , :: Type{StaticLowerUnitRange{L}} ) where {L}
13
- stop = gensym (:loopstop )
12
+ function Loop (ls:: LoopSet , l:: Int , sym :: Symbol , :: Type{StaticLowerUnitRange{L}} ) where {L}
13
+ stop = gensym (String (sym) * " _loopstop " )
14
14
pushpreamble! (ls, Expr (:(= ), stop, Expr (:macrocall , Symbol (" @inbounds" ), LineNumberNode (@__LINE__ , Symbol (@__FILE__ )), Expr (:(.), Expr (:ref , :lb , l), QuoteNode (:U )))))
15
- Loop (gensym ( :n ) , L, L + 1024 , Symbol (" " ), stop, true , false ):: Loop
15
+ Loop (sym , L, L + 1024 , Symbol (" " ), stop, true , false ):: Loop
16
16
end
17
17
# Is there any likely way to generate such a range?
18
18
# function Loop(ls::LoopSet, l::Int, ::Type{StaticLengthUnitRange{N}}) where {N}
21
21
# pushpreamble!(ls, Expr(:(=), stop, Expr(:call, :(+), start, N - 1)))
22
22
# Loop(gensym(:n), 0, N, start, stop, false, false)::Loop
23
23
# end
24
- function Loop (ls, l, :: Type{StaticUnitRange{L,U}} ) where {L,U}
25
- Loop (gensym ( :n ) , L, U, Symbol (" " ), Symbol (" " ), true , true ):: Loop
24
+ function Loop (ls, l, sym :: Symbol , :: Type{StaticUnitRange{L,U}} ) where {L,U}
25
+ Loop (sym , L, U, Symbol (" " ), Symbol (" " ), true , true ):: Loop
26
26
end
27
27
28
- function add_loops! (ls:: LoopSet , LB)
29
- loopsyms = [ gensym ( :n ) for _ ∈ eachindex (LB)]
30
- for (i,l) ∈ enumerate (LB)
31
- add_loop! (ls, Loop (ls, i, l ):: Loop )
28
+ function add_loops! (ls:: LoopSet , LPSYM, LB)
29
+ n = max ( length (LPSYM), length (LB))
30
+ for i = 1 : n
31
+ add_loop! (ls, Loop (ls, i, LPSYM[i], LB[i] ):: Loop )
32
32
end
33
33
end
34
+
34
35
function ArrayReferenceMeta (
35
- ls:: LoopSet , ar:: ArrayRefStruct , arraysymbolinds:: Vector{Symbol} , opsymbols:: Vector{Symbol} ,
36
- array:: Symbol , vp:: Symbol
36
+ ls:: LoopSet , @nospecialize (ar:: ArrayRefStruct ), arraysymbolinds:: Vector{Symbol} , opsymbols:: Vector{Symbol}
37
37
)
38
38
index_types = ar. index_types
39
39
indices = ar. indices
@@ -61,8 +61,8 @@ function ArrayReferenceMeta(
61
61
ni -= 1
62
62
end
63
63
ArrayReferenceMeta (
64
- ArrayReference (array, index_vec, offset_vec),
65
- loopedindex, vp
64
+ ArrayReference (array (ar) , index_vec, offset_vec),
65
+ loopedindex, ptr (ar)
66
66
)
67
67
end
68
68
105
105
function create_mrefs! (ls:: LoopSet , arf:: Vector{ArrayRefStruct} , as:: Vector{Symbol} , os:: Vector{Symbol} , vargs)
106
106
mrefs = Vector {ArrayReferenceMeta} (undef, length (arf))
107
107
for i ∈ eachindex (arf)
108
- ar = ArrayReferenceMeta (ls, arf[i], as, os, Symbol ( " " ), gensym () )
108
+ ar = ArrayReferenceMeta (ls, arf[i], as, os)
109
109
add_mref! (ls, ar, i, vargs[i])
110
110
mrefs[i] = ar
111
111
end
@@ -222,11 +222,11 @@ function sizeofeltypes(v, num_arrays)::Int
222
222
sizeof (T)
223
223
end
224
224
225
- function avx_loopset (instr, ops, arf, AM, LB, vargs)
225
+ function avx_loopset (instr, ops, arf, AM, LPSYM, LB, vargs)
226
226
ls = LoopSet (:LoopVectorization )
227
227
num_arrays = length (arf)
228
228
elementbytes = sizeofeltypes (vargs, num_arrays)
229
- add_loops! (ls, LB)
229
+ add_loops! (ls, LPSYM, LB)
230
230
resize! (ls. loop_order, length (LB))
231
231
arraysymbolinds = process_metadata! (ls, AM, length (arf))
232
232
opsymbols = [gensym (:op ) for _ ∈ eachindex (ops)]
@@ -245,22 +245,22 @@ function avx_body(ls, UT)
245
245
q
246
246
end
247
247
248
- function _avx_loopset_debug (:: Type{OPS} , :: Type{ARF} , :: Type{AM} , :: Type{LB} , vargs... ) where {UT, OPS, ARF, AM, LB}
249
- @show OPS ARF AM LB vargs
250
- _avx_loopset (OPS. parameters, ARF. parameters, AM. parameters, LB. parameters, typeof .(vargs))
248
+ function _avx_loopset_debug (:: Type{OPS} , :: Type{ARF} , :: Type{AM} , :: Type{LPSYM} , :: Type{ LB} , vargs... ) where {UT, OPS, ARF, AM, LPSYM , LB}
249
+ @show OPS ARF AM LPSYM LB vargs
250
+ _avx_loopset (OPS. parameters, ARF. parameters, AM. parameters, LPSYM . parameters, LB. parameters, typeof .(vargs))
251
251
end
252
- function _avx_loopset (OPSsv, ARFsv, AMsv, LBsv, vargs) where {UT, OPS, ARF, AM, LB}
252
+ function _avx_loopset (OPSsv, ARFsv, AMsv, LPSYMsv, LBsv, vargs)
253
253
nops = length (OPSsv) ÷ 3
254
254
instr = Instruction[Instruction (OPSsv[3 i+ 1 ], OPSsv[3 i+ 2 ]) for i ∈ 0 : nops- 1 ]
255
255
ops = OperationStruct[ OPSsv[3 i] for i ∈ 1 : nops ]
256
256
avx_loopset (
257
257
instr, ops,
258
258
ArrayRefStruct[ARFsv... ],
259
- AMsv, LBsv, vargs
259
+ AMsv, LPSYMsv, LBsv, vargs
260
260
)
261
261
end
262
- @generated function _avx_! (:: Val{UT} , :: Type{OPS} , :: Type{ARF} , :: Type{AM} , lb:: LB , vargs... ) where {UT, OPS, ARF, AM, LB}
263
- ls = _avx_loopset (OPS. parameters, ARF. parameters, AM. parameters, LB. parameters, vargs)
262
+ @generated function _avx_! (:: Val{UT} , :: Type{OPS} , :: Type{ARF} , :: Type{AM} , :: Type{LPSYM} , lb:: LB , vargs... ) where {UT, OPS, ARF, AM, LPSYM , LB}
263
+ ls = _avx_loopset (OPS. parameters, ARF. parameters, AM. parameters, LPSYM . parameters, LB. parameters, vargs)
264
264
avx_body (ls, UT)
265
265
end
266
266
0 commit comments