-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfoldl.as
323 lines (323 loc) · 14.7 KB
/
foldl.as
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
lw 0 5 entry
lw 0 7 stack
jalr 5 6
sw 0 1 SCMrv
SCMh halt
noop
Lcons lw 0 5 heap
lw 0 4 consS
add 4 5 4
sw 0 4 heap
sw 4 1 0
sw 4 2 1
lw 0 5 ctag
add 4 5 1
jalr 6 5
noop
Lcar lw 0 5 pmask
nand 1 5 1
nand 1 1 1
lw 1 1 0
jalr 6 5
noop
noop
Lcdr lw 0 5 pmask
nand 1 5 1
nand 1 1 1
lw 1 1 1
jalr 6 5
noop ; [not] '(code (v) (if (not (primcall %eq? #f v)) #f #t))
L0 lw 0 4 C0 ; #f
beq 4 1 I2
beq 0 0 I1
I2 lw 0 1 C1 ; #t
jalr 6 4 ; return
I1 lw 0 1 C0 ; #f
jalr 6 4 ; return
noop ; [zero?] '(code (v) (if (primcall %zero? v) #t #f))
L1 beq 0 1 I8
lw 0 1 C0 ; #f
jalr 6 4 ; return
I8 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [negative?] '(code (v) (if (primcall %zero? (primcall %band v %sign-bit)) #f #t))
L2 lw 0 5 C2 ; %sign-bit
nand 1 5 2
nand 2 2 2 (temp 1) = (local v) & (constant 2147483648 %sign-bit)
beq 0 2 I13
lw 0 1 C1 ; #t
jalr 6 4 ; return
I13 lw 0 1 C0 ; #f
jalr 6 4 ; return
noop ; [positive?] '(code (v) (if (or (primcall %zero? v) (not (primcall %eq? #f (call not (call zero? (primcall %band v %sign-bit)))))) #f #t))
L3 lw 0 4 C3
add 7 4 7 ; SP -= 5
beq 0 1 I20
lw 0 5 C2 ; %sign-bit
nand 1 5 2
nand 2 2 2 (temp 1) = (local v) & (constant 2147483648 %sign-bit)
sw 7 6 5 ; store saved value return-addr
add 0 2 1 ; marshal arg 1
lw 0 5 A1 ; load address of zero?
jalr 5 6 ; call (zero? (temp 1))
lw 0 5 A0 ; load address of not
jalr 5 6 ; call (not (temp 2))
add 0 1 2 ; move result to (temp 3)
lw 7 6 5 ; load restored value return-addr
lw 0 4 C0 ; #f
beq 4 2 I21
beq 0 0 I20
I21 lw 0 1 C1 ; #t
lw 0 4 C4
add 7 4 7 ; SP += 5
jalr 6 4 ; return
I20 lw 0 1 C0 ; #f
lw 0 4 C4
add 7 4 7 ; SP += 5
jalr 6 4 ; return
noop ; [even?] '(code (v) (call zero? (primcall %band v 1)))
L4 lw 0 4 C3
add 7 4 7 ; SP -= 5
lw 0 5 C5 ; 1
nand 1 5 2
nand 2 2 2 (temp 1) = (local v) & (constant 1 1)
add 0 2 1 ; marshal arg 1
lw 0 4 C4
add 7 4 7 ; SP += 5
lw 0 4 A1 ; load target address
jalr 4 5 ; tail-call (zero? (temp 1))
noop ; [odd?] '(code (v) (if (primcall %zero? (primcall %band v 1)) #f #t))
L5 lw 0 5 C5 ; 1
nand 1 5 2
nand 2 2 2 (temp 1) = (local v) & (constant 1 1)
beq 0 2 I37
lw 0 1 C1 ; #t
jalr 6 4 ; return
I37 lw 0 1 C0 ; #f
jalr 6 4 ; return
noop ; [+] '(code (x y) (primcall %add x y))
L6 add 1 2 3 (temp 0) = (local x) + (local y)
add 0 3 1 ; place return value
jalr 6 4 ; return
noop ; [boolean?] '(code (v) (if (primcall %eq? (primcall %band %type-tag-mask v) %bool-tag) #t #f))
L7 lw 0 4 C6 ; %type-tag-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 4261412864 %type-tag-mask) & (local v)
lw 0 5 C0 ; %bool-tag
beq 2 5 I46
lw 0 1 C0 ; #f
jalr 6 4 ; return
I46 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [char?] '(code (v) (if (primcall %eq? (primcall %band %type-tag-mask v) %char-tag) #t #f))
L8 lw 0 4 C6 ; %type-tag-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 4261412864 %type-tag-mask) & (local v)
lw 0 5 C7 ; %char-tag
beq 2 5 I53
lw 0 1 C0 ; #f
jalr 6 4 ; return
I53 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [eq?] '(code (obj1 obj2) (if (primcall %eq? obj1 obj2) #t #f))
L9 beq 1 2 I60
lw 0 1 C0 ; #f
jalr 6 4 ; return
I60 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [empty?] '(code (v) (if (primcall %eq? v ()) #t #f))
L10 lw 0 5 C8 ; ()
beq 1 5 I65
lw 0 1 C0 ; #f
jalr 6 4 ; return
I65 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [null?] '(code (v) (if (primcall %eq? v ()) #t #f))
L11 lw 0 5 C8 ; ()
beq 1 5 I70
lw 0 1 C0 ; #f
jalr 6 4 ; return
I70 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [pair?] '(code (v) (if (primcall %eq? (primcall %band %type-tag-mask v) %cons-tag) #t #f))
L12 lw 0 4 C6 ; %type-tag-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 4261412864 %type-tag-mask) & (local v)
lw 0 5 C9 ; %cons-tag
beq 2 5 I75
lw 0 1 C0 ; #f
jalr 6 4 ; return
I75 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [integer?] '(code (v) (if (primcall %eq? (primcall %band %tagged-mask v) %tagged-tag) #f #t))
L13 lw 0 4 C10 ; %tagged-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 3221225472 %tagged-mask) & (local v)
lw 0 5 C7 ; %tagged-tag
beq 2 5 I82
lw 0 1 C1 ; #t
jalr 6 4 ; return
I82 lw 0 1 C0 ; #f
jalr 6 4 ; return
noop ; [number?] '(code (v) (if (primcall %eq? (primcall %band %tagged-mask v) %tagged-tag) #f #t))
L14 lw 0 4 C10 ; %tagged-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 3221225472 %tagged-mask) & (local v)
lw 0 5 C7 ; %tagged-tag
beq 2 5 I89
lw 0 1 C1 ; #t
jalr 6 4 ; return
I89 lw 0 1 C0 ; #f
jalr 6 4 ; return
noop ; [procedure?] '(code (v) (if (primcall %eq? (primcall %band %type-tag-mask v) %proc-tag) #t #f))
L15 lw 0 4 C6 ; %type-tag-mask
nand 4 1 2
nand 2 2 2 (temp 1) = (constant 4261412864 %type-tag-mask) & (local v)
lw 0 5 C11 ; %proc-tag
beq 2 5 I96
lw 0 1 C0 ; #f
jalr 6 4 ; return
I96 lw 0 1 C1 ; #t
jalr 6 4 ; return
noop ; [foldl] '(code (proc init lst) (if (primcall %eq? lst ()) init (call foldl proc (call proc init (call car lst)) (call cdr lst))))
L16 lw 0 4 C12
add 7 4 7 ; SP -= 6
I102 sw 7 6 6 ; store spilled value return-addr
sw 7 2 1 ; store spilled value (local init)
lw 0 5 C8 ; ()
beq 3 5 I103
sw 7 1 5 ; store saved value (local proc)
sw 7 3 3 ; store saved value (local lst)
lw 7 1 3 ; load arg value (local lst)
lw 0 5 Acar ; load address of car
jalr 5 6 ; call (car (local lst))
add 0 1 6 ; move result to (temp 1)
lw 7 1 5 ; load restored value (local proc)
lw 0 4 C13 ; load pointer mask
nand 4 1 5
nand 5 5 5
sw 7 1 5 ; store saved value (local proc)
lw 7 1 1 ; load arg value (local init)
add 0 6 2 ; marshal arg 2
jalr 5 6 ; call ((local proc) (local init) (temp 1))
add 0 1 2 ; move result to (temp 2)
sw 7 2 4 ; store saved value (temp 2)
lw 7 1 3 ; load arg value (local lst)
lw 0 5 Acdr ; load address of cdr
jalr 5 6 ; call (cdr (local lst))
add 0 1 6 ; move result to (temp 3)
lw 7 1 5 ; load arg value (local proc)
lw 7 2 4 ; load arg value (temp 2)
add 0 6 3 ; marshal arg 3
lw 7 6 6 ; load spilled value return-addr
beq 0 0 I102 ; tail-call (<self> (local proc) (temp 2) (temp 3))
I103 lw 7 1 1 ; load spilled value (local init)
lw 7 5 6 ; load spilled value return-addr
lw 0 4 C14
add 7 4 7 ; SP += 6
jalr 5 4 ; return
noop ; [%toplevel] '(code () (call foldl + 0 (call cons 1 (call cons 2 (call cons 3 (call cons 4 (call cons 5 empty)))))))
L17 lw 0 4 C3
add 7 4 7 ; SP -= 5
sw 7 6 5 ; store saved value return-addr
lw 0 1 C4
lw 0 2 C8
lw 0 5 Acons ; load address of cons
jalr 5 6 ; call (cons (constant 5 5) (constant 1140850688 empty))
sw 7 1 4 ; store arg value #f
lw 0 1 C15
lw 7 2 4 ; load arg value (temp 1)
lw 0 5 Acons ; load address of cons
jalr 5 6 ; call (cons (constant 4 4) (temp 1))
add 0 1 2 ; move result to (temp 2)
lw 0 1 C16
lw 0 5 Acons ; load address of cons
jalr 5 6 ; call (cons (constant 3 3) (temp 2))
sw 7 1 4 ; store arg value #f
lw 0 1 C17
lw 7 2 4 ; load arg value (temp 3)
lw 0 5 Acons ; load address of cons
jalr 5 6 ; call (cons (constant 2 2) (temp 3))
add 0 1 2 ; move result to (temp 4)
lw 0 1 C5
lw 0 5 Acons ; load address of cons
jalr 5 6 ; call (cons (constant 1 1) (temp 4))
lw 0 2 P6 ; (temp 6) = &+
sw 7 1 4 ; store arg value #f
add 0 2 1 ; marshal arg 1
lw 0 2 C18
lw 7 3 4 ; load arg value (temp 5)
lw 7 6 5 ; load restored value return-addr
lw 0 4 C4
add 7 4 7 ; SP += 5
lw 0 4 A16 ; load target address
jalr 4 5 ; tail-call (foldl (temp 6) (constant 0 0) (temp 5))
stack .fill 65535
heapS .fill 8192
heap .fill 8192
SCMrv .fill 559038737
consS .fill 2
entry .fill L17
ctag .fill 1610612736
pmask .fill 65535
C14 .fill 6
C10 .fill 3221225472
C2 .fill 2147483648
C8 .fill 1140850688
C15 .fill 4
C5 .fill 1
C9 .fill 1610612736
C7 .fill 1073741824
C12 .fill -6
C6 .fill 4261412864
C18 .fill 0
C17 .fill 2
C4 .fill 5
C3 .fill -5
C0 .fill 1107296256
C11 .fill 1744830464
C1 .fill 1107296257
C13 .fill 65535
C16 .fill 3
Acons .fill Lcons
Pcons .fill 1761607686
Acar .fill Lcar
Pcar .fill 1761607696
Acdr .fill Lcdr
Pcdr .fill 1761607703
A0 .fill L0
P0 .fill 1761607709
A1 .fill L1
P1 .fill 1761607717
A2 .fill L2
P2 .fill 1761607723
A3 .fill L3
P3 .fill 1761607732
A4 .fill L4
P4 .fill 1761607758
A5 .fill L5
P5 .fill 1761607769
A6 .fill L6
P6 .fill 1761607778
A7 .fill L7
P7 .fill 1761607782
A8 .fill L8
P8 .fill 1761607792
A9 .fill L9
P9 .fill 1761607802
A10 .fill L10
P10 .fill 1761607808
A11 .fill L11
P11 .fill 1761607815
A12 .fill L12
P12 .fill 1761607822
A13 .fill L13
P13 .fill 1761607832
A14 .fill L14
P14 .fill 1761607842
A15 .fill L15
P15 .fill 1761607852
A16 .fill L16
P16 .fill 1761607862
A17 .fill L17
P17 .fill 1761607899