...
1(module
2 (func (export "fac-expr") (param $n i64) (result i64)
3 (local $i i64)
4 (local $res i64)
5 (local.set $i (local.get $n))
6 (local.set $res (i64.const 1))
7 (block $done
8 (loop $loop
9 (if
10 (i64.eq (local.get $i) (i64.const 0))
11 (then (br $done))
12 (else
13 (local.set $res (i64.mul (local.get $i) (local.get $res)))
14 (local.set $i (i64.sub (local.get $i) (i64.const 1)))
15 )
16 )
17 (br $loop)
18 )
19 )
20 (local.get $res)
21 )
22
23 (func (export "fac-stack") (param $n i64) (result i64)
24 (local $i i64)
25 (local $res i64)
26 (local.get $n)
27 (local.set $i)
28 (i64.const 1)
29 (local.set $res)
30 (block $done
31 (loop $loop
32 (local.get $i)
33 (i64.const 0)
34 (i64.eq)
35 (if
36 (then (br $done))
37 (else
38 (local.get $i)
39 (local.get $res)
40 (i64.mul)
41 (local.set $res)
42 (local.get $i)
43 (i64.const 1)
44 (i64.sub)
45 (local.set $i)
46 )
47 )
48 (br $loop)
49 )
50 )
51 (local.get $res)
52 )
53
54 (func (export "fac-stack-raw") (param $n i64) (result i64)
55 (local $i i64)
56 (local $res i64)
57 local.get $n
58 local.set $i
59 i64.const 1
60 local.set $res
61 block $done
62 loop $loop
63 local.get $i
64 i64.const 0
65 i64.eq
66 if $body
67 br $done
68 else $body
69 local.get $i
70 local.get $res
71 i64.mul
72 local.set $res
73 local.get $i
74 i64.const 1
75 i64.sub
76 local.set $i
77 end $body
78 br $loop
79 end $loop
80 end $done
81 local.get $res
82 )
83
84 (func (export "fac-mixed") (param $n i64) (result i64)
85 (local $i i64)
86 (local $res i64)
87 (local.set $i (local.get $n))
88 (local.set $res (i64.const 1))
89 (block $done
90 (loop $loop
91 (i64.eq (local.get $i) (i64.const 0))
92 (if
93 (then (br $done))
94 (else
95 (i64.mul (local.get $i) (local.get $res))
96 (local.set $res)
97 (i64.sub (local.get $i) (i64.const 1))
98 (local.set $i)
99 )
100 )
101 (br $loop)
102 )
103 )
104 (local.get $res)
105 )
106
107 (func (export "fac-mixed-raw") (param $n i64) (result i64)
108 (local $i i64)
109 (local $res i64)
110 (local.set $i (local.get $n))
111 (local.set $res (i64.const 1))
112 block $done
113 loop $loop
114 (i64.eq (local.get $i) (i64.const 0))
115 if
116 br $done
117 else
118 (i64.mul (local.get $i) (local.get $res))
119 local.set $res
120 (i64.sub (local.get $i) (i64.const 1))
121 local.set $i
122 end
123 br $loop
124 end
125 end
126 local.get $res
127 )
128)
129
130(assert_return (invoke "fac-expr" (i64.const 25)) (i64.const 7034535277573963776))
131(assert_return (invoke "fac-stack" (i64.const 25)) (i64.const 7034535277573963776))
132(assert_return (invoke "fac-mixed" (i64.const 25)) (i64.const 7034535277573963776))
133
134
135;; Syntax of flat call_indirect
136
137(module
138 (type $proc (func))
139 (table 1 funcref)
140
141 (func
142 (block i32.const 0 call_indirect)
143 (loop i32.const 0 call_indirect)
144 (if (i32.const 0) (then i32.const 0 call_indirect))
145 (if (i32.const 0)
146 (then i32.const 0 call_indirect)
147 (else i32.const 0 call_indirect)
148 )
149 (block i32.const 0 call_indirect (type $proc))
150 (loop i32.const 0 call_indirect (type $proc))
151 (if (i32.const 0) (then i32.const 0 call_indirect (type $proc)))
152 (if (i32.const 0)
153 (then i32.const 0 call_indirect (type $proc))
154 (else i32.const 0 call_indirect (type $proc))
155 )
156 (block i32.const 0 i32.const 0 call_indirect (param i32))
157 (loop i32.const 0 i32.const 0 call_indirect (param i32))
158 (if (i32.const 0) (then i32.const 0 i32.const 0 call_indirect (param i32)))
159 (if (i32.const 0)
160 (then i32.const 0 i32.const 0 call_indirect (param i32))
161 (else i32.const 0 i32.const 0 call_indirect (param i32))
162 )
163 (block (result i32) i32.const 0 call_indirect (result i32)) (drop)
164 (loop (result i32) i32.const 0 call_indirect (result i32)) (drop)
165 (if (result i32) (i32.const 0)
166 (then i32.const 0 call_indirect (result i32))
167 (else i32.const 0 call_indirect (result i32))
168 ) (drop)
169 (block i32.const 0 call_indirect (type $proc) (param) (result))
170 (loop i32.const 0 call_indirect (type $proc) (param) (result))
171 (if (i32.const 0)
172 (then i32.const 0 call_indirect (type $proc) (param) (result))
173 )
174 (if (i32.const 0)
175 (then i32.const 0 call_indirect (type $proc) (param) (param) (result))
176 (else i32.const 0 call_indirect (type $proc) (param) (result) (result))
177 )
178
179 block i32.const 0 call_indirect end
180 loop i32.const 0 call_indirect end
181 i32.const 0 if i32.const 0 call_indirect end
182 i32.const 0 if i32.const 0 call_indirect else i32.const 0 call_indirect end
183 block i32.const 0 call_indirect (type $proc) end
184 loop i32.const 0 call_indirect (type $proc) end
185 i32.const 0 if i32.const 0 call_indirect (type $proc) end
186 i32.const 0
187 if
188 i32.const 0 call_indirect (type $proc)
189 else
190 i32.const 0 call_indirect (type $proc)
191 end
192 block i32.const 0 i32.const 0 call_indirect (param i32) end
193 loop i32.const 0 i32.const 0 call_indirect (param i32) end
194 i32.const 0 if i32.const 0 i32.const 0 call_indirect (param i32) end
195 i32.const 0
196 if
197 i32.const 0 i32.const 0 call_indirect (param i32)
198 else
199 i32.const 0 i32.const 0 call_indirect (param i32)
200 end
201 block (result i32) i32.const 0 call_indirect (result i32) end drop
202 loop (result i32) i32.const 0 call_indirect (result i32) end drop
203 i32.const 0
204 if (result i32)
205 i32.const 0 call_indirect (result i32)
206 else
207 i32.const 0 call_indirect (result i32)
208 end drop
209 block i32.const 0 call_indirect (type $proc) (param) (result) end
210 loop i32.const 0 call_indirect (type $proc) (param) (result) end
211 i32.const 0 if i32.const 0 call_indirect (type $proc) (param) (result) end
212 i32.const 0
213 if
214 i32.const 0 call_indirect (type $proc) (param) (result)
215 else
216 i32.const 0 call_indirect (type $proc) (param) (param) (result) (result)
217 end
218 i32.const 0 call_indirect
219 )
220)
View as plain text