-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathfor.singeli
44 lines (40 loc) · 892 Bytes
/
for.singeli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
local {
include 'skin/cop'
def ux = primtype{'u', width{*void}}
def num{n} = is{'number',kind{n}}
def loop_var{a, b} = {
if (num{a}) { cast{if (num{b}) ux else type{b}, a} }
else {
def ta=type{a}
match (b) { {_:tb if ta<tb}=>promote{tb,a}; {_}=>a }
}
}
}
def for{vars,begin,end,iter} = {
i := loop_var{begin, end}
while (i < end) {
iter{i, vars}
i = i + 1
}
}
def for_backwards{vars,begin,end,iter} = {
i := loop_var{end, begin}
while (i > begin) {
i = i - 1
iter{i, vars}
}
}
def for_const{vars,begin,end,iter if num{begin} and num{end}} = {
each{iter{., vars}, begin + range{end-begin}}
}
def for_unroll{unr if num{unr}}{vars,begin,end,iter} = {
i := loop_var{begin, end}
while (i + unr <= end) {
each{{j}=>iter{i+j, vars}, range{unr}}
i = i + unr
}
while (i < end) {
iter{i, vars}
i = i + 1
}
}