1
1
function lower_load_scalar! (
2
- q:: Expr , op:: Operation , vectorized:: Symbol , W:: Symbol , unrolled:: Symbol , tiled :: Symbol , U :: Int ,
3
- suffix :: Union{Nothing, Int} , mask :: Union{Nothing,Symbol,Unsigned} = nothing , umin:: Int = 0
2
+ q:: Expr , op:: Operation , vectorized:: Symbol , W:: Symbol , unrolled:: Symbol ,
3
+ tiled :: Symbol , U :: Int , suffix :: Union{Nothing,Int} , umin:: Int = 0
4
4
)
5
5
loopdeps = loopdependencies (op)
6
6
@assert vectorized ∉ loopdeps
7
7
var = variable_name (op, suffix)
8
8
ptr = refname (op)
9
9
isunrolled = unrolled ∈ loopdeps
10
10
U = isunrolled ? U : 1
11
- for u ∈ umin: U- 1
12
- varname = varassignname (var, u, isunrolled)
13
- td = UnrollArgs (u, unrolled, tiled, suffix)
14
- push! (q. args, Expr (:(= ), varname, Expr (:call , lv (:vload ), ptr, mem_offset_u (op, td))))
11
+ if instruction (op). instr != = :conditionalload
12
+ for u ∈ umin: U- 1
13
+ varname = varassignname (var, u, isunrolled)
14
+ td = UnrollArgs (u, unrolled, tiled, suffix)
15
+ push! (q. args, Expr (:(= ), varname, Expr (:call , lv (:vload ), ptr, mem_offset_u (op, td))))
16
+ end
17
+ else
18
+ condop = last (parents (op))
19
+ condvar = variable_name (condop, suffix)
20
+ condunrolled = any (isequal (unrolled), loopdependencies (condop))
21
+ for u ∈ umin: U- 1
22
+ condsym = condunrolled ? Symbol (condvar, u) : condvar
23
+ varname = varassignname (var, u, isunrolled)
24
+ td = UnrollArgs (u, unrolled, tiled, suffix)
25
+ load = Expr (:call , lv (:vload ), ptr, mem_offset_u (op, td))
26
+ cload = Expr (:if , condsym, load, Expr (:call , :zero , Expr (:call , :eltype , ptr)))
27
+ push! (q. args, Expr (:(= ), varname, cload))
28
+ end
15
29
end
16
30
nothing
17
31
end
18
- function pushvectorload! (q:: Expr , op:: Operation , var:: Symbol , td:: UnrollArgs , U:: Int , W:: Symbol , mask, vecnotunrolled:: Bool )
19
- @unpack u, unrolled = td
32
+ function pushvectorload! (
33
+ q:: Expr , op:: Operation , var:: Symbol , td:: UnrollArgs , U:: Int , W:: Symbol , vectorized:: Symbol , mask
34
+ )
35
+ @unpack u, unrolled, suffix = td
20
36
ptr = refname (op)
37
+ vecnotunrolled = vectorized != = unrolled
21
38
name, mo = name_memoffset (var, op, td, W, vecnotunrolled)
22
39
instrcall = Expr (:call , lv (:vload ), ptr, mo)
23
- if mask != = nothing && (vecnotunrolled || u == U - 1 )
40
+
41
+ iscondstore = instruction (op). instr === :conditionalload
42
+ maskend = mask != = nothing && (vecnotunrolled || u == U - 1 )
43
+ if iscondstore
44
+ condop = last (parents (op))
45
+ # @show condop
46
+ condsym = variable_name (condop, suffix)
47
+ condsym = any (isequal (unrolled), loopdependencies (condop)) ? Symbol (condsym, u) : condsym
48
+ if vectorized ∈ loopdependencies (condop)
49
+ if maskend
50
+ push! (instrcall. args, Expr (:call , :& , condsym, mask))
51
+ else
52
+ push! (instrcall. args, condsym)
53
+ end
54
+ else
55
+ if maskend
56
+ push! (instrcall. args, mask)
57
+ end
58
+ instrcall = Expr (:if , condsym, instrcall, Expr (:call , lv (:vzero ), W, Expr (:call , :eltype , ptr)))
59
+ end
60
+ elseif maskend
24
61
push! (instrcall. args, mask)
25
62
end
26
63
push! (q. args, Expr (:(= ), name, instrcall))
@@ -40,10 +77,9 @@ function lower_load_vectorized!(
40
77
end
41
78
# Urange = unrolled ∈ loopdeps ? 0:U-1 : 0
42
79
var = variable_name (op, suffix)
43
- vecnotunrolled = vectorized != = unrolled
44
80
for u ∈ umin: U- 1
45
81
td = UnrollArgs (u, unrolled, tiled, suffix)
46
- pushvectorload! (q, op, var, td, U, W, mask, vecnotunrolled )
82
+ pushvectorload! (q, op, var, td, U, W, vectorized, mask )
47
83
end
48
84
nothing
49
85
end
@@ -73,6 +109,6 @@ function lower_load!(
73
109
if vectorized ∈ loopdependencies (op)
74
110
lower_load_vectorized! (q, op, vectorized, W, unrolled, tiled, U, suffix, mask, umin)
75
111
else
76
- lower_load_scalar! (q, op, vectorized, W, unrolled, tiled, U, suffix, mask, umin)
112
+ lower_load_scalar! (q, op, vectorized, W, unrolled, tiled, U, suffix, umin)
77
113
end
78
114
end
0 commit comments