|
1 | 1 | function add_constant!(ls::LoopSet, var::Symbol, elementbytes::Int = 8) |
2 | 2 | op = Operation(length(operations(ls)), var, elementbytes, LOOPCONSTANT, constant, NODEPENDENCY, Symbol[], NOPARENTS) |
3 | | - pushpreamble!(ls, op, mangledvar(op)) |
| 3 | + pushpreamble!(ls, op, var) |
4 | 4 | pushop!(ls, op, var) |
5 | 5 | end |
6 | 6 | function add_constant!(ls::LoopSet, var, elementbytes::Int = 8) |
7 | | - sym = gensym(:temp) |
8 | | - op = Operation(length(operations(ls)), sym, elementbytes, LOOPCONSTANT, constant, NODEPENDENCY, Symbol[], NOPARENTS) |
9 | | - temp = gensym(:intermediateconst) |
10 | | - pushpreamble!(ls, Expr(:(=), temp, var)) |
11 | | - pushpreamble!(ls, op, temp) |
12 | | - pushop!(ls, op, sym) |
| 7 | + sym = gensym(:loopconstant) |
| 8 | + pushpreamble!(ls, Expr(:(=), sym, var)) |
| 9 | + add_constant!(ls, sym, elementbytes) |
13 | 10 | end |
14 | 11 | function add_constant!(ls::LoopSet, var::Symbol, mpref::ArrayReferenceMetaPosition, elementbytes::Int) |
15 | 12 | op = Operation(length(operations(ls)), var, elementbytes, LOOPCONSTANT, constant, NODEPENDENCY, Symbol[], NOPARENTS, mpref.mref) |
16 | 13 | add_vptr!(ls, op) |
17 | 14 | temp = gensym(:intermediateconstref) |
18 | 15 | pushpreamble!(ls, Expr(:(=), temp, Expr(:call, lv(:load), mpref.mref.ptr, mem_offset(op, UnrollArgs(zero(Int32), Symbol(""), Symbol(""), nothing))))) |
19 | 16 | pushpreamble!(ls, op, temp) |
20 | | - pushop!(ls, op, var) |
| 17 | + pushop!(ls, op, temp) |
21 | 18 | end |
22 | 19 | # This version has loop dependencies. var gets assigned to sym when lowering. |
23 | | -function add_constant!(ls::LoopSet, var::Symbol, deps::Vector{Symbol}, sym::Symbol = gensym(:constant), f::Symbol = Symbol(""), elementbytes::Int = 8) |
24 | | - # length(deps) == 0 && push!(ls.preamble.args, Expr(:(=), sym, var)) |
25 | | - pushop!(ls, Operation(length(operations(ls)), sym, elementbytes, Instruction(f,var), constant, deps, NODEPENDENCY, NOPARENTS), sym) |
| 20 | +function add_constant!( |
| 21 | + ls::LoopSet, value::Symbol, deps::Vector{Symbol}, assignedsym::Symbol = gensym(:constant), elementbytes::Int = 8, f::Symbol = Symbol("") |
| 22 | +) |
| 23 | + op = Operation(length(operations(ls)), assignedsym, elementbytes, Instruction(f, value), constant, deps, NODEPENDENCY, NOPARENTS) |
| 24 | + pushop!(ls, op, assignedsym) |
| 25 | +end |
| 26 | +function add_constant!( |
| 27 | + ls::LoopSet, value, deps::Vector{Symbol}, assignedsym::Symbol = gensym(:constant), elementbytes::Int = 8, f::Symbol = Symbol("") |
| 28 | +) |
| 29 | + intermediary = gensym(:intermediate) # hack, passing meta info here |
| 30 | + pushpreamble!(ls, Expr(:(=), intermediary, value)) |
| 31 | + add_constant!(ls, intermediary, deps, assignedsym, f, elementbytes) |
26 | 32 | end |
27 | | - |
28 | 33 | function add_constant!( |
29 | | - ls::LoopSet, var, deps::Vector{Symbol}, sym::Symbol = gensym(:constant), f::Symbol = Symbol(""), elementbytes::Int = 8 |
| 34 | + ls::LoopSet, value::Number, deps::Vector{Symbol}, assignedsym::Symbol = gensym(:constant), elementbytes::Int = 8 |
30 | 35 | ) |
31 | | - sym2 = gensym(:temp) # hack, passing meta info here |
32 | | - op = Operation(length(operations(ls)), sym, elementbytes, Instruction(f, sym2), constant, deps, NODEPENDENCY, NOPARENTS) |
33 | | - # @show f, sym, name(op), mangledvar(op) |
34 | | - # temp = gensym(:temp2) |
35 | | - # pushpreamble!(ls, Expr(:(=), temp, var)) |
36 | | - pushpreamble!(ls, op, var)#temp) |
37 | | - pushop!(ls, op, sym) |
| 36 | + op = add_constant!(ls, gensym(Symbol(value)), deps, assignedsym, elementbytes, :numericconstant) |
| 37 | + if iszero(value) |
| 38 | + push!(ls.preamble_zeros, identifier(op)) |
| 39 | + elseif isone(value) |
| 40 | + push!(ls.preamble_ones, identifier(op)) |
| 41 | + else |
| 42 | + pushpreamble!(ls, op, value) |
| 43 | + end |
| 44 | + op |
38 | 45 | end |
0 commit comments