Skip to content

Fizzy 0.5.0

Compare
Choose a tag to compare
@axic axic released this 30 Sep 12:07
· 714 commits to master since this release

This release focuses on behind the scenes code and test cleanups, and preparation for a public API.

Fizzy passes all(*) of the official test suite (spectest 1.0):

  • 17911 of 17913 binary parser and execution tests,
  • 989 of 989 validation tests,
  • 477 skipped due to testing text format parser.

(*) The two failures are caused by, in our opinion, two bugs in the test cases.

A notable change is the upgrade from WABT 1.0.12 to 1.0.19 in our testing infrastructure.
While this allows us to conduct fuzzing, it must be noted there is a significant speed regression
with the newer WABT.

There is a slight speed regression compared to Fizzy 0.4.0, which can be attributed to
the code layout restructuring in #518.

Detailed benchmark results

Instantiation

                               |            fizzy            |   wabt  |  wasm3  |
                               |       0.5.0       |  0.4.0  |  1.0.19 |  0.4.7  |
                                abs. [µs]  rel. [%]  rel. [%]  rel. [%]  rel. [%]
geometric mean                                  100       101       279        27
blake2b                                28       100        99       306        38
ecpairing                            1399       100       101       305         3
keccak256                              47       100       103       289        18
memset                                 10       100       100       285        79
mul256_opt0                            12       100       101       246        56
ramanujan_pi                           28       100       101       260        30
sha1                                   43       100       101       284        19
sha256                                 69       100       100       297        12
taylor_pi                               7       100        99       246       116

Execution

                               |            fizzy            |        wabt       |  wasm3  |
                               |       0.5.0       |  0.4.0  |  1.0.19 |  1.0.12 |  0.4.7  |
                                abs. [µs]  rel. [%]  rel. [%]  rel. [%]  rel. [%]  rel. [%]
geometirc mean                                  100        95       508       167        26
blake2b/512_bytes_rounds_1             87       100        97       523       172        26
blake2b/512_bytes_rounds_16          1329       100        96       525       172        26
ecpairing/onepoint                 411770       100       102       516       172        38
keccak256/512_bytes_rounds_1          105       100        96       416       162        18
keccak256/512_bytes_rounds_16        1548       100        96       418       162        18
memset/256_bytes                        7       100        96       509       155        28
memset/60000_bytes                   1623       100        95       507       155        28
mul256_opt0/input0                     29       100        91       545       152        22
mul256_opt0/input1                     29       100        89       543       152        22
ramanujan_pi/33_runs                  138       100        91       483       163        22
sha1/512_bytes_rounds_1                94       100        97       563       181        29
sha1/512_bytes_rounds_16             1318       100        96       566       179        29
sha256/512_bytes_rounds_1              96       100        98       539       186        30
sha256/512_bytes_rounds_16           1326       100        97       540       186        30
taylor_pi/pi_1000000_runs           41668       100        96       465       154        29

Added

  • fizzy-testfloat tool to check floating-point instructions implementation against Berkeley TestFloat test suite. #511
  • instantiate function now has memory_pages_limit parameter to configure hard limit on memory allocation. fizzy-spectests uses the required 4 GB memory limit now. #515
  • fizzy-spectests tool can now run tests form a single *.wast file. #525
  • The shellcheck linter is now used on CI. #537
  • There is now lib/fizzy/cxx20 directory with substitute implementations of C++20 standard library features, which Fizzy uses when compiled in pre-C++20 standard (default). Currently it contains bit_cast and span utilities. #535 #541

Changed

  • Optimization in execute to allocate memory only once for all of the arguments, locals, and operand stack. #382
  • Trap handling in execute has been simplified. #425
  • fizzy-bench now uses WABT version 1.0.19. #443
  • New simpler implementation of f32.nearest and f64.nearest. #504
  • execute.hpp now includes declarations only for execute functions. Other functions of C++ API (instantiate, resolve_imported_functions, exports access) have been moved to instantiate.hpp. #518
  • More strict compiler warnings have been enabled. #508
  • Remove some less useful benchmarking cases. #555
  • CI improvements. #465 #516 #519 #520 #523 #532 #549
  • Code and test cleanups and refactoring. #495 #505 #521 #522

Fixed

  • Incorrect results in some floating point operations with NaNs in GCC builds without optimization. #513
  • Potential undefined behaviour in pointer arithmetic in parser. #539
  • Ensure (in debug mode) that execute() receives the correct number of inputs and returns the correct number of output. #547
  • Incorrect failure logging in fizzy-spectests tool. #548