wa-lang.org/wazero@v1.0.2/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))