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