github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/internal/integration_test/spectest/v1/testdata/align.wast (about) 1 ;; Test alignment annotation rules 2 3 (module (memory 0) (func (drop (i32.load8_s align=1 (i32.const 0))))) 4 (module (memory 0) (func (drop (i32.load8_u align=1 (i32.const 0))))) 5 (module (memory 0) (func (drop (i32.load16_s align=2 (i32.const 0))))) 6 (module (memory 0) (func (drop (i32.load16_u align=2 (i32.const 0))))) 7 (module (memory 0) (func (drop (i32.load align=4 (i32.const 0))))) 8 (module (memory 0) (func (drop (i64.load8_s align=1 (i32.const 0))))) 9 (module (memory 0) (func (drop (i64.load8_u align=1 (i32.const 0))))) 10 (module (memory 0) (func (drop (i64.load16_s align=2 (i32.const 0))))) 11 (module (memory 0) (func (drop (i64.load16_u align=2 (i32.const 0))))) 12 (module (memory 0) (func (drop (i64.load32_s align=4 (i32.const 0))))) 13 (module (memory 0) (func (drop (i64.load32_u align=4 (i32.const 0))))) 14 (module (memory 0) (func (drop (i64.load align=8 (i32.const 0))))) 15 (module (memory 0) (func (drop (f32.load align=4 (i32.const 0))))) 16 (module (memory 0) (func (drop (f64.load align=8 (i32.const 0))))) 17 (module (memory 0) (func (i32.store8 align=1 (i32.const 0) (i32.const 1)))) 18 (module (memory 0) (func (i32.store16 align=2 (i32.const 0) (i32.const 1)))) 19 (module (memory 0) (func (i32.store align=4 (i32.const 0) (i32.const 1)))) 20 (module (memory 0) (func (i64.store8 align=1 (i32.const 0) (i64.const 1)))) 21 (module (memory 0) (func (i64.store16 align=2 (i32.const 0) (i64.const 1)))) 22 (module (memory 0) (func (i64.store32 align=4 (i32.const 0) (i64.const 1)))) 23 (module (memory 0) (func (i64.store align=8 (i32.const 0) (i64.const 1)))) 24 (module (memory 0) (func (f32.store align=4 (i32.const 0) (f32.const 1.0)))) 25 (module (memory 0) (func (f64.store align=8 (i32.const 0) (f64.const 1.0)))) 26 27 (assert_malformed 28 (module quote 29 "(module (memory 0) (func (drop (i32.load8_s align=0 (i32.const 0)))))" 30 ) 31 "alignment" 32 ) 33 (assert_malformed 34 (module quote 35 "(module (memory 0) (func (drop (i32.load8_s align=7 (i32.const 0)))))" 36 ) 37 "alignment" 38 ) 39 (assert_malformed 40 (module quote 41 "(module (memory 0) (func (drop (i32.load8_u align=0 (i32.const 0)))))" 42 ) 43 "alignment" 44 ) 45 (assert_malformed 46 (module quote 47 "(module (memory 0) (func (drop (i32.load8_u align=7 (i32.const 0)))))" 48 ) 49 "alignment" 50 ) 51 (assert_malformed 52 (module quote 53 "(module (memory 0) (func (drop (i32.load16_s align=0 (i32.const 0)))))" 54 ) 55 "alignment" 56 ) 57 (assert_malformed 58 (module quote 59 "(module (memory 0) (func (drop (i32.load16_s align=7 (i32.const 0)))))" 60 ) 61 "alignment" 62 ) 63 (assert_malformed 64 (module quote 65 "(module (memory 0) (func (drop (i32.load16_u align=0 (i32.const 0)))))" 66 ) 67 "alignment" 68 ) 69 (assert_malformed 70 (module quote 71 "(module (memory 0) (func (drop (i32.load16_u align=7 (i32.const 0)))))" 72 ) 73 "alignment" 74 ) 75 (assert_malformed 76 (module quote 77 "(module (memory 0) (func (drop (i32.load align=0 (i32.const 0)))))" 78 ) 79 "alignment" 80 ) 81 (assert_malformed 82 (module quote 83 "(module (memory 0) (func (drop (i32.load align=7 (i32.const 0)))))" 84 ) 85 "alignment" 86 ) 87 (assert_malformed 88 (module quote 89 "(module (memory 0) (func (drop (i64.load8_s align=0 (i32.const 0)))))" 90 ) 91 "alignment" 92 ) 93 (assert_malformed 94 (module quote 95 "(module (memory 0) (func (drop (i64.load8_s align=7 (i32.const 0)))))" 96 ) 97 "alignment" 98 ) 99 (assert_malformed 100 (module quote 101 "(module (memory 0) (func (drop (i64.load8_u align=0 (i32.const 0)))))" 102 ) 103 "alignment" 104 ) 105 (assert_malformed 106 (module quote 107 "(module (memory 0) (func (drop (i64.load8_u align=7 (i32.const 0)))))" 108 ) 109 "alignment" 110 ) 111 (assert_malformed 112 (module quote 113 "(module (memory 0) (func (drop (i64.load16_s align=0 (i32.const 0)))))" 114 ) 115 "alignment" 116 ) 117 (assert_malformed 118 (module quote 119 "(module (memory 0) (func (drop (i64.load16_s align=7 (i32.const 0)))))" 120 ) 121 "alignment" 122 ) 123 (assert_malformed 124 (module quote 125 "(module (memory 0) (func (drop (i64.load16_u align=0 (i32.const 0)))))" 126 ) 127 "alignment" 128 ) 129 (assert_malformed 130 (module quote 131 "(module (memory 0) (func (drop (i64.load16_u align=7 (i32.const 0)))))" 132 ) 133 "alignment" 134 ) 135 (assert_malformed 136 (module quote 137 "(module (memory 0) (func (drop (i64.load32_s align=0 (i32.const 0)))))" 138 ) 139 "alignment" 140 ) 141 (assert_malformed 142 (module quote 143 "(module (memory 0) (func (drop (i64.load32_s align=7 (i32.const 0)))))" 144 ) 145 "alignment" 146 ) 147 (assert_malformed 148 (module quote 149 "(module (memory 0) (func (drop (i64.load32_u align=0 (i32.const 0)))))" 150 ) 151 "alignment" 152 ) 153 (assert_malformed 154 (module quote 155 "(module (memory 0) (func (drop (i64.load32_u align=7 (i32.const 0)))))" 156 ) 157 "alignment" 158 ) 159 (assert_malformed 160 (module quote 161 "(module (memory 0) (func (drop (i64.load align=0 (i32.const 0)))))" 162 ) 163 "alignment" 164 ) 165 (assert_malformed 166 (module quote 167 "(module (memory 0) (func (drop (i64.load align=7 (i32.const 0)))))" 168 ) 169 "alignment" 170 ) 171 (assert_malformed 172 (module quote 173 "(module (memory 0) (func (drop (f32.load align=0 (i32.const 0)))))" 174 ) 175 "alignment" 176 ) 177 (assert_malformed 178 (module quote 179 "(module (memory 0) (func (drop (f32.load align=7 (i32.const 0)))))" 180 ) 181 "alignment" 182 ) 183 (assert_malformed 184 (module quote 185 "(module (memory 0) (func (drop (f64.load align=0 (i32.const 0)))))" 186 ) 187 "alignment" 188 ) 189 (assert_malformed 190 (module quote 191 "(module (memory 0) (func (drop (f64.load align=7 (i32.const 0)))))" 192 ) 193 "alignment" 194 ) 195 196 (assert_malformed 197 (module quote 198 "(module (memory 0) (func (i32.store8 align=0 (i32.const 0) (i32.const 0))))" 199 ) 200 "alignment" 201 ) 202 (assert_malformed 203 (module quote 204 "(module (memory 0) (func (i32.store8 align=7 (i32.const 0) (i32.const 0))))" 205 ) 206 "alignment" 207 ) 208 (assert_malformed 209 (module quote 210 "(module (memory 0) (func (i32.store16 align=0 (i32.const 0) (i32.const 0))))" 211 ) 212 "alignment" 213 ) 214 (assert_malformed 215 (module quote 216 "(module (memory 0) (func (i32.store16 align=7 (i32.const 0) (i32.const 0))))" 217 ) 218 "alignment" 219 ) 220 (assert_malformed 221 (module quote 222 "(module (memory 0) (func (i32.store align=0 (i32.const 0) (i32.const 0))))" 223 ) 224 "alignment" 225 ) 226 (assert_malformed 227 (module quote 228 "(module (memory 0) (func (i32.store align=7 (i32.const 0) (i32.const 0))))" 229 ) 230 "alignment" 231 ) 232 (assert_malformed 233 (module quote 234 "(module (memory 0) (func (i64.store8 align=0 (i32.const 0) (i64.const 0))))" 235 ) 236 "alignment" 237 ) 238 (assert_malformed 239 (module quote 240 "(module (memory 0) (func (i64.store8 align=7 (i32.const 0) (i64.const 0))))" 241 ) 242 "alignment" 243 ) 244 (assert_malformed 245 (module quote 246 "(module (memory 0) (func (i64.store16 align=0 (i32.const 0) (i64.const 0))))" 247 ) 248 "alignment" 249 ) 250 (assert_malformed 251 (module quote 252 "(module (memory 0) (func (i64.store16 align=7 (i32.const 0) (i64.const 0))))" 253 ) 254 "alignment" 255 ) 256 (assert_malformed 257 (module quote 258 "(module (memory 0) (func (i64.store32 align=0 (i32.const 0) (i64.const 0))))" 259 ) 260 "alignment" 261 ) 262 (assert_malformed 263 (module quote 264 "(module (memory 0) (func (i64.store32 align=7 (i32.const 0) (i64.const 0))))" 265 ) 266 "alignment" 267 ) 268 (assert_malformed 269 (module quote 270 "(module (memory 0) (func (i64.store align=0 (i32.const 0) (i64.const 0))))" 271 ) 272 "alignment" 273 ) 274 (assert_malformed 275 (module quote 276 "(module (memory 0) (func (i64.store align=7 (i32.const 0) (i64.const 0))))" 277 ) 278 "alignment" 279 ) 280 (assert_malformed 281 (module quote 282 "(module (memory 0) (func (f32.store align=0 (i32.const 0) (f32.const 0))))" 283 ) 284 "alignment" 285 ) 286 (assert_malformed 287 (module quote 288 "(module (memory 0) (func (f32.store align=7 (i32.const 0) (f32.const 0))))" 289 ) 290 "alignment" 291 ) 292 (assert_malformed 293 (module quote 294 "(module (memory 0) (func (f64.store align=0 (i32.const 0) (f32.const 0))))" 295 ) 296 "alignment" 297 ) 298 (assert_malformed 299 (module quote 300 "(module (memory 0) (func (f64.store align=7 (i32.const 0) (f32.const 0))))" 301 ) 302 "alignment" 303 ) 304 305 (assert_invalid 306 (module (memory 0) (func (drop (i32.load8_s align=2 (i32.const 0))))) 307 "alignment must not be larger than natural" 308 ) 309 (assert_invalid 310 (module (memory 0) (func (drop (i32.load8_u align=2 (i32.const 0))))) 311 "alignment must not be larger than natural" 312 ) 313 (assert_invalid 314 (module (memory 0) (func (drop (i32.load16_s align=4 (i32.const 0))))) 315 "alignment must not be larger than natural" 316 ) 317 (assert_invalid 318 (module (memory 0) (func (drop (i32.load16_u align=4 (i32.const 0))))) 319 "alignment must not be larger than natural" 320 ) 321 (assert_invalid 322 (module (memory 0) (func (drop (i32.load align=8 (i32.const 0))))) 323 "alignment must not be larger than natural" 324 ) 325 (assert_invalid 326 (module (memory 0) (func (drop (i64.load8_s align=2 (i32.const 0))))) 327 "alignment must not be larger than natural" 328 ) 329 (assert_invalid 330 (module (memory 0) (func (drop (i64.load8_u align=2 (i32.const 0))))) 331 "alignment must not be larger than natural" 332 ) 333 (assert_invalid 334 (module (memory 0) (func (drop (i64.load16_s align=4 (i32.const 0))))) 335 "alignment must not be larger than natural" 336 ) 337 (assert_invalid 338 (module (memory 0) (func (drop (i64.load16_u align=4 (i32.const 0))))) 339 "alignment must not be larger than natural" 340 ) 341 (assert_invalid 342 (module (memory 0) (func (drop (i64.load32_s align=8 (i32.const 0))))) 343 "alignment must not be larger than natural" 344 ) 345 (assert_invalid 346 (module (memory 0) (func (drop (i64.load32_u align=8 (i32.const 0))))) 347 "alignment must not be larger than natural" 348 ) 349 (assert_invalid 350 (module (memory 0) (func (drop (i64.load align=16 (i32.const 0))))) 351 "alignment must not be larger than natural" 352 ) 353 (assert_invalid 354 (module (memory 0) (func (drop (f32.load align=8 (i32.const 0))))) 355 "alignment must not be larger than natural" 356 ) 357 (assert_invalid 358 (module (memory 0) (func (drop (f64.load align=16 (i32.const 0))))) 359 "alignment must not be larger than natural" 360 ) 361 362 (assert_invalid 363 (module (memory 0) (func (drop (i32.load8_s align=2 (i32.const 0))))) 364 "alignment must not be larger than natural" 365 ) 366 (assert_invalid 367 (module (memory 0) (func (drop (i32.load8_u align=2 (i32.const 0))))) 368 "alignment must not be larger than natural" 369 ) 370 (assert_invalid 371 (module (memory 0) (func (drop (i32.load16_s align=4 (i32.const 0))))) 372 "alignment must not be larger than natural" 373 ) 374 (assert_invalid 375 (module (memory 0) (func (drop (i32.load16_u align=4 (i32.const 0))))) 376 "alignment must not be larger than natural" 377 ) 378 (assert_invalid 379 (module (memory 0) (func (drop (i32.load align=8 (i32.const 0))))) 380 "alignment must not be larger than natural" 381 ) 382 (assert_invalid 383 (module (memory 0) (func (drop (i64.load8_s align=2 (i32.const 0))))) 384 "alignment must not be larger than natural" 385 ) 386 (assert_invalid 387 (module (memory 0) (func (drop (i64.load8_u align=2 (i32.const 0))))) 388 "alignment must not be larger than natural" 389 ) 390 (assert_invalid 391 (module (memory 0) (func (drop (i64.load16_s align=4 (i32.const 0))))) 392 "alignment must not be larger than natural" 393 ) 394 (assert_invalid 395 (module (memory 0) (func (drop (i64.load16_u align=4 (i32.const 0))))) 396 "alignment must not be larger than natural" 397 ) 398 (assert_invalid 399 (module (memory 0) (func (drop (i64.load32_s align=8 (i32.const 0))))) 400 "alignment must not be larger than natural" 401 ) 402 (assert_invalid 403 (module (memory 0) (func (drop (i64.load32_u align=8 (i32.const 0))))) 404 "alignment must not be larger than natural" 405 ) 406 (assert_invalid 407 (module (memory 0) (func (drop (i64.load align=16 (i32.const 0))))) 408 "alignment must not be larger than natural" 409 ) 410 (assert_invalid 411 (module (memory 0) (func (drop (f32.load align=8 (i32.const 0))))) 412 "alignment must not be larger than natural" 413 ) 414 (assert_invalid 415 (module (memory 0) (func (drop (f64.load align=16 (i32.const 0))))) 416 "alignment must not be larger than natural" 417 ) 418 419 (assert_invalid 420 (module (memory 0) (func (i32.store8 align=2 (i32.const 0) (i32.const 0)))) 421 "alignment must not be larger than natural" 422 ) 423 (assert_invalid 424 (module (memory 0) (func (i32.store16 align=4 (i32.const 0) (i32.const 0)))) 425 "alignment must not be larger than natural" 426 ) 427 (assert_invalid 428 (module (memory 0) (func (i32.store align=8 (i32.const 0) (i32.const 0)))) 429 "alignment must not be larger than natural" 430 ) 431 (assert_invalid 432 (module (memory 0) (func (i64.store8 align=2 (i32.const 0) (i64.const 0)))) 433 "alignment must not be larger than natural" 434 ) 435 (assert_invalid 436 (module (memory 0) (func (i64.store16 align=4 (i32.const 0) (i64.const 0)))) 437 "alignment must not be larger than natural" 438 ) 439 (assert_invalid 440 (module (memory 0) (func (i64.store32 align=8 (i32.const 0) (i64.const 0)))) 441 "alignment must not be larger than natural" 442 ) 443 (assert_invalid 444 (module (memory 0) (func (i64.store align=16 (i32.const 0) (i64.const 0)))) 445 "alignment must not be larger than natural" 446 ) 447 (assert_invalid 448 (module (memory 0) (func (f32.store align=8 (i32.const 0) (f32.const 0)))) 449 "alignment must not be larger than natural" 450 ) 451 (assert_invalid 452 (module (memory 0) (func (f64.store align=16 (i32.const 0) (f64.const 0)))) 453 "alignment must not be larger than natural" 454 ) 455 456 ;; Test aligned and unaligned read/write 457 458 (module 459 (memory 1) 460 461 ;; $default: natural alignment, $1: align=1, $2: align=2, $4: align=4, $8: align=8 462 463 (func (export "f32_align_switch") (param i32) (result f32) 464 (local f32 f32) 465 (local.set 1 (f32.const 10.0)) 466 (block $4 467 (block $2 468 (block $1 469 (block $default 470 (block $0 471 (br_table $0 $default $1 $2 $4 (local.get 0)) 472 ) ;; 0 473 (f32.store (i32.const 0) (local.get 1)) 474 (local.set 2 (f32.load (i32.const 0))) 475 (br $4) 476 ) ;; default 477 (f32.store align=1 (i32.const 0) (local.get 1)) 478 (local.set 2 (f32.load align=1 (i32.const 0))) 479 (br $4) 480 ) ;; 1 481 (f32.store align=2 (i32.const 0) (local.get 1)) 482 (local.set 2 (f32.load align=2 (i32.const 0))) 483 (br $4) 484 ) ;; 2 485 (f32.store align=4 (i32.const 0) (local.get 1)) 486 (local.set 2 (f32.load align=4 (i32.const 0))) 487 ) ;; 4 488 (local.get 2) 489 ) 490 491 (func (export "f64_align_switch") (param i32) (result f64) 492 (local f64 f64) 493 (local.set 1 (f64.const 10.0)) 494 (block $8 495 (block $4 496 (block $2 497 (block $1 498 (block $default 499 (block $0 500 (br_table $0 $default $1 $2 $4 $8 (local.get 0)) 501 ) ;; 0 502 (f64.store (i32.const 0) (local.get 1)) 503 (local.set 2 (f64.load (i32.const 0))) 504 (br $8) 505 ) ;; default 506 (f64.store align=1 (i32.const 0) (local.get 1)) 507 (local.set 2 (f64.load align=1 (i32.const 0))) 508 (br $8) 509 ) ;; 1 510 (f64.store align=2 (i32.const 0) (local.get 1)) 511 (local.set 2 (f64.load align=2 (i32.const 0))) 512 (br $8) 513 ) ;; 2 514 (f64.store align=4 (i32.const 0) (local.get 1)) 515 (local.set 2 (f64.load align=4 (i32.const 0))) 516 (br $8) 517 ) ;; 4 518 (f64.store align=8 (i32.const 0) (local.get 1)) 519 (local.set 2 (f64.load align=8 (i32.const 0))) 520 ) ;; 8 521 (local.get 2) 522 ) 523 524 ;; $8s: i32/i64.load8_s, $8u: i32/i64.load8_u, $16s: i32/i64.load16_s, $16u: i32/i64.load16_u, $32: i32.load 525 ;; $32s: i64.load32_s, $32u: i64.load32_u, $64: i64.load 526 527 (func (export "i32_align_switch") (param i32 i32) (result i32) 528 (local i32 i32) 529 (local.set 2 (i32.const 10)) 530 (block $32 531 (block $16u 532 (block $16s 533 (block $8u 534 (block $8s 535 (block $0 536 (br_table $0 $8s $8u $16s $16u $32 (local.get 0)) 537 ) ;; 0 538 (if (i32.eq (local.get 1) (i32.const 0)) 539 (then 540 (i32.store8 (i32.const 0) (local.get 2)) 541 (local.set 3 (i32.load8_s (i32.const 0))) 542 ) 543 ) 544 (if (i32.eq (local.get 1) (i32.const 1)) 545 (then 546 (i32.store8 align=1 (i32.const 0) (local.get 2)) 547 (local.set 3 (i32.load8_s align=1 (i32.const 0))) 548 ) 549 ) 550 (br $32) 551 ) ;; 8s 552 (if (i32.eq (local.get 1) (i32.const 0)) 553 (then 554 (i32.store8 (i32.const 0) (local.get 2)) 555 (local.set 3 (i32.load8_u (i32.const 0))) 556 ) 557 ) 558 (if (i32.eq (local.get 1) (i32.const 1)) 559 (then 560 (i32.store8 align=1 (i32.const 0) (local.get 2)) 561 (local.set 3 (i32.load8_u align=1 (i32.const 0))) 562 ) 563 ) 564 (br $32) 565 ) ;; 8u 566 (if (i32.eq (local.get 1) (i32.const 0)) 567 (then 568 (i32.store16 (i32.const 0) (local.get 2)) 569 (local.set 3 (i32.load16_s (i32.const 0))) 570 ) 571 ) 572 (if (i32.eq (local.get 1) (i32.const 1)) 573 (then 574 (i32.store16 align=1 (i32.const 0) (local.get 2)) 575 (local.set 3 (i32.load16_s align=1 (i32.const 0))) 576 ) 577 ) 578 (if (i32.eq (local.get 1) (i32.const 2)) 579 (then 580 (i32.store16 align=2 (i32.const 0) (local.get 2)) 581 (local.set 3 (i32.load16_s align=2 (i32.const 0))) 582 ) 583 ) 584 (br $32) 585 ) ;; 16s 586 (if (i32.eq (local.get 1) (i32.const 0)) 587 (then 588 (i32.store16 (i32.const 0) (local.get 2)) 589 (local.set 3 (i32.load16_u (i32.const 0))) 590 ) 591 ) 592 (if (i32.eq (local.get 1) (i32.const 1)) 593 (then 594 (i32.store16 align=1 (i32.const 0) (local.get 2)) 595 (local.set 3 (i32.load16_u align=1 (i32.const 0))) 596 ) 597 ) 598 (if (i32.eq (local.get 1) (i32.const 2)) 599 (then 600 (i32.store16 align=2 (i32.const 0) (local.get 2)) 601 (local.set 3 (i32.load16_u align=2 (i32.const 0))) 602 ) 603 ) 604 (br $32) 605 ) ;; 16u 606 (if (i32.eq (local.get 1) (i32.const 0)) 607 (then 608 (i32.store (i32.const 0) (local.get 2)) 609 (local.set 3 (i32.load (i32.const 0))) 610 ) 611 ) 612 (if (i32.eq (local.get 1) (i32.const 1)) 613 (then 614 (i32.store align=1 (i32.const 0) (local.get 2)) 615 (local.set 3 (i32.load align=1 (i32.const 0))) 616 ) 617 ) 618 (if (i32.eq (local.get 1) (i32.const 2)) 619 (then 620 (i32.store align=2 (i32.const 0) (local.get 2)) 621 (local.set 3 (i32.load align=2 (i32.const 0))) 622 ) 623 ) 624 (if (i32.eq (local.get 1) (i32.const 4)) 625 (then 626 (i32.store align=4 (i32.const 0) (local.get 2)) 627 (local.set 3 (i32.load align=4 (i32.const 0))) 628 ) 629 ) 630 ) ;; 32 631 (local.get 3) 632 ) 633 634 (func (export "i64_align_switch") (param i32 i32) (result i64) 635 (local i64 i64) 636 (local.set 2 (i64.const 10)) 637 (block $64 638 (block $32u 639 (block $32s 640 (block $16u 641 (block $16s 642 (block $8u 643 (block $8s 644 (block $0 645 (br_table $0 $8s $8u $16s $16u $32s $32u $64 (local.get 0)) 646 ) ;; 0 647 (if (i32.eq (local.get 1) (i32.const 0)) 648 (then 649 (i64.store8 (i32.const 0) (local.get 2)) 650 (local.set 3 (i64.load8_s (i32.const 0))) 651 ) 652 ) 653 (if (i32.eq (local.get 1) (i32.const 1)) 654 (then 655 (i64.store8 align=1 (i32.const 0) (local.get 2)) 656 (local.set 3 (i64.load8_s align=1 (i32.const 0))) 657 ) 658 ) 659 (br $64) 660 ) ;; 8s 661 (if (i32.eq (local.get 1) (i32.const 0)) 662 (then 663 (i64.store8 (i32.const 0) (local.get 2)) 664 (local.set 3 (i64.load8_u (i32.const 0))) 665 ) 666 ) 667 (if (i32.eq (local.get 1) (i32.const 1)) 668 (then 669 (i64.store8 align=1 (i32.const 0) (local.get 2)) 670 (local.set 3 (i64.load8_u align=1 (i32.const 0))) 671 ) 672 ) 673 (br $64) 674 ) ;; 8u 675 (if (i32.eq (local.get 1) (i32.const 0)) 676 (then 677 (i64.store16 (i32.const 0) (local.get 2)) 678 (local.set 3 (i64.load16_s (i32.const 0))) 679 ) 680 ) 681 (if (i32.eq (local.get 1) (i32.const 1)) 682 (then 683 (i64.store16 align=1 (i32.const 0) (local.get 2)) 684 (local.set 3 (i64.load16_s align=1 (i32.const 0))) 685 ) 686 ) 687 (if (i32.eq (local.get 1) (i32.const 2)) 688 (then 689 (i64.store16 align=2 (i32.const 0) (local.get 2)) 690 (local.set 3 (i64.load16_s align=2 (i32.const 0))) 691 ) 692 ) 693 (br $64) 694 ) ;; 16s 695 (if (i32.eq (local.get 1) (i32.const 0)) 696 (then 697 (i64.store16 (i32.const 0) (local.get 2)) 698 (local.set 3 (i64.load16_u (i32.const 0))) 699 ) 700 ) 701 (if (i32.eq (local.get 1) (i32.const 1)) 702 (then 703 (i64.store16 align=1 (i32.const 0) (local.get 2)) 704 (local.set 3 (i64.load16_u align=1 (i32.const 0))) 705 ) 706 ) 707 (if (i32.eq (local.get 1) (i32.const 2)) 708 (then 709 (i64.store16 align=2 (i32.const 0) (local.get 2)) 710 (local.set 3 (i64.load16_u align=2 (i32.const 0))) 711 ) 712 ) 713 (br $64) 714 ) ;; 16u 715 (if (i32.eq (local.get 1) (i32.const 0)) 716 (then 717 (i64.store32 (i32.const 0) (local.get 2)) 718 (local.set 3 (i64.load32_s (i32.const 0))) 719 ) 720 ) 721 (if (i32.eq (local.get 1) (i32.const 1)) 722 (then 723 (i64.store32 align=1 (i32.const 0) (local.get 2)) 724 (local.set 3 (i64.load32_s align=1 (i32.const 0))) 725 ) 726 ) 727 (if (i32.eq (local.get 1) (i32.const 2)) 728 (then 729 (i64.store32 align=2 (i32.const 0) (local.get 2)) 730 (local.set 3 (i64.load32_s align=2 (i32.const 0))) 731 ) 732 ) 733 (if (i32.eq (local.get 1) (i32.const 4)) 734 (then 735 (i64.store32 align=4 (i32.const 0) (local.get 2)) 736 (local.set 3 (i64.load32_s align=4 (i32.const 0))) 737 ) 738 ) 739 (br $64) 740 ) ;; 32s 741 (if (i32.eq (local.get 1) (i32.const 0)) 742 (then 743 (i64.store32 (i32.const 0) (local.get 2)) 744 (local.set 3 (i64.load32_u (i32.const 0))) 745 ) 746 ) 747 (if (i32.eq (local.get 1) (i32.const 1)) 748 (then 749 (i64.store32 align=1 (i32.const 0) (local.get 2)) 750 (local.set 3 (i64.load32_u align=1 (i32.const 0))) 751 ) 752 ) 753 (if (i32.eq (local.get 1) (i32.const 2)) 754 (then 755 (i64.store32 align=2 (i32.const 0) (local.get 2)) 756 (local.set 3 (i64.load32_u align=2 (i32.const 0))) 757 ) 758 ) 759 (if (i32.eq (local.get 1) (i32.const 4)) 760 (then 761 (i64.store32 align=4 (i32.const 0) (local.get 2)) 762 (local.set 3 (i64.load32_u align=4 (i32.const 0))) 763 ) 764 ) 765 (br $64) 766 ) ;; 32u 767 (if (i32.eq (local.get 1) (i32.const 0)) 768 (then 769 (i64.store (i32.const 0) (local.get 2)) 770 (local.set 3 (i64.load (i32.const 0))) 771 ) 772 ) 773 (if (i32.eq (local.get 1) (i32.const 1)) 774 (then 775 (i64.store align=1 (i32.const 0) (local.get 2)) 776 (local.set 3 (i64.load align=1 (i32.const 0))) 777 ) 778 ) 779 (if (i32.eq (local.get 1) (i32.const 2)) 780 (then 781 (i64.store align=2 (i32.const 0) (local.get 2)) 782 (local.set 3 (i64.load align=2 (i32.const 0))) 783 ) 784 ) 785 (if (i32.eq (local.get 1) (i32.const 4)) 786 (then 787 (i64.store align=4 (i32.const 0) (local.get 2)) 788 (local.set 3 (i64.load align=4 (i32.const 0))) 789 ) 790 ) 791 (if (i32.eq (local.get 1) (i32.const 8)) 792 (then 793 (i64.store align=8 (i32.const 0) (local.get 2)) 794 (local.set 3 (i64.load align=8 (i32.const 0))) 795 ) 796 ) 797 ) ;; 64 798 (local.get 3) 799 ) 800 ) 801 802 (assert_return (invoke "f32_align_switch" (i32.const 0)) (f32.const 10.0)) 803 (assert_return (invoke "f32_align_switch" (i32.const 1)) (f32.const 10.0)) 804 (assert_return (invoke "f32_align_switch" (i32.const 2)) (f32.const 10.0)) 805 (assert_return (invoke "f32_align_switch" (i32.const 3)) (f32.const 10.0)) 806 807 (assert_return (invoke "f64_align_switch" (i32.const 0)) (f64.const 10.0)) 808 (assert_return (invoke "f64_align_switch" (i32.const 1)) (f64.const 10.0)) 809 (assert_return (invoke "f64_align_switch" (i32.const 2)) (f64.const 10.0)) 810 (assert_return (invoke "f64_align_switch" (i32.const 3)) (f64.const 10.0)) 811 (assert_return (invoke "f64_align_switch" (i32.const 4)) (f64.const 10.0)) 812 813 (assert_return (invoke "i32_align_switch" (i32.const 0) (i32.const 0)) (i32.const 10)) 814 (assert_return (invoke "i32_align_switch" (i32.const 0) (i32.const 1)) (i32.const 10)) 815 (assert_return (invoke "i32_align_switch" (i32.const 1) (i32.const 0)) (i32.const 10)) 816 (assert_return (invoke "i32_align_switch" (i32.const 1) (i32.const 1)) (i32.const 10)) 817 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 0)) (i32.const 10)) 818 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 1)) (i32.const 10)) 819 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 2)) (i32.const 10)) 820 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 0)) (i32.const 10)) 821 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 1)) (i32.const 10)) 822 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 2)) (i32.const 10)) 823 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 0)) (i32.const 10)) 824 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 1)) (i32.const 10)) 825 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 2)) (i32.const 10)) 826 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 4)) (i32.const 10)) 827 828 (assert_return (invoke "i64_align_switch" (i32.const 0) (i32.const 0)) (i64.const 10)) 829 (assert_return (invoke "i64_align_switch" (i32.const 0) (i32.const 1)) (i64.const 10)) 830 (assert_return (invoke "i64_align_switch" (i32.const 1) (i32.const 0)) (i64.const 10)) 831 (assert_return (invoke "i64_align_switch" (i32.const 1) (i32.const 1)) (i64.const 10)) 832 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 0)) (i64.const 10)) 833 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 1)) (i64.const 10)) 834 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 2)) (i64.const 10)) 835 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 0)) (i64.const 10)) 836 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 1)) (i64.const 10)) 837 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 2)) (i64.const 10)) 838 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 0)) (i64.const 10)) 839 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 1)) (i64.const 10)) 840 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 2)) (i64.const 10)) 841 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 4)) (i64.const 10)) 842 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 0)) (i64.const 10)) 843 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 1)) (i64.const 10)) 844 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 2)) (i64.const 10)) 845 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 4)) (i64.const 10)) 846 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 0)) (i64.const 10)) 847 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 1)) (i64.const 10)) 848 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 2)) (i64.const 10)) 849 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 4)) (i64.const 10)) 850 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 8)) (i64.const 10)) 851 852 ;; Test that an i64 store with 4-byte alignment that's 4 bytes out of bounds traps without storing anything 853 854 (module 855 (memory 1) 856 (func (export "store") (param i32 i64) 857 (i64.store align=4 (local.get 0) (local.get 1)) 858 ) 859 (func (export "load") (param i32) (result i32) 860 (i32.load (local.get 0)) 861 ) 862 ) 863 864 (assert_trap (invoke "store" (i32.const 65532) (i64.const -1)) "out of bounds memory access") 865 ;; No memory was changed 866 (assert_return (invoke "load" (i32.const 65532)) (i32.const 0))