1;; Test memory section structure
2(module (memory 0 0))
3(module (memory 0 1))
4(module (memory 1 256))
5;; Too big for Spidermonkey.
6;; (module (memory 0 65536))
7(module (memory 0 0) (data (i32.const 0)))
8(module (memory 0 0) (data (i32.const 0) ""))
9(module (memory 1 1) (data (i32.const 0) "a"))
10(module (memory 1 2) (data (i32.const 0) "a") (data (i32.const 65535) "b"))
11(module (memory 1 2)
12  (data (i32.const 0) "a") (data (i32.const 1) "b") (data (i32.const 2) "c")
13)
14(module (memory 1) (global i32 (i32.const 0)) (data (get_global 0) "a"))
15(module (memory 1) (global $g i32 (i32.const 0)) (data (get_global $g) "a"))
16(module (memory 1) (data (get_global 0) "a") (global i32 (i32.const 0)))
17(module (memory 1) (data (get_global $g) "a") (global $g i32 (i32.const 0)))
18
19(module (memory (data)) (func (export "memsize") (result i32) (current_memory)))
20(assert_return (invoke "memsize") (i32.const 0))
21(module (memory (data "")) (func (export "memsize") (result i32) (current_memory)))
22(assert_return (invoke "memsize") (i32.const 0))
23(module (memory (data "x")) (func (export "memsize") (result i32) (current_memory)))
24(assert_return (invoke "memsize") (i32.const 1))
25
26(assert_invalid (module (data (i32.const 0))) "unknown memory")
27(assert_invalid (module (data (i32.const 0) "")) "unknown memory")
28(assert_invalid (module (data (i32.const 0) "x")) "unknown memory")
29
30(assert_invalid
31  (module (memory 1) (data (i64.const 0)))
32  "type mismatch"
33)
34(assert_invalid
35  (module (memory 1) (data (i32.ctz (i32.const 0))))
36  "constant expression required"
37)
38(assert_invalid
39  (module (memory 1) (data (nop)))
40  "constant expression required"
41)
42(assert_invalid
43  (module (memory 1) (data (get_global $g)) (global $g (mut i32) (i32.const 0)))
44  "constant expression required"
45)
46
47(assert_unlinkable
48  (module (memory 0 0) (data (i32.const 0) "a"))
49  "data segment does not fit"
50)
51(assert_unlinkable
52  (module (memory 1 2) (data (i32.const 0) "a") (data (i32.const 98304) "b"))
53  "data segment does not fit"
54)
55;; This seems to cause a time-out on Travis.
56(;assert_unlinkable
57  (module (memory 0x10000) (data (i32.const 0xffffffff) "ab"))
58  ""  ;; either out of memory or segment does not fit
59;)
60(assert_unlinkable
61  (module (memory 1) (data (get_global 0) "a") (global i32 (i32.const 0x10000)))
62  "data segment does not fit"
63)
64
65(module (memory 0 0) (data (i32.const 0) ""))
66(module (memory 0 0) (data (i32.const 1) ""))
67(module (memory 1 2) (data (i32.const 0) "abc") (data (i32.const 0) "def"))
68(module (memory 1 2) (data (i32.const 3) "ab") (data (i32.const 0) "de"))
69(module
70  (memory 1 2)
71  (data (i32.const 0) "a") (data (i32.const 2) "b") (data (i32.const 1) "c")
72)
73
74(assert_invalid
75  (module (memory 1 0))
76  "memory size minimum must not be greater than maximum"
77)
78(assert_invalid
79  (module (memory 65537))
80  "memory size must be at most 65536 pages (4GiB)"
81)
82(assert_invalid
83  (module (memory 2147483648))
84  "memory size must be at most 65536 pages (4GiB)"
85)
86(assert_invalid
87  (module (memory 4294967295))
88  "memory size must be at most 65536 pages (4GiB)"
89)
90(assert_invalid
91  (module (memory 0 65537))
92  "memory size must be at most 65536 pages (4GiB)"
93)
94(assert_invalid
95  (module (memory 0 2147483648))
96  "memory size must be at most 65536 pages (4GiB)"
97)
98(assert_invalid
99  (module (memory 0 4294967295))
100  "memory size must be at most 65536 pages (4GiB)"
101)
102
103;; Test alignment annotation rules
104(module (memory 0) (func (drop (i32.load8_u align=1 (i32.const 0)))))
105(module (memory 0) (func (drop (i32.load16_u align=2 (i32.const 0)))))
106(module (memory 0) (func (drop (i32.load align=4 (i32.const 0)))))
107(module (memory 0) (func (drop (f32.load align=4 (i32.const 0)))))
108
109(assert_invalid
110  (module (memory 0) (func (drop (i64.load align=0 (i32.const 0)))))
111  "alignment must be a power of two"
112)
113(assert_invalid
114  (module (memory 0) (func (drop (i64.load align=3 (i32.const 0)))))
115  "alignment must be a power of two"
116)
117(assert_invalid
118  (module (memory 0) (func (drop (i64.load align=5 (i32.const 0)))))
119  "alignment must be a power of two"
120)
121(assert_invalid
122  (module (memory 0) (func (drop (i64.load align=6 (i32.const 0)))))
123  "alignment must be a power of two"
124)
125(assert_invalid
126  (module (memory 0) (func (drop (i64.load align=7 (i32.const 0)))))
127  "alignment must be a power of two"
128)
129
130(assert_invalid
131  (module (memory 0) (func (drop (i64.load align=16 (i32.const 0)))))
132  "alignment must not be larger than natural"
133)
134(assert_invalid
135  (module (memory 0) (func (drop (i64.load align=32 (i32.const 0)))))
136  "alignment must not be larger than natural"
137)
138(assert_invalid
139  (module (memory 0) (func (drop (i32.load align=8 (i32.const 0)))))
140  "alignment must not be larger than natural"
141)
142(assert_invalid
143  (module (memory 0) (func (drop (i32.load16_u align=4 (i32.const 0)))))
144  "alignment must not be larger than natural"
145)
146(assert_invalid
147  (module (memory 0) (func (drop (i32.load8_u align=2 (i32.const 0)))))
148  "alignment must not be larger than natural"
149)
150(assert_invalid
151  (module (memory 0) (func (i32.store8 align=2 (i32.const 0) (i32.const 0))))
152  "alignment must not be larger than natural"
153)
154(assert_invalid
155  (module (memory 0) (func (i32.load16_u align=4 (i32.const 0))))
156  "alignment must not be larger than natural"
157)
158(assert_invalid
159  (module (memory 0) (func (i32.load8_u align=2 (i32.const 0))))
160  "alignment must not be larger than natural"
161)
162(assert_invalid
163  (module (memory 0) (func (i32.store8 align=2 (i32.const 0) (i32.const 0))))
164  "alignment must not be larger than natural"
165)
166
167(module
168  (memory 1)
169  (data (i32.const 0) "ABC\a7D") (data (i32.const 20) "WASM")
170
171  ;; Data section
172  (func (export "data") (result i32)
173    (i32.and
174      (i32.and
175        (i32.and
176          (i32.eq (i32.load8_u (i32.const 0)) (i32.const 65))
177          (i32.eq (i32.load8_u (i32.const 3)) (i32.const 167))
178        )
179        (i32.and
180          (i32.eq (i32.load8_u (i32.const 6)) (i32.const 0))
181          (i32.eq (i32.load8_u (i32.const 19)) (i32.const 0))
182        )
183      )
184      (i32.and
185        (i32.and
186          (i32.eq (i32.load8_u (i32.const 20)) (i32.const 87))
187          (i32.eq (i32.load8_u (i32.const 23)) (i32.const 77))
188        )
189        (i32.and
190          (i32.eq (i32.load8_u (i32.const 24)) (i32.const 0))
191          (i32.eq (i32.load8_u (i32.const 1023)) (i32.const 0))
192        )
193      )
194    )
195  )
196
197  ;; Aligned read/write
198  (func (export "aligned") (result i32)
199    (local i32 i32 i32)
200    (set_local 0 (i32.const 10))
201    (block
202      (loop
203        (if
204          (i32.eq (get_local 0) (i32.const 0))
205          (br 2)
206        )
207        (set_local 2 (i32.mul (get_local 0) (i32.const 4)))
208        (i32.store (get_local 2) (get_local 0))
209        (set_local 1 (i32.load (get_local 2)))
210        (if
211          (i32.ne (get_local 0) (get_local 1))
212          (return (i32.const 0))
213        )
214        (set_local 0 (i32.sub (get_local 0) (i32.const 1)))
215        (br 0)
216      )
217    )
218    (i32.const 1)
219  )
220
221  ;; Unaligned read/write
222  (func (export "unaligned") (result i32)
223    (local i32 f64 f64)
224    (set_local 0 (i32.const 10))
225    (block
226      (loop
227        (if
228          (i32.eq (get_local 0) (i32.const 0))
229          (br 2)
230        )
231        (set_local 2 (f64.convert_s/i32 (get_local 0)))
232        (f64.store align=1 (get_local 0) (get_local 2))
233        (set_local 1 (f64.load align=1 (get_local 0)))
234        (if
235          (f64.ne (get_local 2) (get_local 1))
236          (return (i32.const 0))
237        )
238        (set_local 0 (i32.sub (get_local 0) (i32.const 1)))
239        (br 0)
240      )
241    )
242    (i32.const 1)
243  )
244
245  ;; Memory cast
246  (func (export "cast") (result f64)
247    (i64.store (i32.const 8) (i64.const -12345))
248    (if
249      (f64.eq
250        (f64.load (i32.const 8))
251        (f64.reinterpret/i64 (i64.const -12345))
252      )
253      (return (f64.const 0))
254    )
255    (i64.store align=1 (i32.const 9) (i64.const 0))
256    (i32.store16 align=1 (i32.const 15) (i32.const 16453))
257    (f64.load align=1 (i32.const 9))
258  )
259
260  ;; Sign and zero extending memory loads
261  (func (export "i32_load8_s") (param $i i32) (result i32)
262	(i32.store8 (i32.const 8) (get_local $i))
263	(i32.load8_s (i32.const 8))
264  )
265  (func (export "i32_load8_u") (param $i i32) (result i32)
266	(i32.store8 (i32.const 8) (get_local $i))
267	(i32.load8_u (i32.const 8))
268  )
269  (func (export "i32_load16_s") (param $i i32) (result i32)
270	(i32.store16 (i32.const 8) (get_local $i))
271	(i32.load16_s (i32.const 8))
272  )
273  (func (export "i32_load16_u") (param $i i32) (result i32)
274	(i32.store16 (i32.const 8) (get_local $i))
275	(i32.load16_u (i32.const 8))
276  )
277  (func (export "i64_load8_s") (param $i i64) (result i64)
278	(i64.store8 (i32.const 8) (get_local $i))
279	(i64.load8_s (i32.const 8))
280  )
281  (func (export "i64_load8_u") (param $i i64) (result i64)
282	(i64.store8 (i32.const 8) (get_local $i))
283	(i64.load8_u (i32.const 8))
284  )
285  (func (export "i64_load16_s") (param $i i64) (result i64)
286	(i64.store16 (i32.const 8) (get_local $i))
287	(i64.load16_s (i32.const 8))
288  )
289  (func (export "i64_load16_u") (param $i i64) (result i64)
290	(i64.store16 (i32.const 8) (get_local $i))
291	(i64.load16_u (i32.const 8))
292  )
293  (func (export "i64_load32_s") (param $i i64) (result i64)
294	(i64.store32 (i32.const 8) (get_local $i))
295	(i64.load32_s (i32.const 8))
296  )
297  (func (export "i64_load32_u") (param $i i64) (result i64)
298	(i64.store32 (i32.const 8) (get_local $i))
299	(i64.load32_u (i32.const 8))
300  )
301)
302
303(assert_return (invoke "data") (i32.const 1))
304(assert_return (invoke "aligned") (i32.const 1))
305(assert_return (invoke "unaligned") (i32.const 1))
306(assert_return (invoke "cast") (f64.const 42.0))
307
308(assert_return (invoke "i32_load8_s" (i32.const -1)) (i32.const -1))
309(assert_return (invoke "i32_load8_u" (i32.const -1)) (i32.const 255))
310(assert_return (invoke "i32_load16_s" (i32.const -1)) (i32.const -1))
311(assert_return (invoke "i32_load16_u" (i32.const -1)) (i32.const 65535))
312
313(assert_return (invoke "i32_load8_s" (i32.const 100)) (i32.const 100))
314(assert_return (invoke "i32_load8_u" (i32.const 200)) (i32.const 200))
315(assert_return (invoke "i32_load16_s" (i32.const 20000)) (i32.const 20000))
316(assert_return (invoke "i32_load16_u" (i32.const 40000)) (i32.const 40000))
317
318(assert_return (invoke "i64_load8_s" (i64.const -1)) (i64.const -1))
319(assert_return (invoke "i64_load8_u" (i64.const -1)) (i64.const 255))
320(assert_return (invoke "i64_load16_s" (i64.const -1)) (i64.const -1))
321(assert_return (invoke "i64_load16_u" (i64.const -1)) (i64.const 65535))
322(assert_return (invoke "i64_load32_s" (i64.const -1)) (i64.const -1))
323(assert_return (invoke "i64_load32_u" (i64.const -1)) (i64.const 4294967295))
324
325(assert_return (invoke "i64_load8_s" (i64.const 100)) (i64.const 100))
326(assert_return (invoke "i64_load8_u" (i64.const 200)) (i64.const 200))
327(assert_return (invoke "i64_load16_s" (i64.const 20000)) (i64.const 20000))
328(assert_return (invoke "i64_load16_u" (i64.const 40000)) (i64.const 40000))
329(assert_return (invoke "i64_load32_s" (i64.const 20000)) (i64.const 20000))
330(assert_return (invoke "i64_load32_u" (i64.const 40000)) (i64.const 40000))
331