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