1 ;; Test `return_call_ref` operator
4 ;; Auxiliary definitions
6 (type $-i32 (func (result i32)))
7 (type $-i64 (func (result i64)))
8 (type $-f32 (func (result f32)))
9 (type $-f64 (func (result f64)))
11 (type $i32-i32 (func (param i32) (result i32)))
12 (type $i64-i64 (func (param i64) (result i64)))
13 (type $f32-f32 (func (param f32) (result f32)))
14 (type $f64-f64 (func (param f64) (result f64)))
16 (type $f32-i32 (func (param f32 i32) (result i32)))
17 (type $i32-i64 (func (param i32 i64) (result i64)))
18 (type $f64-f32 (func (param f64 f32) (result f32)))
19 (type $i64-f64 (func (param i64 f64) (result f64)))
21 (type $i64i64-i64 (func (param i64 i64) (result i64)))
23 (func $const-i32 (result i32) (i32.const 0x132))
24 (func $const-i64 (result i64) (i64.const 0x164))
25 (func $const-f32 (result f32) (f32.const 0xf32))
26 (func $const-f64 (result f64) (f64.const 0xf64))
28 (func $id-i32 (param i32) (result i32) (local.get 0))
29 (func $id-i64 (param i64) (result i64) (local.get 0))
30 (func $id-f32 (param f32) (result f32) (local.get 0))
31 (func $id-f64 (param f64) (result f64) (local.get 0))
33 (func $f32-i32 (param f32 i32) (result i32) (local.get 1))
34 (func $i32-i64 (param i32 i64) (result i64) (local.get 1))
35 (func $f64-f32 (param f64 f32) (result f32) (local.get 1))
36 (func $i64-f64 (param i64 f64) (result f64) (local.get 1))
38 (global $const-i32 (ref $-i32) (ref.func $const-i32))
39 (global $const-i64 (ref $-i64) (ref.func $const-i64))
40 (global $const-f32 (ref $-f32) (ref.func $const-f32))
41 (global $const-f64 (ref $-f64) (ref.func $const-f64))
43 (global $id-i32 (ref $i32-i32) (ref.func $id-i32))
44 (global $id-i64 (ref $i64-i64) (ref.func $id-i64))
45 (global $id-f32 (ref $f32-f32) (ref.func $id-f32))
46 (global $id-f64 (ref $f64-f64) (ref.func $id-f64))
48 (global $f32-i32 (ref $f32-i32) (ref.func $f32-i32))
49 (global $i32-i64 (ref $i32-i64) (ref.func $i32-i64))
50 (global $f64-f32 (ref $f64-f32) (ref.func $f64-f32))
51 (global $i64-f64 (ref $i64-f64) (ref.func $i64-f64))
54 $const-i32 $const-i64 $const-f32 $const-f64
55 $id-i32 $id-i64 $id-f32 $id-f64
56 $f32-i32 $i32-i64 $f64-f32 $i64-f64
61 (func (export "type-i32") (result i32)
62 (return_call_ref (global.get $const-i32))
64 (func (export "type-i64") (result i64)
65 (return_call_ref (global.get $const-i64))
67 (func (export "type-f32") (result f32)
68 (return_call_ref (global.get $const-f32))
70 (func (export "type-f64") (result f64)
71 (return_call_ref (global.get $const-f64))
74 (func (export "type-first-i32") (result i32)
75 (return_call_ref (i32.const 32) (global.get $id-i32))
77 (func (export "type-first-i64") (result i64)
78 (return_call_ref (i64.const 64) (global.get $id-i64))
80 (func (export "type-first-f32") (result f32)
81 (return_call_ref (f32.const 1.32) (global.get $id-f32))
83 (func (export "type-first-f64") (result f64)
84 (return_call_ref (f64.const 1.64) (global.get $id-f64))
87 (func (export "type-second-i32") (result i32)
88 (return_call_ref (f32.const 32.1) (i32.const 32) (global.get $f32-i32))
90 (func (export "type-second-i64") (result i64)
91 (return_call_ref (i32.const 32) (i64.const 64) (global.get $i32-i64))
93 (func (export "type-second-f32") (result f32)
94 (return_call_ref (f64.const 64) (f32.const 32) (global.get $f64-f32))
96 (func (export "type-second-f64") (result f64)
97 (return_call_ref (i64.const 64) (f64.const 64.1) (global.get $i64-f64))
102 (func (export "null")
103 (return_call_ref (ref.null $proc))
108 (global $fac-acc (ref $i64i64-i64) (ref.func $fac-acc))
110 (elem declare func $fac-acc)
111 (func $fac-acc (export "fac-acc") (param i64 i64) (result i64)
112 (if (result i64) (i64.eqz (local.get 0))
116 (i64.sub (local.get 0) (i64.const 1))
117 (i64.mul (local.get 0) (local.get 1))
118 (global.get $fac-acc)
124 (global $count (ref $i64-i64) (ref.func $count))
126 (elem declare func $count)
127 (func $count (export "count") (param i64) (result i64)
128 (if (result i64) (i64.eqz (local.get 0))
132 (i64.sub (local.get 0) (i64.const 1))
139 (global $even (ref $i64-i64) (ref.func $even))
140 (global $odd (ref $i64-i64) (ref.func $odd))
142 (elem declare func $even)
143 (func $even (export "even") (param i64) (result i64)
144 (if (result i64) (i64.eqz (local.get 0))
145 (then (i64.const 44))
148 (i64.sub (local.get 0) (i64.const 1))
154 (elem declare func $odd)
155 (func $odd (export "odd") (param i64) (result i64)
156 (if (result i64) (i64.eqz (local.get 0))
157 (then (i64.const 99))
160 (i64.sub (local.get 0) (i64.const 1))
168 (assert_return (invoke "type-i32") (i32.const 0x132))
169 (assert_return (invoke "type-i64") (i64.const 0x164))
170 (assert_return (invoke "type-f32") (f32.const 0xf32))
171 (assert_return (invoke "type-f64") (f64.const 0xf64))
173 (assert_return (invoke "type-first-i32") (i32.const 32))
174 (assert_return (invoke "type-first-i64") (i64.const 64))
175 (assert_return (invoke "type-first-f32") (f32.const 1.32))
176 (assert_return (invoke "type-first-f64") (f64.const 1.64))
178 (assert_return (invoke "type-second-i32") (i32.const 32))
179 (assert_return (invoke "type-second-i64") (i64.const 64))
180 (assert_return (invoke "type-second-f32") (f32.const 32))
181 (assert_return (invoke "type-second-f64") (f64.const 64.1))
183 (assert_trap (invoke "null") "null function")
185 (assert_return (invoke "fac-acc" (i64.const 0) (i64.const 1)) (i64.const 1))
186 (assert_return (invoke "fac-acc" (i64.const 1) (i64.const 1)) (i64.const 1))
187 (assert_return (invoke "fac-acc" (i64.const 5) (i64.const 1)) (i64.const 120))
189 (invoke "fac-acc" (i64.const 25) (i64.const 1))
190 (i64.const 7034535277573963776)
193 (assert_return (invoke "count" (i64.const 0)) (i64.const 0))
194 (assert_return (invoke "count" (i64.const 1000)) (i64.const 0))
195 (assert_return (invoke "count" (i64.const 1_000_000)) (i64.const 0))
197 (assert_return (invoke "even" (i64.const 0)) (i64.const 44))
198 (assert_return (invoke "even" (i64.const 1)) (i64.const 99))
199 (assert_return (invoke "even" (i64.const 100)) (i64.const 44))
200 (assert_return (invoke "even" (i64.const 77)) (i64.const 99))
201 (assert_return (invoke "even" (i64.const 1_000_000)) (i64.const 44))
202 (assert_return (invoke "even" (i64.const 1_000_001)) (i64.const 99))
203 (assert_return (invoke "odd" (i64.const 0)) (i64.const 99))
204 (assert_return (invoke "odd" (i64.const 1)) (i64.const 44))
205 (assert_return (invoke "odd" (i64.const 200)) (i64.const 99))
206 (assert_return (invoke "odd" (i64.const 77)) (i64.const 44))
207 (assert_return (invoke "odd" (i64.const 1_000_000)) (i64.const 99))
208 (assert_return (invoke "odd" (i64.const 999_999)) (i64.const 44))
215 (elem declare func $f11 $f22 $f33 $f44)
216 (func $f11 (result (ref $t)) (return_call_ref (ref.func $f11)))
217 (func $f21 (result (ref null $t)) (return_call_ref (ref.func $f11)))
218 (func $f22 (result (ref null $t)) (return_call_ref (ref.func $f22)))
219 (func $f31 (result (ref func)) (return_call_ref (ref.func $f11)))
220 (func $f33 (result (ref func)) (return_call_ref (ref.func $f33)))
221 (func $f41 (result (ref null func)) (return_call_ref (ref.func $f11)))
222 (func $f42 (result (ref null func)) (return_call_ref (ref.func $f22)))
223 (func $f43 (result (ref null func)) (return_call_ref (ref.func $f33)))
224 (func $f44 (result (ref null func)) (return_call_ref (ref.func $f44)))
230 (elem declare func $f22)
231 (func $f12 (result (ref $t)) (return_call_ref (ref.func $f22)))
232 (func $f22 (result (ref null $t)) (return_call_ref (ref.func $f22)))
240 (elem declare func $f33)
241 (func $f13 (result (ref $t)) (return_call_ref (ref.func $f33)))
242 (func $f33 (result (ref func)) (return_call_ref (ref.func $f33)))
250 (elem declare func $f44)
251 (func $f14 (result (ref $t)) (return_call_ref (ref.func $f44)))
252 (func $f44 (result (ref null func)) (return_call_ref (ref.func $f44)))
260 (elem declare func $f33)
261 (func $f23 (result (ref null $t)) (return_call_ref (ref.func $f33)))
262 (func $f33 (result (ref func)) (return_call_ref (ref.func $f33)))
270 (elem declare func $f44)
271 (func $f24 (result (ref null $t)) (return_call_ref (ref.func $f44)))
272 (func $f44 (result (ref null func)) (return_call_ref (ref.func $f44)))
279 (elem declare func $f44)
280 (func $f34 (result (ref func)) (return_call_ref (ref.func $f44)))
281 (func $f44 (result (ref null func)) (return_call_ref (ref.func $f44)))
287 ;; Unreachable typing.
290 (func (export "unreachable") (result i32)
295 (assert_trap (invoke "unreachable") "unreachable")
298 (elem declare func $f)
299 (func $f (param i32) (result i32) (local.get 0))
301 (func (export "unreachable") (result i32)
307 (assert_trap (invoke "unreachable") "unreachable")
310 (elem declare func $f)
311 (func $f (param i32) (result i32) (local.get 0))
313 (func (export "unreachable") (result i32)
321 (assert_trap (invoke "unreachable") "unreachable")
325 (elem declare func $f)
326 (func $f (param i32) (result i32) (local.get 0))
328 (func (export "unreachable") (result i32)
340 (elem declare func $f)
341 (func $f (param i32) (result i32) (local.get 0))
343 (func (export "unreachable") (result i32)